12.03.2012, 00:51 | #1 (permalink) |
Member
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Работа с числовым файлом
1)Во втором листинге есть ошибка,но я даже СМОТРЯ на правильный код, не могу сделать как надо, я уже просто люто бешено... найдите и объясните что не так 2)и ещё почему в первом листинге в 29 строке конец для цикла for выбран "filesize(f)-1" откуда и зачем этот -1? собственно вот рабочая программа: [pascal] program ABC; uses crt; var b,Imin,Imax,Max,Min,i,left,right,S:integer; f:file of integer; begin clrscr; assign(f,'f.dat'); writeLn('введите первую компоненту файла f (признак конца ввода: "555")'); //ввод файла rewrite(f); readLn(b); i:=1; //номер компоненты файла while b<>555 do begin write(f,b); inc(i); writeLn('введите ',i,'-ую компоненту файла f'); readLn(b); end; clrscr; reset(f); writeLn('файл f до изменения:'); read(f,min);//читаем первое число, оно пока мин и макс} write(min:5); max:=min; imin:=0; imax:=0; for i:=1 to filesize(f)-1 do begin read(f,b); write(b:5); if b>max then begin max:=b; imax:=i;{макс} end; if b<min then begin min:=b; imin:=i;{мин} end; end; writeLn; close(f); reset(f); if imin<imax then //порядок begin left:=imin; right:=imax; end else begin left:=imax; right:=imin end; s:=0; for i:=left+1 to right-1 do//считаем сумму begin seek(f,i); read(f,b); s:=s+b; end; close(f); writeln('Сумма=',s); reset(f); for i:=left+1 to right-1 do // вставляем сумму begin seek(f,i); write(f,s); end; close(f); reset(f); writeLn('файл f после изменения:'); while not EOF(f) do begin read(f,b); write(b:5); end; readln; close(f); end. [/pascal] И вот второй вариант, проблема помечена [pascal] program ABC; var a,b,i,maxin,minin,max,min,sum,right,left :integer; f:file of integer; begin assign(f,'f.dat'); writeLn('введите первую компоненту файла f (признак конца ввода: "555")'); //ввод файла rewrite(f); readLn(b); i:=1; //номер компоненты файла while b<>555 do begin write(f,b); inc(i); writeLn('введите ',i,'-ую компоненту файла f'); readLn(b); end; reset(f); //вывод файла до изменения writeLn('файл f до изменения:'); while not EOF(f) do begin read(f,b); write(b:5); end; writeLn; reset(f); // поиск максимума while not EOF(f) do begin read(f,b); if b>max then begin max:=b; maxin:=filePos(f); end; end; reset(f); // поиск минимума while not EOF(f) do begin read(f,b); if b<min then begin min:=b; minin:=filePos(f); end; end; write('minin=',minin,'maxin=',maxin); writeln; if maxin>minin then //очередь begin left:=minin; right:=maxin; end else begin left:=maxin; right:=minin; end; sum:=0; reset(f); for i:=left+1 to right-1 do //ЗДЕСЬ ПРОБЛЕМА !!!!!!!!!!!!!! begin seek(f,i); read(f,b); sum:=sum+b; end; write(sum:5); //ВЫХОДИТ 0-ЛЮТО БЕШЕНО НЕНАВИЖУ close(f); end. [/pascal] |
12.03.2012, 00:51 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Рекомендую не терять времени, а ознакомиться с похожими топиками База данных одним файлом Операции с файлом Работа с текстовым файлом, Pascal Проблема с файлом |
12.03.2012, 00:54 | #2 (permalink) |
Member
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
где кнопка редактировать?
- Выходит не 0, а первый положительный(или если их нет первый отрицательный) + левая граница диапазона, как я понял. т.е. вообще бред. |
12.03.2012, 10:53 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Дорогой друг, прежде всего - позволю себе дать Вам один совет, основанный на, увы, собственном горьком опыте. Много лет назад, когда я начинал заниматься программированием, я также эмоционально реагировал на неподатливые к выявлению ошибки. Кончилось это плачевно - визитами к врачам. С тех пор я сказал себе раз и навсегда:
"Я - программист, а следовательно, могу отладить любую, по крайней мере собственную, программу и найти любую ошибку, нужно лишь спокойно и не торопясь взяться за дело, и всё получится". Так оно и было. Чего и Вам от души советую. Теперь по Вашей программе. Ниже приведен полностью отлаженный листинг. Да, есть несколько ошибок. В частности, обратите внимание: оператор Seek(f,i) нумерует компоненты файла не с 1, а с 0, и это надо учитывать. Что касается нулевой суммы, то она возникает, если максимальный и минимальный элемент (поиск которых я, кстати, загнал в один цикл) расположены в соседних позициях - так и быть должно. Ну или если элементы сложатся так, что получится 0 - тоже возможно. Кроме того, Вы не задали исходных значений максимума и минимума - тоже ошибка. Ну, вроде, так, в основном, всё. Код:
program ABC; var a,b,i,maxin,minin,max,min,sum,right,left :integer; f,f1:file of integer; begin assign(f,'f.dat'); write('введите первую компоненту файла f (признак конца ввода: "555") '); //ввод файла rewrite(f); readLn(b); i:=1; //номер компоненты файла while b<>555 do begin write(f,b); inc(i); write('введите ',i:2,'-ую компоненту файла f '); readLn(b); end; reset(f); //вывод файла до изменения writeLn('файл f до изменения:'); while not EOF(f) do begin read(f,b); write(b:5); end; writeLn; max:=-32000; min:=32000; reset(f); // поиск максимума и минимума while not EOF(f) do begin read(f,b); if b>max then begin max:=b; maxin:=filePos(f); end; if b<min then begin min:=b; minin:=filePos(f); end; end; writeln('minin= ',minin,' maxin= ',maxin); sum:=0; if maxin>minin then //очередь begin left:=minin; right:=maxin; end else begin left:=maxin; right:=minin; end; for i:=left+1 to right-1 do begin seek(f,i-1); read(f,b); sum:=sum+b; end; writeln('Sum= ',sum:5); close(f); writeLn('файл f после изменения:'); reset(f); assign(f1,'f1.dat'); rewrite(f1); i:=0; while not EOF(f) do begin Inc(i); read(f,b); if (i<=left) or (i>=right) then write(f1,b) else write(f1,Sum); end; close(f); close(f1); reset(f1); rewrite(f); while not EOF(f1) do begin read(f1,b); write(f,b) end; close(f); close(f1); erase(f1); reset(f); while not EOF(f) do begin read(f,b); write(b:5); end; readln end. |
12.03.2012, 18:00 | #5 (permalink) |
Member
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
вы несете светлую толику разума в этот мир, я вас понимаю
однако я учусь не на компьютерщика, а на управленца) |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
13.03.2012, 01:07 | #6 (permalink) |
Member
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Вопросики:
что значит конструкция в конце writeLn('файл f после изменения:'); reset(f); assign(f1,'f1.dat'); rewrite(f1); i:=0; ~~~~~~~~~~~~~~~~` close(f); close(f1); reset(f1); rewrite(f); while not EOF(f1) do begin read(f1,b); write(f,b) end; close(f); close(f1); erase(f1); reset(f); while not EOF(f) do begin read(f,b); write(b:5); end; readln end. // т.е. зачем вы f продублировали в f1? ведь если в массиве не будет изменений(замен на сумму) то можно повторно его же и вывести... зачем эти reset close постоянно использовать? в общем там какоето хитросплетение если то, то одно удаляем(эрейзом) и тд... зачем так намудрёно, объясните, пожалст |
13.03.2012, 10:42 | #7 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Перво-наперво, имеем мы тут дело не с массивами, а с файлами. С массивами было бы проще. Напомню, что в задаче требуется преобразовать именно исходный файл и результат вывести на экран. Конечно, можно было бы считать данные исходного файла в массив, дальше в массиве заменить в нужном диапазоне исходные элементы сосчитанной суммой, а потом перезаписать файл. Но у меня предлагается решение без перехода к массивам. Итак, пусть элементы исходного файла f с номерами от i1 до i2 требуется заменить значениями суммы S. Решено так: 1. Открывается на запись второй файл по имени f1. 2. Исходный файл f открывается на чтение. 3. Организуется цикл: из файла f считывается элемент, если его номер (позиция) лежит вне диапазона i1..i2, то он записывается в файл f1, если внутри - то в f1 записывается S. 4. Оба файла закрываются. 5. Файл f1 открывается на чтение, файл f - на запись. 6. Содержимое файла f1 переносится в файл f. 7. Оба файла закрываются. 8. Файл f1 уничтожается - он больше не нужен. 9. Содержимое файла f выводится на экран. Таким образом, условие задачи выполнено в точности: содержимое файла f преобразовано по требуемому алгоритму, причем без помощи массивов. P.S. Что-то я не понял вот этой сентенции: Цитата:
|
||
14.03.2012, 21:10 | #8 (permalink) | |
Member
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
|
|
15.03.2012, 10:27 | #10 (permalink) |
Member
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
ничего страшного, главное я же понял.
спс) |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|