Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ последовательность чисел

Автор: Client 20.01.2010 21:57

Дана последовательность чисел, 0 - ее конец. Определить, сохраняет ли она знак.

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain()
{
int a,b;
bool y=true;
cin >>a >> b;
if (a==0 || b==0) {
cout<<"DA";
getchar();
return 0;
}
else
while (y && b!=0)
{
a=b;
cin>>b;
if (b!=0) {
y=a*b>0;
}
}
if (y) {
cout<<"DA";
}
else
{
cout<<"NET";
}
getchar();
getchar();

return 0;
}
//---------------------------------------------------------------------------
Почему, если ответ ДА то есть задержка экрана, если НЕТ то консоль закрывается сразу? Или лучше задержку экрана делать через cin или есть другой способ?

Автор: Archon 20.01.2010 22:29

Используй

system("PAUSE");
, Люк.

Автор: volvo 20.01.2010 22:32

Цитата
Почему, если ответ ДА то есть задержка экрана, если НЕТ то консоль закрывается сразу?
У тебя "Да" выводится в двух местах, если ты не заметил. Какой из них работает нормально?

В общем случае работает не так, как ожидается, потому, что после того, как ты ввел число, ты нажал на Enter. cin считал число, а код Enter-а остался в буфере. Теперь понятно, почему getchar не задерживает выполнение программы? Да потомы, что он читает излишки Enter-ов, которые есть в буфере. После чтения числа опустошай поток, и все будет работать нормально.

Добавлено через 1 мин.
Archon, это не метод. Нужно править недочет в коде, а не маскировать его так, чтобы не было заметно. Ибо не вылезет сейчас - вылезет потом...

Автор: Client 20.01.2010 22:38

Цитата
Какой из них работает нормально?
Да, при первом ДА стоит 1 getchar, но и во втором случае, где 2 getchar, если ДА то задержка есть, иначе нету.
А как очистить поток?

Автор: volvo 20.01.2010 22:46

С помощью http://www.cplusplus.com/reference/iostream/istream/ignore/, например:

cin.ignore(numeric_limits<streamsize>::max(),'\n') ;

Автор: Client 20.01.2010 23:04

Цитата
cin.ignore(count, delim) - игнорировать count символов или пока не встретится символ разделитель delim. Символ разделитель заключается в апострофы ' '.
Значит можно смело писать
cin.ignore(255,'\n');
?

Автор: volvo 20.01.2010 23:14

То есть, ты на 100% уверен, что
1) в твоей реализации в поток может поместиться 255 символов
2) что все FAQ-и http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3 и советы написаны полудурками, которые вместо того, чтобы написать 255 пишут какую-то ненужную ахинею?

В таком случае извини, это решение "будет работать и фиг с ним. КАК ОНО РАБОТАЕТ - МНЕ НЕВАЖНО". Я в таких обсуждениях участия не принимаю. Программирование - слишком серьезная вещь, чтоб так наплевательски к нему относиться.

Автор: Client 20.01.2010 23:25

извини, но я что-то не понял это

Цитата
что все FAQ-и вот этот, например и советы написаны полудурками, которые вместо того, чтобы написать 255 пишут какую-то ненужную ахинею?
Скопировал кусочек программы в примере по ссылке (15.3) и ругается на строке
Цитата
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Т.е. в этом примере и есть ошибка?

Автор: Krjuger 21.01.2010 17:06

А можно поинтересоваться,а ты подключил билбиотеку limits ,если внимательно посмотреть,то в исходной посте она присутствует,а ты ничего про это не упомянул.И еще почему ты так упорно используеш iostream.h,когда тебе уже каждый сказал,что лучше использовать iostream.

Автор: Client 21.01.2010 19:10

Цитата
билбиотеку limits...
кажется, я слепой....

Автор: volvo 21.01.2010 21:19

Я, если честно, вообще не вижу смысла делать 2 точки, в которых может завершиться выполнение программы. Вот так, скажем:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
#include <iostream>
#include <limits>

//---------------------------------------------------------------------------
#pragma argsused

using namespace std;

int _tmain()
{
int a, b;
bool y = true;
cin >> a >> b;

if(a && b) // Я перевернул условие
{
while (y && b != 0)
{
a = b;
cin >> b;
if (b != 0)
{
y = a * b > 0;
}
}
}

if (y) {
cout<<"DA";
}
else
{
cout<<"NET";
}
cin.ignore(numeric_limits<streamsize>::max(),'\n'); // Чистим поток
cin.get(); // Все-таки ждем нажатия, чтоб увидеть результат
return 0;
}
будет более читаемо...

Автор: Client 21.01.2010 21:45

хитрая штука этот поток... smile.gif
Спасибо.