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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2011, 15:25   #1
Pingvinenok_Lolo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 56
По умолчанию Оператор while

Есть такая простенькая программка, по логике, когда пер-я row будет равна -1 оператор while должен прерваться, но он требует ввести еще следующую пер-ю benz = -1, и только тогда прекращается цикл.
Объясните пожалуйста, что, где неправильно, что где упустила?

Код:
# include <iostream>

using std:: cout;
using std:: cin;

int main ()
{
	double row = 0; 
	double summ = 0; 
	double benz = 0;
	double one_zapr = 0;
		
	while (row != -1)
	{
		cout << "Enter row: ";
		cin >> row;
		cout << "Enter benzin: ";
		cin >> benz;
		one_zapr = row / benz;
		summ = summ + one_zapr;
		cout << "one zapr: " << one_zapr;
		cout << "\nsumm: " << summ;
		cout << "\n";
	}
	cout << "Finish";
}

Последний раз редактировалось Stilet; 05.11.2011 в 17:58. Причина: упс...код С++ ))
Pingvinenok_Lolo вне форума Ответить с цитированием
Старый 05.11.2011, 16:03   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Вообще-то, пока не научились думать на языке программирования, так нелюбимые студентами блок-схемы - помогают

Вариант 1
Код:
    ...        
    while ( 1 ) {
        cout << "Enter row: ";
        cin >> row;
        if ( row == -1 )
           break ;
        ...
    }
    cout << "Finish";
    ...
Вариант 2
Код:
    ...        
    while ( row != -1 ) {
        cout << "Enter row: ";
        cin >> row;
        if ( row == -1 )
           continue ;
        ...
    }
    cout << "Finish";
    ...
Ну и, какой бы вариант ни выбрали, желательно приучить себя "с детства" причину этих continue или break-ов - комментировать.

Added 13:40 CET:
Вариант 3 (в память о собственных студенческих годах, кои совпали с фетишизацией легендарной статьи Дейкстры )
Код:
    ...
    cout << "Enter row: ";
    cin >> row;
    while ( row != -1 ) {
        cout << "Enter benzin: ";
        cin >> benz;
        one_zapr = row / benz;
        summ = summ + one_zapr;
        cout << "one zapr: " << one_zapr;
        cout << "\nsumm: " << summ;
        cout << "\n";
        cout << "Enter row: ";
        cin >> row;
    }
    cout << "Finish";
    ...

Последний раз редактировалось Vago; 05.11.2011 в 16:41.
Vago вне форума Ответить с цитированием
Старый 05.11.2011, 16:54   #3
Pingvinenok_Lolo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Вообще-то, пока не научились думать на языке программирования, так нелюбимые студентами блок-схемы - помогают

Вариант 1
Код:
    ...        
    while ( 1 ) {
        cout << "Enter row: ";
        cin >> row;
        if ( row == -1 )
           break ;
        ...
    }
    cout << "Finish";
    ...
Вариант 2
Код:
    ...        
    while ( row != -1 ) {
        cout << "Enter row: ";
        cin >> row;
        if ( row == -1 )
           continue ;
        ...
    }
    cout << "Finish";
    ...
Ну и, какой бы вариант ни выбрали, желательно приучить себя "с детства" причину этих continue или break-ов - комментировать.

Added 13:40 CET:
Вариант 3 (в память о собственных студенческих годах, кои совпали с фетишизацией легендарной статьи Дейкстры )
Код:
    ...
    cout << "Enter row: ";
    cin >> row;
    while ( row != -1 ) {
        cout << "Enter benzin: ";
        cin >> benz;
        one_zapr = row / benz;
        summ = summ + one_zapr;
        cout << "one zapr: " << one_zapr;
        cout << "\nsumm: " << summ;
        cout << "\n";
        cout << "Enter row: ";
        cin >> row;
    }
    cout << "Finish";
    ...
Да-да, про if забыла напрочь . С первым-вторым вариантами разобралась, а вот в третьем получается что при запуске программы два раза требует ввести пер-ю row,
сделала так:
Код:
while (row != -1)
	{
		cout << "Enter row: ";
		cin >> row;
		if (row == -1)
		{
			break;
		}
		cout << "Enter benzin: ";
		cin >> benz;
                ...
         }
cout << "Finish";
Я конечно извиняюсь за свою непросвещенность, а кто такой Дейкстра? . В гугле их много, а поконкретней можно? )

Последний раз редактировалось Stilet; 05.11.2011 в 17:59.
Pingvinenok_Lolo вне форума Ответить с цитированием
Старый 05.11.2011, 17:24   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Pingvinenok_Lolo Посмотреть сообщение
... а вот в третьем получается что при запуске программы два раза требует ввести пер-ю row ...
Ещё раз, уже настойчивее, говорю: рисуете блок-схему (только - по моемУ "Варианту 3", а не по тому, что у Вас в голове сидит ) и остро отточенным карандашиком водите по блокам вниз-вверх, вниз-вверх, до полного понимания принципа работы управляющей структуры "цикл while"!..

Цитата:
Сообщение от Pingvinenok_Lolo Посмотреть сообщение
... а кто такой Дейкстра? . В гугле их много, а поконкретней можно? )
В программировании Дейкстра - ОДИН!

Собственно статья.

Added 14:34 CET:
Кстати, в крайнем варианте, который написали Вы, проверка в while - паразитная. Именно по ней вы никогда из цикла не выйдете!

Последний раз редактировалось Vago; 05.11.2011 в 17:35.
Vago вне форума Ответить с цитированием
Старый 05.11.2011, 17:51   #5
Pingvinenok_Lolo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Ещё раз, уже настойчивее, говорю: рисуете блок-схему (только - по моемУ "Варианту 3", а не по тому, что у Вас в голове сидит ) и остро отточенным карандашиком водите по блокам вниз-вверх, вниз-вверх, до полного понимания принципа работы управляющей структуры "цикл while"!..


Added 14:34 CET:
Кстати, в крайнем варианте, который написали Вы, проверка в while - паразитная. Именно по ней вы никогда из цикла не выйдете!
Блок-схему нарисовала, карандашик остро отточила, по схеме вниз-вверх поводила, ПОНЯЛА!

Да, в моем последнем варианте условие мягко говоря не совсем правильное, а как сделать чтобы не было паразитов ?

Хотя от паразитов избавились еще в третьем варианте, за Дейкстра спасибо - просветили

Последний раз редактировалось Pingvinenok_Lolo; 05.11.2011 в 17:54.
Pingvinenok_Lolo вне форума Ответить с цитированием
Старый 05.11.2011, 18:17   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Pingvinenok_Lolo Посмотреть сообщение
Блок-схему нарисовала, карандашик остро отточила, по схеме вниз-вверх поводила, ПОНЯЛА!
Студентка - "Мечта преподавателя"!

Цитата:
Сообщение от Pingvinenok_Lolo Посмотреть сообщение
Да, в моем последнем варианте условие мягко говоря не совсем правильное, а как сделать чтобы не было паразитов ?

Хотя от паразитов избавились еще в третьем варианте ...
Как по мне, самой большой пользой от ломания копий вокруг той статьи Дейкстры стала всеобщая терпимость к оператору goto в том его виде, который стал называться "оператором break" Сейчас уже никто не скажет, что программирование в стиле "Варианта 3" - это единственное "хорошо", а варианты 1 и 2 - "плохо". Единственно, повторяю, безо всяких "ИМХО": случаи досрочного выхода из цикла должны быть тщательно откомментированы.

Что до "паразитности", то решение - см. "Вариант 1". Там while, каазалось бы, - ещё более паразитный (ну, действительно, как может не выполниться while (1) ?!), но именно этим просто подчёркивается, что реальный выход из цикла будет где-то внутри цикла.
Vago вне форума Ответить с цитированием
Старый 05.11.2011, 18:39   #7
Pingvinenok_Lolo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 56
По умолчанию

и такие студентки бывают ))))))))

По поводу goto...еще с самых первых пар нам молвили, сие есть страшное зло, и чем меньше используешь goto тем лучше, или вообще не использовать

Цитата:
Сообщение от Vago Посмотреть сообщение
... что реальный выход из цикла будет где-то внутри цикла.
как-то все завуалировано )))), по моему проще правильно составить условие выхода из цикла
Pingvinenok_Lolo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оператор выбора или условный оператор[Перенесено из JavaSE] merhaba1992 Помощь студентам 1 20.01.2011 17:06
Условный оператор. Оператор выбора. Pascal Сержuk Помощь студентам 4 17.11.2010 12:50
Вычислить используя, оператор цикла for и оператор безусловного пе Knubbe Помощь студентам 1 18.12.2009 10:24
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10