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


Ответ
 
Опции темы Опции просмотра
Старый 05.05.2012, 21:19   #1 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
По умолчанию Упорядочить по фамилиям

Код:
program Project2;

const
    n=2;
type
      telem=record
      fam:string[30];
      markaavto:string[30];
      nomer:string[10];
      adres:string[50]
end;
tmas=array [1..n] of telem;
//-------------------------------------------------------------------
procedure vvoddannuh(var a:tmas); //ввод данных
var i:Integer;
    b:telem;
begin
  for i:=1 to n do
  begin
    Writeln('введи фамилию');
    Readln(b.fam);
    Writeln('введи марку автомобиля');
    Readln(b.markaavto);
    Writeln('введи номер');
    Readln(b.nomer);
    Writeln('введи адрес');
    Readln(b.adres)
  end
end;
Procedure vuvoddannuh(var a:tmas);
var i:Integer;
    b:array[1..n] of telem;
begin
   for i:=1 to n do
   begin
   writeln ('--------------------------------------------------------------------------');
   writeln ('фамилия    / марка автомобиля       / номер           / адрес             ');
   writeln ('--------------------------------------------------------------------------');
   writeln(b[i].fam:15,' ',b[i].markaavto:15,' ',b[i].nomer:15,' ',b[i].adres);
   readln
   end
end;
var
  a:tmas;
begin
  vvoddannuh(a);
  vuvoddannuh(a);

end.
помогите написать процедуру упорядочения массива по фамилиям
virginia вне форума   Ответить с цитированием

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

Рекомендую вам внимательно пролистать похожие топики

Упорядочить файлы
Упорядочить массив
Как упорядочить значки в папке Мой компьютер

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

Цитата:
Сообщение от virginia Посмотреть сообщение
помогите написать процедуру упорядочения массива по фамилиям
Написал. Заодно исправил кучу ошибок:

1. В полях записи не нужно задавать формат строк: при выводе поля nomer это приводит к ошибке, поскольку там формат вывода (15) превышает длину строки (10) и номер просто не отображается.

2. В процедуре vvoddannuh не установлена связь между внутренним параметром b и элементом массива a[i]. Я предлагаю вообще обойтись без этого b - он не нужен. То же относится и к процедуре vuvoddannuh.

3. В процедуре vuvoddannuh массив a является входным параметром, а потому ставить перед ним var недопустимо.

4. Поправлена строка-заголовок таблицы. Тут, в принципе, следовало бы еще поработать. Ну это уж Вы сами.

Упорядочение я оформил в виде процедуры Ordering без параметров, поскольку идет обработка глобального массива. Но чтобы не возникало ошибки, раздел описания глобальных переменных пришлось переместить в начало, перед процедурами. Между прочим, именовать глобальные переменные и параметры процедур одинаково (в данном случае речь о массиве a) хоть и допустимо, но крайне нежелательно. Поэтому глобальный я обозвал owners (владельцы). Впрочем, это можете переделать на свой вкус.
Итого:
Код:
const
    n=5;
type
      telem=record
      fam:string;
      markaavto:string;
      nomer:string;
      adres:string
end;
tmas=array [1..n] of telem;

var
  owners:tmas;

//-------------------------------------------------------------------
procedure vvoddannuh(var a:tmas); //ввод данных
var i:Integer;
begin
  for i:=1 to n do
  begin
    Writeln('введи фамилию');
    Readln(a[i].fam);
    Writeln('введи марку автомобиля');
    Readln(a[i].markaavto);
    Writeln('введи номер');
    Readln(a[i].nomer);
    Writeln('введи адрес');
    Readln(a[i].adres);
    writeln;
  end
end;

Procedure vuvoddannuh(a:tmas);
var i:Integer;
begin
   for i:=1 to n do
   begin
   writeln ('--------------------------------------------------------------------------');
   writeln ('    фамилия    / марка автомобиля       / номер           / адрес             ');
   writeln ('--------------------------------------------------------------------------');
   writeln(a[i].fam:15,' ',a[i].markaavto:15,' ',a[i].nomer:15,' ',a[i].adres);
   end
end;

Procedure ordering;
var
 Dummy:telem;
 i,j:Integer;
begin
 for i:=1 to n do
  for j:=1 to n-i do
   if Ord(owners[j].fam[1])>Ord(owners[j+1].fam[1]) then
    begin
     Dummy:=owners[j];
     owners[j]:=owners[j+1];
     owners[j+1]:=Dummy;
    end
end;

begin
  vvoddannuh(owners);
  writeln;
  vuvoddannuh(owners);
  writeln('Press "Enter" to continue...');
  readln;
  writeln;
  writeln('Ordered:');
  ordering;
  vuvoddannuh(owners);
  readln
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 06.05.2012, 20:56   #3 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
По умолчанию

спасибо.
Код:
function poisk(a:tmas):string;
var i,j:Integer;
    k:string;
begin
   for i:=1 to n-1 do
   for j:=i+1 to n do
   if (owners[i].fam=owners[j].fam)and(owners[i].adres=owners[j].adres) then k:=owners[i].fam
                                                                else k:='таких нет';
   poisk:=k;
end;
не поможете еще доработать эту функцию?нужно вывести фамилии автовладельцев,имеющих более одной машины
virginia вне форума   Ответить с цитированием
Старый 06.05.2012, 22:29   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от virginia Посмотреть сообщение
не поможете еще доработать эту функцию?нужно вывести фамилии автовладельцев,имеющих более одной машины
Сейчас попробую. Но тут исключить повторы не так просто.
Vladimir_S вне форума   Ответить с цитированием
Старый 06.05.2012, 23:02   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну вот что получилось. Заодно исправил процедуру вывода: как-то не обратил внимание, что шапка таблицы была внутрь цикла загнана. Вовсе ни к чему.
Код:
const
    n=5;
type
      telem=record
      fam:string;
      markaavto:string;
      nomer:string;
      adres:string
end;
tmas=array [1..n] of telem;

var
  owners:tmas;

//-------------------------------------------------------------------
procedure vvoddannuh(var a:tmas); //ввод данных
var i:Integer;
begin
  for i:=1 to n do
  begin
    Writeln('введи фамилию');
    Readln(a[i].fam);
    Writeln('введи марку автомобиля');
    Readln(a[i].markaavto);
    Writeln('введи номер');
    Readln(a[i].nomer);
    Writeln('введи адрес');
    Readln(a[i].adres);
    writeln;
  end
end;

Procedure vuvoddannuh(a:tmas);
var i:Integer;
begin
   writeln ('--------------------------------------------------------------------------');
   writeln ('    фамилия    / марка автомобиля       / номер           / адрес             ');
   writeln ('--------------------------------------------------------------------------');
   for i:=1 to n do
    writeln(a[i].fam:15,' ',a[i].markaavto:15,' ',a[i].nomer:15,' ',a[i].adres);
end;

Procedure ordering;
var
 Dummy:telem;
 i,j:Integer;
begin
 for i:=1 to n do
  for j:=1 to n-i do
   if Ord(owners[j].fam[1])>Ord(owners[j+1].fam[1]) then
    begin
     Dummy:=owners[j];
     owners[j]:=owners[j+1];
     owners[j+1]:=Dummy;
    end
end;

Procedure vuvod_multi(a:tmas);
var
 i,j,r:Integer;
 P:Set of Byte;
begin
   r:=0;
   P:=[];
   for i:=1 to n-1 do
    for j:=i+1 to n do
     if (a[j].fam=a[i].fam) and (a[i].adres=a[j].adres) then
      begin
       if Not(i in P) then writeln(a[i].fam);
       if Not(j in P) then P:=P+[j];
       Inc(r);
      end;
   if r=0 then writeln('No such owners');
end;

begin
  vvoddannuh(owners);
  writeln;
  vuvoddannuh(owners);
  writeln('Press "Enter" to continue...');
  readln;
  writeln;
  writeln('Ordered:');
  ordering;
  vuvoddannuh(owners);
  writeln('Press "Enter" to continue...');
  readln;
  writeln;
  writeln('2 and more car owners:');
  vuvod_multi(owners);
  readln
end.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 07.05.2012, 09:59   #6 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
По умолчанию

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

Цитата:
Сообщение от virginia Посмотреть сообщение
процедура выводит все фамилии((((
Виноват, каюсь, посыпаю голову пеплом, смиренно прошу прощения: ошибочка таки да, проскочила. Исправил в исходном тексте (выделено красным). И ведь тестировал же - ан вот пропустил.
Миниатюры
cars.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 07.05.2012, 12:53   #8 (permalink)
virginia
Member
 
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
По умолчанию

спасибо огромное
virginia вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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