Другие языки программирования и технологии

Программа в паскале АБС

Найдите ошибку. Программа должна считать количество слов в тексте, при этом пробелы и другие знаки препинания могут идти неразрывно подряд.

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.
АВ
Антон Востров
20 124
Лучший ответ
Программа занята какой-то херней.
Она должна просканировать строку и на каждую встреченную не-букву после буквы увеличивать счетчик слов.
Примерно так:

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);

А у тебя наворочено какой-то жуткой маеты, с удалениями, копированиями и массивами.
Руслан Шумских
Руслан Шумских
95 568
если программа не работает, то ее надо отладить
ЕЖ
Евгений Женя
42 614
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.
Виктор Грядиль
Виктор Грядиль
41 962
ну во первых delete immutable(т. е. не умеет мутировать - применять изменения к переменной которую ему сказали почистить) и возвращает результ так же как copy, во вторух вы пытаетесь сначала удалить все маркера окончания слов??! или мне кажется?

вот вам логика программы:
создаем массив разделителей слов (знаки препинания, пробел).
создаем ещё одну переменную типа 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.

Скажешь учителю, что делал через регулярные выражения, он тебе сразу пять за год поставит.