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