Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/20: Рейтинг темы: голосов - 20, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 24.11.2019
Сообщений: 23

Простая проблема новичка

07.12.2019, 20:01. Показов 3759. Ответов 10

Студворк — интернет-сервис помощи студентам
В ходе написания кода возник ряд ошибок, прежде устранявшихся без особых проблем
Необходимо найти подходящее решение

Текст кода:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
program lab6;
 
const kol = 25; {количество студентов}
 
Type students = record
   fio: array [1..16] of char;
   day: 1..31;
   month: 1..12;
   year: integer;
   first: array [1..4] of 2..5;  {оценки первого семестра}
   second: array [1..5] of 2..5; {оценки второго семестра}
end;
 
var
 s:students;
 every: array [1..kol] of students;
 a: array[1..kol] of real;
 i,j,c,d:integer;
 b:real;
 symbols:char;
 f,t:text;
 
begin
assign(t,'input6.txt');
rewrite(t);
 
assign(f,'B.dat');
reset(f);
 
for i := 1 to 4 do      {На заголовок отведено 4 строки}
 begin
 while not Eoln(f) do   {до конца строки}
  begin
  Read(f,symbols);
  Write(t,symbols);
  end;
 Readln(f);
 Writeln(t);
 end;
  
Readln(f);
for i:=1 to 24 do                {для каждого из 24 студентов}
 begin 
 for j:=1 to 20 do
  begin
  Read(f,every[i].fio[j]);       {считывается ФИО}
  Read(f,every[i].day);          {считывается день}
  Read(f,every[i].month);        {считывается месяц}
  Read(f,every[i].year);         {год рождения}
  for j:=1 to 4 do
   begin
   Read(f, every[i].first[j]);   {Оценки 1-го семестра}
   for j:=1 to 5 do
    begin
    Read(f,every[i].second[j]);  {Оценки 2-го семетра}
    Readln(f);
    end;
   end;
  end;
 end; 
 
for i:=1 to kol do
 begin
 for j:=1 to 4 do
  begin
  a[i]:=(every[i].first[j]+a[i])/4; {нахождение среднего балла первого семестра}
  end;
 end;
 
for i:=1 to kol-1 do            {сортировка по убыванию среднего балла}
 begin
 for j:=i+1 to kol do
  begin
  if (a[j] < a[j+1]) then
   begin
   b:=a[j];
   a[j]:=a[j+1];
   a[j+1]:=b;
   end;
  end;
 end;
 
for i := 1 to 25 do
   Write( a[i],' ');
   
Readln(f);
for i := 1 to 24 do
 begin  
 for j := 1 to 20 do
  begin
  Write(t, every[i].fio[j]);
  Write(t, every[i].day);
  Write(t, every[i].month);
  Write(t, every[i].year);
  Write(t, ' ');
  for j := 1 to 4 do
   begin
   Write(t, every[i].first[j]);
   Write(t, ' ');
   for j:= 1 to 5 do
    begin
    Write(t, every[i].second[j]);
    Writeln(t);
    end;
   end;
  end;
 end; 
 
close(f);
close(t);
end.
Скриншот ошибки:
Миниатюры
Простая проблема новичка  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2019, 20:01
Ответы с готовыми решениями:

Ruby \ Простая задача для новичка
Доброе время суток, форумчане! Помогите пожалуйста с реализацией следующей задачи на языке Ruby. С этим языком сталкиваюсь впервые и...

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

У новичка проблема с секьюрити
Установил у себя Oracle 9i, создал новую базу, попытался ее открыть - ребует паоль. Какой такой пароль она хочет?

10
Модератор
10448 / 5739 / 3407
Регистрация: 17.08.2012
Сообщений: 17,459
08.12.2019, 05:33
Ещё бы. Вы написали вот такую нелепость:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for j := 1 to 20 do
  begin
    //...
    for j := 1 to 4 do
      begin
        //...
        for j := 1 to 5 do
         begin
         //...
         end;
        //...
      end;
    //...
  end;
Изменять вручную переменную-счётчик предопределённого цикла внутри цикла запрещено. О чём и сообщает компилятор. У Вас цикл 1..4 пытается изменить счётчик цикла цикла 1..20, а цикл 1..5 пытается изменить счётчик цикла и у 1..20, и у 1..4. И такая бадяга у Вас аж в двух местах: строки 44..59 и 89..106. Переименуйте счётчики у внутренних циклов... Хотя... Не вполне понятно, что Вы вообще пытаетесь сделать с помощью Вашей программы. Написали бы задание... Находите средний балл, и сортируете массив "a" со средними баллами. Зачем это? Что-то мне подсказывает, что Вам требуется отсортировать массив "every" по среднему баллу.

Кстати, ошибка на скриншоте только одна. Остальное - замечания, которые появляются оттого, что Вас учили Turbo Pascal, в крайнем случае - Pascal ABC, а Вы используете Pascal ABC.NET, синтаксис которого разительно отличается от синтаксисов прочих диалектов паскаля.
0
1 / 1 / 0
Регистрация: 24.11.2019
Сообщений: 23
08.12.2019, 11:24  [ТС]
Моей ошибкой было не показать задание:
Данный список необходимо отсортировать по среднему баллу первой сессии

В сортировке достаточно изменить переменные? Благодарю, исправил

Да, есть ошибка ещё ошибка и нет догадок как с ней справиться(

Pascal Abc.net единственный компилятор, который я использую для кодинга на Паскале
Миниатюры
Простая проблема новичка   Простая проблема новичка  
0
Модератор
10448 / 5739 / 3407
Регистрация: 17.08.2012
Сообщений: 17,459
08.12.2019, 19:23
Цитата Сообщение от kadnedir Посмотреть сообщение
В сортировке достаточно изменить переменные?
Не понимаю, что Вы имеете ввиду. Вы упрямо выкладываете какие-то ненужные фотографии вместо текста Вашей программы... Вообще, можете оставить сортировку такой, какая она есть, но вместе с перестановкой элементов массива "a" нужно переставлять соответствующие элементы массива "every":
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for i:=1 to kol-1 do            {сортировка по убыванию среднего балла}
 begin
 for j:=i+1 to kol do
  begin
  if (a[j] < a[j+1]) then
   begin
   b:=a[j];
   a[j]:=a[j+1];
   a[j+1]:=b;
   s:=every[j];
   every[j]:=every[j+1];
   every[j+1]:=s;
   end;
  end;
 end;
Цитата Сообщение от kadnedir Посмотреть сообщение
есть ошибка ещё
На скриншоте ошибок нет. Это замечания насчёт того, что Вы пользуетесь классическим синтаксисом паскаля вместо синтаксиса Pascal ABC.NET. Не обращайте внимания. Совсем. Но, если Вам ну очень хочется убрать эти замечания, и потом рассказывать преподавателю про синтаксис Pascal ABC.NET, то уберите все объявления о счётчиках циклов из секции var, и оформляйте заголовки цикла вот так:
Pascal
  for var i := 1 to 20 do
или, например, так:
Pascal
  foreach var i in [1..20] do
.
Цитата Сообщение от kadnedir Посмотреть сообщение
Pascal Abc.net единственный компилятор, который я использую для кодинга
Для синтаксиса классического паскаля лучше использовать Free Pascal Compiler (FPC).
0
1 / 1 / 0
Регистрация: 24.11.2019
Сообщений: 23
08.12.2019, 20:45  [ТС]
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
На скриншоте ошибок нет
Updated скриншот

Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Не обращайте внимания. Совсем.
Я не могу не обращать на это внимание, так как в режиме отладки процесс выполнения останавливается на этом шаге

Цитата Сообщение от Cyborg Drone Посмотреть сообщение
и потом рассказывать преподавателю
а следовательно, нет записи в txt. и вот уже его мне нужно показывать преподавателю

Я не сталкивался с такими проблемами, а самостоятельный поиск решения не принес результата
Миниатюры
Простая проблема новичка  
0
Модератор
10448 / 5739 / 3407
Регистрация: 17.08.2012
Сообщений: 17,459
08.12.2019, 22:43
Лучший ответ Сообщение было отмечено kadnedir как решение

Решение

Цитата Сообщение от kadnedir Посмотреть сообщение
Updated скриншот
Ошибок по-прежнему нет.

Я другое заметил. Похоже, что изучать паскаль Вы не желаете совершенно. Ну и ладно. Ваша программа, исправленная:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
program lab6;
 
const
  kol = 2; {количество студентов}
  kfio= 16;  {длина fio}
  k1 = 4;   {количество оценок за 1 семестр}
  k2 = 5;   {количество оценок за 2 семестр}
Type
  students =
    record
      fio: array[1..kfio] of char;
      day: 1..31;
      month: 1..12;
      year: integer;
      first: array [1..k1] of 2..5;  {оценки первого семестра}
      second: array [1..k2] of 2..5; {оценки второго семестра}
    end;
 
var
  s: students;
  every: array [1..kol] of students;
  a: array[1..kol] of real;
  i, j: integer;
  c: char;
  b: real;
  str: string;
  f, t: text;
begin
  assign(t,'input6.txt');
  rewrite(t);
 
  assign(f,'B.dat');
  reset(f);
 
  for i := 1 to 4 do      {На заголовок отведено 4 строки}
    begin
      readln(f, str);
      writeln(t, str)
    end;
 
  for i := 1  to kol do                {для каждого из 24 студентов}
    with every[i] do
      begin
        for j := 1 to kfio do            {ФИО}
          begin
            read(f, c);
            fio[j] := c
          end;
        read(f, day);                  {день}
        read(f, month);                {месяц}
        read(f, year);                 {год рождения}
        for j := 1 to k1 do             {Оценки 1-го семестра}
          read(f, first[j]);
        for j := 1 to k2 do             {Оценки 2-го семетра}
          read(f, second[j]);
        readln(f)
      end;
 
  for i := 1 to kol do              {нахождение среднего балла первого семестра}
    for j := 1 to k1 do
        a[i] := a[i] + every[i].first[j] / k1;
 
  for i := 1 to kol - 1 do            {сортировка по невозрастанию среднего балла}
    for j := i + 1 to kol do
      if a[i] < a[j] then
        begin
          b := a[i];
          a[i] := a[j];
          a[j] := b;
          s := every[i];
          every[i] := every[j];
          every[j] := s
        end;
 
  for i := 1 to kol do
    with every[i] do
      begin
        for j := 1 to kfio do write(t, fio[j]);
        write(t, ' ', day);
        Write(t, ' ', month);
        Write(t, ' ', year);
        for j := 1 to k1 do write(t, ' ', first[j]);
        for j:= 1 to k2 do write(t, ' ', second[j]);
        Writeln(t)
      end;
 
  close(f);
  close(t)
end.
Не знаю, правильно ли я понял, чего Вы хотите от Вашей программы.

Замечание: входной файл у Вас называется 'B.dat', а выходной 'input6.txt', что не очень-то и логично.

И ещё. что-то мне подсказывает, что по заданию файлы должны быть типизированными, а не текстовыми.
1
1 / 1 / 0
Регистрация: 24.11.2019
Сообщений: 23
08.12.2019, 23:57  [ТС]
Спасибо
Вот вывод в файл. Но у меня вопрос: как выровнять данные в колонки под названиями столбцов (день/месяц/год) ?
Я пробовал сделать массив для каждого значения и выводить так же, как ФИО, но это не работает

(Вложение удалено)
0
Модератор
10448 / 5739 / 3407
Регистрация: 17.08.2012
Сообщений: 17,459
09.12.2019, 05:59
Лучший ответ Сообщение было отмечено kadnedir как решение

Решение

Не по теме:

Фотографии текста запрещены. Фотку Вашего блокнота я удалил. В следующий раз копируйте текст в тему, а не фотки выкладывайте. Это невежливо, в конце концов, вынуждать людей перепечатывать текст с Вашей фотки.

Чтобы текст сохранял форматирование, заключайте его в теги какого-либо языка программирования, лучше всего в теги [CODE][/CODE] (кнопка "#" в шапке редактора сообщений), либо пристёгивайте к сообщению сам текстовый файл, если он слишком большой.

Нужно было как-нибудь так написать:
Code
1
2
3
4
5
6
-----------------------------------------------------------------
ф.и.о. студентов    дата    poж.    год     результаты сессий
                    число   месяц   рожд.    1-я         2-я
-----------------------------------------------------------------
first           10 3 1999 2 3 4 5 2 2 2 2 2
second          11 5 1998 4 3 4 5 2 2 2 2 2
Вам нужен форматированный вывод. Замените вывод в файл:
Pascal
75
76
77
78
79
80
81
82
83
84
85
86
87
  for i := 1 to kol do
    with every[i] do
      begin
        for j := 1 to kfio do write(t, fio[j]);
        write(t, day:8);
        Write(t, month:7);
        Write(t, year:9);
        write(t, '   '); //пробел между годом и оценками
        for j := 1 to k1 do write(t, first[j]:2);
        write(t, '   '); //пробел между группами оценок
        for j:= 1 to k2 do write(t, second[j]:2);
        Writeln(t)
      end;
Вроде бы, под шапку Вашей таблицы подходит... Не знаю, может быть, неверно перепечатал текст с Вашей фотки. Не понравится - поиграйтесь шириной полей вывода (числа после двоеточий) и количеством пробелов в строках 82 и 84.

Добавлено через 13 минут
Да, чуть не забыл... Сортировку Вашу я исправил. У Вас было чёрт те что: параметры циклов как в сортировке выбором, а обмен переменных как в сортировке пузырьком. В результате получился неверно работающий какой-то недопузырёк с недовыбором. Заменил это недоразумение на сортировку выбором.
1
1 / 1 / 0
Регистрация: 24.11.2019
Сообщений: 23
09.12.2019, 08:32  [ТС]
Меня интересует глупый вопрос: я заметил, что при сортировке сохраняется упорядочивание фамилий по алфавиту. В коде это не учтено. Как это работает?

Основная работы выполнена, благодарю
0
Модератор
10448 / 5739 / 3407
Регистрация: 17.08.2012
Сообщений: 17,459
09.12.2019, 10:53
Цитата Сообщение от kadnedir Посмотреть сообщение
при сортировке сохраняется упорядочивание фамилий по алфавиту
Нет, не сохраняется. С чего бы это? Сортируем-то по среднему баллу. Выходной файл покажите.
0
1 / 1 / 0
Регистрация: 24.11.2019
Сообщений: 23
09.12.2019, 16:31  [ТС]
Тогда это не стоит внимания. Спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2019, 16:31
Помогаю со студенческими работами здесь

Предельно простая проблема с vk api
Перечитал уже кучу форумов и половину документации, на удивление не смог найти ответ на свой вопрос. Каким образом получить/скачать...

Простая, но неразрешимая (?) проблема сишной отладки на мк
Допустим, я отлаживаю сишную программу на мк и, много раз нажав на разные кнопки на девайсе и на пк, попадаю-таки на сбойную функцию. ...

Простая авторизация на php и mysql, очень простая!
В базе данных таблица с двумя строками: id, user, password. На странице есть два поля для ввода (имени и пароля) и кнопка входа. По...

C++ для новичка-не новичка
Знал с++, забросил - теперь опять. Но есть проблема что я знал с++ для дос, а мне нужен си для линукс-виндовс - то что можно продать. Я...

от новичка
С ассемблером знаком на уровне , что я представляю, что это и простые коды могу прочитать. Сей час пишу/анализирую код написанный для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru