Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Небольшая проблема с программой на С  (Прочитано 2120 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kaziev-95

  • Автор темы
  • Участник
  • *
  • Сообщений: 228
  • Ставь Ubuntu
    • Просмотр профиля
    • Убунту для жизни
Есть небольшая программа написанная на С.
Код: (c) [Выделить]
#include <stdio.h>

int main (void)
{
int a, b, c;
printf ("a=");
scanf ("%d\n", &a);
printf ("b=");
scanf ("%d\n", &b);
printf ("c=");
scanf ("%d\n", &c);
printf ("%d\n", a+b+c);
return 0;
}

После запуска в терминале программа сначала требует ввести значение переменной а, дальше требует ввести любое число или символ, которую он никуда не записывает. Как решить эту проблему?
« Последнее редактирование: 03 Апреля 2012, 22:30:51 от yorik1984 »

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #1 : 03 Апреля 2012, 22:22:50 »
А зачем в scanf \n?
Извините, я все еще учусь

Оффлайн Gekko

  • Участник
  • *
  • Сообщений: 222
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #2 : 03 Апреля 2012, 23:31:37 »
А зачем в scanf \n?

Повидимому автор имел в виду:

#include <stdio.h>
 
int main (void)
{
int a, b, c;
printf ("a=");
scanf ("%d", &a);
printf ("b=");
scanf ("%d", &b);
printf ("c=");
scanf ("%d", &c);
printf ("%d\n", a+b+c);
return 0;
}
Xubuntu 12.04 LTS с Xfce 4.10

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #3 : 03 Апреля 2012, 23:42:39 »
Gekko,
Автор сам должен до этого дойти - а так - это халява :(
Извините, я все еще учусь

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #4 : 04 Апреля 2012, 04:56:52 »
Буферизированные printf(...) без "\n" и без fflush() тоже хорошо не закончатся ;)

Оффлайн kaziev-95

  • Автор темы
  • Участник
  • *
  • Сообщений: 228
  • Ставь Ubuntu
    • Просмотр профиля
    • Убунту для жизни
Re: Небольшая проблема с программой на С
« Ответ #5 : 04 Апреля 2012, 13:29:59 »
Gekko, спасибо за ответ, хотя и согласен с SergeyIT.
Цитировать
Буферизированные printf(...) без "\n" и без fflush() тоже хорошо не закончатся ;)
Olej, можно поподробнее?

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #6 : 05 Апреля 2012, 03:21:34 »
Gekko, спасибо за ответ, хотя и согласен с SergeyIT.
Цитировать
Буферизированные printf(...) без "\n" и без fflush() тоже хорошо не закончатся ;)
Olej, можно поподробнее?

По классическому определению printf() выводит через буфер, и буфер этот реально сбрасывается на вывод, когда в выводе встречается перевод строки ('\n').
Если вы выводите что-то типа вашего запроса на ввод "a=" - то он может так и застревать в буфере и не отображаться до определённого времени ... т.е. возникает путаница (порядка ввода и вывода).
Если хотят отобразить неполную строку (запрос), то после printf() нужно вызвать функцию принудительного сброса буфера fflush().

P.S. это классическая схема, в реализациях в библиотеках она может в деталях отличаться.

Оффлайн kaziev-95

  • Автор темы
  • Участник
  • *
  • Сообщений: 228
  • Ставь Ubuntu
    • Просмотр профиля
    • Убунту для жизни
Re: Небольшая проблема с программой на С
« Ответ #7 : 05 Апреля 2012, 21:23:09 »
#include <stdio.h>
 
int main (void)
{
     int i, n, a, max;
     printf ("Введите количество чисел: ");
     scanf ("%d", &n);
     printf ("Введите %d чисел:", n);
     scanf ("%d", &max);
     for(i = 1; i < n ; i++) {
         scanf ("%d", &a);
         if(a > max)
             max = a;
     }
     printf ("Максмальное число:%d\n", max);
     return 0;
 }

Что в этой программе третий scanf записывает в переменную а?

Оператор for устроен следующим образом:

 for(A; B; C ) D;

Логика оператора for:

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #8 : 05 Апреля 2012, 21:52:44 »
А зачем это ?
scanf ("%d", &max);
Надо перед циклом
max=INT_MIN;
Извините, я все еще учусь

Оффлайн a1nt0pf

  • Новичок
  • *
  • Сообщений: 10
  • asus U24E
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #9 : 06 Апреля 2012, 14:13:18 »
А зачем это ?
scanf ("%d", &max);
Надо перед циклом
max=INT_MIN;
Не нужно присваивать max=INT_MIN перед циклом, поскольку 2-й сканф читает первое число в max, т.е. значение max уже определено.
Цитировать
Что в этой программе третий scanf записывает в переменную а?
3-й сканф читает в цикле в переменную а числа вводимые с клавиатуры, до тех пор, пока условие действительно(i < n), т.е. он читает нужное количество вводимых чисел.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #10 : 06 Апреля 2012, 14:51:53 »
a1nt0pf,
Виноват, исправлюсь  :(
Хотя... лишний вызов scanf ни к чему, кода больше становится. :)
« Последнее редактирование: 06 Апреля 2012, 15:14:57 от SergeyIT »
Извините, я все еще учусь

Оффлайн a1nt0pf

  • Новичок
  • *
  • Сообщений: 10
  • asus U24E
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #11 : 06 Апреля 2012, 16:17:59 »
Цитировать
Хотя... лишний вызов scanf ни к чему, кода больше становится. :)
То что код больше становится это одно, вызов сканфа не бесплатный... Лучше в первом сканфе передавать 2 переменные n и max, дешевле обходится и второй сканф в цикле.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #12 : 06 Апреля 2012, 17:01:20 »
Цитировать
Хотя... лишний вызов scanf ни к чему, кода больше становится. :)
То что код больше становится это одно, вызов сканфа не бесплатный... Лучше в первом сканфе передавать 2 переменные n и max, дешевле обходится и второй сканф в цикле.

В хорошо организованной программе n вообще не должно вводиться, а должно определяться динамически, по какому-то признаку конца ввода... Признаком может быть: 0 значение, отрицательное значение, ... могут быть более изощрённые способы, скрывающие от оператора внутреннюю кухню. 

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #13 : 06 Апреля 2012, 17:07:41 »
Olej,
И здесь холивар устраивать будем? :)
Извините, я все еще учусь

Оффлайн a1nt0pf

  • Новичок
  • *
  • Сообщений: 10
  • asus U24E
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #14 : 06 Апреля 2012, 19:06:48 »
В хорошо организованной программе n вообще не должно вводиться, а должно определяться динамически, по какому-то признаку конца ввода... Признаком может быть: 0 значение, отрицательное значение, ... могут быть более изощрённые способы, скрывающие от оператора внутреннюю кухню. 
Окей, как только научишь компьютер читать мысли - твой подход будет реален, а пока нужно чтобы scanf() читал из входящего потока, ты не сможешь определять к-во нужных чисел "динамически".

 

Страница сгенерирована за 0.038 секунд. Запросов: 25.