Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2017, 12:27   #1
Alexey1002
 
Регистрация: 14.11.2017
Сообщений: 9
По умолчанию [Pascal] Создать массив структур, содержащий сведения о книгах

Необходимо создать массив структур A(n), где n<=30, содержащий сведения о книгах: автор, название книги и год издания. Используя функцию, выбрать из этого массива записи о книгах, изданных до 1995 года, и упорядочить этот список по году издания. В главной функции полученный массив вывести на экран.
Помогите, заранее большое спасибо!

Вот код, что у меня получилось написать, но это самое начало:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

const
nmax=20;
type
comp=record
avtor:string[10];
nazvanie:string[5];
god:Integer;
end;
var
spis:array[1..nmax] of comp;
n,i:Integer;
begin
write('Cislo knig:');
Readln(n);
Writeln('Vvod dannix o knigax:');
for i:=1 to n do
begin
Writeln(i:2, ') avtor, nazvanie, god izdania(cherez ENTER):');
Readln(spis[i].avtor);
Readln(spis[i].nazvanie);
Readln(spis[i].god);
end;
Writeln;
Writeln('------------------------------');
Writeln('| N | Avtor | Nazvanie | God |');
Writeln('------------------------------');
for i:=1 to n do
Writeln(i:3, spis[i].avtor:9, spis[i].nazvanie:5, spis[i].god:9);
Writeln;


{ TODO -oUser -cConsole Main : Insert code here }
end.

Последний раз редактировалось Alexey1002; 19.11.2017 в 14:20.
Alexey1002 вне форума Ответить с цитированием
Старый 19.11.2017, 12:53   #2
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию

Во-первых, используйте для кода BBCode "code".

Во-вторых, оно компилируется?
СтудПом вне форума Ответить с цитированием
Старый 19.11.2017, 14:11   #3
Alexey1002
 
Регистрация: 14.11.2017
Сообщений: 9
По умолчанию

Цитата:
Сообщение от СтудПом Посмотреть сообщение
Во-первых, используйте для кода BBCode "code".

Во-вторых, оно компилируется?
Да, вот консоль
Изображения
Тип файла: png 19-11-2017 14-10-03.png (14.6 Кб, 95 просмотров)
Alexey1002 вне форума Ответить с цитированием
Старый 19.11.2017, 14:30   #4
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию

Отлично!

Теперь, смотрите задание - сказано "Используя функцию".

Это значит, что вся работа в главной части программы д.б. реализована через вызовы функций (процедур).

Следовательно, задача номер раз - сделать тип-массив. Аналогично тому, как сделан тип записей, сделайте тип описывающий массив этих записей, чтоб при объявлении переменной
Код:
spis:array[1..nmax] of comp;
было что-то вроде
Код:
spis:ArrayType;
это желательно сделать, чтоб функции/процедуры работали с массивом через параметры, а не с глобальной переменной (массивом).

Задача номер два - написать две процедуры ввода и вывода массива. Ничего сложного, просто сделайте пустые процедуры с именами InputArray и PrintArray, их содержание уже есть у Вас, просто перенесите из главного модуля.
СтудПом вне форума Ответить с цитированием
Старый 19.11.2017, 16:15   #5
Alexey1002
 
Регистрация: 14.11.2017
Сообщений: 9
По умолчанию

Цитата:
Сообщение от СтудПом Посмотреть сообщение
Отлично!

Теперь, смотрите задание - сказано "Используя функцию".

Это значит, что вся работа в главной части программы д.б. реализована через вызовы функций (процедур).

Следовательно, задача номер раз - сделать тип-массив. Аналогично тому, как сделан тип записей, сделайте тип описывающий массив этих записей, чтоб при объявлении переменной
Код:
spis:array[1..nmax] of comp;
было что-то вроде
Код:
spis:ArrayType;
это желательно сделать, чтоб функции/процедуры работали с массивом через параметры, а не с глобальной переменной (массивом).

Задача номер два - написать две процедуры ввода и вывода массива. Ничего сложного, просто сделайте пустые процедуры с именами InputArray и PrintArray, их содержание уже есть у Вас, просто перенесите из главного модуля.
Не совсем понимаю. Я должен добавить "spis:ArrayType" туда, где идёт ввод переменных? Простите за мою так сказать тугость, начал изучать программирование вот только в начале семестра.
Alexey1002 вне форума Ответить с цитированием
Старый 19.11.2017, 16:29   #6
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию

spis - это переменная, у переменной есть тип, который определяет форму и операции с переменной, но этот тип не именован, т.е. он реализован только для единственной переменной. Традиционные реализации Паскаля не разрешают передавать такие переменные через параметры функций.
Надо создать такой тип, который будет описывать массив из записей
Код:
TYPE
ArrayType=array[1..nmax] of comp;
и далее, везде, где надо создать/объявить переменную содержащую массив, вы будете вместо описания
Код:
Имя_переменной:array[1..nmax] of comp;
указывать просто имя типа
Код:
Имя_переменной:ArrayType;
СтудПом вне форума Ответить с цитированием
Старый 19.11.2017, 21:48   #7
Alexey1002
 
Регистрация: 14.11.2017
Сообщений: 9
По умолчанию

Если правильно Вас понял, то вот так, но выдаёт ошибку (скриншот прилагаю)
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  const
    nmax=20;
    type
       ArrayType=array[1..nmax] of comp;
      comp=record
      avtor:string[10];
      nazvanie:string[5];
      god:Integer;

      end;
  var
n,i:Integer;
begin
      spis:ArrayType;
    write('Cislo knig:');
    Readln(n);
    Writeln('Vvod dannix o knigax:');

for i:=1 to n do
begin
  Writeln(i:2, ') avtor, nazvanie, god izdania(cherez ENTER):');

  Readln(spis[i].avtor);
  Readln(spis[i].nazvanie);
  Readln(spis[i].god);
  end;
  Writeln;
  Writeln('------------------------------');
  Writeln('| N | Avtor | Nazvanie | God |');
  Writeln('------------------------------');
   for i:=1 to n do
   Writeln(i:3, spis[i].avtor:9,  spis[i].nazvanie:5, spis[i].god:9);
   Writeln;
   Readln;


  { TODO -oUser -cConsole Main : Insert code here }
end.
Изображения
Тип файла: png 19-11-2017 21-47-17.png (26.3 Кб, 43 просмотров)
Alexey1002 вне форума Ответить с цитированием
Старый 20.11.2017, 08:53   #8
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию

Вы перенесли объявление переменной под begin
Код:
var
spis:array[1..nmax] of comp;
n,i:Integer;
begin
write('Cislo knig:');
Код:
  var
n,i:Integer;
begin <--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      spis:ArrayType;
    write('Cislo knig:');
Ещё надо переставить описания типов ArrayType идёт до comp. Из-за этого будет ошибка компиляции на строке Readln(spis[i].avtor);

Мля, прогресс компиляторов:
Код:
TP 7 -   3376 байт под DOS
FPC  - 267696 байт под Debian
будущее наступило, БЛИН

Последний раз редактировалось СтудПом; 20.11.2017 в 09:20.
СтудПом вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Структуры и массивы структур. Дан массив записей, содержащий сведения о книгах: фамилия автора, название книги, год издания Beauty44 Помощь студентам 3 21.09.2013 13:14
дан массив, содержащий сведения о книгах мама Паскаль, Turbo Pascal, PascalABC.NET 2 27.02.2013 21:46
типизированный файл catalog.dat, содержащий сведения о книгах (TurboPascal) Camelot_2012 Паскаль, Turbo Pascal, PascalABC.NET 2 25.05.2012 11:11
Создать типизированный файл catalog.dat, содержащий сведения о книгах Хочу все знать! Помощь студентам 3 17.05.2011 01:01
Создать файл содержащий сведения о том kot i @ Паскаль, Turbo Pascal, PascalABC.NET 0 25.05.2010 17:27