| 
| 
 | Вопрос # 5 722/ вопрос решён / | 
 |  Здравствуйте,Уважаемые эксперты!Помогите пожалуйста с освоением языка си!1)Нужно сделать так,чтобы при вводе не положительного значения для stone_num и crit_mass программа просила ввести заново,но она просит только один раз ввести заново при ошибочном вводе значения stone_num и вылетает в любом случае.
 2)Для того,чтобы можно было вводить дробное значение crit_mass достаточно ли записать double crit_mass; и scanf("%lf",&crit_mass); в соответствующем месте кода?
 3)как сделать массив из количества камней которое введёт пользователь (stone_num)  применима ли для этого константа в обязательном порядке?Если да,то как реализовать это?
 Заранее спасибо за внимание и помощь.
 Приложение:Переключить в обычный режим #include<stdio.h>int main(){       int stone_num,crit_mass;    printf("input num of stones\n");    scanf("%d",&stone_num);    if(stone_num<=0)    {         printf("Incorrect!Please input num. of stones again\n");    }    else    {    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;}
|  |   Вопрос задал: Эдик (статус: Посетитель)Вопрос отправлен: 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]
 Удачи.
 Приложение:Переключить в обычный режим #include <stdio.h>int main(){       int stone_num=-1;    double crit_mass=-1;    do {       printf("Input num of stones: ");       scanf("%d",&stone_num);       if(stone_num<=0)           {printf("Incorrect!Please input num. of stones again\n");}    } while (stone_num<=0);     do {       printf("Input crit mass: ");       scanf("%lf",&crit_mass);       if(crit_mass<0)           {printf("Incorrect!Please input crit. mass again\n");}    } while (crit_mass<0);       double *weight = new double [stone_num];    double input=-1;     printf("Input weight of each stone\n");       for (int i=0; i<stone_num; ++i) {            do {                printf("Input weight of %d stone: ",i+1);                scanf("%lf",&input);                if(input<=0)                    {printf("Incorrect!Please input weight again\n");}                else {weight[i]=input;}            } while (input<=0);      }     getchar();    return 0;} 
|  | Ответ отправил: Аксион (статус: 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™ (статус: Доктор наук), 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: Статус вопроса изменён на решённый (изменил автор вопроса — Эдик) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |