Сортировка символов.

  • Автор темы wanty
  • Дата начала
W

wanty

Гость
#1
Код на делфи. Нужно отсортировать символы при помощи сортировки подсчётом ! (разработать 2 варианта программы(обыгрывается с помощью case))
Код готов, но сортирует только цифры ! Нужно переделать так, чтобы сортировал только Символы. Не могу разобраться никак, постоянно выдаёт несоответствие типов в самой сортировке.
<!--shcode--><pre><code class='pascal'>
var
Form1: TForm1;
vrem:Integer; //переменная для временной сложности алгоритма
implementation
procedure Variant2; //2-й вариант программы
const N=255;
var
dannye2:record
dan1:array[0..N] of Word; //исход мас
rez:array of Word; //отсорт мас
a:Integer;
h:Integer;
end;
dig:set of 1..255;
mas:array of byte; //вспомогательная переменная
file2:file;
m:Word;
k:Integer;
i,j:Integer;
begin
dig:=[0..n];
AssignFile(File2,'ResultedNew.Din');
Rewrite(File2,1);
with dannye2 do
begin
a:=0;
while Form1.Memo1.Lines.Strings[a]<>'' do //считывание с мемо в массив
begin
dan1[a]:=StrToInt(Form1.Memo1.Lines.Strings[a]);
a:=a+1;
if a in dig then continue else
begin //
ShowMessage('введите символы);
Exit;
end;
end;
k:=a;
a:=0;
h:=dan1[0];
for i:=0 to k-1 do
if h<dan1 then h:=dan1; //находим наибольший элемент массива
SetLength(mas,h+1);
SetLength(rez,k);
for i:=0 to h do
begin
mas:=0; //задаём начальные значения элементам вспомогательного массива
end;
for j:=0 to k-1 do
begin
mas[dan1[j]]:=mas[dan1[j]]+1; //размещаем количество элементов, равных j в jю ячеёку
end;
for i:=1 to h do
begin
mas:=mas+mas[i-1]; //считываем количество элементов не привосходящих i
end;
for j:=k-1 downto 0 do
begin
rez[mas[dan1[j]]-1]:=dan1[j]; //формируем упорядоченный массив
mas[dan1[j]]:=mas[dan1[j]]-1;
end;
mas:=nil; //оосвобождаем память
for i:=0 to k-1 do
BlockWrite(file2,rez,1); //запись в файл по 1 записи за обращение
CloseFile(File2);
rez:=nil; //освобождение памяти
Reset(file2,1);
for i:=0 to k-1 do
begin
BlockRead(file2,m,1); // считывание с файла по 1 записи
Form1.Memo2.Lines.Add(IntToStr(m));
end;
CloseFile(file2);

end;

end;



{$R *.dfm}





procedure TForm1.Button1Click(Sender: TObject);
type
MyInt=Integer; //псевдоним типов
tFile=file of Word;
var
dannye1:record
dan,rez:array of Word; //исход и отсорт масс
mass:array of byte; //вспомог мас
end;
h,k:Myint; //h - наибольший элемент массива dan,k -число элементов масива dan
i,j:Integer;
file1:tfile; //типизированный файл
m:Word; //вспомогательная переменная
begin
Memo2.Lines.Clear;
AssignFile(file1,'Resulted.DanT');
Rewrite(file1);
Case StrToInt(Edit1.Text) of //выбор 1 из 2х вариантов работы
1:begin //вариант работы с динамическим массивом и типизированными файлами
k:=Memo1.Lines.Count; //определение количества строк в memo
with dannye1 do
begin
SetLength(dan,k);
for i:=0 to k-1 do
begin
if StrToInt(Memo1.Lines.Strings)<0 then
begin
Showmessage('введите только положительные значения');
Exit;
end
else
dan:=StrToInt(Memo1.Lines.Strings); //считывание в массив
end;
end;
end;
2:begin
Variant2;
Exit; //вариант работы со статическим массивом и нетипизированным файлом - число 2
end;
else begin ShowMessage('введите вариант работы'); Exit; end;
end;
with dannye1 do
begin
h:=-1;
for i:=1 to k-1 do
if dan>h then h:=dan else continue; //находим максимальное число
SetLength(mass,h+1);//устанавливаем длину массивов
SetLength(rez,k);
for i:=0 to h do //обнуляем вспомогательную переменную
mass:=0;
for j:=0 to k-1 do //сортируем массив
mass[dan[j]]:=mass[dan[j]]+1; //помещаем количество элементов равных j в j-ю ячейку массива mass
for i:=1 to h do
mass:=mass+mass[i-1]; //считаем колличество элементво не привосходящих числа i
for j:=k-1 downto 0 do
begin
rez[mass[dan[j]]-1]:=dan[j]; //формируем упорядоченный массив
mass[dan[j]]:=mass[dan[j]]-1;
end;
mass:=nil; //освобождение память массива
dan:=nil; //освобождение памяти массива
for i:=0 to k-1 do
Write(file1,rez);
rez:=nil; //оосвобождение памяти массива
CloseFile(file1);
Reset(file1);
While NOT EoF(File1) do //считывание файла в memo
begin
Read(file1,m);
Memo2.Lines.Add(IntToStr(m));
end;
end;
CloseFile(file1);
end;
end.[/CODE]
Лишнего тут ничего нет, говорю сразу ! так всё надо было по заданию ! Подскажите пожалуйста мне.
 

nayke

Well-Known Member
04.08.2010
310
0
#2
dannye2:record
dan1:array[0..N] of Word; //исход мас
rez:array of Word; //отсорт мас
a:Integer;
h:Integer;
word - числовой тип данных используйте char(ну или string), и для переменных -компараторов (сравнивателей) тоже.
dan1[a]:=StrToInt(Form1.Memo1.Lines.Strings[a]);
Сами переводите из строки в число и удивляетесь)
 
09.11.2009
665
1
#3
Можно вместо StrToInt писать Ord а потом при записи в файл Write(file1,chr(rez));
 
W

wanty

Гость
#4
В том то и проблема, когда меняю типы переменных, в всей сортировке несовместимость типов, т.к. сортировка вся идёт типа integer. Я пробовал работать с кодами, просто задать переменную типа чар а потом перевести в код, и использовать уже в сортировке, но всё равно не работает сортировка.
Вы посмотрели на пару срок и говорите ! я думаете не пробовал делать ? Этот код сортирует ЦИФРЫ, а не СИМВОЛЫ ! если убрать strtoint и изменить пару типов то всё равно работать не будет, так как сортировка работает именно с числами, а точнее "индексами", а для того чтобы отсортировать символы нужно перевести их в коды, но из-за этого появляется несоответствие в других строках, да и сортировка сама не работает ! Я прошу помочь переделать код, сортирующий цифры, в тот, который будет сортировать буквы.
 
W

wanty

Гость
#6
Эмм, а кода мало ??? по сути там ничего особого больше нет ! разве что пара вот этих файлов:Resulted.DanT ResultedNew.Din ! а остальное по обычному всё !
 
09.11.2009
665
1
#7
Вроде бы и нет, но если вбивать в мемо текст(цифры) то выдает ошибку.
 
W

wanty

Гость
#8
На форме пристутствует 2 мемо, 1 эдит и кнопка .всё. в мемо1 вводятся цифры по строчно, на каждой строке одна цифра ! В эдит вводится цифра 1 или 2 для выбора варианта по которому будит производится сортировка !
 
09.11.2009
665
1
#9
На форме пристутствует 2 мемо, 1 эдит и кнопка .всё. в мемо1 вводятся цифры по строчно, на каждой строке одна цифра ! В эдит вводится цифра 1 или 2 для выбора варианта по которому будит производится сортировка !
Мда, а я всё в одну сторку печатал.

Работает как с цифрами так и с буквами(со всеми символами, ( :*/-+,*...)), и из строки берёт только первый символ:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Unit7.pas</div></div><div class="sp-body"><div class="sp-content">
Код:
unit Unit7;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm7 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form7: TForm7;
vrem:Integer; //переменная для временной сложности алгоритма

implementation

procedure Variant2; //2-й вариант программы
const N=255;
var
dannye2:record
dan1:array[0..N] of Word; //исход мас
rez:array of Word;  //отсорт мас
a:Integer; 
h:Integer; 
end;
dig:set of 1..255;
mas:array of byte; //вспомогательная переменная
file2:file;
m:Word;
k:Integer;
i,j:Integer;
begin
with form7 do
begin
dig:=[0..n];
AssignFile(File2,'ResultedNew.Din');
Rewrite(File2,1);
with dannye2 do
begin
a:=0;
while Memo1.Lines.Strings[a]<>'' do //считывание с мемо в массив
begin
dan1[a]:=ord(Memo1.Lines.Strings[a][1]);
a:=a+1;
if a in dig then continue else 
begin //
ShowMessage('введите символы');
Exit;
end;
end;
k:=a;
a:=0;
h:=dan1[0];
for i:=0 to k-1 do
if h<dan1[i] then h:=dan1[i];  //находим наибольший элемент массива
SetLength(mas,h+1);
SetLength(rez,k);
for i:=0 to h do
begin
mas[i]:=0; //задаём начальные значения элементам вспомогательного массива
end;
for j:=0 to k-1 do
begin
mas[dan1[j]]:=mas[dan1[j]]+1; //размещаем количество элементов, равных j в jю ячеёку
end;
for i:=1 to h do
begin
mas[i]:=mas[i]+mas[i-1]; //считываем количество элементов не привосходящих i
end;
for j:=k-1 downto 0 do
begin
rez[mas[dan1[j]]-1]:=dan1[j]; //формируем упорядоченный массив
mas[dan1[j]]:=mas[dan1[j]]-1;
end;
mas:=nil;	//оосвобождаем память
for i:=0 to k-1 do
BlockWrite(file2,rez[i],1); //запись в файл по 1 записи за обращение
CloseFile(File2);
rez:=nil;	  //освобождение памяти
Reset(file2,1);
for i:=0 to k-1 do
begin
BlockRead(file2,m,1); // считывание с файла по 1 записи
Memo2.Lines.Add(chr(m));
end;
CloseFile(file2);

end;
end;

end;



{$R *.dfm}





procedure TForm7.Button1Click(Sender: TObject);
type
MyInt=Integer;		//псевдоним типов
tFile=file of Word;
var
dannye1:record
dan,rez:array of Word; //исход и отсорт масс
mass:array of byte; //вспомог мас
end;
h,k:Myint; //h - наибольший элемент массива dan,k -число элементов масива dan
i,j:Integer;
file1:tfile; //типизированный файл
m:Word; //вспомогательная переменная
begin
Memo2.Lines.Clear;
AssignFile(file1,'Resulted.DanT');
Rewrite(file1);
Case StrToInt(Edit1.Text) of //выбор 1 из 2х вариантов работы
1:begin  //вариант работы с динамическим массивом и типизированными файлами
k:=Memo1.Lines.Count;  //определение количества строк в memo
with dannye1 do
begin
SetLength(dan,k);
for i:=0 to k-1 do
begin
if ord(Memo1.Lines.Strings[i][1])<0 then
begin
Showmessage('введите только положительные значения');
Exit;
end
else
dan[i]:=ord(Memo1.Lines.Strings[i][1]); //считывание в массив
end;
end;
end;
2:begin
Variant2;
Exit; //вариант работы со статическим массивом и нетипизированным файлом - число 2
end;
else begin ShowMessage('введите вариант работы'); Exit; end;
end;
with dannye1 do
begin
h:=-1;
for i:=1 to k-1 do
if dan[i]>h then h:=dan[i] else continue; //находим максимальное число
SetLength(mass,h+1);//устанавливаем длину массивов
SetLength(rez,k);
for i:=0 to h do //обнуляем вспомогательную переменную
mass[i]:=0;
for j:=0 to k-1 do //сортируем массив
mass[dan[j]]:=mass[dan[j]]+1; //помещаем количество элементов равных j в j-ю ячейку массива mass
for i:=1 to h do
mass[i]:=mass[i]+mass[i-1]; //считаем колличество элементво не привосходящих числа i
for j:=k-1 downto 0 do
begin
rez[mass[dan[j]]-1]:=dan[j]; //формируем упорядоченный массив
mass[dan[j]]:=mass[dan[j]]-1;
end;
mass:=nil;  //освобождение память массива
dan:=nil; //освобождение памяти массива
for i:=0 to k-1 do
Write(file1,rez[i]);
rez:=nil; //оосвобождение памяти массива
CloseFile(file1);
Reset(file1);
While NOT EoF(File1) do //считывание файла в memo
begin
Read(file1,m);
Memo2.Lines.Add(chr(m));
end;
end;
CloseFile(file1);
end;

end.
 

Вложения

W

wanty

Гость
#10
о_О ! Офигеть, спасибо огромное ! не быть мне программистом, я даже и не додумался прописать ord везде !=)