Добрый вечер! Не могу справиться с такой задачей: дан текстовой файл, содержащий названия городов 1) если он пуст, в файле вывода вывести слово nothing (с этим я справилась), 2) если названия городов начинаются на одну и ту же букву, то выводим города в файл в обратном порядке, 3) если города начинаются на разные буквы, то сортируем только по первой букве. Помогите чайнику, пожалуйста!
TS*
27.12.2006 16:57
Цитата(Jekaterina @ 26.12.2006 22:06)
Добрый вечер! Не могу справиться с такой задачей: дан текстовой файл, содержащий названия городов 1) если он пуст, в файле вывода вывести слово nothing (с этим я справилась), 2) если названия городов начинаются на одну и ту же букву, то выводим города в файл в обратном порядке, 3) если города начинаются на разные буквы, то сортируем только по первой букве. Помогите чайнику, пожалуйста!
Создаеш масив строк, проверяеш одинаковость первых букв строк, если да то выводиш в файл масив строк наоборот, если нет, сортируеш в процедуре по первой букве:
const
n=100;
var
.....
str: array[1..n] ofstring;
F, F1: text;
i, m: word;
function check(strs:arrayofstring; nn: word): boolean; {проверка одинаковы ли все первые буквы}
tr: boolean; k: word;
begin
tr:=true;
for k:=1to nn-1doif(strs[k][1]<strs[k-1][1]) then tr:=false;
if tr then check:=true
else
check:=false;
end;
procedure sort_first(var strf: arrayofstring; mm: word) {сортировка по первой букве}
fl: boolean; temp: string; j: word;
beginrepeat
fl:=true;
for j:=0to mm-2doif(s[j][1]>s[j+1][1]) thenbegin
temp:=s[j]; s[j]:=s[j+1]; s[j+1]:=temp;
end;
untilnot fl;
end;
begin
.....
i:=1;
whilenot(EoF(F)) dobegin
readln(F, str[i]);
inc(i);
end;
m:=i;
if check(str, i) thenbeginfor i:=m downto1do
writeln(F1, str[i]);
endelse
sort_first(str, m);
.....
end.
Jekaterina
27.12.2006 17:12
Спасибо, буду пробовать!
Jekaterina
27.12.2006 18:18
Господи, не идет-стек переполняется! Добрый человек (человеки,народ, люди) что исправить в программе??
мисс_граффити
27.12.2006 18:35
только собралась написать про большие файлы
function check(const strs:arrayofstring; nn: word): boolean;
попробуй...
но это тоже так... полумеры.
М
Для TS*: (цитата из правил) 7. Проверяйте программы перед тем, как разместить их на форуме!!!
Jekaterina
27.12.2006 18:51
Вот горе. Программа все рано висит на поцедуре сортировки.
klem4
27.12.2006 18:57
repeat
fl:=true;
for j:=0to mm-2doif(strf[j][1]>strf[j+1][1]) thenbegin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
end;
untilnot fl; // <----------- Тут всегда true ....
Jekaterina
27.12.2006 19:19
Что же делать? Я, признаюсь, плохо разбираюсь в булеановских функциях, да и в других тоже не очень. Как исправить программу? Заранее простите за настырность
klem4
27.12.2006 19:25
repeat
fl:=false; //<---------- устанавливаем фалг в 0
for j:=0to mm-2doif(strf[j][1]>strf[j+1][1]) thenbegin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl := true; // <------------ если были перестановки, устанавливаем флаг в единицу
end;
untilnot(fl); //<------------ а если не было, то флаг как был 0 так и остался и сорт. завршена
Jekaterina
27.12.2006 19:37
Исправляла-исправляла, но все-таки не получается с выводом ничего: не идет ни сортировка по первой букве с выводом в файл, не идет и вывод в файл в обратном порядке, если первая буква слова одинаковая. Пишет тоже самое в файл, и все тут
Jekaterina
28.12.2006 14:49
Здравтвуйте! Может быть, кто-нибудь из вас посмотрит еще раз на мое решение? Я боюсь, начинаю просто зацикливаться на этой программе
hiv
28.12.2006 16:56
Цитата(Jekaterina @ 28.12.2006 10:49)
Здравтвуйте! Может быть, кто-нибудь из вас посмотрит еще раз на мое решение? Я боюсь, начинаю просто зацикливаться на этой программе
Зацикливалось потому, что строки читала оператором read, который не читает строку целиком. Чтоб узнать где зацикливается жми Ctrl+Break. Подсвеченная строка тебе покажет это место. А дальше пошагово выполняешь программу нажимая F8 и смотришь в Watch значения переменных. Вот работающий код:
const
n=10;
var
str: array[1..n] ofstring;
f1, f2: text;
i, m: word;
Function sort(var strf: arrayofstring; mm: word):string;
Var fl: boolean; temp: string; j: word;
beginrepeat
fl:=false;
for j:=0to mm-2doif(strf[j][1]>strf[j+1][1]) thenbegin{сортируем по первой букве}
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
endelse{если совпадают первые символы, то сортируем наоборот}if (strf[j][1]=strf[j+1][1])and(strf[j]<strf[j+1]) thenbegin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
end;
untilnot (fl);
end;
begin
Assign (f1, 'pasts.in');
Assign (f2,'pasts.out');
Reset (f1);
Rewrite (f2);
i:=1;
whilenot(EoF(F1)) dobegin
readln(F1, str[i]); {ведь строки читаем!}if length(str[i])>0then inc(i); {пустые строки пропускаем}end;
m:=i;
sort(str, m);
for i:=1to m-1do writeln (f2,str[i]); {если выводить то все}
Close (f1);
Close (f2);
end.
Jekaterina
28.12.2006 17:14
Огромное спасибо! Только мне требуется считывать города, записанные в строчку, а не в столбик. Поэтому было "read".
hiv
28.12.2006 17:17
Цитата(Jekaterina @ 28.12.2006 13:14)
Огромное спасибо! Только мне требуется считывать города, записанные в строчку, а не в столбик. Поэтому было "read".
И сколько таких строчек? И каким символом города друг от друга отделяются?
Jekaterina
28.12.2006 17:26
Любое слово может начинаться с большой или малой буквы, длиной от 1 до 255 символов, между словами один или несколько пропусков
Прошу прощения, либо только с большой, либо только с малой буквы. Если слов в файле нет, то в выходном файле выходит слово "nothing". Входной файл до мегабайта объемом
hiv
28.12.2006 17:47
Цитата(Jekaterina @ 28.12.2006 13:26)
Любое слово может начинаться с большой или малой буквы, длиной от 1 до 255 символов, между словами один или несколько пропусков
Прошу прощения, либо только с большой, либо только с малой буквы. Если слов в файле нет, то в выходном файле выходит слово "nothing". Входной файл до мегабайта объемом
Вот с этого и надо было начинать. Тут телепаты не водятся. Тогда читать надо посимвольно с помощью read(с), где с :char; - один символ.
Цитата(Jekaterina @ 28.12.2006 13:26)
Входной файл до мегабайта объемом
Столько в массив строк просто не влезет (ибо в DOS не более 640Килобайт оперативной памяти используется). Таким способом решать задачу нельзя!
Jekaterina
28.12.2006 18:11
Бог с ним, с этим мегабайтом! Мне бы сортировку по строкам добить, а то скоро экзамен и решать еще четыре таких же замудреных задачи
hiv
28.12.2006 18:23
Тогда так:
const
n=10;
var
str: array[1..n] ofstring;
f1, f2: text;
i, m: word;
c :char;
Function sort(var strf: arrayofstring; mm: word):string;
Var fl: boolean; temp: string; j: word;
beginrepeat
fl:=false;
for j:=0to mm-2doif(strf[j][1]>strf[j+1][1]) thenbegin{сортируем по первой букве}
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
endelse{если совпадают первые символы, то сортируем наоборот}if (strf[j][1]=strf[j+1][1])and(strf[j]<strf[j+1]) thenbegin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
end;
untilnot (fl);
end;
begin
Assign (f1, 'pasts.in');
Assign (f2,'pasts.out');
Reset (f1);
Rewrite (f2);
i:=1;
str[i]:=''; {в начале инициализируем пустой строкой}whilenot(EoF(F1)) dobegin
read(F1, c); {читаем посимвольно!}if (c<>' ')and(c<>#10)and(c<>#13) then str[i]:=str[i]+c
elseif length(str[i])>0thenbegin{непустые строки нам нужны}
inc(i);
str[i]:=''; {инициализируем пустой строкой}end;
end;
m:=i;
sort(str, m);
for i:=1to m-1do write(f2,str[i],' '); {если выводить то все и через пробел}
Close (f1);
Close (f2);
end.
Jekaterina
28.12.2006 18:43
Спасибо громаднейшее!!! Буду дальше над оставшимеся голову ломать!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.