// PascalABC.NET 3.0, сборка 1088 const nDay:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31); type Date=record Day,Month,Year:integer end;
function DOW(Dat:Date):integer; // день недели по дате. 0-Вс. 1-Пн, 7-Сб var a,y,m:integer; begin With Dat do begin a:=(14 - month) div 12; y:=Year-a; m:=month+12*a-2; DOW:=(7000+(day+y+y div 4-y div 100+y div 400+(31*m) div 12)) mod 7 end end;
procedure DMY2Date(d,m,y:integer; var data:Date); // Преобразует к дате заданные день, месяц и год begin data.Day:=d; data.Month:=m; data.Year:=y end;
procedure LastDays(month,year:integer; var Wd,Fr:Date); // даты последней среды (Wd) и пятницы (Fr) для месяца в году } var LastDay:Date; n:integer; begin n:=nDay[month]; if (month=2) and (year mod 4 = 0) then Inc(n); DMY2Date(n,month,year,LastDay); n:=DOW(LastDay); // номер последнего дня недели Wd.Month:=month; Wd.Year:=year; if n<3 then Wd.Day:=LastDay.Day-(n+4) else if n=3 then Wd.Day:=LastDay.Day else Wd.Day:=LastDay.Day+3-n; Fr.Month:=month; Fr.Year:=year; if n<5 then Fr.Day:=LastDay.Day-(n+2) else if n=3 then Fr.Day:=LastDay.Day else Fr.Day:=LastDay.Day-1 end;
var Wd,Fr:Date; ff,mf:Text; m:integer; begin Assign(ff,'father.txt'); Rewrite(ff); Assign(mf,'mother.txt'); Rewrite(mf); // Сентябрь-декабрь 2015 года for m:=9 to 12 do begin LastDays(m,2015,Wd,Fr); if Odd(Wd.Day) then Writeln(mf,Wd.Day,'.',m,'.2015 - 1 класс') else Writeln(ff,Wd.Day,'.',m,'.2015 - 1 класс'); if Odd(Fr.Day) then Writeln(mf,Fr.Day,'.',m,'.2015 - 5 класс') else Writeln(ff,Fr.Day,'.',m,'.2015 - 5 класс') end; // Январь - май 2016 года for m:=1 to 5 do begin LastDays(m,2016,Wd,Fr); if Odd(Wd.Day) then Writeln(mf,Wd.Day,'.',m,'.2016 - 1 класс') else Writeln(ff,Wd.Day,'.',m,'.2016 - 1 класс'); if Odd(Fr.Day) then Writeln(mf,Fr.Day,'.',m,'.2016 - 5 класс') else Writeln(ff,Fr.Day,'.',m,'.2016 - 5 класс') end; Close(ff); Close(mf) end.
Содержимое выходных файлов: father.txt 30.9.2015 - 1 класс 28.10.2015 - 1 класс 30.10.2015 - 5 класс 30.12.2015 - 1 класс 24.2.2016 - 1 класс 26.2.2016 - 5 класс 30.3.2016 - 1 класс
mother.txt 25.9.2015 - 5 класс 25.11.2015 - 1 класс 27.11.2015 - 5 класс 25.12.2015 - 5 класс 27.1.2016 - 1 класс 29.1.2016 - 5 класс 25.3.2016 - 5 класс 27.4.2016 - 1 класс 29.4.2016 - 5 класс 25.5.2016 - 1 класс 27.5.2016 - 5 класс
type LibBook = record Book:string[50]; Author:string[50]; Publisher:string[30]; PubYear:integer; City:string[30]; Deleted:boolean end; var gf:file of LibBook;
function Create(pName:string):file of LibBook; // Создает или обнуляет существующий файл библиотеки // с полным именем pName (в имени можно указать и путь) begin var f:file of LibBook; Rewrite(f,pName); Result:=f; f.Close end;
procedure Insert(pLib:LibBook); // Добавляет книгу в базу begin var n:=FileSize(gf); Seek(gf,n); Write(gf,pLib); end;
procedure BookWrite(pn:integer;pLib:LibBook); // вывод книги номер pn begin Writeln('*** Книга №',pn,' ***'); if pLib.Deleted=False then begin Writeln('Название: ',pLib.Book); Writeln('Автор: ',pLib.Author); Writeln('Издатель: ',pLib.Publisher); Writeln('Год выпуска: ',pLib.PubYear); Writeln('Город: ',pLib.City); end else Writeln('=== У Д А Л Е Н А ==='); Writeln end;
procedure View(pKol:integer:=0); // Отображает содержимое библиотеки. // Можно вывести не все, а только pKol первых записей begin var nB:=FileSize(gf); if nb=0 then Writeln('Библиотека пустая') else begin Seek(gf,0); Writeln('Книг в библиотеке: ',nB,NewLine); if pKol<>0 then nB:=min(pKol,nb); var Lib:LibBook; for var i:=1 to nB do begin Read(gf,Lib); BookWrite(i,Lib) end end end;
function Delete(pNom:integer):boolean; // Удаляет книгу с номером pNom и возвращает true. // Возвращает false, если такой книги нет begin var nB:=FileSize(gf); var Lib:LibBook; if pNom-1>nB then begin Writeln('Книга №',pNom,' не найдена'); Result:=False end else begin Seek(gf,pNom-1); Read(gf,Lib); Lib.Deleted:=True; Seek(gf,pNom-1); Write(gf,Lib); Writeln('Книга №',pNom,' удалена'); Result:=True end; end;
procedure Find(ps:string); // поиск книги по параметрам, заданным строкой // Формат <код> пробел <значение> begin var n:=Ord(ps[1])-Ord('0'); Delete(ps,1,2); var par:=ps; var Lib:LibBook; case n of 0:begin // по номеру книги var nb:=FileSize(gf); var fn:=par.ToInteger; if fn-1>nb then Writeln('Книги с таким номером нет') else begin Seek(gf,fn-1); Read(gf,Lib); BookWrite(fn,Lib) end end; 1:begin // по названию книги var nl:=par.Length; // для контекстного поиска Seek(gf,0); var i:=1; while not Eof(gf) do begin Read(gf,Lib); if Copy(Lib.Book,1,nl)=par then begin BookWrite(i,Lib); Exit end else Inc(i) end; Writeln('Поиск по названию книги ',par,' неуспешен') end; 2:begin // по автору книги var nl:=par.Length; // для контекстного поиска Seek(gf,0); var i:=1; while not Eof(gf) do begin Read(gf,Lib); if Copy(Lib.Author,1,nl)=par then begin BookWrite(i,Lib); Exit end else Inc(i) end; Writeln('Поиск по автору книги ',par,' неуспешен') end; 3:begin // по издательству var nl:=par.Length; // для контекстного поиска Seek(gf,0); var i:=1; while not Eof(gf) do begin Read(gf,Lib); if Copy(Lib.Publisher,1,nl)=par then begin BookWrite(i,Lib); Exit end else Inc(i) end; Writeln('Поиск по издательству книги ',par,' неуспешен') end; 4:begin // по году выпуска Seek(gf,0); var i:=1; var ipar:=par.ToInteger; while not Eof(gf) do begin Read(gf,Lib); if Lib.PubYear=ipar then begin BookWrite(i,Lib); Exit end else Inc(i) end; Writeln('Поиск по году издания ',par,' неуспешен') end; 5:begin // по городу var nl:=par.Length; // для контекстного поиска Seek(gf,0); var i:=1; while not Eof(gf) do begin Read(gf,Lib); if Copy(Lib.City,1,nl)=par then begin BookWrite(i,Lib); Exit end else Inc(i) end; Writeln('Поиск по городу ',par,' неуспешен') end; else Writeln('Неверная строка поиска') end end;
const LibName='MyLib.lib'; begin var MyBook:LibBook; gf:=Create(LibName); Reset(gf,LibName); With MyBook do begin Book:='Первый учебник'; Author:='Первый автор'; Publisher:='Издательство 1'; PubYear:=2010;; City:='Город 1' end; Insert(MyBook); With MyBook do begin Book:='Второй учебник'; Author:='Второй автор'; Publisher:='Издательство 2'; PubYear:=2012;; City:='Город 2' end; Insert(MyBook); With MyBook do begin Book:='Третий учебник'; Author:='Третий автор'; Publisher:='Издательство 3'; PubYear:=2006;; City:='Город 3' end; Insert(MyBook); View; Delete(2); View; Find('0 3'); Find('1 Перв'); Find('2 Тре'); Find('3 Издательство 2'); Find('4 2006'); gf.Close end.
2) Пунктуация.
3) Смысл.
Вроде бы это три правила.