Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Типизированные файлы

Автор: ladybird 4.10.2009 2:34

Здравствуйте, помогите пожалуйста с написанием программы. я уже запуталась в файлах. Над прошлой программой с записями сидела очень долго,но написала сама, с файлами без вашей помощи обойтись не могу.

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

в этой лаб. условие не меняестся, только надо все это сделать через файлы и добавить сортировку по чему либо.

Вот, что у меня получилось, программа запускается, но ничего не делает и тут не хватает сортировки. Заранее извиняюсь за безобразие в программе.

program zapis;
uses crt;
const
n=10;
type
adres=record
street:string;
dom,kv,zilci:integer;
end;
ff=file of adres;
mas_adres=array [1..n] of adres;
mas_nov=array [1..n] of adres;
var
f:ff;
f1:file of real;
z:adres;
m:mas_adres;
ma:mas_nov;
i,t,p:integer;
k:word;
v:boolean;
st,sp:string;

Procedure vvod(var zt:adres;stt:string);
begin
for i:=1 to 2 do
with m[i] do
begin
street:=stt;
write('street ');
readln(street);
write('# doma ');
readln(dom);
write('# kvartiri ');
readln(kv);
write('kol-vo zilcov ');
readln(zilci);
end;
end;

Procedure poisk(nt:byte;mt:mas_adres);
var
i:byte;
st,st1:string;
begin
write('fileadres');
readln(st1);
assign(f1,st1);
rewrite(f1);
v:=true;
writeln('st');
readln(st);
for i:=1to 2 do
if mt[i].street=st
then
if v
then
begin
writeln('kolvo zilcov');
with mt[i] do
writeln(zilci:4);
v:=false;
end
else
with mt[i] do
writeln(zilci:10);
close(f1);
end;
{for i:=1 to 2 do
with zt do
begin
readln(street);
readln(dom);
readln(kv);
for i:=1 to 2 do
if ((zt.street=m[i].street) and (zt.dom=m[i].dom)) and (zt.kv=m[i].kv)
then
begin
write('Kol-vo zilcov: ');
write(m[i].zilci);
writeln;
v:=true;
end;
if v=false then
writeln('takogo adresa ne naideno')
end;
end;}

begin
clrscr;
writeln('viberite 1,2,3,4,5 ');
readln(t);
case t of
1:begin
write('file street');
readln(st);
assign(f,st);
rewrite(f);
p:=0;
repeat
writeln('street or enter');
readln(sp);
if sp<>''
then
begin
p:=p+1;
vvod(m[p],sp);
write(f,m[p]);
end;
until sp='';
close(f);
end;

2:begin
repeat
writeln('filestreet or enter');
readln(st);
if st<>''
then
begin
assign(f,st);
{$I-}
reset(f);
k:=ioresult;
if k<>0
then
writeln('error');
{$I-}
end;
until (st='') or (k=0);
p:=0;
while not eof (f) do
begin
p:=p+1;
read(f,m[p]);
end;
close(f);
end;

3:begin
clrscr;
assign(f,st);
reset(f);
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');
for i:=1 to 2 do
with m[i] do
begin
writeln;
write(street:12,' ');
write(dom:6, ' ' ,kv:9, ' ', zilci:8, ' ');
writeln;
end;
write('---------------------------------------------------');
writeln;
close(f);
end;

{ 4:sort; }
5:poisk(n,m)
end;

{Procedure novmas(var zet:mas_adres; var zit:mas_nov);
var
i:integer;
begin
for i:=1 to 2 do
begin
ma[i].dom:=m[i].dom;
ma[i].kv:=m[i].kv;
ma[i].zilci:=m[i].zilci;
end;
end;

Procedure novmasa(var zit:mas_nov);
begin
write('-------------------------------------');
writeln;
write('| #doma | #kv | kol-vo zilcov |');
for i:=1 to 2 do
with ma[i] do
begin
writeln;
write(dom:6, ' ' ,kv:8, ' ', zilci:8, ' ');
writeln;
end;
write('-------------------------------------');
writeln;
end;}

{begin
clrscr;
{vvod(z,st);}
{vivod(z);
poisk(n,m);
{for i:=1 to 2 do
novmas(m,ma);
novmasa(ma);
readln; }
end.



Лектор дал шаблон программы через case(когда писал сам запутался в переменных и нас запутал), но мне почему то кажется, что через сами процедуры будет проще....


Добавлено через 3 мин.
И еще, на всякий случай таже программа, только с записями, уже проверенная...


Прикрепленные файлы
Прикрепленный файл  2KL2FAIL.PAS ( 3.41 килобайт ) Кол-во скачиваний: 272
Прикрепленный файл  2KLAB1ZA.PAS ( 2.18 килобайт ) Кол-во скачиваний: 283

Автор: andriano 4.10.2009 11:05

Цитата
программа запускается, но ничего не делает и тут не хватает сортировки. Заранее извиняюсь за безобразие в программе.
Программа ничего и не может делать, т.к. все, что она могла - закомментировано.

Автор: ladybird 4.10.2009 17:11

Ну подскажите хоть что-нибудь, пожалуйста(((

Автор: maksimla 6.10.2009 18:42

а что ты хочешь чтобы подсказали?

Автор: Lapp 7.10.2009 11:31

Цитата(ladybird @ 3.10.2009 23:34) *
надо все это сделать через файлы
Объясни, пожалуйста, что это означает. Тебе нужно сейвить инфу в файл - да?

И еще скажи, сколько у тебя времени. У меня ощущение, что переделывать нужно многое.. Есть время?

Автор: ladybird 10.10.2009 6:09

Цитата(Lapp @ 7.10.2009 8:31) *

Тебе нужно сейвить инфу в файл - да?
И еще скажи, сколько у тебя времени. У меня ощущение, что переделывать нужно многое.. Есть время?


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


program files;
uses crt;
type
adres=record
street:string;
dom,kv,zilci:integer;
end;
mas_adres=array [1..10] of adres;
mas_nov=array [1..10] of adres;
ff=file of adres;
var
z:adres;
m:mas_adres;
ma:mas_nov;
i,t:integer;
v:boolean;
f:ff;
s:string;
n:byte;

Procedure vvod(var ft:ff);
var
st:string;
zt:adres;
begin
writeln('vvedite filename');
readln(st);
assign(ft,st);
rewrite(ft);
repeat
write('vvedite street or nagmite enter ');
readln(st);
if st<>'' then
begin
with zt do
begin
street:=st;
write('# doma ');
readln(dom);
write('# kvartiri ');
readln(kv);
write('kol-vo zilcov ');
readln(zilci);
end;
write(ft,zt);
end;
until st='';
close(ft);
end;
Procedure vivod(var ft:ff);
begin
reset(ft);
while not eof(ft) do
begin
read(ft,m[i]);
clrscr;
write('--------------------------------------------------');
writeln;
write('| street | #doma | #kv | kol-vo zilcov |');
for i:=1 to 2 do
with m[i] do
begin
writeln;
write(street:12,' ');
write(dom:6, ' ' ,kv:9, ' ', zilci:8, ' ');
writeln;
end;
write('---------------------------------------------------');
writeln;
end;
close(ft);
end;

Procedure poisk(var ft:ff; zt:adres);
begin
reset(ft);
writeln('Vvedite street, dom, kv cheres enter');
for i:=1 to 2 do
with m[i] do
begin
readln(street);
readln(dom);
readln(kv);
while not eof(ft) do
begin
read(ft,m[i]);
for i:=1 to 2 do
if ((zt.street=m[i].street) and (zt.dom=m[i].dom)) and (zt.kv=m[i].kv)
then
begin
write('Kol-vo zilcov: ');
write(m[i].zilci);
writeln;
v:=true;
end;
if v=false then
writeln('takogo adresa ne naideno')
end;
end;
close(ft);
readln;
end;

Procedure novmas(var ft:ff;var zet:mas_adres; var zit:mas_nov);
begin
reset(ft);
for i:=1 to 2 do
begin
ma[i].dom:=m[i].dom;
ma[i].kv:=m[i].kv;
ma[i].zilci:=m[i].zilci;
end;
close(ft);
end;

Procedure novmasa(var ft:ff;var zit:mas_nov);
begin
reset(ft);
write('-------------------------------------');
writeln;
write('| #doma | #kv | kol-vo zilcov |');
for i:=1 to 2 do
with ma[i] do
begin
writeln;
write(dom:6, ' ' ,kv:8, ' ', zilci:8, ' ');
writeln;
end;
write('-------------------------------------');
writeln;
close(ft);
end;

begin
clrscr;
vvod(f);
clrscr;
vivod(f);
poisk(f,z);
for i:=1 to 2 do
novmas(f,m,ma);
novmasa(f,ma);
readln;
end.



М
используй тэги code=pas и /code, пожалуйста




Прикрепленные файлы
Прикрепленный файл  2KL2PROC.PAS ( 2.68 килобайт ) Кол-во скачиваний: 240

Автор: Lapp 10.10.2009 6:44

Цитата(ladybird @ 10.10.2009 3:09) *
попрошу проверить на ошибки

Явная ошибка в процедуре poisk, повторное использование парамера цикла i.
Послушай доброго совета: правильно (а не для красоты) используй отступы. Тогда и такую ошибку будет легко найти.. Вот, посмотри, как должна была выглядеть процедура poisk (если верна ее логика) (ошибка с i тут не исправлена!)
Procedure poisk(var ft:ff; zt:adres);
begin
reset(ft);
writeln('Vvedite street, dom, kv cheres enter');
for i:=1 to 2 do with m[i] do begin { <-- here }
readln(street);
readln(dom);
readln(kv);
while not eof(ft) do begin
read(ft,m[i]);
for i:=1 to 2 do if { <-- and here }
(zt.street=m[i].street) and
(zt.dom=m[i].dom) and
(zt.kv=m[i].kv)
then begin
write('Kol-vo zilcov: ');
write(m[i].zilci);
writeln;
v:=true
end;
if v=false then
writeln('takogo adresa ne naideno')
end;
end;
close(ft);
readln;
end;

Попробуй следовать этому образцу.. Увидишь, насколько легче будет.
И еще: отключи использование символов табуляции в опциях. Не то время, чтоб на этом экономить, а оно мешает..

Автор: ladybird 10.10.2009 19:14

Спасибо, ошибку исправила. Но у меня еще есть вопрос, почему в процедуре вывода у меня вместо введенного мною первого адреса на экране высвечиваются нули и еще не работает процедура процедура создания и вывода нового массива на экран.

Автор: volvo 10.10.2009 21:01

Цитата
как должна была выглядеть процедура poisk (если верна ее логика)
Логика неверна, потому как прочитанные из файла данные сравниваются со значением неинициализированной переменной (где-то хоть что-нибудь заносится в zt ???), следовательно ничего найдено не будет... ladybird, ты бы не использовала With до поры до времени. Ты ж путаешься с ним, лучше прописывай полный путь, будет проще...

Цитата
Спасибо, ошибку исправила
Можно посмотреть, КАК ты ее исправила? Дальше разбираться будем потом... Кстати, не привыкай ВСЕ переменные описывать в самом начале программы. Для информации: http://forum.pascal.net.ru/index.php?s=&showtopic=24644&view=findpost&p=136504 (совет №3)

Автор: Гость 10.10.2009 21:17

Впринципи, я только убрала в поиске лишний счетчик, вот.

Автор: ladybird 10.10.2009 21:20

smile.gif , забыла зайти на форум(пред. сообщение от меня))))

Автор: Lapp 11.10.2009 19:31

Цитата(Гость @ 10.10.2009 18:17) *
Впринципи, я только убрала в поиске лишний счетчик, вот.
Извини, но в программировании так нельзя. Если были изменения - все, остальные разговоры только по полном и точном их предъявлении. Только так и никак иначе. Точка.