W
wanty
Код на делфи. Нужно отсортировать символы при помощи сортировки подсчётом ! (разработать 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]
Лишнего тут ничего нет, говорю сразу ! так всё надо было по заданию ! Подскажите пожалуйста мне.
Код готов, но сортирует только цифры ! Нужно переделать так, чтобы сортировал только Символы. Не могу разобраться никак, постоянно выдаёт несоответствие типов в самой сортировке.
<!--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]
Лишнего тут ничего нет, говорю сразу ! так всё надо было по заданию ! Подскажите пожалуйста мне.