type
DataArray=array[1..5000] ofstring;
DataK=array[1..5000] of integer;
var
item: DataArray;{массив для сортировки}
k: DataK;
s:string; {временная переменная, предназначена для передачи в массив, или ссчитывания из него}
ch,ch2:char;
count,i,j,m:integer;
fout:text;{файл для вывода объявляем текстовым, так как заносим в него строки}
fin:fileof char;{файл для ввода с типом char, чтобы процедура чтения read() получала по одному символу}procedure Inser(var item: DataArray; var k: DataK; count:integer); {сортировка}var
i, j, h: integer;
x: string;
beginfor i := 2to count dobegin
x := item[i];
h := k[i];
j := i-1;
while (x<item[j]) and (j>0) dobegin
item[j+1] := item[j];
k[j+1] := k[j];
j := j-1;
end;
item[j+1] := x;
k[j+1]:= h;
end;
end;
procedure Convert(var s:string); {ANSI -> ASCII}var i:integer;
beginfor i:=1to length(s) doif ord(s[i]) in [192..207] then s[i]:=chr(ord(s[i])-32) {Буквы: А..П переводим в ASCII-код меняя на: а..п}elseif ord(s[i]) in [208..223] then s[i]:=chr(ord(s[i])+16) {Буквы: Р..Я переводим в ASCII-код меняя на: р..я}elseif ord(s[i]) in [224..239] then s[i]:=chr(ord(s[i])-64) {Буквы: а..п переводим в ASCII-код }elseif ord(s[i]) in [240..255] then s[i]:=chr(ord(s[i])-16) {Буквы: р..я переводим в ASCII-код }elseif ord(s[i])=168then s[i]:=chr(ord(241)) {Букву Ё переводим в ASCII-код и меняем на: ё}elseif ord(s[i])=184then s[i]:=chr(ord(241)); {Букву ё переводим в ASCII-код}end;
procedure UnConvert(var a:string);{ASCII->ANSI}var i:integer;
beginfor i:=1to length(a) doif ord(a[i]) in [128..175] then a[i]:=chr(ord(a[i])+64)
elseif ord(a[i]) in [224..239] then a[i]:=chr(ord(a[i])+16)
elseif ord(a[i])=240then a[i]:=chr(ord(168))
elseif ord(a[i])=241then a[i]:=chr(ord(184));
end;
{начало основной программы}begin
Assign(fin,'1.txt'); {ставим в соответствие файловым переменным имена файлов}
Assign(fout,'2.txt');
Reset(fin); {открываем fin для чтения, а fout для записи}
Rewrite(fout);
i:=1;
repeat{общий цикл, работает пока не дойдем до конца файла}
s:='';{очищаем переменную строки, для записи нового слова}repeat
read(fin,ch);{cчитываем символ из файла}if ord(ch)=45thenbeginif s<>''then
s:=s+ch;
end;
if (ch<>'.') and (ord(ch)<>32) and (ch<>',') and (ch<>'"') and (ord(ch)<>45)
and (ch<>'?') and (ch<>'!') and (ch<>':') and (ord(ch)<>10) and (ord(ch)<>13) then s:=s+ch;
until (ord(ch)=32) or (ord(ch)=10) or (EOF(fin));
if s<>''thenbegin
Convert(s);
item[i]:=s;
k[i]:=i;
count:=i;
i:=i+1;
end;
until EOF(fin);{если достигнут конец файла - выходим}
Inser(item,k,count);
for i:=1to count dobegin
s:=item[i];
m:=k[i];
UnConvert(s);
write(fout, m,' '+s+chr(10));
end;
Close(fout);{закрываем оба файла}
Close(fin);
end.
volvo
13.10.2010 5:06
Цитата
У моего друга работает а у меня нет???Почему?
Каким компилятором пользуешься ты, и каким - твой друг? 5000 строк по 256 символов = 1250 Кбайт, больше мегабайта, кто ж тебе на 16-битном компиляторе (если уж пришел в этот раздел - значит, у тебя Турбо-Паскаль, правда?) даст выделить под массив столько места? У тебя на ВСЕ данные (и массив строк, и массив целых, и все вспомогательные переменные) только 64 Кбайт. Либо уменьшай размер строки, либо уменьшай количество строк. Ну, третий вариант - переходить на более современный компилятор.
А вообще выделять память под 5000 строк - это не хорошо. Все равно вряд ли ты столько прочитаешь из файла. Лучше сделать массив указателей на строки - прочел строку, выделил для нее место (через New) и храни в "куче" данные. А "куча" в 10 раз больше по объему, 640К. Чувствуешь разницу?
Lapp
13.10.2010 13:04
Nelson1992, ты не первый день на Форуме! Просьба выполнять Правила, как это делают другие!! Исправь название.
М
В следующий раз твоя тема с подобным названием будет закрыта сразу после обнаружения
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.