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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2013, 18:32   #1
lerenia
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 13
По умолчанию Массив записей (Pascal)

В файле содержаться адреса n человек. Вывести фамилии людей, живущих в разных городах по одинаковым адресам, или сообщить что таких людей нет. Создать новый файл, в который скопировать данные из первого файла, упорядоченные по фамилиям. В своем решении обязательно использовать процедуры или функции.

Поразмышляв я решила что нужно использовать массив записей где первая строчка с наименованиями полей будет: Фамилия Город Адресс

а потом сравнивать:
допустим в первой процедуре узнать все фамилия проживающие в разных городах;
во второй процедуре (работая уже с фамилиями из первой процедуры) вывести все фамилии с одинаковыми адресами
а в третьей процедуре упорядочить фамилии.
Ну а в последней процедуре создать новый файл и перезаписать в него данные.


Мой вопрос заключается в следующем: как сравнить города и адреса? Я не понимаю этот нюанс. Нам дано неизвестное количество людей(т.е. решать нужно для любого числа) . Подскажите как отфильтровать
lerenia вне форума Ответить с цитированием
Старый 09.01.2013, 19:03   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
в первой процедуре узнать все фамилия проживающие в разных городах
Это еще зачем?

Цитата:
как сравнить города и адреса?
Код:
if (A[i].Addres.City      = A[j].Addres.City     ) and
   (A[i].Addres.Street    = A[j].Addres.Street   ) and
   (A[i].Addres.House     = A[j].Addres.House    ) and
   (A[i].Addres.Apartment = A[j].Addres.Apartment) then
Sibedir вне форума Ответить с цитированием
Старый 09.01.2013, 19:05   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Проще всего сразу отсортировать все записи по адресам. И дальше смотреть, если у идущих подряд записей с одинаковыми адресами разные города - выводить их.
Son Of Pain вне форума Ответить с цитированием
Старый 09.01.2013, 19:08   #4
lerenia
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Проще всего сразу отсортировать все записи по адресам. И дальше смотреть, если у идущих подряд записей с одинаковыми адресами разные города - выводить их.
так сколько полей записей надо делать?
lerenia вне форума Ответить с цитированием
Старый 09.01.2013, 19:09   #5
lerenia
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Это еще зачем?


Код:
if (A[i].Addres.City      = A[j].Addres.City     ) and
   (A[i].Addres.Street    = A[j].Addres.Street   ) and
   (A[i].Addres.House     = A[j].Addres.House    ) and
   (A[i].Addres.Apartment = A[j].Addres.Apartment) then
но мне надо наоборот, что бы города были разные
lerenia вне форума Ответить с цитированием
Старый 09.01.2013, 20:00   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
но мне надо наоборот, что бы города были разные
Ну да, сори
Код:
if (A[i].Addres.City      <> A[j].Addres.City     ) and
   (A[i].Addres.Street    =  A[j].Addres.Street   ) and
   (A[i].Addres.House     =  A[j].Addres.House    ) and
   (A[i].Addres.Apartment =  A[j].Addres.Apartment) then
Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Проще всего сразу отсортировать все записи по адресам. И дальше смотреть, если у идущих подряд записей с одинаковыми адресами разные города - выводить их.
согласен

// Добавлено (1:59) ----------------------------------------------------------------------------------------------------------------------------------------------------
Сортировка показалась интересной (в часности функция сравнения)
Код:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TMyRec = record
    Name: String;
    City: String;
    Street: String;
    House: Word;
    Aapartment: Word;
  end;

function FirstMoreSecond_1 (First, Second: TMyRec): Boolean;
begin
  Result := (First.Aapartment > Second.Aapartment) or ((First.Aapartment = Second.Aapartment) and
           ((First.House      > Second.House     ) or ((First.House      = Second.House     ) and
           ((First.Street     > Second.Street    ) or ((First.Street     = Second.Street    ) and
            (First.City       > Second.City      ))))));
end;

function FirstMoreSecond_2 (First, Second: TMyRec): Boolean;
begin
  if (First.Aapartment = Second.Aapartment) then begin
    if (First.House = Second.House) then begin
      if (First.Street = Second.Street) then begin
        Result := (First.City > Second.City);
      end
      else
        Result := (First.Street > Second.Street);
    end
    else
      Result := (First.House > Second.House);
  end
  else
    Result := (First.Aapartment > Second.Aapartment);
end;

var
  _TF: TextFile;
  _Arr: array of TMyRec;
  i, j, c: Integer;
  s: String;
  w: Word;
  b: TMyRec;

begin
  SetLength (_Arr, 0);
  c := -1;
  AssignFile (_TF, '1.ткс');
  Reset (_TF);
  while not EOF(_TF) do begin
    Inc (c);
    SetLength (_Arr, c+1);
    ReadLn (_TF, s); _Arr[c].Name       := s;
    ReadLn (_TF, s); _Arr[c].City       := s;
    ReadLn (_TF, s); _Arr[c].Street     := s;
    ReadLn (_TF, w); _Arr[c].House      := w;
    ReadLn (_TF, w); _Arr[c].Aapartment := w;
  end;
  CloseFile (_TF);

  Writeln ('ВСЕГО ЗАПИСЕЙ - ', c+1);
  Writeln ('----------------------------------------------------------------');
  for i := 0 to c do begin
    Writeln ('Name       = ', _Arr[i].Name      );
    Writeln ('City       = ', _Arr[i].City      );
    Writeln ('Street     = ', _Arr[i].Street    );
    Writeln ('House      = ', _Arr[i].House     );
    Writeln ('Aapartment = ', _Arr[i].Aapartment);
    Writeln ('----------------------------------------------------------------');
  end;

  Dec (c);
  for i := c downto 0 do
    for j := 0 to i do
//      if FirstMoreSecond_1 (_Arr[j], _Arr[j+1]) then begin
      if FirstMoreSecond_2 (_Arr[j], _Arr[j+1]) then begin
        b         := _Arr[j]  ;
        _Arr[j]   := _Arr[j+1];
        _Arr[j+1] := b        ;
      end;

  Readln;
  Writeln;
  Writeln;
  Writeln;
  Writeln ('ОТСОРТИРОВАННЫЙ МАССИВ');
  Writeln ('----------------------------------------------------------------');
  Inc (c);
  for i := 0 to c do begin
    Writeln ('Name       = ', _Arr[i].Name      );
    Writeln ('City       = ', _Arr[i].City      );
    Writeln ('Street     = ', _Arr[i].Street    );
    Writeln ('House      = ', _Arr[i].House     );
    Writeln ('Aapartment = ', _Arr[i].Aapartment);
    Writeln ('----------------------------------------------------------------');
  end;
  Readln;
end.
Это Delphi XE3. Для перехода на TP необходимо несколько видоизменить.

Последний раз редактировалось Sibedir; 09.01.2013 в 22:59.
Sibedir вне форума Ответить с цитированием
Старый 10.01.2013, 00:40   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Я извращенцо
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

type
  TMyRec = record
    Name: String[255];
    City: String[255];
    Street: String[255];
    House: Word;
    Aapartment: Word;
  end;
  PMyRec = ^TMyRec;

  TArr = array [0..$FFFF] of PMyRec;
  PArr = ^TArr;

var
  Arr: PArr;
  ArrCount: Integer;

{$define I_Like_Confusing}
{$define I_Like_Laconically}

{$ifdef I_Like_Confusing}
function FirstEqualSecond (First, Second: PMyRec): Boolean;
begin
  Result := (First.Street     = Second.Street    ) and
            (First.House      = Second.House     ) and
            (First.Aapartment = Second.Aapartment);
end;

procedure SortArr;
var
  rabArr: PArr;
  i, j, l, h: Integer;
  b1, b2: PMyRec;
begin
  GetMem (rabArr, ArrCount * SizeOf(PMyRec));
  h := ArrCount - 1;
  j := -1;
  for i := 0 to h do begin
    b1 := Arr[i];
    if b1 <> nil then begin
      Inc (j);
      rabArr[j] := b1;
      Arr[i] := nil;
      for l := i+1 to h do begin
        b2 := Arr[l];
        if (b2 <> nil) and FirstEqualSecond (b1, b2) then begin
          Inc (j);
          rabArr[j] := b2;
          Arr[l] := nil;
          if j = h then Break;
        end;
      end;
    end;
    if j = h then Break;
  end;
  FreeMem (Arr);
  Arr := rabArr;
end;
{$else I_Like_Confusing}

{$ifdef I_Like_Laconically}
function FirstMoreSecond (First, Second: PMyRec): Boolean;
begin
  Result := (First^.Aapartment > Second^.Aapartment) or ((First^.Aapartment = Second^.Aapartment) and
           ((First^.House      > Second^.House     ) or ((First^.House      = Second^.House     ) and
           ((First^.Street     > Second^.Street    ) or ((First^.Street     = Second^.Street    ) and
            (First^.City       > Second^.City      ))))));
end;
{$else I_Like_Laconically}

function FirstMoreSecond (First, Second: PMyRec): Boolean;
begin
  if (First^.Aapartment = Second^.Aapartment) then begin
    if (First^.House      = Second^.House     ) then begin
      if (First^.Street     = Second^.Street    ) then begin
        Result := (First^.City > Second^.City);
      end
      else
        Result := (First^.Street     > Second^.Street    );
    end
    else
      Result := (First^.House      > Second^.House     );
  end
  else
    Result := (First^.Aapartment > Second^.Aapartment);
end;
{$endif I_Like_Laconically}

procedure SortArr;
var
  i, j, h: Integer;
  b: PMyRec;
begin
  h := ArrCount - 2;
  for i := h downto 0 do
    for j := 0 to i do
      if FirstMoreSecond (Arr[j], Arr[j+1]) then begin
        b        := Arr[j]  ;
        Arr[j]   := Arr[j+1];
        Arr[j+1] := b       ;
      end;
end;
{$endif I_Like_Confusing}

var
  _TF: TextFile;
  i, h: Integer;
  s: String[255];
  w: Word;

begin
  AssignFile (_TF, '1.ткс');
  Reset (_TF);
  ReadLn (_TF, ArrCount);
  GetMem (Arr, ArrCount * SizeOf(PMyRec));
  h := ArrCount-1;
  for i := 0 to h do begin
    GetMem (Arr[i], SizeOf(TMyRec));
    ReadLn (_TF, s); Arr[i].Name       := s;
    ReadLn (_TF, s); Arr[i].City       := s;
    ReadLn (_TF, s); Arr[i].Street     := s;
    ReadLn (_TF, w); Arr[i].House      := w;
    ReadLn (_TF, w); Arr[i].Aapartment := w;
  end;
  CloseFile (_TF);

  Writeln ('ВСЕГО ЗАПИСЕЙ - ', h+1);
  Writeln ('----------------------------------------------------------------');
  for i := 0 to h do begin
    Writeln ('Name       = ', Arr[i].Name      );
    Writeln ('City       = ', Arr[i].City      );
    Writeln ('Street     = ', Arr[i].Street    );
    Writeln ('House      = ', Arr[i].House     );
    Writeln ('Aapartment = ', Arr[i].Aapartment);
    Writeln ('----------------------------------------------------------------');
  end;
  Readln;

  SortArr;
  Writeln;
  Writeln;
  Writeln;
  Writeln ('ОТСОРТИРОВАННЫЙ МАССИВ');
  Writeln ('----------------------------------------------------------------');
  for i := 0 to h do begin
    Writeln ('Name       = ', Arr[i].Name      );
    Writeln ('City       = ', Arr[i].City      );
    Writeln ('Street     = ', Arr[i].Street    );
    Writeln ('House      = ', Arr[i].House     );
    Writeln ('Aapartment = ', Arr[i].Aapartment);
    Writeln ('----------------------------------------------------------------');
  end;
  Readln;
  FreeMem (Arr);
end.
Вложения
Тип файла: zip 1.ткс.zip (270 байт, 7 просмотров)

Последний раз редактировалось Sibedir; 10.01.2013 в 01:12.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив записей(Pascal) taswor Помощь студентам 0 18.12.2012 20:54
Массив записей(Pascal) taswor Помощь студентам 0 18.12.2012 19:43
массив записей cat_gav Общие вопросы C/C++ 0 09.12.2012 16:58
Создать массив записей в соответствии с заданной структурой. Количество записей не больше 10. zulja Паскаль, Turbo Pascal, PascalABC.NET 0 21.05.2012 07:50