Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Гаряка
Статус: Академик
Рейтинг: 8330
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Советник
Рейтинг: 5682
∙ повысить рейтинг »
lamed
Статус: Академик
Рейтинг: 5534
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1200
Дата выхода:03.07.2011, 14:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:164 / 173
Вопросов / ответов:1 / 2

Вопрос № 183719: Здравствуйте! У меня возникли сложности с таким вопросом: Создать файл, содержащий сведения о книгах в библиотеке. Формат сведений: фамилия автора, название книги, год издания. Обеспечить выбор сведений из файла о запрашиваемом авторе. Последо...



Вопрос № 183719:

Здравствуйте! У меня возникли сложности с таким вопросом:

Создать файл, содержащий сведения о книгах в библиотеке. Формат сведений: фамилия автора, название книги, год издания. Обеспечить выбор сведений из файла о запрашиваемом авторе. Последовательность только авторов должна присутствовать на экране. Сведения должны выводиться упорядоченными по годам издания. Предусмотреть вывод исходных неупорядоченных сведений.

Среда - Borland Pascal (BP.EXE)

Заранее спасибо!

Отправлен: 26.06.2011, 13:20
Вопрос задал: лыков валерий олегович (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Николка Белый (4-й класс) :
Здравствуйте, лыков валерий олегович!
Я ответа так и не получил.
Мое решение - это мое видение. Если будут вопросы обращайтесь.
Если нужно будет что-то изменить - обращайтесь.

скачать файл BOOKS.PAS [1.8 кб]

Т.к. автор ответа отказался исправлять ошобки в своей программе, в приложении исправленный оптимизированный вариант
Исправление написаной программы.
-----
∙ Отредактировал: Зенченко Константин Николаевич (Модератор)
∙ Дата редактирования: 01.07.2011, 10:54 (время московское)

Приложение:

Ответ отправил: Николка Белый (4-й класс)
Ответ отправлен: 27.06.2011, 16:38
Номер ответа: 267848
Украина, Краматорск
ICQ # 6570970

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267848 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает lamed (Академик) :
    Здравствуйте, Валерий Олегович! Turbo-Pascal 7.
    Код :
    program p183719;
    { Создать файл, содержащий сведения о книгах в библиотеке.
    Формат сведений: фамилия автора, название книги, год издания.
    Отчеты.
    1. Книги указанного автора в хронологическом порядке.
    2. Исходный неупорядоченный список. }
    { lamed, 01.07.2011 }
    uses
      crt;
    
    const
      MaxVSize = 200; { Максимальный размер массива номеров записей }
    
    type
      TAuthor = string[20]; { Тип - Фамилия автора }
      TTitle = string[30];  { Тип - Название книги }
      TYear = integer;      { Тип - Год издания }
      TBook = record        { Тип - Структура записи о книге }
        author: TAuthor;    { Автор }
        title : TTitle;     { Название }
        year  : TYear;      { Год издания }
      end;
    
      TFileName   = string[30]; { Тип - Имя файла }
      TVector     = array[1..MaxVSize] of integer; { Тип - Массив номеров записей }
      TBooksFile  = file of TBook; { Тип - Файл записей о книгах }
      
      { Храним в одной переменной и массив номеров записей, и фактический размер массива }
      { Таких массивов может быть несколько, если потребуется упорядочить список книг
        еще по каким-то критериям, например, по названию книг в алфавитном порядке }
      TIndex      = record
        v: TVector;
        vSize: integer; { Используемый размер массива (число записей) }
      end;
    
    var
      iChoice  : integer;    { Выбранный пункт меню }
      IsReady  : boolean;    { Файл открыт для работы }
      idx      : TIndex;     { Массив номеров записей }
      f        : TBooksFile; { Файл записей о книгах }
      fname    : TFileName;  { Имя файла записей о книгах }
      Membook  : Tbook;      { Карточка книги или шаблон для поиска / упорядочения }
    
    procedure append(var f: TBooksFile; book: Tbook);
    { Добавление записи в файл }
    begin
      seek(f, filesize(f)); { В конец файла }
      write(f, book);
    end; { append }
    
    procedure OpenOrCreate(const fname: TFileName; var f: TBooksFile; var IsReady: boolean);
    { Открытие или создание файла }
    begin
      if fName='' then
        IsReady := false
      else
        begin
          {$I-}
          Assign(f, fName);
          Reset(f);
          {$I+}
          IsReady := IOResult = 0; 
          if not IsReady then { Если файл не сушествует, пробуем создать новый файл с таким именем }
            begin
              {$I-}
              Rewrite(f);
              {$I+}
              IsReady := IOResult = 0;
              { Если не удалось ни открыть, ни создать, дальнейшая работа будет невозможна }
            end;
        end;
    end;  { OpenOrCreate }
    
    procedure GetAuthor(var book: Tbook);
    { Получение значения записи с клавиатуры }
    begin
      clrscr;
      write('Автор       > ');
      readln(book.author);
    end; { GetAuthor }
    
    procedure Getbook(var book: Tbook);
    { Получение значения записи с клавиатуры }
    begin
      clrscr;
      write('Автор       > ');
      readln(book.author);
      write('Название    > ');
      readln(book.title);
      write('Год издания > ');
      readln(book.year);
    end; { Getbook }
    
    procedure menu;
    { Меню }
    begin
      clrscr;
      Writeln( ' 0.Выход' );
      Writeln( ' 1.Cоздание / открытие файла' );
      Writeln( ' 2.Добавление записи' );
      Writeln( ' 3.Книги автора' );
      Writeln( ' 4.Все книги' );
      Write  ( ' Выбран пункт:');
    end; { Menu }
    
    procedure PrintBook(
      const book: TBook;
      const lines: integer;
      const i: integer);
    { Печать одной книги, возможно, включая строку заголовка и подсказку для продолжения }
    begin
      if i mod lines = 0 then { Печатаем по lines строк на экране }
        begin
          if i<>0 then
            begin
              write('Нажмите клавишу для продолжения >');
              readln;
            end;
          ClrScr;
          writeln('Автор               Название                      Год изд.');
        end;
      writeln(
        book.author, ' ':20-length(book.author),
        book.title,' ':30-length(book.title),
        book.year); { Располагаем по левому краю. Лучше написать функцию padl }
    end; { PrintBook }
    
    procedure PrintAll(var f: TBooksFile; const lines: integer);
    { Построчная печать файла }
    var
      i: integer;
      fSize: integer;
      book: TBook;
    begin
      ClrScr;
    
      fSize:= filesize(f)-1; { Число записей }
      seek(f,0);             { На начало файла }
      for i:= 0 to fSize do  { Обрабатываем каждую запись }
        begin
          read(f,book);
          PrintBook(book,lines,i);
        end;
      write('Нажмите клавишу для продолжения >');
      readln;
    end; { show }
    
    procedure PrintIdx(
      var f: TBooksFile;
      const idx: TIndex;
      const lines: integer);
    { Печать файла с использованием массива номеров записей }
    var
      i: integer;
      book: Tbook;
    begin
      for i:= 1 to idx.vSize do { Для каждого используемого элемента массива номеров записей }
        begin
          seek(f,idx.v[i]); { Переходим к записи, указанной в массиве }
          read(f,book);     { Читаем }
          PrintBook(book,lines,i-1); { Печатаем }
        end;
      write('Нажмите клавишу для продолжения >');
      readln;
    end; { PrintIdx }
    
    procedure swap(var i1, i2: integer);
    { Обмен содержимого двух целых переменных }
    var
      tmp: integer;
    begin
      tmp := i1;
      i1 := i2;
      i2 := tmp;
    end; { swap }
    
    procedure sort(var f: TBooksFile; var idx: TIndex);
    { Сортировка индексного массива "пузырьком"}
    { Эта процедура неоптимальна. Число чтений из файла можно уменьшить }
    var
      i,j : integer;
      book1, book2: Tbook;
    
    begin
      for i:= 1 to idx.vSize-1 do
        for j:= idx.vSize downto i+1 do
            begin
              { Это место программы самое слабое }
              { Фактически запись из файла читается дважды }
              seek(f,idx.v[j-1]);
              read(f,book1);
              seek(f,idx.v[j]);
              read(f,book2);
              if (book2.year<book1.year) then { Если записи не упорядочены, меняем их номера в массиве }
                swap(idx.v[j], idx.v[j-1]);
            end;
    
    end; { sort }
    
    procedure LoadIdx(var f: TBooksFile; var idx: TIndex; const etalon: TBook);
    { Загрузка номеров записей в индексный массив }
    var
      i: integer;
      book: Tbook;
      fSize: integer;
    begin
      idx.vSize := 0;
      fSize := filesize(f)-1;
      seek(f,0);
      for i:= 0 to fSize do { Обрабатываем файл }
        begin
          read(f,book);
          if book.author = etalon.author then { В массив заносим номера строк по фильтру }
            begin
              inc(idx.vSize); { Заполняем следующий элемент массива }
              idx.v[idx.vSize] := filepos(f)-1;
            end;
        end;
    end; { LoadIdx }
    
    begin { main }
    
      iChoice    := 0;      { По умолчанию устанавливаем "Выход" }
      IsReady    := false;  { Файл не открыт }
      while true do begin
        menu;
        readln( iChoice );
    
        case iChoice of
          0: { выход }
          begin
            write('Завершение работы');
            readln;
            if isReady then close(f);
            exit;
          end;
    
          1: { открытие/создание файла }
          begin
            If isReady then
              write('Файл уже открыт')
            else
              begin
                write('Полный путь к файлу > ');
                readln(fName);
                OpenOrCreate(fName, f, IsReady);
                readln;
              end;
          end;
    
          2: { добавление записи }
          begin
            if IsReady then
              begin
                GetBook(MemBook);  { Прочли карточку книги }
                append(f,Membook); { Добавили в конец файла }
              end
            else
              begin
                write('Файл не открыт');
                readln;
              end;
          end;
    
          3: { Выбор автора и печать его книг в хронологическом порядке }
          begin
            if IsReady then
              begin
                GetAuthor(MemBook); { Получили фамилию автора }
                LoadIdx(f, idx, MemBook); { Загрузили массив номеров строк из файла }
                Sort(f, idx);        { Сортируем массив }
                PrintIdx(f, idx, 10); 
                { Печатаем записи файла в порядке следования в массиве, по 10 строк на экране }
              end
            else
              write('Файл не открыт');
            readln;
          end;
    
          4: { Печать исходного файла }
          begin
            if IsReady then
              PrintAll(f, 10)
              { Печатаем все записи файла в исходном порядке, по 10 строк на экране }
            else
              write('Файл не открыт');
            readln;
          end;
        end; { case }
      end;
    end.

    Удачи!

    Ответ отправил: lamed (Академик)
    Ответ отправлен: 30.06.2011, 22:00
    Номер ответа: 267868
    Россия, Ковров
    Тел.: +79107793141

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267868 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное