Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Массив записей, Pascal (http://www.tehnari.ru/f41/t83732/)

lerenia 09.01.2013 19:29

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

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

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


Мой вопрос заключается в следующем: как сравнить города и адреса? Я не понимаю этот нюанс. Нам дано неизвестное количество людей(т.е. решать нужно для любого числа) . Подскажите как отфильтровать

Vladimir_S 10.01.2013 11:44

Цитата:

Сообщение от lerenia (Сообщение 846106)
допустим в первой процедуре узнать все фамилия проживающие в разных городах; во второй процедуре (работая уже с фамилиями из первой процедуры) вывести все фамилии с одинаковыми адресами а в третьей процедуре упорядочить фамилии. Ну а в последней процедуре создать новый файл и перезаписать в него данные. Мой вопрос заключается в следующем: как сравнить города и адреса? Я не понимаю этот нюанс. Нам дано неизвестное количество людей(т.е. решать нужно для любого числа) . Подскажите как отфильтровать

Вы знаете, не имея программы, очень трудно дать ответ.
Но так, в общем, очень просто:
строится цикл типа
Код:

for i:=1 to n-1 do
 for j:=i+1 to n do
  If (data[i].address=data[j].address) and (data[i].town<>data[i].town) then
  begin
    Ink(k);
    Q[k]:=data[i];
    Ink(k);
    Q[k]:=data[j];
  end;

Здесь во вспомогательном массиве записей Q мы собрали данные о людях, имеющих одинаковые адреса, но в разных городах. Беда только в том, что если таких людей (имеющих одинаковый адрес в разных городах) больше двух, то возникнут повторы, которые нужно как-то исключить. Это можно сделать, например, так. Пусть количество элементов в массиве Q равно k - так и получится после предыдущей фильтрации. Тогда
Код:

i:=0;
Repeat
 Inc(i);
 for j:=i+1 to k do
  if Q[j]=Q[i] then
  begin
    for m:=j+1 to k do Q[m-1]:=Q[m];
    Dec(k);
  end;
Until i>=k-1;

Попробуйте. К сожалению, честно признаюсь, сейчас я сильно занят и возможности тестирования нет, так что Вы уж сами.

Егор1337 14.12.2015 01:10

Цитата:

Сообщение от Vladimir_S (Сообщение 846524)
Вы знаете, не имея программы, очень трудно дать ответ.
Но так, в общем, очень просто:
строится цикл типа
Код:

for i:=1 to n-1 do
 for j:=i+1 to n do
  If (data[i].address=data[j].address) and (data[i].town<>data[i].town) then
  begin
    Ink(k);
    Q[k]:=data[i];
    Ink(k);
    Q[k]:=data[j];
  end;

Здесь во вспомогательном массиве записей Q мы собрали данные о людях, имеющих одинаковые адреса, но в разных городах. Беда только в том, что если таких людей (имеющих одинаковый адрес в разных городах) больше двух, то возникнут повторы, которые нужно как-то исключить. Это можно сделать, например, так. Пусть количество элементов в массиве Q равно k - так и получится после предыдущей фильтрации. Тогда
Код:

i:=0;
Repeat
 Inc(i);
 for j:=i+1 to k do
  if Q[j]=Q[i] then
  begin
    for m:=j+1 to k do Q[m-1]:=Q[m];
    Dec(k);
  end;
Until i>=k-1;

Попробуйте. К сожалению, честно признаюсь, сейчас я сильно занят и возможности тестирования нет, так что Вы уж сами.

Помогите сделать это в моем коде, уже день сижу не могу понять куда и что вставлять что бы не было повторов!
Код:

program lab_9;
uses crt;
const
  way='f_file.txt';
  waytxt='txt_file.txt';
type el=record
        name,surname,otchestvo,adres,stat,data:string[40];
    end;
    arr_el=array [1..40] of el;
    ft=file of el;
var
    f:ft;
    r1:el;
    r:arr_el;
    t:text;
    str1:string;
    name,surname,otchestvo,stat,adres,data:string[40];
    i,j,q,z,o,m:integer;
    s:string;
begin
ClrScr;
i:=0;
assign(f,way);
rewrite(f);
assign(t,waytxt);
reset(t);
while not eof(t) do begin
    writeln;
    inc(i);
    readln(t,name);
    readln(t,surname);
    readln(t,otchestvo);
    readln(t,data);
    readln(t,stat);
    readln(t,adres);
    textcolor(4);
    write('ФИО: ');
    textcolor(7);
    write(surname,' ');   
    write(name,' ');
    writeln(otchestvo);
    textcolor(4);
    write('ДАТА РОЖД.: ');
    textcolor(7);
    writeln(data);
    textcolor(4);
    write('ПОЛ: ');
    textcolor(7);
    writeln(stat);
    textcolor(4);
    write('ДОМ. АДРЕСС: ');
    textcolor(7);
    writeln(adres);
    r[i].name:=name;
    r[i].surname:=surname;
    r[i].otchestvo:=otchestvo;
    r[i].data:=data;
    r[i].stat:=stat;
    r[i].adres:=adres;
    write(f,r[i]);
end;
close(t);
close(f);
writeln;
textcolor(2);
writeln('Люди с одинаковыми фамилиями:');
textcolor(7);
assign(t,'newtxt.txt');
rewrite(t);
for j:=1 to i do
    for q:=j+1 to i do
      if (r[j].surname=r[q].surname)
      then begin
    write(t,r[j].surname,' ');
    write(t,r[j].name,' ');
    write(t,r[j].otchestvo);
    write(t,r[j].data);
    write(t,r[j].stat);
    write(t,r[j].adres);
    {dwadawdawdawdawdawdawdawdawdwadawdwa}
    writeln(t,r[q].surname,' ');
    writeln(t,r[q].name,' ');
    writeln(t,r[q].otchestvo);
    writeln(t,r[q].data);
    writeln(t,r[q].stat);
    writeln(t,r[q].adres);
    {dwadawdawdawdawdawdawdawdawdwadawdwa}
    writeln;
    textcolor(4);
    write('ФИО: ');
    textcolor(7);
    write(r[j].surname,' ');
    write(r[j].name,' ');
    writeln(r[j].otchestvo);
    textcolor(4);
    write('ДАТА РОЖД.: ');
    textcolor(7);
    writeln(r[j].data);
    textcolor(4);
    write('ПОЛ: ');
    textcolor(7);
    writeln(r[j].stat);
    textcolor(4);
    write('ДОМ. АДРЕСС: ');
    textcolor(7);
    writeln(r[j].adres);
    {dwadawdawdawdawdawdawdawdawdwadawdwa}
    writeln;
      textcolor(4);
    write('ФИО: ');
    textcolor(7);
    write(r[q].surname,' ');
    write(r[q].name,' ');
    writeln(r[q].otchestvo);
    textcolor(4);
    write('ДАТА РОЖД.: ');
    textcolor(7);
    writeln(r[q].data);
    textcolor(4);
    write('ПОЛ: ');
    textcolor(7);
    writeln(r[q].stat);
    textcolor(4);
    write('ДОМ. АДРЕСС: ');
    textcolor(7);
    writeln(r[q].adres);
    end;
    i:=0;
close(t);
writeln;
end.

файл txt_file.txt если нужно.

Код:

Василий
Глушков
Петрович
03.02.98
Mужской
Киев, Метталистов, 8\123
Егор
Глушков
Андреевич
08.12.97
Mужской
Киев, 23 августа, 32\32
Константин
Глушков
Игоревич
12.11.99
Mужской
Киев, Хрещатик, 18а\22
Иван
Батрудинов
Юрьевич
13.01.98
Mужской
Харьков, Ленина, 81\33
Иван
Батрудинов1
Юрьевич
13.01.98
Mужской
Харьков, Ленина, 81\33


Vladimir_S 14.12.2015 12:50

Цитата:

Сообщение от Егор1337 (Сообщение 1187976)
Помогите сделать это в моем коде, уже день сижу не могу понять куда и что вставлять что бы не было повторов!

Отладил. Получите.
Пара замечаний.
1. Не совсем понятно назначение файла f_file: вроде как он и "не играет" в программе.
2. И кстати, если уж Вы вводите типизированный файл, в данном случае - файл записей, то не следует давать ему расширение ".txt". То есть формально можно, но - зачем?

Код:

uses crt;
const
 way='f_file';
 waytxt='txt_file.txt';
type
 el=record
    name,surname,otchestvo,adres,stat,data:string[40];
    end;
 arr_el=array [1..40] of el;
 ft=file of el;
var
 f:ft;
 r1:el;
 r:arr_el;
 t:text;
 str1:string;
 name,surname,otchestvo,stat,adres,data:string[40];
 i,j,q:integer;
 b,b1:boolean;

Begin
 ClrScr;
 i:=0;
 assign(f,way);
 rewrite(f);
 assign(t,waytxt);
 reset(t);
 while not eof(t) do
  begin
  writeln;
  inc(i);
  readln(t,name);
  readln(t,surname);
  readln(t,otchestvo);
  readln(t,data);
  readln(t,stat);
  readln(t,adres);
  textcolor(4);
  write('ФИО: ');
  textcolor(7);
  write(surname,' ');
  write(name,' ');
  writeln(otchestvo);
  textcolor(4);
  write('ДАТА РОЖД.: ');
  textcolor(7);
  writeln(data);
  textcolor(4);
  write('ПОЛ: ');
  textcolor(7);
  writeln(stat);
  textcolor(4);
  write('ДОМ. АДРЕС: ');
  textcolor(7);
  writeln(adres);
  r[i].name:=name;
  r[i].surname:=surname;
  r[i].otchestvo:=otchestvo;
  r[i].data:=data;
  r[i].stat:=stat;
  r[i].adres:=adres;
  write(f,r[i]);
  end;
 close(t);
 close(f);
 writeln;
 textcolor(2);
 writeln('Люди с одинаковыми фамилиями:');
 textcolor(7);
 assign(t,'newtxt.txt');
 rewrite(t);
 for j:=1 to i-1 do
  begin
  b1:=true;
  for q:=1 to j-1 do
    if r[j].surname=r[q].surname then b1:=false;
  if b1 then
    begin
    b:=false;
    q:=j;
    repeat
      inc(q);
      if r[j].surname=r[q].surname then b:=true;
    until b or (q=i);
    if b then
      begin
      writeln(t,r[j].surname,' ');
      writeln(t,r[j].name,' ');
      writeln(t,r[j].otchestvo);
      writeln(t,r[j].data);
      writeln(t,r[j].stat);
      writeln(t,r[j].adres);
      writeln(t);
      textcolor(4);
      write('ФИО: ');
      textcolor(7);
      write(r[j].surname,' ');
      write(r[j].name,' ');
      writeln(r[j].otchestvo);
      textcolor(4);
      write('ДАТА РОЖД.: ');
      textcolor(7);
      writeln(r[j].data);
      textcolor(4);
      write('ПОЛ: ');
      textcolor(7);
      writeln(r[j].stat);
      textcolor(4);
      write('ДОМ. АДРЕС: ');
      textcolor(7);
      writeln(r[j].adres);
      writeln;
      {dwadawdawdawdawdawdawdawdawdwadawdwa}
      for q:=j+1 to i do
        if r[j].surname=r[q].surname then
        begin
          writeln(t,r[q].surname,' ');
          writeln(t,r[q].name,' ');
          writeln(t,r[q].otchestvo);
          writeln(t,r[q].data);
          writeln(t,r[q].stat);
          writeln(t,r[q].adres);
          writeln(t);
          textcolor(4);
          write('ФИО: ');
          textcolor(7);
          write(r[q].surname,' ');
          write(r[q].name,' ');
          writeln(r[q].otchestvo);
          textcolor(4);
          write('ДАТА РОЖД.: ');
          textcolor(7);
          writeln(r[q].data);
          textcolor(4);
          write('ПОЛ: ');
          textcolor(7);
          writeln(r[q].stat);
          textcolor(4);
          write('ДОМ. АДРЕС: ');
          textcolor(7);
          writeln(r[q].adres);
          writeln;
        end;
      end;
    end;
  end;
 close(t);
 readln;
End.



Часовой пояс GMT +4, время: 02:04.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.