Помощь - Поиск - Пользователи - Календарь
Полная версия: Как подсчитать количество слов в строке?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Shmanich
Есть следующая наработка:

Program;
uses crt;
var s: string; i, n, l: integer;
begin
clrscr;
write('Enter string:'); readln(s);
l:=length(s);
if l=0 then n:=0 else n:=1;
for i:=1 to l do
if (s[i]=' ') then n:=n+1;
writeln('Words in string =', n);
Readkey;
end.



Все врое бы ОК. Пробел - разделитель (что по условию задачи верно). Пишет "0 слов", если ничего не введешь или "1 слово", если введешь одно. Но если введешь "слово" [пробел] "слово" [пробел] " ", то программа скажет, что введено 3 слова, хотя его нет после второго проблела.
Как сделать так, чтобы программа считала верно в таком случае?
J.Bond_33
как вариант сначала удалять все пробелы до слов, и после, а так же между словами если их более 2
prevedmuraved

Program;
uses crt;
var s: string; i, n, l: integer;
begin
clrscr;
write('Enter string:'); readln(s);
l:=length(s);
if l=0 then n:=0 else n:=1;
for i:=1 to l do
if (s[i]=' ')and(i<l) then n:=n+1;
writeln('Words in string =', n);
Readkey;
end.



попробуй так... cool.gif

М
ну я уже устал ставить тэги, неужели так трудно сделать правильно??
Lapp

Lapp
Цитата(prevedmuraved @ 9.06.2010 9:16) *
попробуй так... cool.gif

а если строка такая: "слово_слово____", - тогда что? smile.gif

(пробелы заменены на _ )
J.Bond_33
попробуй так
Program;
uses crt;
var s: string; i, n, l: integer;
begin
clrscr;
write('Enter string:'); readln(s);
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
for i:=1 to length(s) do
if s[I]=' ' then
while s[I+1]=' ' do delete(s,I+1,1);
l:=length(s);
if l=0 then n:=0 else n:=1;
for i:=1 to l do
if (s[i]=' ') then n:=n+1;
writeln('Words in string =', n);
Readkey;
end.
Lapp
нет, J.Bond_33, и так не пойдет тоже... ))

Посмотри на свой код внимательно, постарайся найти ошибку. Если не найдешь - подсказка под спойлером..

подсказка (Показать/Скрыть)
J.Bond_33
про это не подумал...
Program;
uses crt;
var s: string; i, n, l, a: integer;
begin
clrscr;
write('Enter string:'); readln(s);
a:=1;
while s[a]=' ' do inc(a);
if a=length(s)+1 then n:=0
else begin
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
for i:=1 to length(s) do
if s[I]=' ' then
while s[I+1]=' ' do delete(s,I+1,1);
l:=length(s);
if l=0 then n:=0 else n:=1;
for i:=1 to l do
if (s[i]=' ') then n:=n+1;
end;
writeln('Words in string =', n);
Readkey;
end.

вот так вроде будет работать в любом случае
volvo
J.Bond_33
Эту программу можно в 2 раза короче сделать. Не надо добавлять куски кода, "чтоб работало". Надо сначала сесть и придумать алгоритм. Потом - продумать программу. И только потом включить компьютер и начать эту программу набирать.
Shmanich
Цитата(prevedmuraved @ 9.06.2010 12:16) *


Program;
uses crt;
var s: string; i, n, l: integer;
begin
clrscr;
write('Enter string:'); readln(s);
l:=length(s);
if l=0 then n:=0 else n:=1;
for i:=1 to l do
if (s[i]=' ')and(i<l) then n:=n+1;
writeln('Words in string =', n);
Readkey;
end.



попробуй так... cool.gif



Тогда при вводе "word_word_[нет слова]" (где _ - пробел), программа говорит, что введено 1 слово.
Lapp
Вот вся твоя задача.. Две строчки:
  n:=0;
for i:=1 to Length(s) do if (s[i]<>' ')and((i=Length(s))or(s[i+1]=' ')) then Inc(n);

Shmanich
Цитата(Lapp @ 9.06.2010 18:36) *

Вот вся твоя задача.. Две строчки:
  n:=0;
for i:=1 to Length(s) do if (s[i]<>' ')and((i=Length(s))or(s[i+1]=' ')) then Inc(n);



Error: type mismatch.
При этом:
s: string; i, n: integer;
Lapp
Цитата(Shmaniche @ 10.06.2010 7:36) *
Error: type mismatch.
При этом:
s: string; i, n: integer;

Нет, так не пойдет. Давай уж весь код целиком.. Copy - Paste, please
Cheburashka
var n, i : integer;
s : string;
begin
Writeln ('Vvedite tekst:');
Readln (s);
n := 0;
for i := 1 to Length(s) do
if (s[i] <> ' ') and ((i = Length(s)) or (s[i + 1] = ' ')) then Inc(n);
Writeln ('Kol-vo slov v tekste -> ',n);
end.

Всё должно работать правильно, и без ошибок. Перепроверь программу свою.
Lapp
Цитата(Shmaniche @ 10.06.2010 7:36) *

Error: type mismatch.
При этом:
s: string; i, n: integer;

Хотя, погоди... какой у тебя компилятор? Turbo? Если да, то он может хотеть лишних скобочек.. Сейчас не могу проверить, попозже.
Lapp
Цитата(Lapp @ 10.06.2010 8:12) *
Сейчас не могу проверить, попозже.
Проверил.
Нет, зря я на Turbo клепал - все нормально работает!
Давай, дорогой Shmaniche, приводи весь код. Будем посмотреть (С), где ты там напортачил.. smile.gif
Shmanich
Цитата(Сергей Меркурьев @ 10.06.2010 11:08) *

var n, i : integer;
s : string;
begin
Writeln ('Vvedite tekst:');
Readln (s);
n := 0;
for i := 1 to Length(s) do
if (s[i] <> ' ') and ((i = Length(s)) or (s[i + 1] = ' ')) then Inc(n);
Writeln ('Kol-vo slov v tekste -> ',n);
end.

Всё должно работать правильно, и без ошибок. Перепроверь программу свою.


Все ок. Turbo перегрузил, перестал ругаться smile.gif
Lapp
Цитата(Shmaniche @ 10.06.2010 9:20) *
Все ок. Turbo перегрузил, перестал ругаться smile.gif
Ой, темните, парниша!..
Никогда в жизни такого не было, чтоб Турбо так сбоил, и ему требовалась перезагрузка.. no1.gif
Ладно, остается на твоей совести. Надеюсь, тебя это хоть чему-то научило smile.gif.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.