Сортировка строк(Паскаль)

gluik
Сообщения: 12
Зарегистрирован: 10 дек 2007, 14:23

04 мар 2008, 12:20

Вводится массив строк содержащий названия(фамилии) на русском требуется вывести его на экран в алфавитном порядке.Подскажите как это сделать.
MOTOCoder
Сообщения: 542
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

04 мар 2008, 16:17

Например так:

[syntax='Delphi']
program sortarr;
const
N=5;
var
data:array[0..N]of string;
x,i:integer;
f:text;

procedure insert(idx:integer;str:string);
var j:integer;
begin
for j:=N-1 downto idx do
data[j+1]:=data[j];
data[idx]:=str;
end;

procedure delete(idx:integer);
var j:integer;
begin
for j:=idx to n-1 do
data[j]:=data[j+1];
end;

procedure sort;

begin
for i := 0 to (N-1) do
for x := 0 to (N - 1) do
if (data[x] < data) and (x > i) then
begin
Insert(i, data[x]);
Delete(x+ 1);
end;
end;

begin
writeln('Введите ',N-1,' строк(и)');
for i:=1 to N-1 do
readln(Data);
sort;
writeln;
for i:=1 to N-1 do
writeln(data);
readln;

end.

[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
C_O_D_E
Сообщения: 293
Зарегистрирован: 13 фев 2008, 20:10
Откуда: Беларусь. Орша
Контактная информация:

04 мар 2008, 22:45

Мой вариант реализации. Сама делала достаточно давно, если что, то могу подкорректировать.


[syntax=Delphi]

uses crt;
const t=20; {макс. кол-во слов в предлож.}
ch:set of char =['a'..'z','A'..'Z','а'..'я','А'..'Я']; {допуст. символы}
procedure InputWord(var stroka:string); {ввод предлож.}
begin
write('Введите предложение:');
readln(stroka);
end;
procedure Find(stroka:string;var slova:array of string;var n:byte);{выделение слов из предложения}
var m,i,c:byte;
begin
n:=1;
i:=0; {номер символа, с кот. нач. копир.}
c:=0; {кол-во копир. символов}
for m:=1 to length(stroka) do {текущий символ предложения}
begin
if stroka[m] in ch then
if i=0 then {указ-ль на первую букву слова}
begin i:=m; c:=c+1; end
else c:=c+1 {увел. кол-во копир. символов}
else if i<>0 then
begin slova[n]:=copy(stroka,i,c); inc(n); i:=0; c:=0; end;{зап. мас. слов}
if m=length(stroka) then
begin slova[n]:=copy(stroka,i,c); inc(n); end; {принуд. заполн. мас. слов}
end;
end;
procedure Sort(var slova:array of string; n:byte); {сортировка}
var i,j,k:byte; min:string;
begin
for j:=1 to n-2 do {номер слова, с кот. начинается сравн.}
for i:=j+1 to n-1 do {текущий номер слова}
begin
k:=1; {номер тек. буквы}
while (slova[k]=slova[j][k]) and {сравн. буквы}
(k<=length(slova)) do inc(k); {тек. слова с}
if slova[k] < slova[j][k] then {буквой мин. слова}
begin {обмен слов}
min:=slova;
slova:=slova[j];
slova[j]:=min;
end;
end;
end;
procedure WriteText(slova:array of string; n:byte); {вывод слов}
var i:byte; {номер слова}
res:string; {строка-результат}
begin
res:='';
write ('Полученный результат:');
for i:=1 to n do
if slova[0] <> #0 then res:=concat(res,slova)+' ';
writeln(res);
end;
var str:string; {введ. предложение}
word:array [1..t] of string; {слова предложения}
n:byte; {номер последнего слова}
begin
clrscr;
Randomize;
writeln (' Напечатать слова, входящие в предложение, в алфавитном порядке');
writeln;
InputWord(str);
Find(str,word,n);
Sort(word,n);
WriteText(word,n);
readkey;
end.

[/syntax]
Если назначен специальный человек для контроля за чистотой исходной информации, то найдется изобратательный идиот, который придумает способ, чтобы неправильная информация прошла этот контроль.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

05 мар 2008, 11:08

Хосспади ты боже ж мой!

Код: Выделить всё

var i, j:integer; mas: array[1..100] of string; tmp:string;
begin
  for i:=1 to 99 do
  for j:=i+1 to 100 do
  if mas[i][1]>mas[j][1] then
  begin
     tmp:=mas[i]; mas[i]:=mas[j]; mas[j]:=tmp;
  end;
end.
Все! Кроме ввода и вывода
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
drummer
Сообщения: 57
Зарегистрирован: 13 янв 2008, 18:43

05 мар 2008, 20:03

to Хыиуду:
А если первые буквы оказались одинаковые?

Код: Выделить всё

if mas[i]>mas[j] then
  begin
     tmp:=mas[i]; mas[i]:=mas[j]; mas[j]:=tmp;
  end;
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

06 мар 2008, 14:02

Тьфу ты, да, второй индекс поставил совершенно автоматически, у меня сейчас как раз идет работа над программой, где сравнение идет по первым символам.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
C_O_D_E
Сообщения: 293
Зарегистрирован: 13 фев 2008, 20:10
Откуда: Беларусь. Орша
Контактная информация:

06 мар 2008, 20:15

Господа, а чем Вас не устраивает мое оригинальное решение через множества?
Я конечно понимаю, что все за глубокую рациональность, но волю творчеству тож стоит давать!

Если бы Строители строили дома и др архитектурные сооружения так же, как программисты пишут программы, то первый, случайно залетевший, дятел разрушил бы цивилизацию! (с)
Если назначен специальный человек для контроля за чистотой исходной информации, то найдется изобратательный идиот, который придумает способ, чтобы неправильная информация прошла этот контроль.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

07 мар 2008, 11:11

А кто не дает волю творчеству? Все равно конечному пользователю способ реализации глубоко фиолетов, если он не оказывает влияния на конечный результат.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
C_O_D_E
Сообщения: 293
Зарегистрирован: 13 фев 2008, 20:10
Откуда: Беларусь. Орша
Контактная информация:

07 мар 2008, 22:00

Моя реализация ошибочна? Вполне возможно. я не писала программу специально по это условие! я нашла реализацию своей работы, просто условие показалось похожим.
Если назначен специальный человек для контроля за чистотой исходной информации, то найдется изобратательный идиот, который придумает способ, чтобы неправильная информация прошла этот контроль.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

17 мар 2008, 12:25

Ну почему же ошибочна, я не проверял ;) В любом случае, для пользователя имеет значение только интерфейс (который в подобных учебных задачах практически отсутствует), скорость работы (которая в таких задачах совершенно не критична), и потребляемая память/объем диска (которая для таких задач ничтожно мала в сравнении с объемом памяти современного компа). А главное - чтобы работало.
А как пишет программист - это уж его дело. Хотите заниматься вольными художествами - занимайтесь на здоровье. А я вот люблю решения таких задач сводить к примитивизму везде, где это возможно.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить