05.05.2012, 21:19 | #1 (permalink) |
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. |
05.05.2012, 21:19 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Рекомендую вам внимательно пролистать похожие топики Упорядочить файлы Упорядочить массив Как упорядочить значки в папке Мой компьютер |
06.05.2012, 11:58 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Написал. Заодно исправил кучу ошибок:
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. |
06.05.2012, 20:56 | #3 (permalink) |
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; |
06.05.2012, 23:02 | #5 (permalink) |
Специалист
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
07.05.2012, 11:12 | #7 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Виноват, каюсь, посыпаю голову пеплом, смиренно прошу прощения: ошибочка таки да, проскочила. Исправил в исходном тексте (выделено красным). И ведь тестировал же - ан вот пропустил.
|
07.05.2012, 12:53 | #8 (permalink) |
Member
Регистрация: 29.10.2011
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: -42
|
спасибо огромное
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|