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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2012, 13:30   #1
Fatalita
Пользователь
 
Регистрация: 12.10.2011
Сообщений: 33
По умолчанию Указатели.

Задача: Багаж пассажира характеризуется количеством вещей и общим весом вещей. Дан файл f, содержащий информацию о багаже нескольких пассажиров. Отсортировать пассажиров по убыванию общего веса багажа.

Нужно написать программу, с помощью указателей. Я написала без них. Кто - нибудь поправит? А я пойму.

Делфи.

Код:
program klass;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TAbit= record
    FIO:string[250];
    kol,ves,Res:Integer;
end;

var
  i,j,n,max:Integer;
  Passajir: array [1..200] of TAbit;
  C0:TAbit;
  F: Text;
  T: file of TAbit;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  Assign(F, 'bagaj.txt');
  Reset(F);
  N:=0;
  while not Eof(F) do
    begin
      N:=N+1;
      with Passajir[N] do
        begin
          ReadLn(F, FIO);
          ReadLn(F, kol, ves);
          Res:=Kol*ves;
        end;
    end;
    Close(F);
    for i:=1 to n-1 do
      begin
        Max:=i;
        for j:=i+1 to n do
          if Passajir[j].res>Passajir[Max].res
            then Max:=j;
        C0:=Passajir[i];
        Passajir[i]:=Passajir[max];
        Passajir[max]:=C0;
      end;
    Assign(T,'pas.dat');
    Rewrite(T);
    for i:=1 to n do
      begin
        WriteLn(Passajir[i].FIO);
        write(T, Passajir[i]);
      end;
    Readln;
    Close(T);
end.
Спасибо.

Последний раз редактировалось Fatalita; 15.10.2012 в 13:37.
Fatalita вне форума Ответить с цитированием
Старый 15.10.2012, 16:17   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, изучайте...

Код:
program klasssort2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;


type
  TAbit = record
    FIO:string[250];
    kol,ves,Res:Integer;
  end;

  PListRec = ^TListRec;
  TListRec = record
    data : TAbit;
    next : PListRec
  end;

procedure ShowList(first : PListRec);
var
  temp: PListRec;
begin
  temp := first;
  WriteLn('List contains of: ');
  while temp <> nil do
  begin
    writeln(StrAnsiToOem( temp^.data.FIO), ' ', temp^.data.kol, ' ', temp^.data.ves );
    temp := temp^.next;
  end;
  WriteLn;
end;

procedure SortList( first : PListRec );
var temp, pK, pMax : PListRec;
  COtemp : TAbit;
begin
  temp := first;
  while temp <> nil do begin
    pMax := temp;
    pK := temp^.next;
    while pK <> nil do begin
      if pK^.data.Res>pMax^.data.Res then pMax := pK;
      pK := pK^.next
    end;
    if pMax<>temp then begin {меняем элементы местами
                           ВНИМАНИЕ! Меняем только данные, ссылки не трогаем! }
      COtemp := temp^.data;
      temp^.data := pMax^.Data;
      pMax^.Data := COtemp
    end;
    temp := temp^.next;
  end;
end;

procedure SaveListToTypedFile( first : PListRec );
var
  T: file of TAbit;
  temp: PListRec;
begin
  Assign(T,'pas.dat');
  Rewrite(T);
  temp := first;
  while temp <> nil do
  begin
    // writeln(StrAnsiToOem( temp^.data.FIO), ' ', temp^.data.kol, ' ', temp^.data.ves );
    write( T, temp^.data );
    temp := temp^.next;
  end;
  Close(T);
end;

var
  F: Text;
  head, tmp : PListRec;


begin
  Assign(F, 'bagaj.txt');
  Reset(F);
  head := nil;

  {чтение текстового файла в список}
  while not Eof(F) do
    begin
      new(tmp);
      tmp^.next := head;
      head := tmp;

      with tmp^.data do
        begin
          ReadLn(F, FIO);
          ReadLn(F, kol, ves);
          Res:=Kol*ves;
        end;
    end;
    Close(F);

    {выведем содержимое списка}
    ShowList( head );

    {отсортируем список}
    SortList( head );

    WriteLn('List after sort:');
    ShowList( head );

    {сохраним данные в типизированный файл}
    SaveListToTypedFile( head );

    readln
end.


примечание. в данном примере при сортировке меняются местами данные.
В случае использования массивов - это единственный возможный способ поменять местами I и J-й элементы.
Однако, в данном случае, при использовании связных списков это простой, но заведомо неэффективный способ обмена - гораздо предпочтительнее (и намного сложнее) изменять только ссылки так, чтобы информационная часть не трогалась, а изменялись только взаимосвязи элементов.

Последний раз редактировалось Serge_Bliznykov; 15.10.2012 в 16:23.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели ConverterDU Общие вопросы C/C++ 1 18.02.2011 16:27
указатели Gen_r_questions Общие вопросы C/C++ 9 13.02.2011 21:07
указатели cizer Помощь студентам 1 26.01.2011 04:30
Указатели C gignet Общие вопросы C/C++ 7 04.06.2010 23:35
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39