Помогите! Пожалуйста с типизированным файлом: Задание: Создать исходный целочисленный файл. Сформировать новый файл, содержащий номера позиций в исходном файле в порядке возрастания значений чисел, стоящих на соответствующих позициях.
Очень надо - последняя прога, а я не понимаю как её сделать
Bokul
18.05.2006 6:42
Если честно, то я почти не понял задание задачи, какой-то набор слов... Пришлось самому придумывать... Попробую представить решения чуть в другой форме: каждому елементу файла соответствует свой индекс, нам надо отсортировать файл по возростанию, но потом результат представить не в виде отсортирвого файла, а в види индексов ссылающихся на начальное положения етих елементов.
uses crt; const n=10; var f,res: file of integer; i,j,buf:integer; mas:array[1..n] of integer; index:array[1..n] of integer; begin clrscr; assign(f,'с:\1.txt'); rewrite(f);
randomize; for i:=1 to n do {создаем файл целых чисел, и сразу заполняем массивы} begin mas[i]:=random(10); write(f,mas[i]); index[i]:=i; end;
for i:=1 to n do for j:=n downto i+1 do if mas[pred(j)] > mas[j] then begin buf:=index[pred(j)]; index[pred(j)]:=index[j]; index[j]:=buf; end;
assign(res,'с:\2.txt'); rewrite(res); for i:=1 to n do write(res,index[i]);
readln; close(f); close(res); end.
И последнее: Правильно ли я заполнял массивы, или их надо заполнять через файл, тоесть открывать файл F и считовать елементы массива?
Lapp
18.05.2006 10:20
Bokul, понял ты все правильно, судя по словам и примерам (кстати, какие тут могут быть варианты? Условие написано кристально ясно), а вот решение у тебя неверное.. Ты его проверял?
Ошибка в том, что при "сортировке" ты перекладываешь индексы, а значения самого массива не перекладываешь. Реальной сортировки не получается (потому я взял это слово в кавычки), и результат неправильный.
Есть еще пара замечаний.. 1. Зачем тащить за собой CRT? Для ClrScr? Но ты даже ничего не печатаешь! 2. Не рекомендую использовать переменную с именем Index. 3. Зачем давать типизированному (integer) файлу расширение .txt ? 4. Последнее совсем несущественное: создавая файл, не надо забывать, что целые бывают отрицательными..
А в остальном все вроде верно.. Ниже привожу исправленный (и проверенный ) код.
const n=10; var f,res: file of integer; i,j,buf:integer; mas,ind:array[1..n] of integer;
begin assign(f,'shikaka1.int'); rewrite(f); for i:=1 to n do begin {создаем файл целых чисел, и сразу заполняем массивы} mas[i]:=random(20)-10; write(f,mas[i]); ind[i]:=i; end; close(f); for i:=1 to n do Write(mas[i]:3); WriteLn; for i:=1 to n do Write(ind[i]:3); WriteLn; for i:=1 to n do for j:=n downto i+1 do if mas[pred(j)] > mas[j] then begin buf:=mas[pred(j)]; {Сортировка массива} mas[pred(j)]:=mas[j]; mas[j]:=buf; buf:=ind[pred(j)]; {Сортировка индексов} ind[pred(j)]:=ind[j]; ind[j]:=buf; end; for i:=1 to n do Write(ind[i]:3); WriteLn; assign(res,'shikaka2.int'); rewrite(res); for i:=1 to n do write(res,ind[i]); {Пишем второй файл} close(res); readln; end.
Bokul
18.05.2006 10:36
Цитата
Ты его проверял?
Конечно да. Ошибки появляются уже на форуме - после коректировки...
Цитата
1. Зачем тащить за собой CRT? Для ClrScr? Но ты даже ничего не печатаешь!
Печятал когда программу проверял...
Цитата
2. Не рекомендую использовать переменную с именем Index.
Почему?
Цитата
3. Зачем давать типизированному (integer) файлу расширение .txt ?
Какая разница?
Цитата
Ошибка в том, что при "сортировке" ты перекладываешь индексы, а значения самого массива не перекладываешь. Реальной сортировки не получается (потому я взял это слово в кавычки), и результат неправильный.
Так и было до того как я выложил исходник, потом начал вырезать части, и сортировку массива тоже вырезал не подумав
Lapp
18.05.2006 11:14
Цитата(Bokul @ 18.05.2006 7:36)
> Ты его проверял? Конечно да. Ошибки появляются уже на форуме - после коректировки...
Какой корректировки??
Цитата(Bokul @ 18.05.2006 7:36)
> 1. Зачем тащить за собой CRT? Для ClrScr? Но ты даже ничего не печатаешь! Печятал когда программу проверял...
Для отладочной печати обычно хватает Write и WriteLn (как у меня и сделано)..
Цитата(Bokul @ 18.05.2006 7:36)
> 2. Не рекомендую использовать переменную с именем Index. Почему?
Потому что это зарезервированное слово языка Pascal.
Это так называемая неявная договоренность, стандарт de facto. Видя такое расширение, человек обычно кликает по нему - и файл открывается в ноутпаде. И что мы там увидим?.. Такие вещи имеет смысл учитывать.
Цитата(Bokul @ 18.05.2006 7:36)
Так и было до того как я выложил исходник, потом начал вырезать части, и сортировку массива тоже вырезал не подумав
Да нечего оправдываться . Какая разница, почему именно ошибка?... Важно, есть она или нет - верно? Все О'kay.
volvo
18.05.2006 12:14
lapp, у тебя в коде есть конструкция, которая при запуске программы, откомпилированной под Турбо Паскалем с установленной опцией "Range Checking" выдаст "RunTime Error 201" (эта опция, кстати, устанавливается по умолчанию, так что вероятность получения подобной ошибки довольно велика)... Вот здесь:
for i:=1 to n do begin mas[i]:=random(20)-10; { <--- !!! Range Check Error !!! } write(f,mas[i]); ind[i]:=i; end;
Для устранения ошибки - делаем так:
for i:=1 to n do begin mas[i]:=Integer(random(20))-10; { <--- Type Cast, и все нормально } write(f,mas[i]); ind[i]:=i; end;
Lapp
19.05.2006 2:54
Цитата(volvo @ 18.05.2006 9:14)
под Турбо Паскалем с установленной опцией "Range Checking" выдаст "RunTime Error 201"
mas[i]:=random(20)-10; { <--- !!! Range Check Error !!! }
Да, верно.. Расслабил меня FPC
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.