Помощь - Поиск - Пользователи - Календарь
Полная версия: Записи с файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Окран
Умоляю помочь сделать данную задачу до завтрашнего дня!!!!!Очень прошу!!Сам вышел из больницы 2 дня назад и в первый же день учебы лабараторная по паскалю на котором я был всего на 1-2 лекциях а потом загремел по состоянию здоровья в больницу!!!Пожалуйста!!!!

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

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.

Должно быть так.
сли что не так - свисти, отвечу.
Окран
Простите пожалуйста, но у вас целая куча ошибок!!!Такие как неправильное название stirng вместо string я исправил но там остались какие-то непонятные!!!Памагите пожалуйста!!!
BlackShadow
Я с работы писал - там у меня компилятора нет.
Ща перепроверю ближе к вечеру пришлю.
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.

Старею... Без компилятора уже трудновато smile.gif
Окран
Храни тебя бог!!!!!!!!!!! smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif
Окран
BlackShadow друг выручи меня еще раз пожалуйста!!!!!
На эту же задачу тока вот новое задание:

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

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

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.

Опять с работы, опять без компилятора. Если что - свисти.
Окран
BlackShadow ругается на переменную N-ты ее вроде не обозначил?????
BlackShadow
Забыл.
Ну допиши в начале
Код

Const
 N = 20;

Только смотри, чтобы в обеих прогах N совпадало.
Окран
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
Ндя...
Начнём
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
Цитата
И что это за цикл такой и как работает??Почему тут i:=0?


А что, препод не знает что это за цикл такой?
:D
Окран
BlackShadow спасибо друг!!! smile.gif smile.gif smile.gif smile.gif
Вот последнее задание и я получу зачет:

Код

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

Пожалуйста!!!
BlackShadow
Код

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;

Должно работать...
Окран
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
а в чем проблемы с блок схемами то?!

___
и любят преподы издеваться.. smile.gif
Catty
Код
Как записи там обозначать?А с файлами какие блоки?

записи по-моему обозначаются обычными прямоугольными блоками (если идет действие с этой записью), а файлы обозначаются ввиде бочек или больших венчестеров или фиг его знает что оно такое!! blink.gif lol.gif
Окран
Вы очень помогли! sad.gif
kile
окран, ты еще недоволен ??
Catty
поройся в инете там полно блок-схем!! Или на худой конец посмотри в ворде там к каждой блок-схеме есть комментарий! Ну блин не в блок-схемах счастье!! lol.gif
Тем более что по правилам сначала рисуется блок-схема а уже потом пишеться текст прграммы! rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.