Разработка объектной программы для обработки данных о авторах издательства». 4 этап переделанный 2. Разработка объектной программы для обработки данных о авторах издательства
Скачать 183.44 Kb.
|
begin Assign(f, Filename); // соединяем файл с переменной rewrite(f); // Открываем файл на запись for i := 0 to AuthorCount - 1 do // проходим по всем авторам begin author := AuthorList[i]; writeln(f, author.GetAuthorName); // запись фамилии автора writeln(f, author.GetBooksCount); // запись количества книг book := author.GetHead.GetNext; while (book <> nil) do// проходим по всем книгам begin writeln(f, book.GetBookName); // запись названия книги writeln(f, book.GetCirculation); // запись тиража book := book.GetNext; // переходим к след элементу end; end; CloseFile(f); end; procedure TPublishing.Load(Filename: string); var aFile: Textfile; author: TAuthor; // экземпляр автора tauthorCount: integer; // количество авторов aAuthorName: string; // фамилия автора i: integer; book: TBook; // экземпляр книги aBookName: string; // название книги aCirculation: integer; // тираж lastBook: TBook; // закладка - ссылка на посл добавленную книгу begin AssignFile(aFile, Filename); reset(aFile); while not EOF(aFile) do begin lastBook := nil; Readln(aFile, aAuthorName); // фамилия автора author := TAuthor.Create(aAuthorName); // создаём автора Readln(aFile, tauthorCount); // считываем количество авторов for i := 1 to tauthorCount do begin Readln(aFile, aBookName); // считываем название книги Readln(aFile, aCirculation); // считываем тираж book := TBook.Create(aBookName, aCirculation);// создаём книгу if author.GetBooksCount = 0 then author.AddFirst(book) // добавляем первую книгу else author.AddAfter(book, lastBook.GetBookName); // добавляем в конец lastBook := book; // сохраняем последнюю добавленную книгу end; AddAuthor(author); // добавляем автора в издательство end; CloseFile(aFile); end; unit unitAuthor; interface uses Classes, uniTBook; type TAuthor = class // класс автор private AuthorName: string; // фамилия автора BooksCount: integer; // количество книг Head: TBook; // ссылка на заголовок public constructor Create(aAuthorName: string); function GetAuthorName(): string; function GetBooksCount(): integer; function GetHead(): TBook; procedure SetAuthorName(aAuthorName: string); procedure AddFirst(aBook: TBook); // добавляет в начало function AddAfter(aBook: TBook; aBookName: string): boolean; // добавление после заданного function AddBefore(aBook: TBook; aBookName: string): boolean; // добавление перед заданным function Delete(aBookName: string): boolean; // удаление function Search(aLastName: string): TBook; overload; // поиск обычный function Search(aLastName: string; var pPrev: TBook): TBook; overload; // поиск с возвратом предшетсвенника function SumCirculation: integer; // суммарный тираж end; implementation constructor TAuthor.Create(aAuthorName: string); begin AuthorName := aAuthorName; Head := TBook.Create('', 0); // создаём заголовок BooksCount := 0; end; function TAuthor.GetAuthorName(): string; begin Result := AuthorName; end; procedure TAuthor.SetAuthorName(aAuthorName: string); begin AuthorName := aAuthorName; end; function TAuthor.GetBooksCount(): integer; begin Result := BooksCount; end; function TAuthor.GetHead(): TBook; begin Result := Head; end; procedure TAuthor.AddFirst(aBook: TBook); begin begin Head.SetNext(aBook); // Изменяеем ссылку на след у заголовка на новый BooksCount := BooksCount + 1; end; end; function TAuthor.AddAfter(aBook: TBook; aBookName: string): boolean; var temp: TBook; begin Result := False; temp := Search(aBookName); // поиск книги if (temp <> nil) then // при её нахождении begin aBook.SetNext(temp.GetNext);// настриваем ссылки temp.SetNext(aBook); BooksCount := BooksCount + 1; // увеличиваем счетчик Result := True; end; end; function TAuthor.AddBefore(aBook: TBook; aBookName: string): boolean; var temp, prev: TBook; begin Result := False; temp := Search(aBookName, prev); // поиск книги и её предшественника if (temp <> nil) then // при её нахождении begin aBook.SetNext(prev.GetNext); // настриваем ссылки prev.SetNext(aBook); BooksCount := BooksCount + 1; // увеличиваем счетчик Result := True; end; end; function TAuthor.Delete(aBookName: string): boolean; var temp, prev: TBook; begin Result := False; temp := Search(aBookName, prev); // поиск книги и её предшественника if (prev <> nil) then // при нахождении begin prev.SetNext(temp.GetNext);// настриваем ссылки temp := nil; BooksCount := BooksCount - 1;// увеличиваем счётчик Result := True; end; end; function TAuthor.Search(aLastName: string): TBook; var temp: TBook; begin Result := nil; temp := Head.GetNext; // установка переменной в начало списка while temp <> nil do // организация цикла до достижения заголовка if temp.GetBookName = aLastName then// в случае нахождения прерывание begin Result := temp; break; end else temp := temp.GetNext;// переход к следующему end; function TAuthor.Search(aLastName: string; var pPrev: TBook): TBook; var temp: TBook; begin Result := nil; pPrev := Head; temp := Head.GetNext;// установка переменной в начало списка while (temp <> nil) do // организация цикла до достижения заголовка begin if (aLastName = temp.GetBookName) then // в случае нахождения прерывание begin Result := temp; break; end else begin pPrev := temp; // Запомнимаем предыдущего temp := temp.GetNext;// переходим к следующему end; end; end; function TAuthor.SumCirculation: integer; var temp: TBook; begin Result := 0; temp := Head.GetNext; while (temp <> nil) do begin Result := Result + temp.GetCirculation; temp := temp.GetNext; end; end; end. unit unitBook; interface uses Classes; type TBook = class // класс книга private BookName: string; // название книги Circulation: integer; // тираж Next: TBook; // след книга public constructor Create(aBookName: string; aCirculation: integer); function GetNext: TBook; function GetBookName: string; function GetCirculation: integer; procedure SetNext(aNext: TBook); procedure SetBookName(aBookName: string); procedure SetCirculation(aCirculation: integer); end; implementation constructor TBook.Create(aBookName: string; aCirculation: integer); begin BookName := aBookName; Circulation := aCirculation; end; function TBook.GetNext: TBook; begin Result := Next; end; procedure TBook.SetNext(aNext: TBook); begin Next := aNext; end; function TBook.GetBookName: string; begin Result := BookName; end; procedure TBook.SetBookName(aBookName: string); begin BookName := aBookName; end; function TBook.GetCirculation: integer; begin Result := Circulation; end; procedure TBook.SetCirculation(aCirculation: integer); begin Circulation := aCirculation; end; end. |