IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Линейные списки, Исправить ишибки
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Здравствуйте. Помогите исправить ошибки, пожалуйста.

Задача:
1 Сформировать список с полями Улица,№дома,№квартира,кол-во жильцов и вывести на экран в виде таблицы.
2. Найти и вывести на экран кол-во жильцов по заданному пользователем адресу.
3. Отсортировать по кол-ву жильцов.
4. Сформировать новый список не включающий поля "улица".
5. Вывести новый список на экран в виде таблицы.

Заминка вышла в сортировке, у меня сортирует кол-во жильцов, а не по количеству. И при формировании нового списка я извлекаю инф из первого элемента и освобождаю его память, а на экран выводится только второй адрес(из двух) без поля "улица".

Помогите, если не трудно)))

Вот код:

program spisok;
uses crt;
type
sp=^adres;
adres=record
street:string;
dom,kv,zilci:integer;
link:sp;
end;
sp1=^adres1;
adres1=record
street:string;
dom,kv,zilci:integer;
link:sp1;
end;
var
begp,endp,pp:sp;
begp1,endp1:sp1;
i,j:integer;
nm:byte;
v:boolean;

Procedure vvod(var begp,endp:sp);
var pp:sp;
begin
Writeln('vvedite kolichestvo zap');
readln(nm);
for i:=1 to nm do
begin
new(pp);
write('street ');
readln(pp^.street);
write('# doma ');
readln(pp^.dom);
write('# kvartiri ');
readln(pp^.kv);
write('kol-vo zilcov ');
readln(pp^.zilci);
pp^.link:=nil;
if begp=nil
then begp:=pp
else endp^.link:=pp;
endp:=pp;
end;
end;

procedure vivod(begp,endp:sp);
var pp:sp;
begin
clrscr;
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');
for i:=1 to nm do
pp:=begp;
while pp<>nil do
begin
writeln;
write(pp^.street:12,' ');
write(pp^.dom:6, ' ' ,pp^.kv:9, ' ', pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('---------------------------------------------------');
writeln;
end;

procedure poisk(var begp1,endp1:sp1;begp,endp:sp);
var
pp:sp;
pp1:sp1;
begin
writeln('Vvedite street, dom, kv cheres enter');
begin
readln(pp1^.street);
readln(pp1^.dom);
readln(pp1^.kv);
pp:=begp;
while pp<>nil do
begin
if ((pp1^.street=pp^.street) and (pp1^.dom=pp^.dom)) and (pp1^.kv=pp^.kv)
then
begin
write('Kol-vo zilcov: ');
write(pp^.zilci);
writeln;
v:=true;
end;
if v=false then
writeln('takogo adresa ne naideno');
pp:=pp^.link;
end;
end;
end;

procedure sort(begp,endp:sp);
var
pp,p1,pt:sp;
t,r,g:integer;
k:string;
begin
for i:=1 to nm do
pp:=begp;
while pp<>endp do
begin
t:=pp^.zilci;
pt:=pp;
p1:=pp;
while p1^.link<>nil do
begin
p1:=p1^.link;
if p1^.zilci<=pp^.zilci then
begin
t:=p1^.zilci;
pt:=p1;
end;
end;
pt^.zilci:=pp^.zilci;
pp^.zilci:=t;
pp:=pp^.link;
end;
end;

procedure vivodsort(begp,endp:sp);
var pp:sp;
begin
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');
for i:=1 to nm do
pp:=begp;
while pp<>nil do
begin
writeln;
write(pp^.street:12,' ');
write(pp^.dom:6, ' ' ,pp^.kv:9, ' ', pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('---------------------------------------------------');
writeln;
end;


Procedure novmas(var begp,endp:sp);
var
x:string;
pp:sp;
begin
for i:=1 to nm do
x:=begp^.street;
pp:=begp;
begp:=pp^.link;
dispose(pp);
end;
{Procedure novmas(var begp,endp:sp);
var
pp:sp;
pp1:sp1;
begin
for i:=1to nm do
new(pp1);
pp1^.dom:=pp^.dom;
pp1^.kv:=pp^.kv;
pp1^.zilci:=pp^.zilci;
pp1^.link:=nil;
begp1:=pp1;
endp1:=pp1;
end; }

Procedure novmasa(begp,endp:sp);
var pp:sp;
begin
write('-------------------------------------');
writeln;
write('| #doma | #kv | kol-vo zilcov |');
pp:=begp;
while pp<>nil do
begin
writeln;
write(pp^.dom:6, ' ' ,pp^.kv:8, ' ',pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('-------------------------------------');
writeln;
readln;
end;

begin
clrscr;
begp:=nil;
endp:=nil;
vvod(begp,endp);
vivod(begp,endp);
poisk(begp1,endp1,begp,endp);
sort(begp,endp);
writeln('ots spisok');
vivodsort(begp,endp);
novmas(begp,endp);
novmasa(begp,endp);
readln;
end.



Прикрепленные файлы
Прикрепленный файл  2KL4SPIS.PAS ( 3.54 килобайт ) Кол-во скачиваний: 281
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Заминка вышла в сортировке, у меня сортирует кол-во жильцов, а не по количеству.
Естественно, ты же вот тут:
Цитата
if p1^.zilci<=pp^.zilci then
begin
t:=p1^.zilci;
pt:=p1;
end;
это и просишь сделать у компилятора. Запоминаешь только количество жильцов, а потом меняешь только количество с тем же полем другой записи. Вообще-то обычно делается так:

 AddrRec = record
street:string;
dom,kv,zilci:integer;
end;

sp=^adres;
adres=record
Data: AddrRec;
link:sp;
end;
, то есть, данные отделяются от вспомогательных полей, необходимых для организации списка. поле link никак с твоими данными не связано, оно нужно только для того, чтобы перейти к следующей записи, поэтому его от информационной части надо отделить... А потом уже запоминать не количество жильцов, а всё поле Data.

Или посмотреть вот этот пост: сортировка списка простыми вставками , тогда можно обойтись без разделения структуры adres.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Спасибо за подсказку,но когда я делаю через "сортировку списка простыми вставками" мне выдает ошибку, что не хватает end, когда я его ставлю, ему не хватает begin....помню, что мне когда-то попадалась эта ошибка, но не помню, что в этом случае надо делать....подскажите, а?
И как мне быть с тем, что при формировании нового списка я извлекаю инф из первого элемента и освобождаю его память, а на экран выводится только второй адрес(из двух) без поля "улица"?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(ladybird @ 18.11.2009 23:13) *
выдает ошибку, что не хватает end, когда я его ставлю, ему не хватает begin....помню, что мне когда-то попадалась эта ошибка, но не помню, что в этом случае надо делать....
Что ж, бывает - забывается.. Напоминаю, что в этом случае надо делать: нужно привести тут полный код программы. Вредная ошибка не продержится и часа, уверяю тебя smile.gif.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Вот:
program spisok;
uses crt;
type
sp=^adres;
adres=record
street:string;
dom,kv,zilci:integer;
link:sp;
end;

sp1=^adres1;
adres1=record
street:string;
dom,kv,zilci:integer;
link:sp1;
end;
var
begp,endp,pp:sp;
begp1,endp1:sp1;
i,j:integer;
nm:byte;
v:boolean;
first:sp;

Procedure vvod(var begp,endp:sp);
var pp:sp;
begin
Writeln('vvedite kolichestvo zap');
readln(nm);
for i:=1 to nm do
begin
new(pp);
write('street ');
readln(pp^.street);
write('# doma ');
readln(pp^.dom);
write('# kvartiri ');
readln(pp^.kv);
write('kol-vo zilcov ');
readln(pp^.zilci);
pp^.link:=nil;
if begp=nil
then begp:=pp
else endp^.link:=pp;
endp:=pp;
end;
end;

procedure vivod(begp,endp:sp);
var pp:sp;
begin
clrscr;
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');
for i:=1 to nm do
pp:=begp;
while pp<>nil do
begin
writeln;
write(pp^.street:12,' ');
write(pp^.dom:6, ' ' ,pp^.kv:9, ' ', pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('---------------------------------------------------');
writeln;
end;

procedure poisk(var begp1,endp1:sp1;begp,endp:sp);
var
pp:sp;
pp1:sp1;
begin
writeln('Vvedite street, dom, kv cheres enter');
begin
readln(pp1^.street);
readln(pp1^.dom);
readln(pp1^.kv);
pp:=begp;
while pp<>nil do
begin
if ((pp1^.street=pp^.street) and (pp1^.dom=pp^.dom)) and (pp1^.kv=pp^.kv)
then
begin
write('Kol-vo zilcov: ');
write(pp^.zilci);
writeln;
v:=true;
end;
if v=false then
writeln('takogo adresa ne naideno');
pp:=pp^.link;
end;
end;
end;
function insert_sort(p1:sp):sp;

function insert(pp:sp;p1:sp):sp;
begin
pp^.link:=Nil;
if p1=nil then insert:=pp
else
if ((pp^.street<p1^.street) and (pp^.dom<p1^.dom))
and ((pp^.kv<p1^.kv)and(pp^.zilci<p1^.zilci)) then
begin
pp^.link:=p1;
insert:=pp;
end
else
begin
p1^.link:=insert(pp,p1^.link);
insert:=p1;
end;
end;

Procedure novmas(var begp,endp:sp);
var
x:string;
pp:sp;
begin
for i:=1 to nm do
x:=begp^.street;
pp:=begp;
begp:=pp^.link;
dispose(pp);
end;

Procedure novmasa(begp,endp:sp);
var pp:sp;
begin
write('-------------------------------------');
writeln;
write('| #doma | #kv | kol-vo zilcov |');
pp:=begp;
while pp<>nil do
begin
writeln;
write(pp^.dom:6, ' ' ,pp^.kv:8, ' ',pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('-------------------------------------');
writeln;
readln;
end;

begin
clrscr;
begp:=nil;
endp:=nil;
vvod(begp,endp);
vivod(begp,endp);
poisk(begp1,endp1,begp,endp);
writeln('ots spisok');
if p1=nil then insert_sort:=nil
else insert_sort:=insert(p1,insert_sort(p1^.link));
novmas(begp,endp);
novmasa(begp,endp);
readln;
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






В функции insert_sort должна быть вложенная функция, называется Insert. Она у тебя есть, НО тела самой функции insert_sort -то у тебя и нет (по ссылке - это вот этот кусок:
Цитата
begin
if l = nil then insert_sort := nil
else insert_sort := insert(l, insert_sort(l^.next));
end;
). В итоге компилятор думает, что ВСЕ функции, которые описаны ниже insert_sort являются вложенными в нее. Твою ОСНОВНУЮ часть программы он считает наконец-то описанием тела функции insert_sort, и естественно потом требует еще точку с запятой, и главный блок
begin 
{ ... }
end.
Добавь эти 2 строки (которые я процитировал) куда положено, и все откомпилируется.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(ladybird @ 19.11.2009 11:33) *
Вот:
Втовоем "вот" "смешались в кучу кони, люди", как сказал поэт )).

Вот так она по крайней мере компилится smile.gif:
program spisok;
uses crt;
type
sp=^adres;
adres=record
street:string;
dom,kv,zilci:integer;
link:sp;
end;

sp1=^adres1;
adres1=record
street:string;
dom,kv,zilci:integer;
link:sp1;
end;

var
begp,endp,pp:sp;
begp1,endp1:sp1;
i,j:integer;
nm:byte;
v:boolean;
first:sp;

Procedure vvod(var begp,endp:sp);
var
pp:sp;
begin
Writeln('vvedite kolichestvo zap');
readln(nm);
for i:=1 to nm do begin
new(pp);
write('street ');
readln(pp^.street);
write('# doma ');
readln(pp^.dom);
write('# kvartiri ');
readln(pp^.kv);
write('kol-vo zilcov ');
readln(pp^.zilci);
pp^.link:=nil;
if begp=nil then begp:=pp else endp^.link:=pp;
endp:=pp;
end;
end;


procedure vivod(begp,endp:sp);
var
pp:sp;
begin
clrscr;
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');
for i:=1 to nm do pp:=begp;
while pp<>nil do begin
writeln;
write(pp^.street:12,' ');
write(pp^.dom:6, ' ' ,pp^.kv:9, ' ', pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('---------------------------------------------------');
writeln;
end;


procedure poisk(var begp1,endp1:sp1;begp,endp:sp);
var
pp:sp;
pp1:sp1;
begin
writeln('Vvedite street, dom, kv cheres enter');
begin
readln(pp1^.street);
readln(pp1^.dom);
readln(pp1^.kv);
pp:=begp;
while pp<>nil do begin
if ((pp1^.street=pp^.street) and (pp1^.dom=pp^.dom)) and (pp1^.kv=pp^.kv)
then begin
write('Kol-vo zilcov: ');
write(pp^.zilci);
writeln;
v:=true;
end;
if v=false then writeln('takogo adresa ne naideno');
pp:=pp^.link;
end;
end;
end;


function insert_sort(p1:sp):sp;

function insert(pp:sp;p1:sp):sp;
begin
pp^.link:=Nil;
if p1=nil then insert:=pp
else
if ((pp^.street<p1^.street) and (pp^.dom<p1^.dom))
and ((pp^.kv<p1^.kv)and(pp^.zilci<p1^.zilci)) then
begin
pp^.link:=p1;
insert:=pp;
end
else
begin
p1^.link:=insert(pp,p1^.link);
insert:=p1;
end;
end;

begin {это тело функции insert_sort}
if p1=nil then insert_sort:=nil
else insert_sort:=insert(p1,insert_sort(p1^.link));
end;


Procedure novmas(var begp,endp:sp);
var
x:string;
pp:sp;
begin
for i:=1 to nm do
x:=begp^.street;
pp:=begp;
begp:=pp^.link;
dispose(pp);
end;


Procedure novmasa(begp,endp:sp);
var
pp:sp;
begin
write('-------------------------------------');
writeln;
write('| #doma | #kv | kol-vo zilcov |');
pp:=begp;
while pp<>nil do
begin
writeln;
write(pp^.dom:6, ' ' ,pp^.kv:8, ' ',pp^.zilci:8, ' ');
writeln;
pp:=pp^.link;
end;
write('-------------------------------------');
writeln;
readln;
end;


begin
clrscr;
begp:=nil;
endp:=nil;
vvod(begp,endp);
vivod(begp,endp);
poisk(begp1,endp1,begp,endp);
writeln('ots spisok');
novmas(begp,endp);
novmasa(begp,endp);
readln;
end.




Добавлено через 48 сек.
sorry, volvo


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Спасибо, я исправила эту ошибку, но на экран мне сортировку так и не выводит)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
Спасибо, я исправила эту ошибку
Можешь показать только ОСНОВНУЮ часть программы (не надо сами процедуры, только там, где вызов vvod/vivod/poisk и insert_sort)? Есть подозрение, что ты неправильно вызываешь сортировку.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Так оно и есть)) я про вызов то и забыла)) Как ее правильно вызвать? я чего-то недопонимаю. Если ставлю writeln(insert_sort), то выдает ошибку. Не ругайтесь сильно на мою неосведомленность, но я всегда функции обходила стороной и работала только с процедурами, вот теперь зависла....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Если сделать так:
begin
begp:=nil;
endp:=nil;
vvod(begp,endp);
vivod(begp,endp);
writeln('ots spisok');
begp := insert_sort(begp);
vivod(begp,endp); { <--- Внимательнее здесь !!! }
readln;
end.
, то все должно отсортироваться. Почему внимательнее - потому что endp уже может указывать не на последний элемент списка. Я бы вообще обошелся в процедуре печати вообще одним параметром, второй все равно не используется.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(ladybird @ 19.11.2009 13:14) *
если ставлю writeln(insert_sort), то выдает ошибку.

Конечно ошибка будет. WriteLn умеет работать только со стандартными типами, и то не со всеми. Что, ты полагаешь, она должна сделать?.. blink.gif
Но у тебя есть специальная процедура для вывода. Она, вроде, берет как раз тип sp. Вот, ее и используй, наверное )).


Добавлено через 1 мин.
опять ))
извини, volvo lol.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Хм... Да процедуру vivod вообще надо переписывать, там что, для надежности несколько раз делается:
  write('|   street   |  #doma  |  #kv  |  kol-vo zilcov   |');
for i:=1 to nm do pp:=begp; { <--- Вот это }
? Если сделать присвоение один раз, поверь, процедура работать хуже не станет. Да и доп. переменная pp вообще не нужна. Передавай только указатель на начало списка, и работай с ним. Он же передается без Var, по значению, а значит в вызывающей программе не изменится его значение. Не надо лишних переменных. Чем их меньше - тем лучше.

Цитата
опять ))
извини, volvo
Да ничего smile.gif Я тут только теоретически, Паскаля нет на машине, так что надо бы еще проверить, БУДЕТ ли оно работать. Должно-то должно, но мало ли...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


А как мне быть с тем, что при вводе , например, трех адресов, сортируются только 1й и последний между собой?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Значит, все-же что-то неправильно исправила. Присоединяй файл с полной программой.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Вот:


Прикрепленные файлы
Прикрепленный файл  PROSTO.PAS ( 3.67 килобайт ) Кол-во скачиваний: 279
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Хм... А у тебя poisk вообще работает? Не должен, насколько я вижу:
Цитата
procedure poisk(var begp1,endp1:sp1;begp,endp:sp);
var
pp:sp;
pp1:sp1;
begin
writeln('Vvedite street, dom, kv cheres enter');
begin
readln(pp1^.street); { <--- Ну, и чему здесь равно pp1? Куда ты записываешь данные? }
readln(pp1^.dom);
readln(pp1^.kv);
pp:=begp;

Контроль ошибок времени выполнения включен (Options -> Compiler -> Runtime Errors)? Хотя в Турбо Паскале может и не сработать, все же не обязательно pp1 будет nil, то есть просто испортится какое-то значение в памяти и все.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Цитата
Хм... А у тебя poisk вообще работает?


Не знаю, но работает...кол-во жильцов выводит правильно, но потом еще добавляет, что "такого адреса не найдено".
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Итак... Я наконец добрался до Паскаля. Берем твою программу и делаем небольшую ревизию. Смотри. Сначала убираем типы - дубликаты. Как adres/adres1 и sp/sp1. Второе - все переменные, описанные в самом начале программы, переносим, их описание будет перед началом основного блока программы. Это позволит от большей части из них (почти ото всех) избавиться. Подробнее - см. здесь: Как не надо писать программы (пункт 3, но вообще прочитай всю тему, это не помешает). Итого, после всех изменений, имеем:

program spisok;
type
sp=^adres;
adres=record
street:string;
dom,kv,zilci:integer;
link:sp;
end;

{ Процедура принимает и возвращает только начало списка }
procedure vvod(var begp: sp);
var
pp, endp: sp;
i, nm: integer;
begin
endp := nil; { <--- Это уже локальная переменная }

write('vvedite kolichestvo zap: '); readln(nm);
for i:=1 to nm do
begin
new(pp);
write('street '); readln(pp^.street);
write('# doma '); readln(pp^.dom);
write('# kvartiri '); readln(pp^.kv);
write('kol-vo zilcov '); readln(pp^.zilci);

pp^.link:=nil;
if begp=nil then begp:=pp
else endp^.link:=pp;

endp:=pp;
end;
end;

{ Для вывода тоже достаточно только начала списка }
procedure vivod(begp: sp);
begin
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');

while begp <> nil do { работаем прямо с begp, ничего с ней не случится }
begin
writeln;
with begp^ do
writeln(street:12, dom:6, kv:9, zilci:8);
begp := begp^.link; { <--- Продвигаемся по списку }
end;
write('---------------------------------------------------');
writeln;
end;

{ Поиск... Странно, но здесь тоже надо только указатель на начало }
procedure poisk(begp: sp);
var
pp, pp1:sp;
v: boolean; { <--- V используется только здесь? Вот и описываем локально }
begin
v := false; { Инициализируем переменную обязательно }
writeln('Vvedite street, dom, kv cheres enter');

new(pp1); { Выделяем память для хранения данных, которые будем искать }
readln(pp1^.street);
readln(pp1^.dom);
readln(pp1^.kv);

pp:=begp; { С начала списка ... }
while pp<>nil do { ... до его конца ... }
begin
if ((pp1^.street=pp^.street) and (pp1^.dom=pp^.dom)) and (pp1^.kv=pp^.kv) then
begin
write('Kol-vo zilcov: ');
write(pp^.zilci);
writeln;
v:=true;
end;

pp:=pp^.link; { ... продвигаемся }
end;

{ И только теперь можем сказать, была ли найдена запись }
if not v then
writeln('takogo adresa ne naideno');

dispose(pp1); { Освобождаем место, где хранились данные для поиска }
end;

function insert_sort(p1:sp):sp;

function insert(pp:sp;p1:sp):sp;
begin
pp^.link:=Nil;
if p1=nil then insert:=pp
else
if pp^.zilci < p1^.zilci then { чтобы отсортировать по количеству жильцов }
begin
pp^.link:=p1;
insert:=pp;
end
else
begin
p1^.link:=insert(pp,p1^.link);
insert:=p1;
end;
end;

begin
if p1=nil then insert_sort:=nil
else insert_sort:=insert(p1,insert_sort(p1^.link));
end;

var
begp: sp;

begin
begp:=nil;
vvod(begp);
vivod(begp);
poisk(begp);

writeln('ots spisok');
begp := insert_sort(begp);
vivod(begp);

readln;
end.
Запускаем программу, она выдает вот такой результат:
Running "f:\programs\pascal\ladybird.exe"
vvedite kolichestvo zap: 3
street s1
# doma 32
# kvartiri 43
kol-vo zilcov 15
street s2
# doma 23
# kvartiri 65
kol-vo zilcov 7
street s3
# doma 43
# kvartiri 44
kol-vo zilcov 9
--------------------------------------------------
| street | #doma | #kv | kol-vo zilcov |
s1 32 43 15

s2 23 65 7

s3 43 44 9
---------------------------------------------------
Vvedite street, dom, kv cheres enter
s4
22
33
takogo adresa ne naideno
ots spisok
--------------------------------------------------
| street | #doma | #kv | kol-vo zilcov |
s2 23 65 7

s3 43 44 9

s1 32 43 15
---------------------------------------------------

Вроде все по заданию (пункты 1-3)...

Ах да, новый список, не включающий поля "улица" - это как? Физически не включающий, или просто не отображать это поле? Делается тоже достаточно просто, попробуй, если не получится - поможем.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Ольга

Репутация: -  0  +


Физически не включающий, если просто не отображать, тогда все элементарно.
Но я уже сама над этим подумаю.

Огромное СПАСИБО за помощь smile.gif .
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 20:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name