


Pascal ABC. Помогите исправить ошибку в программе.
var
s:string;
c,k:integer;
b:byte;
a:char;
begin
write('Type stroke: '); readln(s);
write('Type symbol: '); readln(a);
c:=length(s);
k:=0;
for b:=1 to c do begin
if s[b]=('a') then
k:=k+1;
end;
for b:=1 to c do begin
if s[b]=('a') then
delete(s,b,1); end;
writeln('symbol ', a, ' is written ', k, ' times.');
write(s);
end.
Строка с ошибкой: if s[b]=('a') then
delete(s,b,1); end;
Индекс выходит за границы массива. Заранее спасибо.
На данный момент 2 ошибки явных
s[b]='a' --> s[b]=a
Вы скорее всего хотите найти в строке не количество символов 'a', а символов, введенных с клавиатуры.
Но проблема с выходом за границы массива не в этом, delete(s,b,1) уменьшает количество символов в строке и рано или поздно вы обязательно выйдете за её пределы.
С этим бороться просто - удалять символы с конца строки к первому символу. В цикле for b = c downto 1.
ЗЫ. Достаточно одного этого цикла, так как k:=k+1 можно считать прямо в нём!
Во-первых, если я правильно понял, то а там должно быть без скобок и кавычек.
А во-вторых, смотри какая шняга получается.
Пусть ввели ааа и надо посчитать а.
Ты запустил цикл от 1 до 3
И после первого прогона цикла у тебя уже осталось аа
И 3-его элемента уже нет.
Вывод - цикл со счетчиком тут не нужен. Впрочем, цикл тут не нужен вообще, но это уже другой подход, вряд ли твоей училке понравится.
Читайте про функцию length, сколько она возвращает. Скорее всего ошибка буквальная - у вас на опеределенной итерации выходит за пределы массива. Возможно, на последней.
Еще можно протрассировать и посмотреть, что в s лежит.
Ну и бонусом можно 2 цикла свести в 1, но это уже нюансы)
var s:string; i,n:integer; c:char;
begin
write('String: '); readln(s); write('Symbol: '); readln(c);
n:=0; for i:=1 to length(s) do n:=n+ord(s[i]=c);
writeln('Symbol ',c,' is written ',n,' times.');
end.
без циклов тут нужно, без циклов