Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Как подсчитать количество слов в строке?

Автор: Shmaniche 9.06.2010 11:46

Есть следующая наработка:

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 слова, хотя его нет после второго проблела.
Как сделать так, чтобы программа считала верно в таком случае?

Автор: Ozzя 9.06.2010 12:09

http://forum.pascal.net.ru/index.php?showtopic=6972

Автор: J.Bond_33 9.06.2010 12:09

как вариант сначала удалять все пробелы до слов, и после, а так же между словами если их более 2

Автор: 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

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


Автор: Lapp 9.06.2010 12:34

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

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

(пробелы заменены на _ )

Автор: J.Bond_33 9.06.2010 12:40

попробуй так

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 9.06.2010 12:57

нет, J.Bond_33, и так не пойдет тоже... ))

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

подсказка (Показать/Скрыть)

Автор: J.Bond_33 9.06.2010 13:05

про это не подумал...

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 9.06.2010 13:13

J.Bond_33
Эту программу можно в 2 раза короче сделать. Не надо добавлять куски кода, "чтоб работало". Надо сначала сесть и придумать алгоритм. Потом - продумать программу. И только потом включить компьютер и начать эту программу набирать.

Автор: Shmaniche 9.06.2010 16:12

Цитата(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 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);


Автор: Shmaniche 10.06.2010 10:36

Цитата(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 10.06.2010 11:08

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

Нет, так не пойдет. Давай уж весь код целиком.. Copy - Paste, please

Автор: Сергей Меркурьев 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.

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

Автор: Lapp 10.06.2010 11:12

Цитата(Shmaniche @ 10.06.2010 7:36) *

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

Хотя, погоди... какой у тебя компилятор? Turbo? Если да, то он может хотеть лишних скобочек.. Сейчас не могу проверить, попозже.

Автор: Lapp 10.06.2010 12:57

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

Автор: Shmaniche 10.06.2010 13:20

Цитата(Сергей Меркурьев @ 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 10.06.2010 13:52

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