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

Тема в разделе "Pascal and Delphi", создана пользователем wanty, 25 май 2011.

  1. wanty

    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]
    Лишнего тут ничего нет, говорю сразу ! так всё надо было по заданию ! Подскажите пожалуйста мне.
     
  2. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    word - числовой тип данных используйте char(ну или string), и для переменных -компараторов (сравнивателей) тоже.
    Сами переводите из строки в число и удивляетесь)
     
  3. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Можно вместо StrToInt писать Ord а потом при записи в файл Write(file1,chr(rez));
     
  4. wanty

    wanty Гость

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

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Можете выложить ВСЕ файлы проэкта в архиве?
     
  6. wanty

    wanty Гость

    Эмм, а кода мало ??? по сути там ничего особого больше нет ! разве что пара вот этих файлов:Resulted.DanT ResultedNew.Din ! а остальное по обычному всё !
     
  7. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Вроде бы и нет, но если вбивать в мемо текст(цифры) то выдает ошибку.
     
  8. wanty

    wanty Гость

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

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Мда, а я всё в одну сторку печатал.

    Работает как с цифрами так и с буквами(со всеми символами, ( :*/-+,*...)), и из строки берёт только первый символ:
    <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">
    Код (Delphi):
    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.
     

    Вложения:

    • 1234567.zip
      Размер файла:
      4 КБ
      Просмотров:
      10
  10. wanty

    wanty Гость

    о_О ! Офигеть, спасибо огромное ! не быть мне программистом, я даже и не додумался прописать ord везде !=)
     
Загрузка...
Похожие Темы - Сортировка символов
  1. ленарано
    Ответов:
    1
    Просмотров:
    1.102
  2. vera2014
    Ответов:
    0
    Просмотров:
    1.070
  3. Liori
    Ответов:
    2
    Просмотров:
    1.004
  4. FCDK
    Ответов:
    0
    Просмотров:
    1.263
  5. Creder
    Ответов:
    0
    Просмотров:
    1.345

Поделиться этой страницей