Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2011, 04:20   #1
Тошка
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 11
По умолчанию Бесконечный цикл.

Здравствуйте, я только начинаю изучать C++. При выполнении данной программы
Код:
#include <iostream>
#include <iomanip>
using std::cout;
using std::cin;
using std::endl;
using std::setprecision;
using std::fixed;

int main()
{
  int way;
  int litresOnKm;
  int totalWay = 0;
  double totalLitresOnKm =0;
 
  cout << "Vvedite proidennyi put` (<Ctrl>+Z yesli vvod zakonchen) : ";
  cin >> way;
  
  while ( way != EOF )
  {
    cout << "Vvedite rashod benzina : ";
    cin >> litresOnKm;
	
    totalLitresOnKm = totalLitresOnKm + litresOnKm;
    totalWay = totalWay + way;
	
    cout << "Km\\litr dlya etoi zapravki : " << setprecision(6) << fixed << ( ( static_cast< double >( way ) ) / litresOnKm ) << endl;
    cout << "Summarnoe znachenie km\\litr: " << setprecision(6) << fixed << ( ( static_cast< double >( totalWay ) ) / totalLitresOnKm ) << endl;
    cout << "\nVvedite proidennyi put` (<Ctrl>+Z yesli vvod zakonchen) : ";
    cin >> way;
  }
}
почему-то при нажатии ctrl-z она переходит в бесконечный цикл. При установки условия в -1 все работает хорошо. Я что-то не так делаю или это особенность компилятора\среды запуска? Компилирую в Dev-C++.

Последний раз редактировалось Тошка; 12.03.2011 в 04:37.
Тошка вне форума Ответить с цитированием
Старый 12.03.2011, 07:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю так:
Код:
	int way;
  int litresOnKm;
  int totalWay = 0;
  double totalLitresOnKm =0;
 
  
  do
  {
  cout << "\n\nVvedite proidennyi put`: ";
  cin >> way;
    cout << "Vvedite rashod benzina : ";
    cin >> litresOnKm;
	
    totalLitresOnKm = totalLitresOnKm + litresOnKm;
    totalWay = totalWay + way;
	
    cout << "Km\\litr dlya etoi zapravki : " << setprecision(6) << fixed << ( ( static_cast< double >( way ) ) / litresOnKm ) << endl;
    cout << "Summarnoe znachenie km\\litr: " << setprecision(6) << fixed << ( ( static_cast< double >( totalWay ) ) / totalLitresOnKm ) << endl;
    cout << "\nVvedite proidennyi put` (<Ctrl>+Z yesli vvod zakonchen) : ";
	cout << "vvod zakonchen? Y/N";
	cin.get();
  }while (cin.get()!='y');
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.03.2011, 11:55   #3
Тошка
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 11
По умолчанию

Да, конечно понятно, спасибо, буду знать еще один способ. Но основная суть моего вопроса не в методе остановки цикла, а в том, почему не работает метод с EOF?
Тошка вне форума Ответить с цитированием
Старый 12.03.2011, 12:36   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Можно так (точнее наверно нужно)
Код:
int main()
{
  int way;
  int litresOnKm;
  int totalWay = 0;
  double totalLitresOnKm =0;
 
  cout << "Vvedite proidennyi put` (<Ctrl>+Z yesli vvod zakonchen) : ";
  
  while ( cin.get() != EOF )
  {
    cout << "Vvedite rashod benzina : ";
    cin >> litresOnKm;
	
    totalLitresOnKm = totalLitresOnKm + litresOnKm;
    totalWay = totalWay + way;
	
    cout << "Km\\litr dlya etoi zapravki : " << setprecision(6) << fixed << ( ( static_cast< double >( way ) ) / litresOnKm ) << endl;
    cout << "Summarnoe znachenie km\\litr: " << setprecision(6) << fixed << ( ( static_cast< double >( totalWay ) ) / totalLitresOnKm ) << endl;
    cout << "\nVvedite proidennyi put` (<Ctrl>+Z yesli vvod zakonchen) : ";
  }
}
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 12.03.2011, 13:21   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему не работает метод с EOF?
Это вопрос к проффи в Си...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.03.2011, 17:50   #6
Тошка
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 11
По умолчанию

Задание простое, и я его в общем то выполнил. Но для большего понимания, закрепления и просто тупо из интереса решил довести до ума. Вот допилил немного
Код:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int way;
  int litresOnKm;
  int totalWay = 0;
  double totalLitresOnKm = 0;

  for ( way = 1; way != 0; )
  {
    cout << "\nВведите пройденный путь (введите 0 для завершения ввода): ";
    cin >> way;
    if ( cin.fail() )
      do
      {	
        cin.clear();
        cin.sync();
        cout << "Путь должен состоять из цифр. Введите пройденный путь (введите 0 для завершения ввода): ";
        cin >> way;
      } while ( cin.fail() );

    if ( way == 0 )
      continue;
	
    cout << "Введите расход бензина: ";
    cin >> litresOnKm;
    if ( cin.fail() )
    do
    {
      cin.clear();
      cin.sync();
      cout << "Расход может быть представлен только в виде цифр. Введите расход бензина: ";
      cin >> litresOnKm;
    } while ( cin.fail() );
		
    totalLitresOnKm = totalLitresOnKm + litresOnKm;
    totalWay = totalWay + way;
	
    cout << "Км\\литр для этой заправки: " << setprecision(6) << fixed << ( ( static_cast< double >( way ) ) / litresOnKm ) << endl;
    cout << "Суммарное значение км\\литр: " << setprecision(6) << fixed << ( ( static_cast< double >( totalWay ) ) / totalLitresOnKm ) << endl;
  }
  return 0;
}
Хотел еще сделать проверку на отрицательные числа для пути и отрицательные числа\ноль для расхода. Но при исполнении вот этого кода
Код:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int way;
  int litresOnKm;
  int totalWay = 0;
  double totalLitresOnKm = 0;
  
  for ( way = 1; way != 0 )
  {
    cout << "\nВведите пройденный путь (введите 0 для завершения ввода): ";
    cin >> way;
    if ( cin.fail() || way < 0 )
      do
      {	
        if ( cin.fail() )
        {
          cin.clear();
          cin.sync();
          cout << "Путь должен состоять из цифр. Введите пройденный путь (введите 0 для завершения ввода): ";
          cin >> way;
        }
        if ( way < 0 )
        {
          cout << "Путьне может быть отрицательным. Введите пройденный путь (введите 0 для завершения ввода): ";
          cin >> way;
        }
      } while ( cin.fail() && way < 0 );
	
    if ( way == 0 )
	  continue;
	
    cout << "Введите расход бензина: ";
    cin >> litresOnKm;
    if ( cin.fail() || litresOnKm < 0 )
      do
      {
        if ( cin.fail())
        {
          cin.clear();
          cin.sync();
          cout << "Расход может быть представлен только в виде цифр. Введите расход бензина: ";
          cin >> litresOnKm;
        }
        if ( litresOnKm < 0 )
        {
          cout << "Расход не может быть отрицательным или равным нулю: ";
          cin >> litresOnKm;
        }
      } while ( cin.fail() && litresOnKm < 0 );
		
    totalLitresOnKm = totalLitresOnKm + litresOnKm;
    totalWay = totalWay + way;
	
    cout << "Км\\литр для этой заправки: " << setprecision(6) << fixed << ( ( static_cast< double >( way ) ) / litresOnKm ) << endl;
    cout << "Суммарное значение км\\литр: " << setprecision(6) << fixed << ( ( static_cast< double >( totalWay ) ) / totalLitresOnKm ) << endl;
  }
  return 0;
}
при вводе первого отрицательного числа все нормально, условие срабатывает и запускается цикл, при следующем же вводе еще одного отрицательного числа цикл почему то прекращается и записывается отрицательное значение переменной пути. Далее предлагается ввод расхода. При вводе отрицательного числа в расхода естественно все так же. Не могу понять где допустил ошибку.

2Hacker19_90: Спасибо, буду знать. Но с этим кодом этот способ не работает, возможно он бы работал со предыдущим кодом, где первый раз переменная пути определялась вне цикла.

Последний раз редактировалось Тошка; 12.03.2011 в 18:17.
Тошка вне форума Ответить с цитированием
Старый 12.03.2011, 17:50   #7
Тошка
Пользователь
 
Регистрация: 10.03.2011
Сообщений: 11
По умолчанию

Ой как же я тупанул в условиях (нужно было ИЛИ вместо И... и как я это упустил...). Разобрался сам, всем спасибо, конечный вариант:
Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int way;
  int litresOnKm;
  int totalWay = 0;
  double totalLitresOnKm = 0;  
  
   
   
  for ( way = 1; way != 0; )
  {
    cout << "\nВведите пройденный путь (введите 0 для завершения ввода): ";
	cin >> way;
    if ( cin.fail() || way < 0 )
      do
      {
        if ( cin.fail() )
        {
          cin.clear();
          cin.sync();
          cout << "Путь должен состоять из цифр. Введите пройденный путь (введите 0 для завершения ввода): ";
          cin >> way;
          continue;
        }
        if ( way < 0 )
        {
          cout << "Путь не может быть отрицательным или равняться нулю. Введите пройденный путь (введите 0 для завершения ввода): ";
          cin >> way;
        }
      } while ( cin.fail() || way < 0 );
    else
      if ( way == 0 )
        continue;
	
    cout << "Введите расход бензина: ";
    cin >> litresOnKm;
    if ( cin.fail() || litresOnKm <= 0 )
      do
      {
        if ( cin.fail() )
        {
          cin.clear();
          cin.sync();
          cout << "Расход может быть представлен только в виде цифр. Введите расход бензина: ";
          cin >> litresOnKm;
	  continue;
        }
        if ( litresOnKm <= 0 )
        {
          cout << "Расход не может быть отрицательным или равным нулю. Введите расход бензина: ";
          cin >> litresOnKm;
        }
      } while ( cin.fail() || litresOnKm <= 0 );
		
    totalLitresOnKm = totalLitresOnKm + litresOnKm;
    totalWay = totalWay + way;
	
    cout << "Км\\литр для этой заправки: " << setprecision(6) << fixed << ( ( static_cast< double >( way ) ) / litresOnKm ) << endl;
    cout << "Суммарное значение км\\литр: " << setprecision(6) << fixed << ( ( static_cast< double >( totalWay ) ) / totalLitresOnKm ) << endl;
  }
  system("pause");
  return 0;
}

Последний раз редактировалось Тошка; 13.03.2011 в 03:53.
Тошка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесконечный цикл (Pascal) _fynjy_ Помощь студентам 4 13.12.2010 21:36
Бесконечный цикл. Kingdom_Reborn Помощь студентам 4 11.11.2010 00:18
WinSock и бесконечный цикл shinobi2 Работа с сетью в Delphi 3 10.02.2010 18:10
Бесконечный цикл(visual c++) JOFRIF Visual C++ 10 26.08.2008 22:43
Бесконечный цикл Эдуард Общие вопросы C/C++ 4 03.04.2008 17:28