Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 722

/ вопрос решён /

Здравствуйте,Уважаемые эксперты!Помогите пожалуйста с освоением языка си!
1)Нужно сделать так,чтобы при вводе не положительного значения для stone_num и crit_mass программа просила ввести заново,но она просит только один раз ввести заново при ошибочном вводе значения stone_num и вылетает в любом случае.
2)Для того,чтобы можно было вводить дробное значение crit_mass достаточно ли записать double crit_mass; и scanf("%lf",&crit_mass); в соответствующем месте кода?
3)как сделать массив из количества камней которое введёт пользователь (stone_num) применима ли для этого константа в обязательном порядке?Если да,то как реализовать это?
Заранее спасибо за внимание и помощь.

Приложение:
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int stone_num,crit_mass;
  5. printf("input num of stones\n");
  6. scanf("%d",&stone_num);
  7. if(stone_num<=0)
  8. {
  9. printf("Incorrect!Please input num. of stones again\n");
  10. }
  11. else
  12. {
  13. printf("input crit mass\n");
  14. }
  15. scanf("%d",&crit_mass);
  16. if(crit_mass<0)
  17. {
  18. printf("Incorrect!Please input crit. mass again\n");
  19. }
  20. else
  21. {
  22. printf("input weight of each stone");
  23. }
  24. getchar();
  25. return 0;
  26. }


Эдик Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Эдик (статус: Посетитель)
Вопрос отправлен: 6 ноября 2011, 16:35
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Аксион

Здравствуйте, Эдик!
1) Смотрите код в приложении (Используйте конструкцию do - while)
2) Да
3) Используйте динамический массив
double *weight = new double [stone_num]; - создает массив из double'ов, нумерация: 0,...,stone_num -1
Обращение к i-ному элементу массива: weight[i]
Удачи.

Приложение:
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int stone_num=-1;
  5. double crit_mass=-1;
  6. do {
  7. printf("Input num of stones: ");
  8. scanf("%d",&stone_num);
  9. if(stone_num<=0)
  10. {printf("Incorrect!Please input num. of stones again\n");}
  11. } while (stone_num<=0);
  12.  
  13. do {
  14. printf("Input crit mass: ");
  15. scanf("%lf",&crit_mass);
  16. if(crit_mass<0)
  17. {printf("Incorrect!Please input crit. mass again\n");}
  18. } while (crit_mass<0);
  19.  
  20. double *weight = new double [stone_num];
  21. double input=-1;
  22.  
  23. printf("Input weight of each stone\n");
  24. for (int i=0; i<stone_num; ++i) {
  25. do {
  26. printf("Input weight of %d stone: ",i+1);
  27. scanf("%lf",&input);
  28. if(input<=0)
  29. {printf("Incorrect!Please input weight again\n");}
  30. else {weight[i]=input;}
  31. } while (input<=0);
  32. }
  33.  
  34. getchar();
  35. return 0;
  36. }
  37.  


Ответ отправил: Аксион (статус: 4-ый класс)
Время отправки: 6 ноября 2011, 18:48
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Как-то так:

#include<stdio.h>
int main()
{
  int stone_num,
      crit_mass;
 
  do
  {
    // это цикл с постусловием
    printf("input num of stones\n");
    scanf("%d", &stone_num);
 
    if (stone_num <= 0)
      printf("Incorrect! Please input num. of stones again\n");
    else break;
  } while (true); // ну или вместо "else break" - "while (stone_num <= 0)", но это медленнее
 
  /* Остальное, офкос, по аналогии */
 
  //printf("input crit mass\n");
  //scanf("%d", &crit_mass);
 
  //if(crit_mass<0) printf("Incorrect!Please input crit. mass again\n");
  //else            printf("input weight of each stone");
 
  getchar();
  return 0;
}

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 6 ноября 2011, 18:54


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 16 ноября 2011, 21:31; участников в обсуждении: 3.
Аксион

Аксион (статус: 4-ый класс), 6 ноября 2011, 18:52 [#1]:

И да, совсем забыл про удаление массива, перед return 0; Вписать строчку "delete[] weight;" - освобождаем выделенную под массив память
min@y™

min@y™ (статус: Доктор наук), 6 ноября 2011, 18:55 [#2]:

2Админ: Андрюх, почему в Ц++ слово "do" не светится?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

8 ноября 2011, 21:31: Статус вопроса изменён на решённый (изменил автор вопроса — Эдик)

Эдик

Эдик (статус: Посетитель), 9 ноября 2011, 19:23 [#3]:

через if с crit_mass не прокатывает там while нужен

9 ноября 2011, 19:24: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — Эдик)

Эдик

Эдик (статус: Посетитель), 9 ноября 2011, 20:05 [#4]:

Помогите пожалуйста,в коде отмечено 2 места,где в коментариях всё описано
# define NUM_stones 7         /// задаём количество камней константой
# include <stdio.h>
# include <math.h>
int main ()
{
    int i;int crit_mass;       /// i - переменная,crit_mass - критическая масса
    double a[NUM_stones];       /// вводим массив из масс камней
    printf("Input crit. mass\n");
    scanf("%d", &crit_mass);
    while(crit_mass<0)
    {
        printf("Incorrcet!Input crit. mass again\n");
        scanf("%d", &crit_mass);
    }
    /// какой здесь должен быть цикл,чтобы он вывел на экран 7 раз??? 
    /// "input vveight of 1 stone:" и вводим
    /// "input wvieght of 2 stone:" и вводим
    /// etc...при "# define NUM_stones 7" 
    for(int t=0;i<NUM_stones;i++)
    {
         printf("input weight %i stone");
         scanf("%lf",&a[i]);
    }
    ///  я думаю что что-то подобное,но это лишь портит ввод критической массы
    ///  (отрицательные блокируются сколько угодно,но при вводе нуля или 
    ///  положительного числа,можно ввести второе любое число
    /// консоль выдаёт 0.000000 и всё...   
    scanf("%lf", &a[NUM_stones]);
    for(i=NUM_stones;i>=1;i--)   /// сортирует массив по возврастанию
    {
        if(a[i-1]>a[i])
        {
           a[i-1]=a[i];
        }   
         else break;
    }
    printf("%lf",&a[i]);  /// эта строка выведет на экран 7 раз???
    /// wweight of 1 stone: ...
    /// vveight of 2 stone: ...
    /// etc...при "# define NUM_stones 7" 
    getchar();
    getchar();
    return 0;
}
Аксион

Аксион (статус: 4-ый класс), 10 ноября 2011, 20:17 [#5]:

Не особо понял, что требовалось, глянь код, может угадал я:
# define NUM_stones 7  
 
# include <stdio.h>
# include <math.h>
 
void BubleSort(double* Matrix, int n)
{
     for(int j=0; j<n; ++j){
           for(int i=0; i<n-1-j; ++i){
                   if(Matrix[i]>Matrix[i+1]){
                        double temp=Matrix[i];
                        Matrix[i]=Matrix[i+1];
                        Matrix[i+1]=temp;
                   } 
           }
     }        
}
 
int main ()
{
    int i,crit_mass;      
    double a[NUM_stones]; 
 
    printf("Input crit. mass: ");
    scanf("%d", &crit_mass);
 
    while(crit_mass<0)
    {
        printf("Incorrect!Input crit. mass again: ");
        scanf("%d", &crit_mass);
    }
 
    for (int i=0; i<NUM_stones; ++i) {
            do {
                printf("Input weight of %d stone: ",i+1);
                scanf("%lf",&a[i]);
                if(a[i]<=0)
                    {printf("Incorrect!Please input weight again\n");}
            } while (a[i]<=0);  
    }
 
    BubleSort(a,NUM_stones);
 
    for(i=0;i<NUM_stones;i++){
    printf("Weight of %d stone: %lf\n",i+1,a[i]);}
 
    getchar();
    getchar();
    return 0;
}
Эдик

Эдик (статус: Посетитель), 16 ноября 2011, 20:32 [#6]:

Спасибо Аксион - я переделал на свой лад.
Эдик

Эдик (статус: Посетитель), 16 ноября 2011, 21:12 [#7]:

хнык!При объявлении BubleSort в мейне invalid conversation from int to double
Эдик

Эдик (статус: Посетитель), 16 ноября 2011, 21:31 [#8]:

нет я всё таки переделал на свой лад проблемы уже другие)

16 ноября 2011, 22:25: Статус вопроса изменён на решённый (изменил автор вопроса — Эдик)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.04 сек.