Найдите ошибку. Программа должна считать количество слов в тексте, при этом пробелы и другие знаки препинания могут идти неразрывно подряд.
var S,b,h: string;
k,z,v,x,i: integer;
a: array [1..7] of string;
begin
readln(S);
a[1]:=' ';
a[2]:=':';
a[3]:=';';
a[4]:='.';
a[5]:=',';
a[6]:='?';
a[7]:='!';
k:=1;
while x<>0 do
begin
for i:= 1 to 7 do
while z<>0 do
begin
z:=pos(a[i],S);
if z<>0 then
begin
delete(S,z,1);
h:=copy(S,z,1);
while h=a[i] do
delete(S,z,1);
k:=k+1;
end;
end;
x:=length(S);
end;
writeln(k);
end.
Другие языки программирования и технологии
Программа в паскале АБС
var i, k: integer;
st, s, gl: string;
begin
gl:='.,:;"!?';
write ('строка = ');
readln (st);
for i:=1 to length(st) do
if st[i] in gl then s:=s+' '
else s:=s+st[i];
s:=' '+s+' ';
for i:=1 to length (s)-1 do
if (s[i] = ' ') and (s[i+1] <> ' ') then inc(k);
writeln ('количество слов = ', k)
end.
st, s, gl: string;
begin
gl:='.,:;"!?';
write ('строка = ');
readln (st);
for i:=1 to length(st) do
if st[i] in gl then s:=s+' '
else s:=s+st[i];
s:=' '+s+' ';
for i:=1 to length (s)-1 do
if (s[i] = ' ') and (s[i+1] <> ' ') then inc(k);
writeln ('количество слов = ', k)
end.
Программа занята какой-то херней.
Она должна просканировать строку и на каждую встреченную не-букву после буквы увеличивать счетчик слов.
Примерно так:
readln(s);
s:=s+'.';
c:=0;
for i:=1 to Length(s)-1 do
if (UpCase(s[i]) in ['A'..'Z']) and not (UpCase(s[i+1]) in ['A'..'Z']) then
inc(c);
writeln(c);
А у тебя наворочено какой-то жуткой маеты, с удалениями, копированиями и массивами.
Она должна просканировать строку и на каждую встреченную не-букву после буквы увеличивать счетчик слов.
Примерно так:
readln(s);
s:=s+'.';
c:=0;
for i:=1 to Length(s)-1 do
if (UpCase(s[i]) in ['A'..'Z']) and not (UpCase(s[i+1]) in ['A'..'Z']) then
inc(c);
writeln(c);
А у тебя наворочено какой-то жуткой маеты, с удалениями, копированиями и массивами.
если программа не работает, то ее надо отладить
var S: string;
k,i,j: integer;
a: array [1..7] of char;
b,g: boolean;
begin
readln(S);
a[1]:=' ';
a[2]:=':';
a[3]:=';';
a[4]:='.';
a[5]:=',';
a[6]:='?';
a[7]:='!';
k:=0;
for i:=1 to length(s)-1 do
begin
b:=false;
g:=false;
for j:=1 to 7 do
begin
if (s[i]=a[j]) then
begin
b:=true;
break;
end;
end;
if (i=1) and (b=false) then k:=k+1;
if (b=true) then
begin
for j:=1 to 7 do
begin
if (s[i+1]=a[j]) then
begin
g:=true;
break;
end;
end;
if g=false then k:=k+1;
end;
end;
writeln(k);
end.
k,i,j: integer;
a: array [1..7] of char;
b,g: boolean;
begin
readln(S);
a[1]:=' ';
a[2]:=':';
a[3]:=';';
a[4]:='.';
a[5]:=',';
a[6]:='?';
a[7]:='!';
k:=0;
for i:=1 to length(s)-1 do
begin
b:=false;
g:=false;
for j:=1 to 7 do
begin
if (s[i]=a[j]) then
begin
b:=true;
break;
end;
end;
if (i=1) and (b=false) then k:=k+1;
if (b=true) then
begin
for j:=1 to 7 do
begin
if (s[i+1]=a[j]) then
begin
g:=true;
break;
end;
end;
if g=false then k:=k+1;
end;
end;
writeln(k);
end.
ну во первых delete immutable(т. е. не умеет мутировать - применять изменения к переменной которую ему сказали почистить) и возвращает результ так же как copy, во вторух вы пытаетесь сначала удалить все маркера окончания слов??! или мне кажется?
вот вам логика программы:
создаем массив разделителей слов (знаки препинания, пробел).
создаем ещё одну переменную типа bool и значением false
прочесываем строку for-ом как массив char-ов и делаем это:
-ищем текущий символ в массиве разделителей (IndexOf(Arr, String[i]) )
-если поиск вернул не -1
--смотрим в булеву переменную, если true - continue;
--увеличиваем счетчик слов и ставим булеву переменную в true
-если -1 то ставим булеву переменную в false
как-то так
вот вам логика программы:
создаем массив разделителей слов (знаки препинания, пробел).
создаем ещё одну переменную типа bool и значением false
прочесываем строку for-ом как массив char-ов и делаем это:
-ищем текущий символ в массиве разделителей (IndexOf(Arr, String[i]) )
-если поиск вернул не -1
--смотрим в булеву переменную, если true - continue;
--увеличиваем счетчик слов и ставим булеву переменную в true
-если -1 то ставим булеву переменную в false
как-то так
uses
System.Text.RegularExpressions;
var s : integer;
st: string;
begin
Readln(st);
s := Regex.Matches(st, '\w+').Count;
writeln(s);
end.
Скажешь учителю, что делал через регулярные выражения, он тебе сразу пять за год поставит.
System.Text.RegularExpressions;
var s : integer;
st: string;
begin
Readln(st);
s := Regex.Matches(st, '\w+').Count;
writeln(s);
end.
Скажешь учителю, что делал через регулярные выражения, он тебе сразу пять за год поставит.
Похожие вопросы
- Как написать программу в Паскаль АБС срочно
- Программа на паскале! Помогите(бесплатно)
- Паскаль АБС - это тот же паскаль?
- Нужно написать программы в Паскале! Массивы! Срочно! Помогите!
- Нужно написать программу на паскале
- Написать программу в Паскале для построения графика функций. К программе желательно составить алгоритм.
- Программа в Паскале
- Помогите составить программу на паскале!
- Время работы программы в Паскаль
- Объясните как работает программа в паскаль!!!