2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 13:53 
Заслуженный участник
Аватара пользователя


06/10/08
6422
e2e4 в сообщении #243596 писал(а):
Придется либо вернуться к float, либо написать что-то типа:

Зачем??? Спецификатор формата double - %lf

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 13:56 


21/03/06
1545
Москва
Еще придумал - рекомендуется после каждго scanf делать fflush (stdin) - для сброса всего того, что было забуферизированно в буфере консоли (если stdin связан с консолью) - вдруг Вы печатали быстрее, чем Ваша программа это обрабатывала? :)

-- Вт сен 15, 2009 13:56:55 --

Xaositect писал(а):
Зачем??? Спецификатор формата double - %lf

Спасибо, не знал.

-- Вт сен 15, 2009 14:00:35 --

int13 писал(а):
Код:
#define EPS (1e-7)

Ээ.. Не совсем...

Посмотрите, например, здесь.

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 14:10 
Заслуженный участник
Аватара пользователя


06/10/08
6422
e2e4 в сообщении #243598 писал(а):
Еще придумал - рекомендуется после каждго scanf делать fflush (stdin) - для сброса всего того, что было забуферизированно в буфере консоли (если stdin связан с консолью) - вдруг Вы печатали быстрее, чем Ваша программа это обрабатывала?

Плохой совет.
http://www.gidnetwork.com/b-57.html

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 14:20 
Аватара пользователя


05/12/06
126
Нижний Новгород
Должен же быть спецификатор (хотя, сходу, три ссылки из гугла по scanf'у о нем промолчали) :)
Цитата:
после каждго scanf делать fflush (stdin)

Ну это наверное уж совсем лишнее :) Препод подумает что я хочу его загрузить :))
Читаю про #define

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 14:21 


21/03/06
1545
Москва
Xaositect в сообщении #243599 писал(а):
e2e4 в сообщении #243598 писал(а):
Еще придумал - рекомендуется после каждго scanf делать fflush (stdin) - для сброса всего того, что было забуферизированно в буфере консоли (если stdin связан с консолью) - вдруг Вы печатали быстрее, чем Ваша программа это обрабатывала?

Плохой совет.
http://www.gidnetwork.com/b-57.html


Действительно плохой. В Builder 6.0 по поводу fflush написано следующее:

Цитата:
Flushes a stream.
If the given stream has buffered output fflush writes the output for stream to the associated file.
The stream remains open after fflush has executed. fflush has no effect on an unbuffered stream.

Т.е. действительно, ничего не сказано про input stream. Однако, в том же билдере в примере на использование scanf встречаем:

Код:
...
printf("\n\nPlease enter a label for the chart: ");
scanf("%20s", label);
fflush(stdin);  /* flush the input stream in case of bad input */
...

Что в очередной раз доказывает кривость Builder'а.

За информацию спасибо, сам я этого не знал. Хотя, в полном согласии с
Цитата:
So what do you do if you can't use fflush()? Well, my first recommendation is not to use functions like scanf()* that love leaving junk in the input buffer. Find other ways to read your input and don't rely on functions that have unexpected anomalies or seemingly inconsistent results. Ouside of that, start checking returns from all your I/O functions (including scanf()) and start studying what functions actually do when input is not exactly as expected.

Your best bet, and I know this is beyond beginners so it's something to look forward to, you need to read a character buffer and parse the input yourself. There's only so much intelligence a canned C/C++ function can have. Until you can do this, you won't easily be able to create bulletproof input. Sorry.

функцией scanf не пользовался никогда в коммерческих проектах. Что-то подсознательное заставляло писать собственный простенький парсер :).

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 16:10 
Аватара пользователя


05/12/06
126
Нижний Новгород
Не все понял.

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 16:57 
Заслуженный участник


04/05/09
4582
e2e4 в сообщении #243598 писал(а):
int13 писал(а):
Код:
#define EPS (1e-7)

Ээ.. Не совсем...

Посмотрите, например, здесь.
Посмотрел, всё равно не понятно, почему
Код:
#define EPS (1e-7)
лучше, чем
Код:
#define EPS 1e-7

Может, объясните? Про приоритет операций в выражениях можно не упоминать, их в нашем примере нет.

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 17:23 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Сегодня нет, завтра прикрутим - и хопа, всплывёт эзотерический глюк. Нафиг такое счастье.

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 18:00 
Аватара пользователя


05/12/06
126
Нижний Новгород
А как грамотным языком сформулировать, исходя из уровней приоритетов, почему #define EPS (1e-7) лучше чем #define EPS 1e-7?
В скобках повышает приоритет? Я как-то читал что у операций есть чуть ли не 15 уровней приоритетов, оно тут как-то играет роль?
Или, имелось ввиду, просто, если мы где-то в программе будем использовать (1е-7)=EPS в таком выражении, что приоритеты распределятся по-другому, и сначала оно умножится на десять и вычтется семь?
Если так, то можно пример такого выражения?

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 18:47 


21/03/06
1545
Москва
venco, int13, конкретно в данном случае вроде бы можно без скобок (чтобы это сказать, я 15 минут моделировал различные сочетания в компиляторе!), однако, как сказал ИСН, все может быть. В другом компиляторе, кстати, может быть банальная ошибка, и в таком выражении как 1e-7 вдруг включится разбор по приоритетам и хопа - фигня получится. Хотите всегда быть уверены в подобном коде, и не задумываться, когда скобки действительно необходимы - ставьте их всегда, хуже от этого точно не будет.

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 21:05 
Заслуженный участник


04/05/09
4582
e2e4 в сообщении #243647 писал(а):
в таком выражении как 1e-7 вдруг включится разбор по приоритетам
В каком выражении? Приоритеты чего? Здесь нет операций, это просто одно неделимое число, такое же как 0x123, или 22ul.

 Профиль  
                  
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 21:20 


21/03/06
1545
Москва
venco в сообщении #243668 писал(а):
e2e4 в сообщении #243647 писал(а):
в таком выражении как 1e-7 вдруг включится разбор по приоритетам
В каком выражении? Приоритеты чего? Здесь нет операций, это просто одно неделимое число, такое же как 0x123, или 22ul.

Знак "минус" есть? Есть. Буква какая-то есть? Есть. Подозрительно, лучше заключить в скобки.

На самом деле предвижу, что Вы скажете, но свое мнение я уже привел - чтобы не забивать себе мозги, заключайте все #define в скобки и все будет ок. Точно так же как рекомендуется ставить фигурные скобки после каждого if...else if...else, даже если там только 1 оператор. Еще совет - всегда делать явное преобразование типов, если не уверен. За каждой подобной рекомендацией - потраченные зазря часы и дни на отладку. Хотя, может быть, новичкам будет полезко кое-что испытать на своей шкуре, хз.

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

Си/Си++ - уродский синтаксис. Live with it. :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group