Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 02.06.2020, 09:19   #1
acecandra
 
Регистрация: 30.04.2020
Сообщений: 4
По умолчанию Необходимо найти ошибку в коде

Добрый день.
Такая проблема в коде: когда выбираешь вариант "посмотреть список студентов", выдает оценки по математике и литературе, а не список студентов.
Вот задание: Разработать программу создания и корректировки файла, содержащего
сведения об абитуриентах, сдавших вступительные экзамены в институт. Каждый элемент этого файла должен содержать следующие данные: фамилию и инициалы абитуриента, специальность, на которую он поступает, полученные
оценки по физике, математике и литературе. Предусмотреть создание текстового файла, содержащего информацию об абитуриентах, поступающих на указанную специальность.
Код:
program STUDENT;
uses
CRT;
label
menu;
var
t:text;
a:string;
b : array [1..200] of string;
z,i,j:integer;
procedure AddSt;
begin
ClrScr;
assign(t,'st.txt');
reset(t);
i:=1;
while not Eof(t) do
begin
Readln(t,b[i]);
j:=i;
i:=i+1;
end;
close(t);
rewrite(t);
writeln(t,' ');
writeln('vvedite familiu i inicialy');
readln(a);
writeln(t,'FIO : ',a);
writeln('vvedite specialnost');
readln(a);
writeln(t,'Specialnost : ',a);
writeln('vvedite ocenku po fizike');
readln(a);
writeln(t,'Fizika : ',a);
writeln('vvedite ocenku po matematike');
readln(a);
writeln(t,'Matematika : ',a);
writeln('vvedite ocenku po literature');
readln(a);
writeln(t,'literatura : ',a);
writeln(t,' ');
for i:=1 to j do
begin
writeln(t, b[i]);
end;
close(t);
writeln('Student v spiske! nazhmite enter');
readln;
end;
procedure ListSt;
begin
ClrScr;
assign(t,'st.txt');
reset(t);
while not Eof(t) do
begin
readln(t,a);
writeln(a);
end;
close(t);
writeln(' ');
writeln('Nazhmite enter');
readln;
end;
procedure ClrSt;
begin
ClrScr;
assign(t,'st.txt');
rewrite(t);
close(t);
writeln('Spisok pust, nazhmite enter');
readln;
end;
procedure re;
begin
ClrScr;
writeln('chto vy hotite sdelat?');
writeln('1 - dobavit studenta v spisok');
writeln('2 - prosmotret spisok studentov');
writeln('3 - ochistit spisok');
writeln('0 - vyhod iz programmy');
readln(z);
if z=1 then
begin
AddSt;
end
else
begin
if z=2 then
begin
ListSt;
end
else
begin
if z=3 then
begin
ClrSt;
end
else
begin
if z=0 then
begin
halt(0);
end;
end;
end;
end;
end;
begin
assign(t,'st.txt');
rewrite(t);
close(t);
menu:
re;
goto menu;
end.

Последний раз редактировалось acecandra; 02.06.2020 в 09:40.
acecandra вне форума Ответить с цитированием
Старый 02.06.2020, 11:58   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 2,609
По умолчанию

Уже пальцы заболели писать новичкам об: хочешь получить ответ - выложи нормальный форматированный исходник с тегами CODE, с отступами. Потому что читать такую вот портянку - зубы сводит.
Может, найдутся мазохисты, продерутся сквозь получитаемый текст и ответят.
Как по мне, так я бы создал массив records с заданными полями и соответственно типизированный файл. Ну а выборка из массива абтуров по заданной специальности в текстовый файл - это отдельная часть задачи.

Последний раз редактировалось digitalis; 02.06.2020 в 12:04.
digitalis вне форума Ответить с цитированием
Старый 03.06.2020, 16:51   #3
ViktorR
Участник клуба
 
Регистрация: 23.10.2010
Сообщений: 1,620
По умолчанию

Смотрим формат вашего файла
Код:
FIO :  <фамилия И. О.>
Specialnost : <Специальность>
Fizika :  <оценка по физике>
Matematika : <оценка по математике>
literatura : <оценка по литературе>
Смотрим как читается файл (procedure ListSt
Код:
assign(t,'st.txt');
reset(t);
while not Eof(t) do
begin
readln(t,a);
writeln(a);
end;
Т.е. читаются и выводятся все строки подряд.
Вы написали:
Цитата:
Такая проблема в коде: когда выбираешь вариант "посмотреть список студентов", выдает оценки по математике и литературе, а не список студентов.
Но, как показано выше, это не так. Выводится вся информация, записанная в файле.
Если нужно выводить только список студентов или некоторую другую информацию, например только оценки по физике, то при чтении строки следует проанализировать её первую часть.
Для этого в процедуру следует передать фразу, по которой надо искать, например, 'FIO'.
Тогда процедура должна иметь другой вид:
Код:
procedure ListSt(s: string);
begin
ClrScr;
assign(t,'st.txt');
reset(t);
while not Eof(t) do
begin
readln(t,a);
npos := pos(s, a); {поиск подстроки s в строке a}
if npos = 0 then continue; {Продолжим поиск}
if npos = 1 then writeln(a); {Вывод без обработки, но можно удалить фразу FIO :}
...
end;
Код:
Delete(a, 1, lehgth(s)); {Удалит с позиции 1 число символов, которое передано в s}
s - это подстрока, которая передаётся в процедуру для поиска нужной строки. При этом анализируется только первая часть строк.
Если, например, FIO будет записан не с первой позиции, то такая строка будет пропущена.

Ну и, пожалуйста, забудьте про goto.
Тут это вообще ни к чему.
Вместо
Код:
menu:
re;
goto menu;
Вполне подойдёт:
Код:
while True do
   re;
И короче, и внятнее.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти у себя ошибку в коде. Буду благодарен, если вы сможете её найти Agent00x Windows Forms 4 25.11.2018 01:17
Помогите, пожалуйста, найти ошибку в коде (найти сумму факториалов чётных чисел в заданном диапазоне) kris14 Паскаль, Turbo Pascal, PascalABC.NET 8 25.10.2017 15:42
Найти ошибку в коде (Для данной целочисленной матрицы размером n*m найти матрицу из 0 и 1...) код на C camel5 Помощь студентам 1 26.11.2013 05:11
Необходимо найти ошибку в коде VB6 marcaa Помощь студентам 1 24.05.2012 17:03
Турбо паскаль:программа находящая сумму ряда(необходимо найти ошибку в коде) Galchonok Помощь студентам 5 12.06.2010 14:10


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840