File62. Дан символьный файл. Упорядочить его элементы по возрастанию их кодов.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
program File62; var S: String; F_in,F_out: File of Char; C,CMin,CLast:Char; NumC,i,Space:integer; begin Write('File: '); Readln(S); Assign(F_in,S); Assign(F_out,'~'+S); ReWrite(F_out); Reset(F_in); Read(F_in,CMin); while (not eof(F_in)) do begin Read(F_in,C); if (CMin>C) then begin CMin:=C; NumC:=0; end; if CMin=C then inc(NumC); end; CLast:=char(ord(CMin)-1); while (CLast<>CMin) do begin for i:=1 to NumC do Write(F_out,CMin); CLast:=CMin; Close(F_in); Reset(F_in); while (not eof(F_in)) do begin Read(F_in,C); if (CLast<C) and ((CMin>C) or (CMin=CLast)) then begin CMin:=C; NumC:=0; end; if CMin=C then inc(NumC); end; end; Close(F_out); Close(F_in); Erase(F_in); Rename(F_out,S); end. |
Пояснение к коду:
1)
1 2 3 4 5 6 |
Write('File: '); Readln(S); Assign(F_in,S); Assign(F_out,'~'+S); ReWrite(F_out); |
Здесь мы вводим название файла, к которому будет применена сортировка, а так же создаём дополнительный файл для записи промежуточных значений, с именем как наш файл только в нале будет стоять знак ‘~’/
2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Reset(F_in); Read(F_in,CMin); while (not eof(F_in)) do begin Read(F_in,C); if (CMin>C) then begin CMin:=C; NumC:=0; end; if CMin=C then inc(NumC); end; CLast:=char(ord(CMin)-1); |
Суть этого действия найти символ с самым маленьким кодом в ASCII.
1 2 |
Reset(F_in); Read(F_in,CMin); |
Для этого мы открываем файл F_in на чтение. И читаем первый символ. Который будем считать пока символом с самым маленьким ASCII кодом.
1 |
while (not eof(F_in)) do |
Бежим до конца файла.
1 |
Read(F_in,C); |
Читаем элемент из файла.
1 2 3 4 5 |
if (CMin>C) then begin CMin:=C; NumC:=0; end; |
если текущий символ меньше нашего CMin, то меняем CMin и обнуляем кол-во таких символов.
1 |
if CMin=C then inc(NumC); |
если текущий символ совпадает с CMin увеличиваем счётчик символов NumC на 1.
1 |
CLast:=char(ord(CMin)-1); |
Говорим, что последний символ который мы записали во временный файл CLast на единицу меньше, чем текущий максимальный. На самом деле мы пока ещё ничего не записывали в файл. И это действие нам нужно, что бы мы могли войти в цикл ниже.
3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
while (CLast<>CMin) do begin for i:=1 to NumC do Write(F_out,CMin); CLast:=CMin; Close(F_in); Reset(F_in); while (not eof(F_in)) do begin Read(F_in,C); if (CLast<C) and ((CMin>C) or (CMin=CLast)) then begin CMin:=C; NumC:=0; end; if CMin=C then inc(NumC); end; end; |
Цикл в котором мы будем бегать по исходному файлу и искать символ, который мы ещё не записывали во временный файл, и который является наименьшим в таблице ASCII. А так же их кол-во.
1 |
while (CLast<>CMin) do |
в начале мы проверяем, что в предыдущем действии мы нашли символ удовлетворяющий условию для записи в файл.
1 |
for i:=1 to NumC do Write(F_out,CMin); |
Записываем во временный файл ранее найденный символ СMin столько раз, сколько он встречался в исходном файле.
1 |
CLast:=CMin; |
Запоминаем какой последний символ мы записали в файл.
1 2 |
Close(F_in); Reset(F_in); |
Переоткрываем исходный файл.
1 2 3 4 5 6 7 8 9 10 |
while (not eof(F_in)) do begin Read(F_in,C); if (CLast<C) and ((CMin>C) or (CMin=CLast)) then begin CMin:=C; NumC:=0; end; if CMin=C then inc(NumC); end; |
У нас опять цикл такой же как в пункте 2, но изменено условие поиска минимального элемента СMin.
Здесь мы учитываем, что:
Символ не должен быть уже записанным в файл CLast<C.
И
Наш символ должен быть меньше CMin CMin>C
или
Мы пока не нашли подходящий символ, тоесть CMin не изменилось с прошлого прохода CMin=CLast.
В остальном цикл делает тоже самое.
4)
1 2 3 4 |
Close(F_out); Close(F_in); Erase(F_in); Rename(F_out,S); |
После того как мы нашли все символы и записали их во временный файл. Мы закрываем все файлы, удаляем исходный, и переименовываем временный файл в имя исходного файла.
Другие задачи из раздела File можно посмотреть здесь.
Комментарии: