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

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

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

 
 Ответить  Открыть новую тему 
> Типизированные файлы, задача про адрес
сообщение
Сообщение #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 килобайт ) Кол-во скачиваний: 168
Прикрепленный файл  2KLAB1ZA.PAS ( 2.18 килобайт ) Кол-во скачиваний: 188
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

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

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


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


Новичок
*

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

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


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


Знаток
****

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

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


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


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


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

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

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


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 килобайт ) Кол-во скачиваний: 146
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

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

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


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


Гость






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

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


Гость






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


Новичок
*

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

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


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


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

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

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


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


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

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

 





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