Вопрос, поднятый пользователем, связан с обработкой текстового файла в среде PascalABC. Задача заключается в подсчете количества восклицательных знаков в строках с четными номерами и выводе строк, содержащих более двух восклицательных знаков. В процессе решения возникла ошибка, связанная с несоответствием типов данных.
Описание проблемы
Пользователь столкнулся с проблемой, когда пытался прочитать файл и выполнить указанные операции. При выполнении программы в среде PascalABC была выявлена ошибка в строке с номером 3, связанная с ожидаемым типом данных.
Пример кода с ошибкой
program text;
var
T: Text; // Ошибка может быть связана с использованием типа Text
fName: string;
str: string;
i: integer;
numStr: integer; {Number of current string in file}
amtSymb: integer; {count !}
begin
clrscr;
write('enter input file name: ');
readln(fName);
assign(T, fName);
reset(T); {open file for reading}
numStr := 0; // Инкремент numStr происходит до проверки четности строки
while not EoF(T) do begin
readln(T, str);
inc(numStr);
if ((numStr mod 2) = 0) then begin
amtSymb := 0;
for i := 1 to length(str) do begin
if (str[i] = '!') then
inc(amtSymb);
end;
if (amtSymb > 2) then
writeln(str);
end;
end;
close(T);
writeln('press any key to exit...');
readKey;
end.
Подтвержденный ответ
Проблема, скорее всего, связана с конфликтом имен между именем программы text и типом файла Text. Рекомендуется переименовать программу, чтобы избежать этого конфликта. Кроме того, инкремент переменной numStr происходит до проверки четности строки, что неверно с логической точки зрения. Проверку на четность следует выполнять до инкремента.
Альтернативный ответ
Альтернативный ответ не был предоставлен пользователем, но на основе анализа кода можно предложить следующие улучшения:
Исправить конфликт имен, переименовав программу.
Переместить инкремент переменной numStr после проверки четности строки.
Убедиться, что все используемые идентификаторы (переменные, типы и т.д.) не конфликтуют с встроенными идентификаторами PascalABC.
Исправленный код
program TextProcessor;
var
file: Text; // Используем другое имя для переменной типа Text
fName: string;
line: string;
index: integer;
lineNumber: integer; {Номер текущей строки в файле}
exclamationMarks: integer; {Счетчик !}
begin
clrscr;
write('Введите имя входного файла: ');
readln(fName);
assign(file, fName);
reset(file); {Открываем файл для чтения}
lineNumber := 1; // Начинаем с первой строки
while not EoF(file) do begin
readln(file, line);
if ((lineNumber mod 2) = 0) then begin // Проверяем четность строки
exclamationMarks := 0;
for index := 1 to length(line) do begin
if (line[index] = '!') then
inc(exclamationMarks);
end;
if (exclamationMarks > 2) then // Выводим строку если больше двух !
writeln(lineNumber, ': ', line);
end;
inc(lineNumber); // Инкремент номера строки после чтения
end;
close(file);
writeln('Нажмите любую клавишу для выхода...');
readKey;
end.
Этот код исправляет проблему пользователя и демонстрирует, как правильно читать файл и выполнять необходимые операции с учетом четности строк.
Задача состоит в написании программы на языке PascalABC для обработки текста из файла, где необходимо подсчитать количество восклицательных знаков в четных строках и вывести строки, содержащие более двух таких знаков, а также исправление возникшей ошибки
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.