Типизированные файлы |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Типизированные файлы |
mfractus |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: 0 |
Доброго времени суток! Прошу помощи в решении задачи. Заранее спасибо!
Текст задачи. Сформировать файл G. Определить сумму и произведение наибольшего и наименьшего из значений компонент. Заменить значением суммы первую и последнюю компоненты, а на значение произведения – увеличить каждую третью компоненту файла. Файл вывести до и после преобразования. |
volvo |
Сообщение
#2
|
Гость |
Цитата Прошу помощи в решении задачи. "Помощь" и "Получение готового кода" - это разные вещи, если что. Начинай, говори, что сделал, что и где непонятно, подскажем. А делать за тебя - извини, это никому не сдалось... |
mfractus |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: 0 |
"Помощь" и "Получение готового кода" - это разные вещи, если что. Начинай, говори, что сделал, что и где непонятно, подскажем. А делать за тебя - извини, это никому не сдалось... Здравствуйте! Я разграничиваю эти понятия и прошу именно помощи. Program Files_1;Дальше, так думаю, необходимо найти экстремельные значения. По аналогии с массивами сделать не удалось, не сумел. |
mfractus |
Сообщение
#4
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: 0 |
Вот что еще написал.
read(F,Min); Ошибка: Попытка чтения за концом файла. Вот на этой стороке read(F,buf); |
Lapp |
Сообщение
#5
|
|||
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Ошибка: Попытка чтения за концом файла. Вот на этой стороке read(F,buf); Я правильно понял, что эти два куска нужно соединить? Если да, то..Ты сначала читаешь файл до конца вот тут: while not EOF(F) do read(F,Min);- а потом пытаешься читать дальше. Конечно, будет ошибка. Я бы искал max и min как-то так: (добавлено: тут ошибка, читайте дальше сообщение volvo) reset(f); А дальше собствено замена, примерно вот так: s:= max+min; Еще замечу, что условие не вполне однозначное. Если последняя компонента в файле окажется еще и "каждой третьей", то результат зависит от порядка выполнения операций. Я в приведенном фрагменте сделал тот порядок, который в условии (не факт, что преп не придерется)). Вникни. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
mfractus |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: 0 |
Спасибо за ответ! Да, два куска соединить. Вот я тут работал с другой программой, которая вычисляет сумму и произведение.
Текст программы: Код [code=pas] Program Files_0; var F: file of integer; S,P, buf:integer; begin Assign(F,'.dat'); rewrite(F); writeLn('Введите первую компоненту файла'); readLn(buf); while buf<>999 do begin write(F,buf); writeLn('Введите следующую компоненту:'); readLn(buf); end; S:=0; P:=1; reset(F); while not EOF(F) do begin read(F,buf); S:=S+buf; P:=P*buf; end; writeLn('Найденная сумма равна:',S); writeLn('Найденное произведение равно:',P); close(F); end. Возник вопрос, read(F,buf); тоже стоит после while not EOF(F) do, тем не менее программа исправно работает. В чем тут дело не пойму. Сообщение отредактировано: mfractus - |
volvo |
Сообщение
#7
|
Гость |
Цитата Возник вопрос, read(F,buf); тоже стоит после while not EOF(F) do, тем не менее программа исправно работает. В чем тут дело не пойму. При чем тут, где стоит Read? Как только дойдешь до конца файла, цикл While тут же завершится, то есть если сейчас ты прочел последнюю запись, то следующая итерация начнется с проверки EOF(f). Проверка вернет "ложь", и цикл прекратит выполняться, ты сразу перейдешь к строке, печатающей результаты.А ты в приведенном выше фрагменте нигде на EOF не проверял, отсюда и ошибка. Да, да... Даже если тебе и кажется, что ее там нет: твои ощущения - очень ненадежная штука; оставь заботу о том, чтоб не читать за концом файла, компилятору. У него это получится лучше. И, наконец, пользуйся комбобоксом CODE, неужели ты действительно не видишь разницы, как выглядит код с подветкой, а как - без нее? Добавлено через 8 мин. И потом. Почему вы так любите делать ненужную работу? Первая компонента файла отличается от всех остальных? За что ей такая честь, быть прочитанной отдельно, вне цикла? Если я сделаю цикл: Min := maxint; Imin := -1;, я что-то упущу? Нет, мой код будет выполняться ровно так, как и должен. Зато ошибки не будет. |
TarasBer |
Сообщение
#8
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Возник вопрос, read(F,buf); тоже стоит после while not EOF(F) do, тем не менее программа исправно работает. В чем тут дело не пойму.
read(F, buf) стоит внутри цикла, в условии которого стоит while not EOF(F). А то, что оно по тексту после - ну базовые управляющие структуры надо же знать, что после чего там должно выполняться. -------------------- |
Lapp |
Сообщение
#9
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Зато ошибки не будет. Совершенно согласен, +1. Сглупил я, однако )). (Добавлено: ) хотя, else я все же оставил бы.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
Сообщение
#10
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> За что ей такая честь, быть прочитанной отдельно, вне цикла?
Для инициализации максимума и минимума первым элементом. Для целых чисел можно обойтись -MaxInt-1, а для вещественных или строк или ещё чего придётся уже делать иначе. Но выносить первый элемент наружу всё равно не надо.
-------------------- |
Lapp |
Сообщение
#11
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Интересно, как иногда совсем несложный вопрос становится интересным предметом для обсуждения..
Во-первых, должен признать, что вот тут: (Добавлено: ) хотя, else я все же оставил бы.. - я снова ощибся. Если вносить чтение первого элемента в цикл, то ELSE применять нельзя. Извиняюсь. Но это наводит на другие мысли (см. ниже)..Для целых чисел можно обойтись -MaxInt-1, а для вещественных или строк или ещё чего придётся уже делать иначе. Но выносить первый элемент наружу всё равно не надо. first := true; А мне не нравится добавление новой (логической) переменной и проверка ее на каждом проходе цикла.. Короче, я повторюсь, что в первом моем фрагменте кода есть ошибка, и ее необходимо исправить. Предложено два варианта, но в обоих есть некоторый недостаток - трата времени в цикле. Если мой код подправить вот так: reset(f); - то, может, с потерей элегантности, исполняться он будет более эффективно . Лишний код - не всегда лишняя работа (компьютера) . И не надо забывать, что после нахождения макс и мин все равно придется обрабатывать ситуацию с пустым файлом при обработке результатов (см. задание). А в этом варианте она обрабатывается за один раз.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
Сообщение
#12
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> - то, может, с потерей элегантности, исполняться он будет более эффективно
Соглашусь, что иногда и так приходится делать. (хотя в данном случае, при работе с файлами, смысла нет) -------------------- |
mfractus |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: 0 |
Спасибо всем, кто принял участие в дискуссии! А оператор close(F); один раз должен встречаться в программе?
Добавлено через 3 мин. Как участок кода вставить в исходный? Код s:= max+min; p:= max*min; reset(f); write(f,s); seek(f,l-1); write(f,s); l:= filesize(f); n:=2; while n<l do begin seek(f,n); read(f,a); seek(f,n); write(f,a+p); Inc(n,3) end; close(f); Вот сюда: Код Program Files_1; var F: file of integer; buf,Imin,Imax,Min,Max,i:integer; begin Assign(F,'.dat'); rewrite(F); writeln('Введите компоненты файла целые числа, окончание ввода 999:'); while buf<>999 do begin readLn(buf); if buf<>999 then write(F,buf); end; reset(F); writeln('Исходный файл:'); read(F,Min); write(Min,' '); Max:=Min; Imin:=0; Imax:=0; for i:=1 to filesize(F)-1 do begin read(F,buf); write(buf,' '); if buf>Max then begin Max:=buf; Imax:=i; end; if buf<Min then begin Min:=buf; Imin:=i; end; end; close(F); writeln; writeLn('Наибольшее из значений компонент=',Max); writeLn('Наименьшее из значений компонент=',Min); end. |
mfractus |
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 26 Пол: Мужской Репутация: 0 |
Вот что получилось, но где то ошибка, точнее код - одна сплошная ошибка
Program Files_1; |
Текстовая версия | 20.04.2024 21:11 |