2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 13:53 
Аватара пользователя
e2e4 в сообщении #243596 писал(а):
Придется либо вернуться к float, либо написать что-то типа:

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

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 13:56 
Еще придумал - рекомендуется после каждго 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 
Аватара пользователя
e2e4 в сообщении #243598 писал(а):
Еще придумал - рекомендуется после каждго scanf делать fflush (stdin) - для сброса всего того, что было забуферизированно в буфере консоли (если stdin связан с консолью) - вдруг Вы печатали быстрее, чем Ваша программа это обрабатывала?

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

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 14:20 
Аватара пользователя
Должен же быть спецификатор (хотя, сходу, три ссылки из гугла по scanf'у о нем промолчали) :)
Цитата:
после каждго scanf делать fflush (stdin)

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

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 14:21 
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 
Аватара пользователя
Не все понял.

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 16:57 
e2e4 в сообщении #243598 писал(а):
int13 писал(а):
Код:
#define EPS (1e-7)

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

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

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

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 17:23 
Аватара пользователя
Сегодня нет, завтра прикрутим - и хопа, всплывёт эзотерический глюк. Нафиг такое счастье.

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 18:00 
Аватара пользователя
А как грамотным языком сформулировать, исходя из уровней приоритетов, почему #define EPS (1e-7) лучше чем #define EPS 1e-7?
В скобках повышает приоритет? Я как-то читал что у операций есть чуть ли не 15 уровней приоритетов, оно тут как-то играет роль?
Или, имелось ввиду, просто, если мы где-то в программе будем использовать (1е-7)=EPS в таком выражении, что приоритеты распределятся по-другому, и сначала оно умножится на десять и вычтется семь?
Если так, то можно пример такого выражения?

 
 
 
 Re: Две задачи по Си (1 курс)
Сообщение15.09.2009, 18:47 
venco, int13, конкретно в данном случае вроде бы можно без скобок (чтобы это сказать, я 15 минут моделировал различные сочетания в компиляторе!), однако, как сказал ИСН, все может быть. В другом компиляторе, кстати, может быть банальная ошибка, и в таком выражении как 1e-7 вдруг включится разбор по приоритетам и хопа - фигня получится. Хотите всегда быть уверены в подобном коде, и не задумываться, когда скобки действительно необходимы - ставьте их всегда, хуже от этого точно не будет.

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

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

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

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

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

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

 
 
 [ Сообщений: 42 ]  На страницу Пред.  1, 2, 3


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group