Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Записи с файлами

Автор: Окран 13.05.2004 17:21

Умоляю помочь сделать данную задачу до завтрашнего дня!!!!!Очень прошу!!Сам вышел из больницы 2 дня назад и в первый же день учебы лабараторная по паскалю на котором я был всего на 1-2 лекциях а потом загремел по состоянию здоровья в больницу!!!Пожалуйста!!!!

Код
Полугодовая информация о изданиях по каждому подчиненному имеет следующую структуру:
ФИО - 20 знаков
участок доставки - 2 знака
адрес
кол-во выписанных изданий - 2 знака
список изданий
адрес в свою очередь состоит из следующих компонентов:
                                улица - 20 знаков
                                номер дома - 3 знака
                                номер квартиры - 3 знака
Список изданий состоит из следующих компонентов:
                                название - 20 знаков
                                вид - 1 знак(газета, журнал)
                                месяцы на которые оформлена подписка.
Список изданий представляет собой массив структур, содержащий N элементов из которых заполнены K - количествовыписанных изданий.Если подписчик оформил подписку на более чем N изданий то для него имеется 2 или более записи идущие подряд.Информация о месяцах подписки может быть представлена в виде массива из 12 логических элементов.
А теперь само задание :) : создайте файл о подписных изданиях.                

Автор: BlackShadow 13.05.2004 18:14

Код

Const
 N = 20;
Type
 TMonths=Array[0..1] Of Boolean;
 TIzdanie=Record
   Title:Strin[20];
   Tip:Char;
   Months:TMonth
 End;
 TAddr=Record
   Street:String[20];
   Home:String[3];
   Flat:String[3]
 End;
 TChel=Record
   Name:String[20];
   Uchastok:String[2];
   Addr:TAddr;
   Count:String[2];
   Izdaniya:Array[0..N-1] Of TIzdan
 End;

Const
 Names:Array[0..2] Of String = ('Ivanov','Petrov','Sidorov'); {Дополнишь сам}
 Streets:Array[0..2] Of Stirng = ('Pervaya','Vtoraya','Tretyaya'); {См. выше}
 Titles:Array[0..2] Of String = ('Programmer','Lamer','Sysop'); {Ну ты догадался}
 Tips:Array[0..2] Of Char = ('G','J','D'); {Буквы на угад. Типы изданий.}
 MName:Array[0..1] Of String = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
Var
 Chels:Array[1..100] Of TChel;
 TotalChels:Integer;
 TotalRecords:Integer;

{Придумывает человечка и сохраняет его в массиве}
Procedure GenerateChel;
Var
 x,i,j:Integer;
Begin
 With Chels[TotalRecords] Do
 Begin
   Name:=Names[Random(3)];              {Придумаем имя}
   Str(Random(100),Uchastok);              {Придумаем участок}
   Addr.Street:=Streets[Random(3)];      {Придумаем улицу}
   Str(Random(1000),Addr.Home);          {Дом}
   Str(Random(1000),Addr.Flat)              {Квартиру}
   x:=Random(50)+1;                            {Вот столько изданий он и выписал}
   Str(x,Count);
 End;
 {Придумаем ему издания}
 For i:=0 To x-1 Do
   With Chels[TotalRecords+(i Div N)].Izdaniya[i Mod M] Do
   Begin
     Title:=Titles[Random(3)];    {Название}
     Tip:=Tips[Random(3)];        {Тип}
     For j:=0 To 11 Do
       Months[j]:=Random(2)=0;  {Месяцы подписки}
   End;
 Inc(TotalRecords,x Div N)
End;

Var
 f:Text;
 i,j,k,x,e:Integer;

Begin
 Randomize;
 TotalChels:=Random(30); {Не более 30 человек, где 0 значит, что 1 чел
                                         всё-таки есть}
 TotalRecords:=0;                    {В массиве Chels пока ничего нет}
 For i:=0 To TotalChels Do  {придумаем всех челов}
   GenerateChel;

 Assign(f,'Chels.Txt');   {Создадим файл}
 ReWrite(f);

 i:=0;
 While i < TotalRecords Do   {И скинемтуда все записи}
 Begin
   With Chels[i] Do
   Begin
     WriteLn(f,Name);
     WriteLn(f,'  From Uchastok ',Uchastok);
     WriteLn(f,'  That Lives At ',Addr.Street,' in house #',Home,' in flat ',Flat);
     WriteLn(f,'  Subscribed For ',Count,' izdaniy:');
     Val(s,x,e)
   End;
   For j:=0 To x-1 Do
     With Chels[i + (j Div N)].Izdaniya[j Mod N] Do
     Begin
       Write(f,Ttitle,' (',Tip,') :');
       For k:=0 To 11 Do
         If Months[k] Then
           Write(f,MName[k]);
       WriteLn(f)
     End;
   Inc(i,1 + (x Div N))
 End;

 Close(f)
End.

Должно быть так.
сли что не так - свисти, отвечу.

Автор: Окран 13.05.2004 21:16

Простите пожалуйста, но у вас целая куча ошибок!!!Такие как неправильное название stirng вместо string я исправил но там остались какие-то непонятные!!!Памагите пожалуйста!!!

Автор: BlackShadow 13.05.2004 21:34

Я с работы писал - там у меня компилятора нет.
Ща перепроверю ближе к вечеру пришлю.

Автор: BlackShadow 13.05.2004 22:08

Код

Const
N = 20;
Type
TMonths=Array[0..1] Of Boolean;
TIzdanie=Record
  Title:String[20];
  Tip:Char;
  Months:TMonths
End;
TAddr=Record
  Street:String[20];
  Home:String[3];
  Flat:String[3]
End;
TChel=Record
  Name:String[20];
  Uchastok:String[2];
  Addr:TAddr;
  Count:String[2];
  Izdaniya:Array[0..N-1] Of TIzdanie
End;

Const
Names:Array[0..2] Of String = ('Ivanov','Petrov','Sidorov'); {Дополнишь сам}
Streets:Array[0..2] Of String = ('Pervaya','Vtoraya','Tretyaya'); {См. выше}
Titles:Array[0..2] Of String = ('Programmer','Lamer','Sysop'); {Ну ты догадался}
Tips:Array[0..2] Of Char = ('G','J','D'); {Буквы на угад. Типы изданий.}
MName:Array[0..11] Of String = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
Var
Chels:Array[0..100] Of TChel;
TotalChels:Integer;
TotalRecords:Integer;

{Придумывает человечка и сохраняет его в массиве}
Procedure GenerateChel;
Var
x,i,j:Integer;
Begin
With Chels[TotalRecords] Do
Begin
  Name:=Names[Random(3)];              {Придумаем имя}
  Str(Random(100),Uchastok);              {Придумаем участок}
  Addr.Street:=Streets[Random(3)];      {Придумаем улицу}
  Str(Random(1000),Addr.Home);          {Дом}
  Str(Random(1000),Addr.Flat);              {Квартиру}
  x:=Random(50)+1;                            {Вот столько изданий он и выписал}
  Str(x,Count);
End;
{Придумаем ему издания}
For i:=0 To x-1 Do
  With Chels[TotalRecords+(i Div N)].Izdaniya[i Mod N] Do
  Begin
    Title:=Titles[Random(3)];    {Название}
    Tip:=Tips[Random(3)];        {Тип}
    For j:=0 To 11 Do
      Months[j]:=Random(2)=0;  {Месяцы подписки}
  End;
Inc(TotalRecords,(x Div N) + Byte((x Mod N) <> 0))
End;

Var
f:Text;
i,j,k,x,e:Integer;

Begin
Randomize;
TotalChels:=Random(30); {Не более 30 человек, где 0 значит, что 1 чел
                                        всё-таки есть}
TotalRecords:=0;                    {В массиве Chels пока ничего нет}
For i:=0 To TotalChels Do  {придумаем всех челов}
  GenerateChel;

Assign(f,'Chels.Txt');   {Создадим файл}
ReWrite(f);

i:=0;
While i < TotalRecords Do   {И скинемтуда все записи}
Begin
  With Chels[i] Do
  Begin
    WriteLn(f,Name);
    WriteLn(f,'  From Uchastok ',Uchastok);
    WriteLn(f,'  That Lives At ',Addr.Street,' in house #',Addr.Home,' in flat ',Addr.Flat);
    WriteLn(f,'  Subscribed For ',Count,' izdaniya:');
    Val(Count,x,e)
  End;
  For j:=0 To x-1 Do
    With Chels[i + (j Div N)].Izdaniya[j Mod N] Do
    Begin
      Write(f,'    ',Title,' (',Tip,') :');
      For k:=0 To 11 Do
        If Months[k] Then
          Write(f,MName[k],' ');
      WriteLn(f)
    End;
  Inc(i,(x Div N) + Byte((x Mod N) <> 0))
End;

Close(f)
End.

Старею... Без компилятора уже трудновато smile.gif

Автор: Окран 13.05.2004 22:15

Храни тебя бог!!!!!!!!!!! smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif

Автор: Окран 17.05.2004 17:20

BlackShadow друг выручи меня еще раз пожалуйста!!!!!
На эту же задачу тока вот новое задание:

Код
Написать программу обработки файла подписных изданий по данным № месяца и изданию!Найдите количество экземпляров, подлежащих доставке!

Спаси утопающего! sad.gif

Автор: BlackShadow 17.05.2004 18:34

Аллах акбар!
Я понял так: надо перелопатить файл, созданный прошлой прогой и вычленить оттуда кол-во изданий с указанным названием, на которые кто-нибудь да подписался в указнном месяце. Если так, то лови:

Код

Type
TMonths=Array[0..11] Of Boolean;
TIzdanie=Record
 Title:String[20];
 Tip:Char;
 Months:TMonths
End;
TAddr=Record
 Street:String[20];
 Home:String[3];
 Flat:String[3]
End;
TChel=Record
 Name:String[20];
 Uchastok:String[2];
 Addr:TAddr;
 Count:String[2];
 Izdaniya:Array[0..N-1] Of TIzdanie
End;

Var
 f:File Of TChel;
 IzdName:String;
 SubscrMonth:Integer;
 Total:Integer;
 x,e,i:Integer;
 c:TChel;
Begin
 Write('Enter Name Of Izdanie: ');
 ReadLn(IzdName);
 Write('Enter Month (0..11, where 0 is January): ');
 ReadLn(SubscrMonth);
 Assign(f,'Chels.Txt');
 Reset(f);
 Total:=0;
 While Not Eof(f) Do
 Begin
   Read(f,c);
   Val(c.Count,x,e);
   i:=0;
   While i<x Do
   Begin
     If (i>0) And (i Mod N = 0) Then
       Read(f,c);
     With c.Izdaniya[i Mod N] Do
       If Title = IzdName Then
         If Months[SubscrMonth] Then
           Inc(Total)
   End
 End;
 Close(f);
 WriteLn('Total ',Total,' units of ',IzdName,' will be needed')
End.

Опять с работы, опять без компилятора. Если что - свисти.

Автор: Окран 17.05.2004 21:04

BlackShadow ругается на переменную N-ты ее вроде не обозначил?????

Автор: BlackShadow 17.05.2004 23:40

Забыл.
Ну допиши в начале

Код

Const
 N = 20;

Только смотри, чтобы в обеих прогах N совпадало.

Автор: Окран 19.05.2004 19:29

BlackShadow я так и сделал!!Спасиба!!!!
Сдал я сегодня программу а препод как начал меня спрашивать!!!!!Ой!!!!!
Скажи пожалуйста что означают следующие строки??

Код

Total:=0;


Код

Val(c.Count,x,e);


Код

TChel=Record
Name:String[20];
Uchastok:String[2];
Addr:TAddr;
Count:String[2]; (что вот это????)
Izdaniya:Array[0..N-1] Of TIzdanie
End;




И что это за цикл такой и как работает??Почему тут i:=0?
Код

Val(c.Count,x,e);
  i:=0;
  While i<x Do
  Begin
    If (i>0) And (i Mod N = 0) Then
      Read(f,c);
    With c.Izdaniya[i Mod N] Do
      If Title = IzdName Then
        If Months[SubscrMonth] Then
          Inc(Total)
  End


Спасибо большое за все что ты сделал для меня!!! smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif

Автор: BlackShadow 19.05.2004 20:11

Ндя...
Начнём
1). Усвой сразу и навсегда, если ещё собираешься вернуться к программированию: любая переменная обнуляется (число = 0б строка - пустая) при запуске программы ТОЛЬКО В РЕЖИМЕ ОТЛАДКИ! А при обычном запуске на её месте может (с вероятностью 2^SizeOf(Variable):1) отнюдь не 0. Поэтому перед посчётом чего-то там я принудительно обнулил переменную Total. А то ведь могло бы получиться, что 3 человека выписали 148 журналов "Мурзилка" на январь smile.gif
2). Процедура Val преобразует строку в число: Val(Str:String;Var x;Var e:Integer). Первый параметр, понятно, строка, второй - туда куда преобразовывать, третий - код ошибки. Сюда записывается номер первого неверного символа в строке ('ю' например) или 0, если всё пучком. В этой программе кол-во подписок я храню в виде строки, а цикл-то строкой не организуешь - вот и перевожу в число.
3). Вроде уже как и сказал... Count - кол-во изданий, на которые подписан данный чел. Хранится в виде строки для удобства (хотя, может и неудобства, но я так написал).
4). А цикл этот вот что делает. Он перебирает все издания этого чела, проверяет, то ли название у текущей подписки и активна ли она в нужном месяце. Если всё это выполняется, то увеличивает Total. Делается это так. Сначала в x записывается сколько у него вообще подписок. Затем начинаем цикл по i (почему i:=0, надеюсь понятно из п. 1). Внутри цикла сначала проверяем, не пришло ли время считать очередную запись (так как в одной записи может храниться максимум N подписок, а их может быть больше, тогда надо брать сведения из следующей записи, см. условия). после этого выполняются все вышеперечисленные проверки и т. д. для подписки №(i Mod N). Если вдуматься, то можно заметить, что i проходит цикл от 0 до x-1, а i Mod N - от 0 до N-1, но при этом переключаясь на другие записи (как, если ты хочешь сделать 50 шагов, но делаешь их по кругу радиусом в метр). Это вобщем и есть основная задумка всей программы.


Вот, вроде и всё.

Автор: APAL 19.05.2004 20:12

Цитата
И что это за цикл такой и как работает??Почему тут i:=0?


А что, препод не знает что это за цикл такой?
:D

Автор: Окран 20.05.2004 17:35

BlackShadow спасибо друг!!! smile.gif smile.gif smile.gif smile.gif
Вот последнее задание и я получу зачет:

Код

Написать программу обработки файла подписных изданий по заданным ФИО.Распечатать список подписных изданий подписчика(записей, относящихся к одному подписчику может быть несколько)!!!!

Пожалуйста!!!

Автор: BlackShadow 20.05.2004 18:15

Код

Const
 N = 20;

Type
TMonths=Array[0..11] Of Boolean;
TIzdanie=Record
Title:String[20];
Tip:Char;
Months:TMonths
End;
TAddr=Record
Street:String[20];
Home:String[3];
Flat:String[3]
End;
TChel=Record
Name:String[20];
Uchastok:String[2];
Addr:TAddr;
Count:String[2];
Izdaniya:Array[0..N-1] Of TIzdanie
End;

Const
 MonthName:Array[0..11] Of String=('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec');


Var
f:File Of TChel;
Name:String;
c:TChel;
 i,j:Integer;
Begin
Write('Enter Name: ');
ReadLn(Name);
Assign(f,'Chels.Txt');
Reset(f);
While Not Eof(f) Do
Begin
  Read(f,c);
  If c.Name=Name Then
  Begin
    Val(c.Count,x,e);
    i:=0;
    While i<x Do
    Begin
      If (i>0) And (i Mod N = 0) Then
        Read(f,c);
      With c.Izdaniya[i Mod N] Do
      Begin
        Write(Title,': ');
        For j:=0 To 11 Do
          If (Monts[j]) Then
            Write(MonthName[j]);
        WriteLn
      End;
      Inc(i)
  End
End;
Close(f)
End.

Вроде так...
Если "вывод на печать" подразумевает принтёр, то добавь в начало Uses Printer; и допиши пару строк:
Код

      With c.Izdaniya[i Mod N] Do
      Begin
        Write(Title,': ');
        Write(Lst,Title,': ');
        For j:=0 To 11 Do
          If (Monts[j]) Then
          Begin
            Write(MonthName[j]);
            Write(Lst,MonthName[j])
          End
        WriteLn;
        WriteLn(Lst)
      End;

Должно работать...

Автор: Окран 4.06.2004 17:49

BlackShadow тебе можно памятник ставить - спасибо!!!
Только вот еще одно НО!К первой проге заставили составить блок-схему. Как ее делать? Как записи там обозначать?А с файлами какие блоки? Помогите плиз!!!

Код
Const
N = 20;
Type
TMonths=Array[0..1] Of Boolean;
TIzdanie=Record
 Title:String[20];
 Tip:Char;
 Months:TMonths
End;
TAddr=Record
 Street:String[20];
 Home:String[3];
 Flat:String[3]
End;
TChel=Record
 Name:String[20];
 Uchastok:String[2];
 Addr:TAddr;
 Count:String[2];
 Izdaniya:Array[0..N-1] Of TIzdanie
End;

Const
Names:Array[0..2] Of String = ('Ivanov','Petrov','Sidorov'); {Дополнишь сам}
Streets:Array[0..2] Of String = ('Pervaya','Vtoraya','Tretyaya'); {См. выше}
Titles:Array[0..2] Of String = ('Programmer','Lamer','Sysop'); {Ну ты догадался}
Tips:Array[0..2] Of Char = ('G','J','D'); {Буквы на угад. Типы изданий.}
MName:Array[0..11] Of String = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
Var
Chels:Array[0..100] Of TChel;
TotalChels:Integer;
TotalRecords:Integer;

{Придумывает человечка и сохраняет его в массиве}
Procedure GenerateChel;
Var
x,i,j:Integer;
Begin
With Chels[TotalRecords] Do
Begin
 Name:=Names[Random(3)];              {Придумаем имя}
 Str(Random(100),Uchastok);              {Придумаем участок}
 Addr.Street:=Streets[Random(3)];      {Придумаем улицу}
 Str(Random(1000),Addr.Home);          {Дом}
 Str(Random(1000),Addr.Flat);              {Квартиру}
 x:=Random(50)+1;                            {Вот столько изданий он и выписал}
 Str(x,Count);
End;
{Придумаем ему издания}
For i:=0 To x-1 Do
 With Chels[TotalRecords+(i Div N)].Izdaniya[i Mod N] Do
 Begin
   Title:=Titles[Random(3)];    {Название}
   Tip:=Tips[Random(3)];        {Тип}
   For j:=0 To 11 Do
     Months[j]:=Random(2)=0;  {Месяцы подписки}
 End;
Inc(TotalRecords,(x Div N) + Byte((x Mod N) <> 0))
End;

Var
f:Text;
i,j,k,x,e:Integer;

Begin
Randomize;
TotalChels:=Random(30); {Не более 30 человек, где 0 значит, что 1 чел
                                       всё-таки есть}
TotalRecords:=0;                    {В массиве Chels пока ничего нет}
For i:=0 To TotalChels Do  {придумаем всех челов}
 GenerateChel;

Assign(f,'Chels.Txt');   {Создадим файл}
ReWrite(f);

i:=0;
While i < TotalRecords Do   {И скинемтуда все записи}
Begin
 With Chels[i] Do
 Begin
   WriteLn(f,Name);
   WriteLn(f,'  From Uchastok ',Uchastok);
   WriteLn(f,'  That Lives At ',Addr.Street,' in house #',Addr.Home,' in flat ',Addr.Flat);
   WriteLn(f,'  Subscribed For ',Count,' izdaniya:');
   Val(Count,x,e)
 End;
 For j:=0 To x-1 Do
   With Chels[i + (j Div N)].Izdaniya[j Mod N] Do
   Begin
     Write(f,'    ',Title,' (',Tip,') :');
     For k:=0 To 11 Do
       If Months[k] Then
         Write(f,MName[k],' ');
     WriteLn(f)
   End;
 Inc(i,(x Div N) + Byte((x Mod N) <> 0))
End;

Close(f)
End.

Автор: fms 5.06.2004 2:35

а в чем проблемы с блок схемами то?!

___
и любят преподы издеваться.. smile.gif

Автор: Catty 5.06.2004 2:58

Код
Как записи там обозначать?А с файлами какие блоки?

записи по-моему обозначаются обычными прямоугольными блоками (если идет действие с этой записью), а файлы обозначаются ввиде бочек или больших венчестеров или фиг его знает что оно такое!! blink.gif lol.gif

Автор: Окран 6.06.2004 20:01

Вы очень помогли! sad.gif

Автор: kile 6.06.2004 23:36

окран, ты еще недоволен ??

Автор: Catty 8.06.2004 1:35

поройся в инете там полно блок-схем!! Или на худой конец посмотри в ворде там к каждой блок-схеме есть комментарий! Ну блин не в блок-схемах счастье!! lol.gif
Тем более что по правилам сначала рисуется блок-схема а уже потом пишеться текст прграммы! rolleyes.gif