Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2013, 19:48   #1
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию Сортировка record

Всем привет.
Помогите, плиз. Не могу понять как написать код (алгоритм понятен).
У меня есть rec=record
key:integer;
body:string;
table:=array [1..5] of rec;
Мне надо отсортировать по ключам этот массив. Метод можно любой, хоть пузырьком.
Спасибо.
guroDragon вне форума Ответить с цитированием
Старый 11.12.2013, 20:06   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

А как бы ты отсортировал просто массив
Код:
var a:array[0..5]of Integer;
Вот также сортируй и массив
Код:
var ta:table;
Только вместо элементов a[i] используй ta[i].key

Только ошибка, надо так
Код:
table=array [1..5] of rec;
type_Oleg вне форума Ответить с цитированием
Старый 11.12.2013, 20:15   #3
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Так я сделал, ничего не происходит. Вот такой код.
Код:
procedure FileSort;
var
i,k:integer;
j:rec;
Begin
        clrscr;
        for i:=1 to 4 do
                For k:=2 to 5 do
                if table[i].key>table[k].key then
                begin
                        j:=table[i];
                        table[i]:=table[k];
                        table[i]:=j;
                        end;
Вроде все верно.
guroDragon вне форума Ответить с цитированием
Старый 11.12.2013, 20:22   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Я не пойму, table - это имя типа или имя переменной. И как передаются параметры в процедуру и из нее. Через глобальные?
Что там в самой программе?
type_Oleg вне форума Ответить с цитированием
Старый 11.12.2013, 20:27   #5
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Вот весь код.
Там все в процедурах, код не сложный)
Код:
uses crt;

type rec = record
        key:integer;
        body:string;
     end;
var quit:boolean;
    mass:array [1..5] of integer;
    go:word;
    f:file of rec;
    table:array[1..5] of rec;
    n:longint;
    filename:string;
procedure FileRead;
    var i,j:longint;
        ch:char;

    Begin
        clrscr;
        Assign(f, filename);
        {$I-}
        Reset(f);
        {$I+}
         n:=0;
        if IOResult <> 0 then
            begin
                rewrite(f);
                close(f);
                exit;
            end;


        if filesize(f) < 1 then
            begin
                WriteLn('Fail Pystoi');
                close(f);
                exit;
            end;



            while not eof(f) do
                begin
                    inc(n);
                    {$I-}
                    Read(f,table[n]);
                    {$I+}
                    if IOResult <> 0 then
                        dec(n);
                end;
        WriteLn('Zapusu (',n,'):');
        WriteLn;
        WriteLn('#  |   Key      |       Body')  ;
        WriteLn;
        for i:=1 to n do
            begin
                with table[i] do
                    begin
                        Writeln(i,' ',key:7,' ',body:25);

                    end;
            end;
        WriteLn;
        Close(f);
    End;
procedure FileSave;
    var i:longint;
    Begin
        Assign(f, filename);
        {$I-}
        Rewrite(f);
        {$I+}
        if ioresult <> 0 then
            WriteLn('Error! No access to file!');

        for i:=1 to n do
            Write(f, table[i]);



        Close(f);

    End;


procedure FileAdd;
    var i,j:longint;
        ch:char;
        s:string;

    Begin
        FileRead;
        writeln;
        i:=n+1;
        WriteLn('Nova9 zapusb...');
        table[i].key:=-1;
        while (table[i].key<1)or(IORESULT<>0) do
            begin
                 WriteLn('Vvedute Key (>0):');
                 {$I-}
                 ReadLn(table[i].key);
                 {$I+}
                 if ioresult <> 0 then WriteLn('Error! only num');
            end;

        WriteLn('Vvedute Body:');
        readln(table[i].body);
        inc(n);
        FileSave;

        go:=2;


    End;

procedure FileDel;
    var del,i:longint;
    Begin
        FileRead;
        WriteLn;
        WriteLn('---------');

        if n<1 then
            begin
                WriteLn('Net zapusei. Najmute Enter');
                readln;
                go:=1;
                exit;
            end;

        WriteLn('Najmute Space - menu, drygyu - prestyputb k edalenuyu ');
        if readkey = #32  then
            begin
                go:=1;
                exit;
            end;


        del:=200;
        while del>n do
            begin
                WriteLn('Zapusb ydalutb')  ;
                readln(del);
                if del>n then
                    WriteLn('Net takoi zapusu');
            end;


        for i:=del to n-1 do
            table[i]:=table[i+1];

        dec(n);

        FileSave;
        go:=2;

    End;

procedure FileSort;
var
i,k:integer;
j:rec;
Begin
        clrscr;
        for i:=1 to 4 do
                For k:=2 to 5 do
                if table[i].key>table[k].key then
                begin
                        j:=table[i];
                        table[i]:=table[k];
                        table[i]:=j;
                        end;

        WriteLn('Space - Menu');
        WriteLn('Esc   - Exit');



        case readkey of
            #27:go:=0;
            #32:go:=1;
          end;




    End;

procedure FileChange;
    Begin
        clrscr;
        WriteLn('Vvedute nazvanue faila s kotorum xotte rabotatb');
        Readln(filename);
        Writeln('Dl9 prodol>i<enue najmute enter');
        readln;
        go:=1;
    End;

Begin
    go:=1; quit:=false;
    filename:='data.txt';
    while not quit do
        begin
            case go of
                1: Menu;
                2: begin
                    FileRead;
                    WriteLn;
                    WriteLn('Vernuts9 v menu -  Space')    ;
                    case readkey of
                        #32:go:=1;
                      end;
                   end;
                3: FileAdd;
                4: FIleDel;
                5: FileSort;
                6: FileChange;

              else quit:=true;
            end;



        end;
End.
guroDragon вне форума Ответить с цитированием
Старый 11.12.2013, 20:28   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Вроде все верно.
Вместо
For k:=2 to 5 do
вставить
For k:=i+1 to 5 do
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.12.2013, 20:34   #7
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

все уже пробовал, ниче не выходит...
guroDragon вне форума Ответить с цитированием
Старый 11.12.2013, 20:35   #8
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Аватар, нет, вроде надо каждый раз с начала. Это - пузырек.
Если например так : 5,7,9,3,1 - как 1 поставить на первое место.

Вроде нашел:
Код:
 table[i]:=table[k];
 table[i]:=j;
А что table[k] ?

Последний раз редактировалось type_Oleg; 11.12.2013 в 20:39.
type_Oleg вне форума Ответить с цитированием
Старый 11.12.2013, 20:40   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от guroDragon Посмотреть сообщение
все уже пробовал, ниче не выходит...
Ну все попробовать жизни не хватит. А то, что в #6 пробовали?
Цитата:
каждый раз с начала
Олег, вы просто не подумали
Цитата:
А что table[k] ?
Да и это тоже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.12.2013 в 20:44.
Аватар вне форума Ответить с цитированием
Старый 11.12.2013, 20:43   #10
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Ну пусть попробует в процедуре сортировки во внутреннем for вместо
table[i]:=j; вот это table[k]:=j;
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование record в record Anton911 Общие вопросы Delphi 7 03.05.2012 08:49
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Record! .K.E.P. Паскаль, Turbo Pascal, PascalABC.NET 1 17.12.2010 21:56
В чём различие записей Record от Packed Record? Terran Общие вопросы Delphi 7 08.06.2010 17:14
Record / Packed Record Alex Cones Общие вопросы Delphi 7 11.11.2009 10:43