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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 00:18   #11
SAURONoff
 
Аватар для SAURONoff
 
Регистрация: 16.01.2010
Сообщений: 6
По умолчанию

не, ну толи лыжи не едут, толи со мной чего не так... не буду плодить темы, тут спрошу=)
Код:
int main(int argc, char *argv[])
{
long a;
a=0;
while(getchar() !='0')
++a;
printf("%1d", a);
  system("PAUSE");	
  return 0;
}
почему оно выдаёт результат в два раза больше нужного??
с переменными вроде не напутано,
Код:
long a;
a=0;
++a;
++a;
++a;
printf("%1d", a);
выдаёт правильную троечку... значит проблема в while, но где??
SAURONoff вне форума Ответить с цитированием
Старый 17.01.2010, 01:16   #12
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
int main()
{
long a;
a=0;

while(getchar() !='0')
{
++a;
fflush(stdin);
}

printf("%1d", a);
  system("PAUSE");

        return 0;
}
Нужно очищать буфер устройства ввода перед или после вызова функции getchar().
profi вне форума Ответить с цитированием
Старый 17.01.2010, 01:30   #13
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от SAURONoff Посмотреть сообщение
почему оно выдаёт результат в два раза больше нужного??
Потому что каждый раз, как Вы вводите цифру и жмёте энтер, Вы вводите не 1 символ, а 2(цифра и перевод строки). Их оба последовательно читает getchar, потому циклов выходит в два раза больше ожидаемого
netrino вне форума Ответить с цитированием
Старый 17.01.2010, 01:35   #14
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Потому что каждый раз, как Вы вводите цифру и жмёте энтер, Вы вводите не 1 символ, а 2(цифра и перевод строки). Их оба последовательно читает getchar, потому циклов выходит в два раза больше ожидаемого
Хм... я всегда думал, что просто остается в буфере старое значение и из-за этого getchar() два раза его считывает. Тогда почему этот код
Код:
while(c = getchar() !='0')
if (c != '\n')
++a;
В два раза больше выводит a?

Последний раз редактировалось profi; 17.01.2010 в 01:37.
profi вне форума Ответить с цитированием
Старый 17.01.2010, 01:41   #15
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Хм... я всегда думал, что просто остается в буфере старое значение и из-за этого getchar() два раза его считывает. Тогда почему этот код
Код:
while(c = getchar() !='0')
if (c != '\n')
++a;
В два раза больше выводит a?
Потому что надо вот так)
Код:
while( (c = getchar()) != '0' )
    if(c != '\n')
       ++a;
netrino вне форума Ответить с цитированием
Старый 17.01.2010, 01:47   #16
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Приоритет '!=' больше чем '=' ) понятно не заметил.
profi вне форума Ответить с цитированием
Старый 17.01.2010, 14:28   #17
SAURONoff
 
Аватар для SAURONoff
 
Регистрация: 16.01.2010
Сообщений: 6
По умолчанию

с fflush сработало, спасибо. последний вопрос: этот учебник что, действительно лучший самоучитель по Си?! все об это говорят, но я как бэ вижу обратное...
SAURONoff вне форума Ответить с цитированием
Старый 17.01.2010, 14:43   #18
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

"Этот" - это какой?
MaTBeu вне форума Ответить с цитированием
Старый 17.01.2010, 14:50   #19
Valter
Пользователь
 
Регистрация: 29.03.2008
Сообщений: 51
По умолчанию

Цитата:
Сообщение от SAURONoff Посмотреть сообщение
с fflush сработало, спасибо. последний вопрос: этот учебник что, действительно лучший самоучитель по Си?! все об это говорят, но я как бэ вижу обратное...
Да, лучший, во всяком случае на мой взгляд.

Вообще в stdio.h EOF присваивается (-1). Но никто не мешает через #define задать что-нибудь другое другой переменной. Создай

Код:
#define EOFile 48
и тогда после ввода 0 и enter программа прекратит работу.


PS: то , что иногда приходиться включать голову и разбираться самому, когда учишься по книге Кернигана и Ритчи - это только плюс, а не минус.

Последний раз редактировалось Valter; 17.01.2010 в 14:52.
Valter вне форума Ответить с цитированием
Старый 17.01.2010, 15:14   #20
SAURONoff
 
Аватар для SAURONoff
 
Регистрация: 16.01.2010
Сообщений: 6
По умолчанию

MaTBeu, "Язык Си", Керниган и Ричи.
Цитата:
Сообщение от Valter Посмотреть сообщение
Вообще в stdio.h EOF присваивается (-1). Но никто не мешает через #define задать что-нибудь другое другой переменной. Создай

Код:
#define EOFile 48
и тогда после ввода 0 и enter программа прекратит работу.
с #define работает, но мне больше нра #define EOFile '0' =)

Цитата:
PS: то , что иногда приходиться включать голову и разбираться самому, когда учишься по книге Кернигана и Ритчи - это только плюс, а не минус.
Одно дело, если книга дает нужные (и правильные!) данные, и дает задание склепать из этого код проги - тогда это действительно самоучитель.
А когда половина теории неправильна, и приходится по каждому пункту обращаться к более опытным - это уже что-то не то...

Последний раз редактировалось SAURONoff; 17.01.2010 в 15:17.
SAURONoff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как задать рекурсией? Irdis Фриланс 4 11.02.2010 02:01
Подскажите как работает eof()[Console C++] sawer5 Помощь студентам 3 01.01.2010 12:11
Как задать треугольник? Shevali Помощь студентам 4 07.04.2009 01:01
Как задать множество 1234 Паскаль, Turbo Pascal, PascalABC.NET 7 25.05.2008 16:15