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

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

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

> Типизированные файлы, задача про адрес
ladybird
сообщение 3.10.2009 22:34
Сообщение #1


Новичок
*

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

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


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

Условие задачи прошлой лаб. такое:
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 килобайт ) Кол-во скачиваний: 187
Прикрепленный файл  2KLAB1ZA.PAS ( 2.18 килобайт ) Кол-во скачиваний: 207
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
andriano
сообщение 4.10.2009 7:05
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

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


Цитата
программа запускается, но ничего не делает и тут не хватает сортировки. Заранее извиняюсь за безобразие в программе.
Программа ничего и не может делать, т.к. все, что она могла - закомментировано.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ladybird
сообщение 4.10.2009 13:11
Сообщение #3


Новичок
*

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

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


Ну подскажите хоть что-нибудь, пожалуйста(((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
maksimla
сообщение 6.10.2009 14:42
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

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


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


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 7.10.2009 7:31
Сообщение #5


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

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

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


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

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


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


Новичок
*

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

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


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


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

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

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


Цитата(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;

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


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


Новичок
*

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

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


Спасибо, ошибку исправила. Но у меня еще есть вопрос, почему в процедуре вывода у меня вместо введенного мною первого адреса на экране высвечиваются нули и еще не работает процедура процедура создания и вывода нового массива на экран.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.10.2009 17:01
Сообщение #9


Гость






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

Цитата
Спасибо, ошибку исправила
Можно посмотреть, КАК ты ее исправила? Дальше разбираться будем потом... Кстати, не привыкай ВСЕ переменные описывать в самом начале программы. Для информации: Как не надо писать программы (совет №3)
 К началу страницы 
+ Ответить 
Гость
сообщение 10.10.2009 17:17
Сообщение #10


Гость






Впринципи, я только убрала в поиске лишний счетчик, вот.
 К началу страницы 
+ Ответить 
ladybird
сообщение 10.10.2009 17:20
Сообщение #11


Новичок
*

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

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


smile.gif , забыла зайти на форум(пред. сообщение от меня))))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 11.10.2009 15:31
Сообщение #12


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

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

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


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


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

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

 



- Текстовая версия 20.07.2025 2:49
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"