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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #15 : 06 Апреля 2012, 21:16:46 »
Olej,
И здесь холивар устраивать будем? :)

И здесь тоже...


Пользователь решил продолжить мысль 06 Апреля 2012, 21:17:41:
Окей, как только научишь компьютер читать мысли - твой подход будет реален, а пока нужно чтобы scanf() читал из входящего потока, ты не сможешь определять к-во нужных чисел "динамически".

Сам то понял чего сказал? ;)


Пользователь решил продолжить мысль 06 Апреля 2012, 21:53:03:
как только научишь компьютер читать мысли

Вот примерно так (как пример хорошо организованной программы для случая, если числа предполагаются положительные):
#include <stdio.h>

int main( void ) {
   int a, max = 0;
   printf ( "Вводите ваши числа (ввод 0 - означает чисел больше нет): " );
   do {
      scanf( "%d", &a );
      max = a > max ? a : max;
   } while( a > 0 );
   printf ( "Максмальное число:%d\n", max );
   return 0;
}
И его выполнение:
[olej@notebook scanf]$ ./scanf
Вводите ваши числа (ввод 0 - означает чисел больше нет): 1 2 5
22
333
43
1
0
Максмальное число:333
« Последнее редактирование: 06 Апреля 2012, 21:53:03 от Olej »

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #16 : 06 Апреля 2012, 22:25:44 »
Olej,
Где же здесь хорошая организация? А контроль неправильного ввода, мало ли какой символ случайно введен будет....
(Занудствуем? :))
Извините, я все еще учусь

Оффлайн a1nt0pf

  • Новичок
  • *
  • Сообщений: 10
  • asus U24E
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #17 : 06 Апреля 2012, 23:28:07 »
Olej, скажу одно, я бы так написанную "программу" не использовал. Тем более на фоне уровня изначального кода ТС и твой "слабо" отличаются... Да и вместо do while я бы использовал for. В итоге у тебя получилось ооочень динамично??? Надумано очень ты написал... Не сочти за грубость. Хочу закончить на нотке "Мир, Дружба, Жвачка".

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #18 : 07 Апреля 2012, 01:28:53 »
Olej, скажу одно, я бы так написанную "программу" не использовал. Тем более на фоне уровня изначального кода ТС и твой "слабо" отличаются... Да и вместо do while я бы использовал for. В итоге у тебя получилось ооочень динамично??? Надумано очень ты написал... Не сочти за грубость. Хочу закончить на нотке "Мир, Дружба, Жвачка".

Мне ваши "я бы" - мало интересны.
Я (в самом упрощённом виде) показал, что фиксированные размерности: ввода, массивов, структур ... всего - это последнее дело, учитесь этого ограничения избегать.
« Последнее редактирование: 07 Апреля 2012, 01:38:03 от Olej »

Оффлайн Белый пони

  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #19 : 07 Апреля 2012, 10:56:54 »
Я (в самом упрощённом виде) показал, что фиксированные размерности: ввода, массивов, структур ... всего - это последнее дело, учитесь этого ограничения избегать.
А почему? И от задачи не зависит?

Lifewalker

  • Гость
Re: Небольшая проблема с программой на С
« Ответ #20 : 07 Апреля 2012, 11:48:34 »
Возьмите нормальный язык программирования, типа Oberon-2 или Component pascal и не парьте себе и людям моск. Под виндой можно юзать Zonnon. Серьёзно. Компиляторы и трансляторы доступны бесплатно.

Оффлайн Gekko

  • Участник
  • *
  • Сообщений: 222
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #21 : 07 Апреля 2012, 13:10:54 »
Возьмите нормальный язык программирования, типа Oberon-2 или Component pascal и не парьте себе и людям моск. Под виндой можно юзать Zonnon. Серьёзно. Компиляторы и трансляторы доступны бесплатно.

Oberon-2 нормальный язык программирования? :)) Я ток ща услышал про этот язык программирования и догадываюсь, что больше никогда в жизни о нем не услышу ))))
Xubuntu 12.04 LTS с Xfce 4.10

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #22 : 07 Апреля 2012, 14:42:39 »
Я (в самом упрощённом виде) показал, что фиксированные размерности: ввода, массивов, структур ... всего - это последнее дело, учитесь этого ограничения избегать.
А почему? И от задачи не зависит?

Нет, не зависит.
Это - работа с оператором, человеко-машинные интерфейсы (как-то хорошо было проработано IBM до уровня фирменных стандартов). Это: эргономика, психодинамика etc. - а к программированию и задаче это никак не относится:
- не заставляйте оператора вводить не содержательную для работы информацию (число далее вводимых чисел для сравнения);
- не заставляйте оператора вводить информацию, от которой он не может позже отказаться или её изменить...

P.S. те, кто хоть раз конфигурировал и собирал ядро Linux могут вспомнить этот ужас с:     
$ make config
- когда на 357-м вопросе конфигурирования оказывается, что на 32-й вопрос нужно было отвечать по-другому.
И разница, когда это делается:
$ make menuconfig
не говоря уже о
make xconfig
или
make gconfig

Lifewalker

  • Гость
Re: Небольшая проблема с программой на С
« Ответ #23 : 07 Апреля 2012, 14:43:45 »
Oberon-2 нормальный язык программирования? :))
Попытка потроллить не удалась.

Да, Оберон-2 - отличный язык программирования, на голову удобнее, безопаснее и проще Си или Си++. И уж куда как понятнее для разработки и сопровождения. Во всяком случае, не на Си++, а на Модуле, Обероне и Аде пишут программы для спутников и систем управления производством. На вашем Си++, Шарпах и Жабах всяких индусы пишут жалкие бизьнес-поделки. А пишут на них от безысходности и нежелания учиться, как нужно создавать реально сложные ответственные приложения. Примеры т.н. «индусского говнокода» можно найти в интернете тыщами штуков на раз.

Утрудивший себя разобраться в вопросе не будет сомневаться, прочие пусть помолчат.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #24 : 07 Апреля 2012, 14:53:34 »
Возьмите нормальный язык программирования, типа Oberon-2 или Component pascal и не парьте себе и людям моск. Под виндой можно юзать Zonnon. Серьёзно. Компиляторы и трансляторы доступны бесплатно.

Oberon-2 нормальный язык программирования? :)) Я ток ща услышал про этот язык программирования и догадываюсь
Цитировать
Хотелось бы обсуждать вкус устриц с тем, кто их пробовал.
(с)М.Жванецкий

Modula-2 - Oberon - Zenon - это последовательная линия дальнейшего развития линии Pascal языковой группы, причём эта линия развития производится CERN-ом и под контролем единоличного автора Pascal Никласа Вирта. С точки зрения теории языков и матлингвистики эта линия развития безупречна, и далеко опережает активно эксплуатирующиеся на сегодня языки "от сохи". Если они и не найдут широкого применения, то окажут огромное влияние на последующие языки программирования.

P.S. а от того, что вы "ток ща услышал"(с) - так их же не убудет?

P.P.S. вообще, из CERN-а много что исходило, что становилось потом естественным стандартом... например: HTML - WWW - и то, что вы сейчас сидите за экранами ;)   

P.P.P.S. это не сильно широко известно, но, например, на Modula-2 сделано (в Новосибирске, Томске) достаточно много вещей в российских аэрокосмических программах.


Пользователь решил продолжить мысль 07 Апреля 2012, 14:56:54:
Во всяком случае, не на Си++, а на Модуле, Обероне и Аде пишут программы для спутников и систем управления производством.

Ну, с Ada в этом ряду, скажем, вопрос сложный, не исключено, что эта линия идёт на спад, это были большие надежды, которые очень слабо оправдались.
« Последнее редактирование: 07 Апреля 2012, 14:56:54 от Olej »

Оффлайн lukinfore

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #25 : 07 Апреля 2012, 16:46:58 »
Код: (C) [Выделить]
#include <stdio.h>
int main(){
int a,max=0;
printf("Введите последовательность десятичных чисел\n");
while (scanf("%d",&a)!=EOF) if (a>max) max=a;
printf("Максимальное число - %d\n",max);
}
Цитата: man 3 scanf
RETURN VALUE
       These functions return the number of input items successfully matched and assigned, which can be fewer  than  provided for, or even zero in the event of an early matching failure.

       The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs.  EOF is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set indicate the error.
но ожидаемо (т.е. ввод не-числа или ^D оканчивает цикл) работает только по условию
Код: (C) [Выделить]
(scanf("%d",&a)==1)Что я перевожу не так? Что на вводе должно к EOF возвращаемому привести?

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #26 : 07 Апреля 2012, 18:42:08 »
Что на вводе должно к EOF возвращаемому привести?
enjoy :
int main( void ) {
   int a, max = 0;
   printf("Введите последовательность десятичных чисел\n");
   while( scanf( "%d", &a ) > 0 )
      if( a > max ) max = a;
   printf("Максимальное число - %d\n",max);
}
- хоть жмите ^D, хоть вводите нечисленные данные.

« Последнее редактирование: 07 Апреля 2012, 20:15:46 от Olej »

Оффлайн lukinfore

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #27 : 07 Апреля 2012, 22:27:16 »
enjoy what? Там больше нуля только единица и может быть, опять же если я правильно перевожу
Цитировать
return the number of input items
%d ведь одно.
Кодоразницы кроме пробелов не уловил, ответа тоже.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #28 : 07 Апреля 2012, 23:16:32 »
enjoy what? Там больше нуля только единица и может быть, опять же если я правильно перевожу
Значит неправильно ;)
... хотя? Переводите правильно, понимаете переведенное - неправильно. Там 1 как раз более чем достаточно.
(поставьте отладочный вывод результата scanf() и всё сами поймёте)

Вьюноши, я уже давно не показываю ни одного фрагмента кода, если я раньше его сам не проверил выполнением:

[olej@notebook scanf]$ ./scanf
Введите последовательность десятичных чисел
3 5 7 6 4
Максимальное число - 7
- там было введено не отображаемое ^D
[olej@notebook scanf]$ ./scanf
Введите последовательность десятичных чисел
1 3 5 4 2
фыва
Максимальное число - 5
- а здесь всё и так видно.
« Последнее редактирование: 07 Апреля 2012, 23:20:12 от Olej »

Оффлайн lukinfore

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Небольшая проблема с программой на С
« Ответ #29 : 08 Апреля 2012, 00:34:08 »
Кхм. Видимо нужно расширить:
Код: (C) [Выделить]
#include <stdio.h>
int main(){
int a,max=0;
printf("Введите последовательность десятичных чисел\n");
while (scanf("%d",&a)!=EOF) if (a>max) max=a;
printf("Максимальное число - %d\n",max);
}
Это работает при коррекции условия в цикле
Код: (C) [Выделить]
(scanf("%d",&a)==1)
и работает с ожидаемым эффектомlukinfore@:~/c_tests$./a.out
Введите последовательность десятичных чисел
-2 -4 -6
100500
42
r
Максимальное число - 100500
lukinfore@:~/c_tests$
Отсюда вывод: в приведенном коде scanf возвращает единицу для чисел, которая больше нуля, да. И да, в этом можно убедиться, добавив отладочный вывод результата scanf()
Вопрос: в каком случае scanf возвращает EOF?

 

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