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 килобайт ) Кол-во скачиваний: 311
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Итак... Я наконец добрался до Паскаля. Берем твою программу и делаем небольшую ревизию. Смотри. Сначала убираем типы - дубликаты. Как 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)...

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

Сообщений в этой теме
ladybird   Линейные списки   18.11.2009 18:26
volvo   Естественно, ты же вот тут: это и просишь сделать …   18.11.2009 19:13
ladybird   Спасибо за подсказку,но когда я делаю через …   19.11.2009 3:13
Lapp   выдает ошибку, что не хватает end, когда я его ста…   19.11.2009 3:50
ladybird   Вот: program spisok; uses crt; type sp=^adres; a…   19.11.2009 15:33
Lapp   Вот:Втовоем "вот" "смешались в кучу…   19.11.2009 15:55
volvo   В функции insert_sort должна быть вложенная функци…   19.11.2009 15:41
ladybird   Спасибо, я исправила эту ошибку, но на экран мне с…   19.11.2009 16:52
volvo   Можешь показать только ОСНОВНУЮ часть программы (н…   19.11.2009 17:01
ladybird   Так оно и есть)) я про вызов то и забыла)) Как ее …   19.11.2009 17:14
Lapp   если ставлю writeln(insert_sort), то выдает ошибку…   19.11.2009 17:20
volvo   Если сделать так: begin begp:=nil; endp:=nil; …   19.11.2009 17:18
volvo   Хм... Да процедуру vivod вообще надо переписывать,…   19.11.2009 17:24
ladybird   А как мне быть с тем, что при вводе , например, тр…   19.11.2009 18:25
volvo   Значит, все-же что-то неправильно исправила. Присо…   19.11.2009 18:38
ladybird   Вот:   19.11.2009 18:42
volvo   Хм... А у тебя poisk вообще работает? Не должен, н…   19.11.2009 18:51
ladybird   Не знаю, но работает...кол-во жильцов выводит пр…   19.11.2009 19:13
volvo   Итак... Я наконец добрался до Паскаля. Берем твою …   19.11.2009 22:45
ladybird   Физически не включающий, если просто не отображать…   20.11.2009 0:05


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

 





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