Компилятор крашится при компиляции модуля - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Задача состоит в создании модуля для работы с данными о студентах.
Если что, модуль доработан не до конца(скажем так, остается навести красоты, но это не касается темы проблемы). Хотел проверить, нет ли где-нибудь ошибок путем компиляции. Так вот, при нажатии кнопки "Компилировать" PascalABC.Net крашится. Попытался разобраться в чем проблема, и, кажется, понял, что беда в строке(попробовал ее просто закомментировать, и компиляция пошла, начало указывать на незнакомое имя list):
В связи с этим пара вопросов: могу ли я задавать динамическим массивам свой тип? И правильно ли я объявил данный массив? Заранее спасибо!

Решение задачи: «Компилятор крашится при компиляции модуля»

textual
Листинг программы
unit Stud;
 
interface
 
type
  //шаблон данных о студентах
  students = record
    number: integer;
    name: string[50]; 
    group: string[25];
    age: integer;
  end;
  arrtype = array of students;
 
procedure add(s: string; var k: smallint);
procedure search(s: string; num: smallint; k: smallint);
procedure redaction(s: string; k: smallint);
procedure del(s: string; var k: smallint);
procedure welcome;
 
implementation
 
var
  list: arrtype;
 
procedure welcome;
var
  s: string[200];
  s1: string[30];
  k: integer;
  i: byte;
begin
  k := 1;
  setlength(list, k); //устанавливаем длину массива записей
  while(s <> 'Выход') do 
  begin
    writeln('"Если Вы желаете добавить информацию о студенте, то введите следующую форму:"');
    writeln('"Добавить <фамилия студента> <возраст> <название группы>"');
    writeln('"Если Вы желаете редактировать информацию о студенте, то введите следующую форму:"');
    writeln('"Редактировать <фамилия студента> <новое значение возраста> <новое название группы>"');
    writeln('"Если Вы желаете удалить информацию о студенте, то введите следующую форму:"');
    writeln('"Удалить <номер студента,информацию о котором надо удалить>"');
    writeln('"Если Вы желаете запросить информацию о студенте, то введите следующую форму:"');
    writeln('"Запрос <фамилия студента>" или "Запрос <номер студента>"');
    writeln('Если Вы желаете выйти, то введите "Выход".');
    readln(s);
    
    s := trim(s);//удаляем все начальные и конечные пробелы
    i := pos(' ', s);//ищем позицию первого пробела
    s1 := copy(s, 1, i - 1);//копируем слово из s в s1 до первого пробела
    delete(s, 1, i);//удаляем из s первое слово
    
    (*
    case s1 of
      'Добавить': add(s, k);
      'Удалить': del(s, k);
      'Редактировать': redaction(s, k);
      'Запрос': search(s);
    else 
      begin
        writeln('Некорректный ввод');
        //welcome;
      end;
    end;
    *)
 
  end;
  
end;
 
//процедура добавления информации о студентах
procedure add(s: string; var k: smallint);
var
  s1: string;
  a: byte;
  b, c: integer;
begin
  setlength(list, k); //устанавливаем длину массива записей
  //выделение фамилии и добавление ее в информацию о студенте
  a := pos(' ', s);
  s1 := copy(s, 1, a - 1);
  delete(s, 1, a);
  list[k - 1].name := s1;
  //выделение возраста студента и добавление его в информацию
  a := pos(' ', s);
  s1 := copy(s, 1, a - 1);
  delete(s, 1, a);
  val(s1, b, c);
  while (c <> 0) do
  begin
    writeln('Возраст введен неккоретно, введите еще раз.');
    val(s1, b, c);
  end;
  list[k - 1].age := b;
  //добавление номера группы
  list[k - 1].group := s;
  //добавление порядкового номера студента
  list[k - 1].number := k;
  inc(k);
end;
//процедура удаления информации о студенте с заданным номером
procedure del(s: string; var k: smallint);
var
  a: smallint;
  b, c: integer;
begin
  //выделение номера студента для удаления
  val(s, b, c);
  while (c <> 0) do
  begin
    writeln('Номер введен неккоретно, введите еще раз.');
    val(s, b, c);
  end;
  a := b;
  //поиск студента с введенным номером
  for b := 0 to k - 1 do
    if list[b].number = a then c := b;
  //перенос информации о других студентах
  for b := c to k - 2 do 
    list[b] := list[b + 1];
  //уменьшаем длину массива записей на одну
  dec(k);
  setlength(list, k); 
end;
//процедура редактирования информации о студенте
procedure redaction(s: string; k: smallint);
var
  s1: string[50];
  a, b: smallint;
  c: byte;
  err : integer;
begin
  c := pos(' ', s);
  s1 := copy(s, 1, c - 1);
  delete(s, 1, c);
  
  for a := 0 to k - 1 do 
    if list[a].name = s1 then b := 0;
  
  c := pos(' ', s);
  s1 := copy(s, 1, c - 1);
  delete(s, 1, c);
  
  val(s, c, err);
  list[a].age := c;
  list[a].group := s;
end;
 
procedure search(s: string; num: smallint; k: smallint);
var
  a, b: smallint;
begin
  if s <> '' then 
  begin
    for a := 0 to k - 1 do
      if list[a].name = s then // a := b;
  end
  else
  begin
    for a := 0 to k - 1 do
      if list[a].number = num then // a := b;
  end;
end;
 
end.

Объяснение кода листинга программы

  1. unit Stud; - определяет модуль Stud, который содержит все описанные ниже процедуры и переменные
  2. interface - определяет интерфейс модуля Stud
  3. type - определяет типы данных, используемые в модуле Stud
  4. students = record - определяет структуру данных о студентах
    • number: integer; - номер студента
    • name: string[50]; - имя студента
    • group: string[25]; - название группы студента
    • age: integer; - возраст студента
  5. arrtype = array of students; - определяет тип массива для хранения структур данных о студентах
  6. procedure add(s: string; var k: smallint); - определяет процедуру добавления информации о студенте
  7. procedure search(s: string; num: smallint; k: smallint); - определяет процедуру поиска информации о студенте по фамилии или номеру
  8. procedure redaction(s: string; k: smallint); - определяет процедуру редактирования информации о студенте
  9. procedure del(s: string; var k: smallint); - определяет процедуру удаления информации о студенте
  10. procedure welcome; - определяет процедуру приветствия и получения команд от пользователя
  11. var - определяет переменные, используемые в модуле Stud
  12. list: arrtype; - определяет массив для хранения информации о студентах
  13. implementation - определяет реализацию модуля Stud
  14. var - определяет дополнительные переменные, используемые в реализации модуля Stud
  15. k: integer; - определяет переменную для хранения текущего размера массива list
  16. welcome; - вызывает процедуру приветствия и получения команд от пользователя
  17. while(s <> 'Выход') do - выполняет цикл, пока пользователь не введет 'Выход'
  18. begin - начинает выполнение блока кода
  19. writeln('Если Вы желаете добавить информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода информации о студенте
  20. writeln('Добавить <фамилия студента> <возраст> <название группы>'); - выводит пример ввода информации о студенте
  21. writeln('Если Вы желаете редактировать информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода информации о редактировании студента
  22. writeln('Редактировать <фамилия студента> <новое значение возраста> <новое название группы>'); - выводит пример ввода информации о редактировании студента
  23. writeln('Если Вы желаете удалить информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода информации о удалении студента
  24. writeln('Удалить <номер студента,информацию о котором надо удалить>'); - выводит пример ввода информации о удалении студента
  25. writeln('Если Вы желаете запросить информацию о студенте, то введите следующую форму:'); - выводит инструкцию для ввода запроса информации о студенте
  26. writeln('Запрос <фамилия студента> или Запрос <номер студента>'); - выводит пример ввода запроса информации о студенте
  27. end; - заканчивает выполнение блока кода
  28. end. - завершает определение модуля Stud

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы