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;
Индекс выходит за границы массива. Заранее спасибо.
Другие языки программирования и технологии
Pascal ABC. Помогите исправить ошибку в программе.
На данный момент 2 ошибки явных
s[b]='a' --> s[b]=a
Вы скорее всего хотите найти в строке не количество символов 'a', а символов, введенных с клавиатуры.
Но проблема с выходом за границы массива не в этом, delete(s,b,1) уменьшает количество символов в строке и рано или поздно вы обязательно выйдете за её пределы.
С этим бороться просто - удалять символы с конца строки к первому символу. В цикле for b = c downto 1.
ЗЫ. Достаточно одного этого цикла, так как k:=k+1 можно считать прямо в нём!
s[b]='a' --> s[b]=a
Вы скорее всего хотите найти в строке не количество символов 'a', а символов, введенных с клавиатуры.
Но проблема с выходом за границы массива не в этом, delete(s,b,1) уменьшает количество символов в строке и рано или поздно вы обязательно выйдете за её пределы.
С этим бороться просто - удалять символы с конца строки к первому символу. В цикле for b = c downto 1.
ЗЫ. Достаточно одного этого цикла, так как k:=k+1 можно считать прямо в нём!
Во-первых, если я правильно понял, то а там должно быть без скобок и кавычек.
А во-вторых, смотри какая шняга получается.
Пусть ввели ааа и надо посчитать а.
Ты запустил цикл от 1 до 3
И после первого прогона цикла у тебя уже осталось аа
И 3-его элемента уже нет.
Вывод - цикл со счетчиком тут не нужен. Впрочем, цикл тут не нужен вообще, но это уже другой подход, вряд ли твоей училке понравится.
А во-вторых, смотри какая шняга получается.
Пусть ввели ааа и надо посчитать а.
Ты запустил цикл от 1 до 3
И после первого прогона цикла у тебя уже осталось аа
И 3-его элемента уже нет.
Вывод - цикл со счетчиком тут не нужен. Впрочем, цикл тут не нужен вообще, но это уже другой подход, вряд ли твоей училке понравится.
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.
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.
без циклов тут нужно, без циклов
Читайте про функцию length, сколько она возвращает. Скорее всего ошибка буквальная - у вас на опеределенной итерации выходит за пределы массива. Возможно, на последней.
Еще можно протрассировать и посмотреть, что в s лежит.
Ну и бонусом можно 2 цикла свести в 1, но это уже нюансы)
Еще можно протрассировать и посмотреть, что в s лежит.
Ну и бонусом можно 2 цикла свести в 1, но это уже нюансы)
Похожие вопросы
- помогите исправить ошибку в программе в Pascal
- Помогите исправить ошибку в программе (c++).
- Помогите исправить ошибку в программе на Си
- Пожалуйста, помогите исправить ошибки в программах на С++!
- Пожайлуста, помогите исправить ошибки в программе на С++!!
- Помогите исправить ошибку в коде программы, пожалуйста!
- Помогите исправить ошибку в коде программы на паскале.
- помогите найти ошибка в программе на PASCAL тема: "файлы".
- Помогите исправить ошибки в коде на Pascal, чтобы он выводил верные ответы. Или можете сами пожалуйста написать пжпжпж!
- Ребят, кто знает Pascal ABC, помогите.
for b:=1 to c do begin
if s[b]=('a') then
delete(s,b,1); end;
может в операции delete ошибка?