Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ Записи с файлами
Автор: Окран 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.
Старею... Без компилятора уже трудновато
Автор: Окран 17.05.2004 17:20
BlackShadow друг выручи меня еще раз пожалуйста!!!!!
На эту же задачу тока вот новое задание:
Код
Написать программу обработки файла подписных изданий по данным № месяца и изданию!Найдите количество экземпляров, подлежащих доставке!
Спаси утопающего!
Автор: 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
Спасибо большое за все что ты сделал для меня!!!
Автор: BlackShadow 19.05.2004 20:11
Ндя...
Начнём
1). Усвой сразу и навсегда, если ещё собираешься вернуться к программированию: любая переменная обнуляется (число = 0б строка - пустая) при запуске программы ТОЛЬКО В РЕЖИМЕ ОТЛАДКИ! А при обычном запуске на её месте может (с вероятностью 2^SizeOf(Variable):1) отнюдь не 0. Поэтому перед посчётом чего-то там я принудительно обнулил переменную Total. А то ведь могло бы получиться, что 3 человека выписали 148 журналов "Мурзилка" на январь
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 спасибо друг!!!
Вот последнее задание и я получу зачет:
Код
Написать программу обработки файла подписных изданий по заданным ФИО.Распечатать список подписных изданий подписчика(записей, относящихся к одному подписчику может быть несколько)!!!!
Пожалуйста!!!
Автор: 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
а в чем проблемы с блок схемами то?!
___
и любят преподы издеваться..
Автор: Catty 5.06.2004 2:58
Код
Как записи там обозначать?А с файлами какие блоки?
записи по-моему обозначаются обычными прямоугольными блоками (если идет действие с этой записью), а файлы обозначаются ввиде бочек или больших венчестеров или фиг его знает что оно такое!!
Автор: Окран 6.06.2004 20:01
Вы очень помогли!
Автор: kile 6.06.2004 23:36
окран, ты еще недоволен ??
Автор: Catty 8.06.2004 1:35
поройся в инете там полно блок-схем!! Или на худой конец посмотри в ворде там к каждой блок-схеме есть комментарий! Ну блин не в блок-схемах счастье!!
Тем более что по правилам сначала рисуется блок-схема а уже потом пишеться текст прграммы!