Помощь - Поиск - Пользователи - Календарь
Полная версия: Типизированные файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ladybird
Здравствуйте, помогите пожалуйста с написанием программы. я уже запуталась в файлах. Над прошлой программой с записями сидела очень долго,но написала сама, с файлами без вашей помощи обойтись не могу.

Условие задачи прошлой лаб. такое:
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 мин.
И еще, на всякий случай таже программа, только с записями, уже проверенная...
andriano
Цитата
программа запускается, но ничего не делает и тут не хватает сортировки. Заранее извиняюсь за безобразие в программе.
Программа ничего и не может делать, т.к. все, что она могла - закомментировано.
ladybird
Ну подскажите хоть что-нибудь, пожалуйста(((
maksimla
а что ты хочешь чтобы подсказали?
Lapp
Цитата(ladybird @ 3.10.2009 23:34) *
надо все это сделать через файлы
Объясни, пожалуйста, что это означает. Тебе нужно сейвить инфу в файл - да?

И еще скажи, сколько у тебя времени. У меня ощущение, что переделывать нужно многое.. Есть время?
ladybird
Цитата(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, пожалуйста

Lapp
Цитата(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
Спасибо, ошибку исправила. Но у меня еще есть вопрос, почему в процедуре вывода у меня вместо введенного мною первого адреса на экране высвечиваются нули и еще не работает процедура процедура создания и вывода нового массива на экран.
volvo
Цитата
как должна была выглядеть процедура poisk (если верна ее логика)
Логика неверна, потому как прочитанные из файла данные сравниваются со значением неинициализированной переменной (где-то хоть что-нибудь заносится в zt ???), следовательно ничего найдено не будет... ladybird, ты бы не использовала With до поры до времени. Ты ж путаешься с ним, лучше прописывай полный путь, будет проще...

Цитата
Спасибо, ошибку исправила
Можно посмотреть, КАК ты ее исправила? Дальше разбираться будем потом... Кстати, не привыкай ВСЕ переменные описывать в самом начале программы. Для информации: Как не надо писать программы (совет №3)
Гость
Впринципи, я только убрала в поиске лишний счетчик, вот.
ladybird
smile.gif , забыла зайти на форум(пред. сообщение от меня))))
Lapp
Цитата(Гость @ 10.10.2009 18:17) *
Впринципи, я только убрала в поиске лишний счетчик, вот.
Извини, но в программировании так нельзя. Если были изменения - все, остальные разговоры только по полном и точном их предъявлении. Только так и никак иначе. Точка.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.