Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Бесконечность в цикле while


Автор: Kontaktnik 22.8.2012, 01:01
Не судите строго за код.Я только начинаю разбираться с основами.У меня одна проблема, в цикле while, у меня постоянно возникает бесконечность повторения.Хочу чтобы мне обьяснили мою ошибку.Выполняю по одному готовому примеру свои задачи, но в примере вроде всё проходит, а вот в задачах возникает бесконечный цикл.Поясните пожалуйста самыми простыми словами.

 Задача состоит в том, чтобы с помощью контрольного значения (-1), т.е. пока его не введут, выполнялся цикл для разных заправок например.Требуется вывести км/литры по каждой конкретной заправке, и среднее кол-во км/литров по 2-3-4 заправкам

 #include <stdio.h>

 main ()
 {
 float total = 0, counter = 0;
 int km, litr, a, itogkm, itoglitr;

 printf("Введите расход бензина(-1 to end): \n");
 scanf("%d", &litr);
 printf("Введи кол-во проеденных км: \n");
 scanf("%d", &km);

 while (counter != -1) {
 itoglitr += litr;
 itogkm += km;
 a = (float) km / litr;
 counter++;
 printf("Для этой заправки использовано км/литр: %f/n", a);
 }

 total = itogkm / itoglitr;
 printf("Среднее число км/литров: %d/n", total);


 return 0;
 }

Автор: Фантом 22.8.2012, 01:10
Так ведь counter нигде не вводится. Сначала он равен 0, потом на каждом шаге цикла увеличивается на единицу, соответственно, до значения -1 не добирается.

Автор: math64 22.8.2012, 08:08
Доберётся. Только ждать долго. Сначала от 0 доберётся до 0x7fffFFFF (это чуть больше 2000000000), затем столько же от -0x80000000 до -1.
Если используешь 16 разрядный компилятор, ждать поменьше  - от 0 до 32767 и от -32768 до -1.

Автор: borisbn 22.8.2012, 08:54
Цитата(math64 @  22.8.2012,  08:08 Найти цитируемый пост)
Доберётся. 

 smile 
Цитата(Kontaktnik @  22.8.2012,  01:01 Найти цитируемый пост)
float total = 0, counter = 0;


Автор: math64 22.8.2012, 11:41
Да, не заметил что float - тем более без подсветки синтаксиса. Kontaktnik, используй кнопку "Код"!
С таким счётчиком даже такой цикл
Код

float counter, delta;
for(counter = 10, delta = 0.1; counter != 0; counter -= delta) {
   printf("%g\n", (double)counter);
}

будет бесконечным  - из-за ошибок округления counter никогда не станет 0.

Добавлено через 2 минуты и 40 секунд
Кстати, total - тоже float, а печатается с помощью %d. Лажу напечатает.

Автор: Kontaktnik 23.8.2012, 00:54
Код

#include <stdio.h>
 
main ()
   {
   float total = 0, itogkm = 0, itoglitr = 0;
   int km, litr; 
   
   printf("Введите расход бензина(-1 to end): \n");
   scanf("%d", &litr);
   printf("Введи кол-во проеденных км: \n");
   scanf("%d", &km);
   
   while (litr != -1)  {  
      itoglitr += litr;
      itogkm += km;
      total = (float) km / litr; 
      litr++; /*здесь не очень понятно, в принципе мне не нужно не увеличивать, не уменьшать счётчик, кол-во вводов меня не интересует*/
      printf("Для этой заправки использовано км/литр: %f\n",  total); 
      printf("Введите расход бензина(-1 to end): \n");
      scanf("%d", &litr);
      printf("Введи кол-во проеденных км: \n");
      scanf("%d", &km);
       }
       
      total = itogkm / itoglitr; 
      printf("Среднее число км/литров: %f\n", total);
      
       
   return 0;
  }


Как сделать так, чтобы при вводе -1(т.е. этого самого контр.значения)
Код

printf("Введите расход бензина(-1 to end): \n");
      scanf("%d", &litr);
      printf("Введи кол-во проеденных км: \n");
      scanf("%d", &km);
строка "Введи кол-во проеденных км: \n" не выводилась ? Т.е. если мы останавливаем цикл на вводе расхода бензина, вводить кол-во проеденных км не нужно.

Пробывал реализовать с помощью if/else, но никак не поддаётся.
Заранее благодарен

Автор: NadezdaT 23.8.2012, 09:38
О_о...
Код

   printf("Введите расход бензина(-1 to end): \n");
   scanf("%d", &litr);
   if (litr != -1) {
      printf("Введи кол-во проеденных км: \n");
      scanf("%d", &km);
   }
   else {// здесь пишешь то что нужно....
   }

Автор: Kontaktnik 23.8.2012, 14:34
Всем спасибо, разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)