Помощь - Поиск - Пользователи - Календарь
Полная версия: Типизированные файлы
Форум «Всё о Паскале» > 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) *
Впринципи, я только убрала в поиске лишний счетчик, вот.
Извини, но в программировании так нельзя. Если были изменения - все, остальные разговоры только по полном и точном их предъявлении. Только так и никак иначе. Точка.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.