Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Отсортировать строки по алфавиту. Как?

Автор: Child of Bodom 25.12.2006 18:18

Привет всем. я тут новичок. И мне очнеь срочно нужна ваша помощь. Помогите очень прошу. Задача такова:
В текстовой файле 5-8 строк. Мне надо отсортировать их по алфавиту. То есть строки надо отсортировать по фамилиям , находящимсяпрямо в начале всех строк. Вывести на экран это получается , а вот с процедурой сортировки что то совсем никак!!! помогите а то отсался последний зачет получить а тут такая вот чтука. В FAQе уже не однократно был -но там же ничего не понятно. Вот примерно что у меня получилось

Program Zadanie_3;
uses crt;
var f,g:text;
str:array [1..5] of string;
procedure vivod (var f:text);
var i:integer;
begin
reset(f);
i:=1;
while not eof(f) do
begin
readln(f,str[i]);
writeln(str[i]);
i:=i+1;
end;

end;
procedure alfavit;
var x: string;
i,j: integer;
str:array [1..5] of string;

begin
reset(f);
rewrite(g);
i:=1;
for i:=1 to 5 do
begin
for j:=5 downto 1 do
begin
if str[i+1]>str[i] then
begin
x:=str[i];
str[i]:=str[i+1];
str[i+1]:=x;
writeln (str[i]);
end;
end;
end;

erase(f);
rename(g,'temp.txt');
reset(f);
close(g);
end;

BEGIN
clrscr;
assign (f,'BOLNICTA.txt');
assign (g,'temp.txt');
vivod(f);
readln;
clrscr;
alfavit;
readln;
end.


Текстовый файлик вкладываю:


Прикрепленные файлы
Прикрепленный файл  BOLNITCA.TXT ( 241 байт ) Кол-во скачиваний: 325

Автор: volvo 25.12.2006 18:55

Смотри на комментарии:

procedure alfavit;
var x: string;
i,j: integer;
{ str:array [1..5] of string; } { <--- Эта строка - не нужна }

begin
reset(f);
rewrite(g);
i:=1;
for i:=1 to 5 do
begin
for j:=5 downto i + 1 do { <--- До i + 1, а не до i }
begin
if str[j - 1]>str[j] then { <--- Здесь работаем по индексу ВНУТРЕННЕГО цикла }
begin
x:=str[j];
str[j]:=str[j-1];
str[j-1]:=x;
{ writeln (str[i]); } { <--- Печатаем не здесь }
end;
end;
writeln (str[i]); { <--- А вот тут }
writeln (g, str[i]); { <--- В файл тоже не забываем занести }
end;

erase(f);
close(g); { <--- Сначала закроем файл, чтобы не потерять результаты }
rename(g,'temp.txt'); { и только потом - переименуем }
{ reset(f); } { <--- Этого делать не надо, ты уже удалил файл }
end;

Остальная часть программы остается без изменений...

Автор: Child of Bodom 25.12.2006 22:18

Что то она не работает должным образом:первые буквы фамилий убирает, и не сортирует совсем

Автор: volvo 25.12.2006 22:31

На твоем примере все работает безошибочно... Ничего не удаляет лишнего (у тебя, кстати, в файле TXT после последней строки должен быть нажат Enter, иначе последнюю строку программа просто не прочтет из файла с помошью ReadLn(f, ...))

Автор: Child of Bodom 25.12.2006 22:49

Это очень странно. У меня первые 2 убираются, и список ну ни как не сортируется. Может у меня версия паскаля не та или что нибудь еще ????А пробел я поставил

Автор: volvo 25.12.2006 23:00

Ну-ка, выложи еще раз ИСПРАВЛЕННЫЙ код сюда, посмотрим...

Автор: Child of Bodom 25.12.2006 23:06

Вот он:

Program Zadanie_3;
uses crt;
var f,g:text;
procedure vivod (var f:text);
var i:integer;
str:array [1..5] of string;
begin
reset(f);
i:=1;
while not eof(f) do
begin
readln(f,str[i]);
writeln(str[i]);
i:=i+1;
end;

end;
procedure alfavit;
var x: string;
i,j: integer;
str:array [1..5] of string;

begin
reset(f);
rewrite(g);
for i:=1 to 5 do
begin
for j:=5 downto (i+1) do
begin
if str[j+1]>str[j] then
begin
x:=str[i]; { может здесь в место i надо о поставить?}
str[i]:=str[i+1];
str[i+1]:=x;
end;
end;
writeln (str[i]);
writeln (g,str[i]);
end;
close (g);
{ erase(f);
rename(g,'Bolnica.txt'); } { Это чтоб постоянно не возвращать оригинал временно}
end;

BEGIN
clrscr;
assign (f,'BOLNITCA.txt');
assign (g,'ddddd.txt');
reset(f);
rewrite (g);
vivod(f);
readln;
clrscr;
alfavit;
close (f);
readln;
end.
[code]

Автор: volvo 25.12.2006 23:11

Ну, я же тебе написал, "читай комментарии" - и каждое изменение объяснил !!! А ты опять вместо J используешь I... Ищи несовпадения, я второй раз ничего исправлять не буду...

И тегами пользуйся ... (Кнопка "Изменить -> Полное редактирование" Выделяешь текст программы, комбобокс CODE - выбираешь язык)

Автор: Child of Bodom 25.12.2006 23:23

Все i переделал на j. Я попробовал в самом текстовом файле сдвинуть все строки в право на два пробела.
Что то вроде сделалось. Но потом я опять запустил прогу и теперь там начали появлятся иероглифы. Что мне делать???Скажите

Автор: Child of Bodom 25.12.2006 23:58

Знатоки помогите пожалуйста. Срочно очень нужно решить!!!

Автор: volvo 26.12.2006 0:07

У всех все срочно, блин... Ты вчера где был? А неделю назад? dry.gif

Вот файл, который отработал на 4-х разных компиляторах: (НИЧЕГО не трогай, только запусти и проверь, работает ли у тебя ИМЕННО на моем TXT-файле)

Прикрепленный файл  t.pas ( 814 байт ) Кол-во скачиваний: 667

Прикрепленный файл  BOLNITCA.TXT ( 243 байт ) Кол-во скачиваний: 608

Автор: Гость 26.12.2006 0:15

Знаете что я вам скажу:вы волшебник. Все заработало, хотя щас сверил коды индентичны хоть ты тресни. И все равно большое вам спасибо!!!!а можете еще пару задачек решить, но не таких срочных. Они как бы на половину работаю. Там осталось что то добавить чего я не могу понять и они должны заработать как надо!!! Ну так сможете помочь еще???

Автор: мисс_граффити 26.12.2006 0:55

для начала вот эту:

Цитата
И тегами пользуйся ... (Кнопка "Изменить -> Полное редактирование" Выделяешь текст программы, комбобокс CODE - выбираешь язык)

рекомендацию выполни!

Автор: Гость 26.12.2006 13:27

Не могу найти кнопки изменить!!!Но на будущее учту!!! Господа знающие программисты, оказывается в этой задаче надо было еще список отсортировать по диагнозам. Вы ничем помочь не сможете???

Автор: volvo 26.12.2006 14:35

Цитата
в этой задаче надо было еще список отсортировать по диагнозам
В процедуре сортировки замени
if str[j - 1]>str[j] then

на
if copy(str[j - 1], 37, 255) > copy(str[j], 37, 255) then

тогда список будет сортироваться по диагнозам...

Цитата
Не могу найти кнопки изменить!!!
Под Гостем ??? blink.gif И не найдешь...