Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2012, 05:54   #1
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию Типизированные файлы. Паскаль.

Вообщем сел я пару часов назад за теорию и практику по типизированным файлам, столкнулся с некоторым непониманием, от части вызванным сильным хотением спать, вообщем есть файл типа рекорд, в котором есть жители:имя,адрес, тра-ляля, и нужно по средством чтения этого файла, который мы сами создаем, вывести в текстовый новый файл, людей которые живут вместе(т.е. соседи), по запрошенному адресу.
Я начал работать, но потом появилась проблема с чтением из готового файла, паскаль начал ругаться, вообщем я психанул и стер всю процедуру с чтением и записью в txt ибо не смог понять где ошибка, вообщем буду благодарен за дельные советы+посоветуйте оптимальный вариант по проверке на соседей( я думаю подключить в процес множества, но это кажется громоздким, пытался сделать красивый перебор, всегда вылетали какие-то бока)... Задача элементарная до ужаса, и стоит мне проспаться я уверен что её решу, но на это нету времени, мб есть такие экстрималы, которые сейчас не спят, или у вас часовой пояс кординально отличается от моего, вообщем до утра мне её нужно доделать, вот что сделал я:
Код:
Program lab10;
type citizen=Record
Fam,city,street:string[20];
house,flat:integer;
end;


Procedure ish(m:integer;s:string);
var
man:citizen;
f:file of citizen;
i:integer;
begin
assign(f,s);
rewrite(f);
writeln('Vvedite danije pro giteley');
for i:=1 to m do begin
write('Vvedite familiju grazdanina');
readln(Man.fam);
write('Vvedite gorod v kotorom jivet grazd.');
readln(man.city);
write('Vvedite ulizi -//-');
readln(man.street);
write('Vvedite dom -//-');
readln(man.house);
write('Vvedite kvartiri -//-');
readln(man.flat);
write(f,Man);
end;
close(f);
end;

Procedure neighbours(s1:string;n:integer);
var
f1:file of record;
fin:txt;
ss:string;
begin
write('Введите название txt файла');
readln(ss);
assign(f1,s1);
assign(fin,ss);

//...
end;

var
s,s1:string;
n:integer;
begin
write('Vvedite nazvanie sozdovaemogo fayla-bazi s grazdanamy');
readln(s);
write('Vvedite predpologaemoje kol-vo grazdan');
readln(n);
s1:=s+'.dat';
ish(n,s1);
neighnbours(n,s1);
end.
Вообщем помимо этого я понимаю, что нужно вводить массивы, только я вот думаю как именно: загнать жителей в массив или их дома или все поля типа record xP
вообщем голова не варит, выручайте.
Carpe Diem
Heming вне форума Ответить с цитированием
Старый 07.02.2012, 07:48   #2
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
загнать жителей в массив или их дома или все поля типа record xP
логично, у вас в каждом элементе массива будет храниться информация про каждого жителя (его фамилия, город, адрес).
можно попробывать такой код (не проверял)
Код:
for i:= 1 to m-1 do
	begin
	  flag:= true;
	  with data [i] do
	    begin
	      if city <> data [i+1].city then flag:= false;
	      if street <> data [i+1].street then flag:= false;
	      if hourse <> data [+1].hourse then flag:= false;
	    end;
	  if flag = true then writeln (data [i].fam);
	end;	
	
где, data: array [1..x] of citizen;
       flag: boolean;
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.

Последний раз редактировалось Niro; 07.02.2012 в 08:15.
Niro вне форума Ответить с цитированием
Старый 07.02.2012, 09:27   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а мне непонятно определение соседи в данном контексте...
некто, проживающий по адресу ул.Ленина, д.7 является ли соседом тому, кто проживает по адресу ул.Ленина д.8 ? (при принятой в России нумерации, эти дома будут находится на противоположных сторонах улицы и совсем не факт, что напротив друг друга!)
а если дом многоквартиный - это надо учитывать? многоквартиный дом №7 и рядом многоквартирный дом №9 - все жители всех квартир - соседи?!
В задаче должно быть чётко сформулировано - какие адреса считаются соседними.


а вообще, я бы решал эту задачу отсортировав всех жителей по адресам (первый ключ сортировки - улица, второй ключ сортировки - номер дома - (причём чётные и нечётные номера отдельно - не подряд, третий ключ сортировки - по номеру квартиры - а потом банальный проход по массиву - если следующий элемент расположен рядом(по адресному соседству) - выдать жителя как соседа, и так до конца массива...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2012, 09:46   #4
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Соседи те, кто живет в одном доме, на одной улице,
Ленина 8
Ленина 8
Carpe Diem
Heming вне форума Ответить с цитированием
Старый 07.02.2012, 10:04   #5
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Цитата:
Код:
где, data: array [1..x] of citizen;
       flag: boolean;
Проблема в том, что x задается с клавиатуры, а паскаль не разрешает чтобы в обьявлении массива стояла переменная, там должна быть константа.
Я думаю такой вариант с флагами прокатит, токо как его втиснуть чтобы код был рабочий

Срочно помогите доделать, плз!!
Carpe Diem

Последний раз редактировалось Heming; 07.02.2012 в 10:38.
Heming вне форума Ответить с цитированием
Старый 07.02.2012, 10:54   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Проблема в том, что x задается с клавиатуры, а паскаль не разрешает чтобы в обьявлении массива стояла переменная, там должна быть константа.
проблема в том, что Вы не сказали, какой у Вас Паскаль...
Дело в том, что если речь идёт о TurboPascal'е, то в нём нет и не было нормальных динамических массивов. Поэтому это решается либо через указатели (как цивилизовано - через организацию динамических связных списков, так и хакерскими методами - указатель на массив из одного элемента, а выделяем памяти сколько нужно, отключаем проверку на границы индексов и юзаем массив через этот указатель),
либо, более простой способ (для подобных учебных задач обычно прокатывает для сдачи). Задаётся обычный статический массив заведомо большого размера (больше, чем может быть обработато записей).
ну, например, на 500 (600-700-1000-2000-....) записей.
Тогда, разумеется, большее число записей не может быть обработано.
Но такой подход вполне оправдан. Главное, чтобы программа корректно обрабатывала, если ей пытаются подсунуть большее число, чем задано записей..

такой код пойдёт, для начала?
Код:
const MaxCount = 200;
...
var
  data: array [1..MaxCount] of citizen;
  i, j, N : integer;
  One : citizen;
....
begin
  repeat
    WriteLn('введите, сколько записей с данными о жителях вы хотите ввести в программу: ');
    Readln(N);
    if (N<1) or (N>MaxCount) then WriteLn('Ошибочное число. Допускается от 1 до ',MaxCount);
  until (N>=1) and (N<=MaxCount);

  for  i:=1 to N do 
     with data[i] do begin
        WriteLn(i,'-я запись. Фамилия: '); Readln(Fam);
        WriteLn('Город: '); Readln(city);
        WriteLn('Улица: '); Readln(street);
        WriteLn('Номер дома (число): '); Readln(house);
        WriteLn('Номер квартиры (число): '); Readln(flat);
    end;

  {сортировка массива записей}
  {сортировка массива методом простых обменов ("пузырька") }
  for i:=1 to N-1 do
    for j:=i+1 to N do
      if (data[i].city < data[j].city) or 
            ((data[i].city = data[j].city) and (data[i].street < data[j].street))  or 
              ((data[i].city = data[j].city) and (data[i].street = data[j].street) and  (data[i].house < data[j].house))
        then
        begin
          One := data[i];
          data[i]:= data[j];
          data[j]:= One;
        end;


  {поиск соседей - с выдачей результатов}

p.s. учтите, что раз у вас город и улица задаются строковыми значениями, тогда строка "Москва" НЕ БУДЕТ равна строке "МОСКВА"! Это же замечание касается и названия улицы...

Последний раз редактировалось Serge_Bliznykov; 07.02.2012 в 11:04.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2012, 10:58   #7
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

У меня ABC Pascal, сейчас буду пытаться, спс.
Код:
p.s. учтите, что раз у вас город и улица задаются строковыми значениями, тогда строка "Москва" НЕ БУДЕТ равна строке "МОСКВА"! Это же замечание касается и названия улицы...
эт ясно, но все равно спс


С этой частью я как бы понял, но у меня все еще остался вопрос по поводу чтения, из типизированного файла в txt:т.е. из с помощью существующего файла, создаем ткст, в который записываем все содержимое предыдущего(опустим, пока условие задачи, просто переписать из готового файла в txt), как это правильно реализовать? я сколько по-разному не пробывал, выдавало ошибку, вот еще недудачная попытака, можете обьяснить этот момент как делать?
Код:
Procedure neighbours(s1:string;m:integer);
const Maxcount=200;
var
f1:file of citizen;
data: array [1..Maxcount] of citizen;
flag: boolean;
ss:string;
fin:text; i:integer;
begin
      
  write('Введите название вашего тктс файла');
readln(ss);
assign(f1,s1);
assign(fin,ss);
reset(f1);
for i:=1 to m do
read(f1,data[i]);
append(fin);
for i:=1 to m do  begin
write(fin,data[i]);
writeln;
end;
close(f1);
close(fin);
end;
Carpe Diem

Последний раз редактировалось Heming; 07.02.2012 в 11:24.
Heming вне форума Ответить с цитированием
Старый 07.02.2012, 15:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну что вы?!!
Append(fl); можно выполнять ТОЛЬКО ОДИН РАЗ (да и то, если текстовый файл существует!)
а вы в цикле вызываете. Так НЕЛЬЗЯ!!

добавлено
кстати, массив записей для того, чтобы переписать из типизированного файла в текстовый ВААЩЕ не нужен!
(правда, он может быть весьма полезен для сортировки и последующего поиска соседей)...

Последний раз редактировалось Serge_Bliznykov; 07.02.2012 в 15:49.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2012, 18:41   #9
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Может мне кто-то програмно написать как записать в текстовый файл содержимое типизированого без НАМЕКОВ, без хождений вокруг доокола, просто напишите две строчки кода, которые я не знаю как писать!"!!!!
Carpe Diem
Heming вне форума Ответить с цитированием
Старый 07.02.2012, 20:13   #10
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

собственно файл с которым ассоциируется переменная fin у вас текстовый... а записать пытаетесь как в типизированном...
вот ориентировочное исправление
Код:
rewrite(fin);
for i:=1 to m do 
 begin
writeln(fin,data[i].fam, ' ' ,data[i].city, ' ' ,data[i].street,' ',data[i].house,' ', data[i].house,' ' ,data[i].flat);
end;
и ещё... открыть файл на перезапись не забудьте добавить...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Типизированные файлы(Паскаль) Китос Помощь студентам 1 13.10.2011 15:10
Типизированные Файлы. Паскаль. Chaara Помощь студентам 2 09.04.2011 00:58
типизированные файлы (паскаль) Rfn.if Помощь студентам 1 16.03.2011 10:46
типизированные файлы, паскаль! D1em Паскаль, Turbo Pascal, PascalABC.NET 4 12.02.2011 17:11
Типизированные файлы.Паскаль.help! ромка) Паскаль, Turbo Pascal, PascalABC.NET 1 17.05.2008 07:59