Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 09.01.2013, 19:29   #1 (permalink)
lerenia
Новичок
 
Регистрация: 09.01.2013
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Массив записей, Pascal

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

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

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


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

Старый 09.01.2013, 19:29
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Схожие темы можно найти через поиск, но я помогу вам и вышлю их сюда

Одномерный массив, Pascal
Массивы записей
Массив, файлы, подпрограммы. Pascal

Старый 10.01.2013, 11:44   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от lerenia Посмотреть сообщение
допустим в первой процедуре узнать все фамилия проживающие в разных городах; во второй процедуре (работая уже с фамилиями из первой процедуры) вывести все фамилии с одинаковыми адресами а в третьей процедуре упорядочить фамилии. Ну а в последней процедуре создать новый файл и перезаписать в него данные. Мой вопрос заключается в следующем: как сравнить города и адреса? Я не понимаю этот нюанс. Нам дано неизвестное количество людей(т.е. решать нужно для любого числа) . Подскажите как отфильтровать
Вы знаете, не имея программы, очень трудно дать ответ.
Но так, в общем, очень просто:
строится цикл типа
Код:
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;
Попробуйте. К сожалению, честно признаюсь, сейчас я сильно занят и возможности тестирования нет, так что Вы уж сами.
Vladimir_S вне форума   Ответить с цитированием
Старый 14.12.2015, 01:10   #3 (permalink)
Егор1337
Новичок
 
Регистрация: 14.12.2015
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Вы знаете, не имея программы, очень трудно дать ответ.
Но так, в общем, очень просто:
строится цикл типа
Код:
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
Егор1337 вне форума   Ответить с цитированием
Старый 14.12.2015, 12:50   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Егор1337 Посмотреть сообщение
Помогите сделать это в моем коде, уже день сижу не могу понять куда и что вставлять что бы не было повторов!
Отладил. Получите.
Пара замечаний.
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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.