• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Массив записей, Pascal

  • Автор темы Автор темы lerenia
  • Дата начала Дата начала

lerenia

Ученик
Регистрация
9 Янв 2013
Сообщения
1
Реакции
0
Баллы
0
Массив записей, Pascal

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

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

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


Мой вопрос заключается в следующем: как сравнить города и адреса? Я не понимаю этот нюанс. Нам дано неизвестное количество людей(т.е. решать нужно для любого числа) . Подскажите как отфильтровать
 
допустим в первой процедуре узнать все фамилия проживающие в разных городах; во второй процедуре (работая уже с фамилиями из первой процедуры) вывести все фамилии с одинаковыми адресами а в третьей процедуре упорядочить фамилии. Ну а в последней процедуре создать новый файл и перезаписать в него данные. Мой вопрос заключается в следующем: как сравнить города и адреса? Я не понимаю этот нюанс. Нам дано неизвестное количество людей(т.е. решать нужно для любого числа) . Подскажите как отфильтровать
Вы знаете, не имея программы, очень трудно дать ответ.
Но так, в общем, очень просто:
строится цикл типа
Код:
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;
Попробуйте. К сожалению, честно признаюсь, сейчас я сильно занят и возможности тестирования нет, так что Вы уж сами.
 
Вы знаете, не имея программы, очень трудно дать ответ.
Но так, в общем, очень просто:
строится цикл типа
Код:
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
 
Помогите сделать это в моем коде, уже день сижу не могу понять куда и что вставлять что бы не было повторов!
Отладил. Получите.
Пара замечаний.
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.
 
Назад
Сверху