Перейти к содержимому


Фото

Программирование


  • Please log in to reply
81 ответов в этой теме

#76 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 17 November 2010 - 18:23

WinterWolf, ты-то вещественные числа ввёл сам, конечно, какие там расхождения могут быть :) . А при вычислениях обычно возникают погрешности, другое дело - будут ли они влиять на результат в конкретном случае.

Насчет case тоже в недоумении... ни к селу ни к городу для такой задачи.

Tomb_and_Jerry, никогда не понимала преподавателей, не поощряющих применение знаний, которых он не давал сам (если это действительно знание, которое предполагает еще и понимание).

При желании она вполне могла назвать его и по-другому, а вместо логики использовать любой целочисленный тип (тогда в case были бы, например, 0 и 1).


Это неоптимальное использование памяти - для нолика и единицы огроменный тип использовать! =) Тогда уж в паскале диапазон лучше применить: var flag: 0..1.

Сообщение изменено: Invisible (17 November 2010 - 18:30)

"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#77 Invisible

Invisible

    Археолог

  • Validating
  • PipPipPip
  • 750 сообщений

Отправлено 17 November 2010 - 18:37

Даааа, что-то у меня с головой приключилось... Извините. Ступила :)

"Given enough eyeballs, all bugs are shallow". Э. Рэймонд


#78 NyK2104

NyK2104

    Профессор

  • Members2
  • PipPipPipPip
  • 1080 сообщений

Отправлено 08 February 2011 - 18:36

Отослал лично Андариель, но если вдруг её не будет, то помогите, пожалуйста!

1. для действительной (целой) таблицы x[1 : N] найти сумму всех элементов, которые повторяются

2.для действительной (целой) таблицы x[1 : M] найти произведение всех элементов


Better to be hated than loved for what you're not

#79 WinterWolf

WinterWolf

    Странный зверь

  • Members2
  • PipPipPipPip
  • 1036 сообщений

Отправлено 17 November 2010 - 18:30

WinterWolf, ты-то вещественные числа ввёл сам, конечно, какие там расхождения могут быть :) . А при вычислениях обычно возникают погрешности, другое дело - будут ли они влиять на результат в конкретном случае.

При вычислении функции, согласен, погрешности возникнуть могут, но x ведь мы по условию задачи задаем сами. :)

Это неоптимальное использование памяти - для нолика и единицы огроменный тип использовать! =) Тогда уж в паскале диапазон лучше применить: var flag: 0..1.

Согласен с той лишь оговоркой, что byte, как и boolean, занимает в памяти 1 байт. :)

Сообщение изменено: WinterWolf (17 November 2010 - 18:37)

Слова - лакмусовая бумажка, определяющая тип сознания.

#80 Andariel

Andariel

    Расхититель

  • Members2
  • PipPipPipPipPip
  • 6450 сообщений

Отправлено 08 February 2011 - 22:33

Я где-то тут, завтра сделаю, но от здравого соперничества не откажусь :)
ЗЫ. Кому интересно и кто не в курсе: язык - турбо паскаль 7

#81 Smile

Smile

    Исследователь

  • Members2
  • PipPip
  • 218 сообщений

Отправлено 29 December 2012 - 20:58

Всем привет =)

Значит так, я царапаю программульки на Visual C++ Express Editon 2008 при помощи замечательного учебника (вернее, учебников два: том 1 и том 2). Это для начала.
Идём дальше. Дошёл до темы "Стандартный файловый ввод - вывод". Речь идёт про операции последовательного чтения из файла. Вот текст программы:

Spoiler

В содержимое файла "MyText.txt" накатал следующее: "qwerty".

Всё понятно, всё ясно. Ещё: потом немножко дополнил текст под свой лад, но суть не изменилась:

Spoiler

Далее. Запускаю проект, Всё работает. Молодец, но не правильно. По идее, программа должна была вывести каждый символ из qwerty с новой строки. Да, программулька с этим справилась. Но вместо того, чтобы вывести "Нажмите любую клавишу, чтобы выйти: ", она выводит бесконечно вот это:

Покер фейс.

Ладно, в головёшке моей бестолковой вертятся следующие мысли:

EOF - это есть конец файла, типа енд оф файл, ну или проще говоря, константа "-1". Окей, а функция fgetc() возвращает значение символа и автоматом переводит указатель текущей позиции на следующий, а когда достигнет конца файла, то вернёт "-1". Хорошо, но у нас же dat = fgetc(pf). То есть, по идее, когда мы доползём до конца файла, то значение переменной dat должно быть -1, но в объявлении этой переменной ясно сказано, что это есть unsigned char, то есть, эта переменная принимает значение от 0 до 255. Ага, тогда: когда переменной dat посылается значение "-1", то эта переменная принимает значение 255 (логично, кстати, о такой интересной штучке про переменную типа char подробнее было описано главой назад). А эта переменная из таблицы ASCII есть буковка "я". Тогда вот программа и выводит эту зловещую букву бесконечно раз. Ладно - ладно. Тогда я совсем чуть - чуть поменял код: вместо строки while ((dat = fgetc(pf))!= EOF) я написал while ((dat = fgetc(pf))!= 255). Вроде бы всё нормально, программа теперь полноценно идёт, но блин. А если в файле будет бувка "я", то программа тупо закончит выполнять цикл, ибо "я" есть 255... Нет, так не идёт. На свой страх и риск я вместо "unsigned char dat;" написал "int dat;", ибо теперь -1 это и есть -1 (тупо объяснил =D). В общем это я сделал из - за вот этого (выделено красным): printf ("Байт на %d позиции в файле = %c\n", pos, dat);. То есть, в итоге вы всё равно выведем буковку))) А вот собственно и вопрос: а так естественно/ я хоть правильно сделал? И почему автор написал программу именно так (в смысле, как в самом начале, не предусмотрев зацикливания)? В итоге у меня такой код:

Spoiler


Сообщение изменено: Smile (29 December 2012 - 21:04)


#82 Robert Langdon

Robert Langdon

    Археолог

  • Members2
  • PipPipPip
  • 918 сообщений

Отправлено 30 December 2012 - 00:06

Ну во первых респект и уважуха за старания )))

 

Сразу отвечу на вопрос: да, сделал всё правильно, так делать вполне можно и допустимо.

 

Теперь расскажу, что я бы делал немного по-другому:

1) Если обратиться к документации http://msdn.microsof...ibrary/c7sskzc1(v=vs.71).aspx , то видно, что функция возвращет int, то бишь 32-битное значение со знаком, тогда как один символ в ASCII-кодировке - это 8 бит (хотя например fgetwc вернет двухбайтный символ или даже символ из нескольких байт). По сути такая избыточность введена лишь для того, чтобы была возможность вернуть EOF, не заменяя никакой символ (как букву "я" в твоём случае). Таким образом, наиболее правильным вариантом мне видится сначала проверка символа на eof как int, а потом, если символ не оказался EOF, то его можно преобразовать к unsigned char и работать с ним как изначально было задумано.

2) как видно в том же примере в документации к fgetc - там для проверки на eof используется (на мой взгляд более наглядное и правильное) feof(FILE*), которое вернёт не ноль, если достигнут конец файла

3) в образовательных целях fgetc простая и понятная функция, однако на практике она применяется довольно редко для чтения информации из файлов из-за низкой производительности. То есть если например написать функцию копирования файла через функции fgetc и fputc, то с большой вероятностью копирование файла будет выполняться на порядок (если не на два) медленее, чем это может сделать например операционная система. Чтобы чтение выполнялось быстро надо читать не по байту, а большими кусками (например по несколько килобайт). И тут уже надо читать про функцию fread http://msdn.microsof...ibrary/kt0etdcs(v=vs.71).aspx






2 посетителей читают эту тему

0 пользователей, 2 гостей, 0 скрытых