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

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

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

Автор: VIK@ 25.12.2005 0:23

Посмотрите, пожалуйста, какие ошибки, а то чего-то не получается sad.gif
Определить каков процент слов в тексте начинается на
букву К. Слова разделены пробелами.

var
a,k: string [100];

i,b,m,c: integer;
x: real;
begin
writeln ('Введите текст:');
readln (S);
cut:=0
S:=' ' + S;
b:=length (S);
for i:=1 to b do
begin
k:= ' ' + 'k';
if copy (a,i,2)=k then m:=m+1;
end;
writeln ('количество k=',m)
writeln('x=', X:4:3);
end.

Заранее ОГРОМНОЕ спасибо

Автор: КМА 25.12.2005 2:15

var
a: string [100];

i,m: integer;
x: real;
begin
writeln ('Введите текст:');
readln (S);
S:=' ' + S;
for i:=1 to length (s) do
if (s[i]=' ' and s[i]=k)
then m:=m+1;
writeln ('количество k=',m);
x:=(m/length (s))*100;
writeln('%=', X:4:1);
end.

Вот , вроде должна пойти.

Автор: volvo 25.12.2005 2:19

А почему делим на длину строки, а не на общее число слов в строке? Что, если у меня будет строка:

Код
"kuku                "
(16 пробелов), то процент будет равен 5%? Вообще-то тут 100% должно получиться...

Автор: Гость 25.12.2005 2:25

Мда, ты прав, тогда может завести еще одну переменную, которая будет сообщать о количестве слов???
Например
if s[i]=' ' and s[i+1]<>' '
then inc (summWord);

Автор: Shura 25.12.2005 2:34

Да и вообще, выложенная программа не скомпилируется))
А цикл надо начинать с двойки, а не с единицы, т.к. первый символ строки мы сделали пробелом.
Вот код:

Код

Var
s: String;
i,w,k: Byte;

Begin
WriteLn('Enter string: ');
ReadLn(s);

k:=0;
w:=0;
s:=' '+s;

for i:=2 to length(s)
do if (s[i-1] = ' ')and(s[i] <> ' ')
    then begin
      Inc(w);
       if s[i] = 'k'
       then Inc(k)
     end;

Write((k*100/w):0:1, ' percents.');
ReadLn
End.

Автор: VIK@ 25.12.2005 13:44

СПАСИБО ОГРОМНОЕ!!!!!!!!! Если не трудно, подскажите, пожалуйста, как быть со второй задачей..
Нужно определить сколько слов в тексте содержат один слог, два слога, три слога и т.д.

Автор: VIK@ 25.12.2005 18:40

Ну помогите, пожалуйста, завтра зачет, а у меня вообще никаких идей как решается задача.. sad.gif((

Автор: VIK@ 25.12.2005 21:00

На вас последняя надежда... откликнитесь, pls!!!!

Автор: klem4 25.12.2005 21:41

Тут смотря что понимается под слогом .. какие-то конкретные буквосочетания ? Сочетания одной гласной и одной согласной ? Ты бы информации дала побольше

Автор: Shura 25.12.2005 22:09

Да, это конечно непонятно, что собственно считается слогом. В русском языке в слове столько слогов, сколько гласных. Но что получается - слово без гласных содержит 0 слогов?)))) Вобщем вот код по такому правилу. Думаю несложно будет если что изменить. Слова без гласных я сделал, как один слог.

Код

Var
a: Array [0..130] of Byte; {i-й элемент массива содержит кол-во слов, которые состоят из i слогов.}
s,w: String; {s - вся строка, w - очередное слово}
i,n: Byte;
f: Boolean; {прибавлять ли к w очередную букву}

Function Slogs(s: String): Byte; {Возвращает кол-во слогов}
var
  i,p: Byte;
begin
  p:=0;
  for i:=1 to length(s)
  do if s[i] in ['e','y','u','i','o','a']
     then Inc(p);
   if p = 0
   then p:=1;  
  Slogs:=p
end; {Slogs}

Begin
Write('Enter string: ');
ReadLn(s);
s:=' ' + s;

w:='';
f:=false;
for i:=2 to length(s)
do begin
     if (s[i] <> ' ')and(s[i-1] = ' ')
     then f:=true;
     if ((s[i] = ' ')or(i = length(s)))and(f)
     then begin
       f:=false;
       Inc(a[slogs(w)]);
       w:=''
      end;
      if f
      then w:=w+s[i]
    end;

for i:=0 to 130
do if a[i] <> 0
    then WriteLn('Slov, soderzhaschih ', i, ' slogov: ', a[i], '.');

ReadLn
End.

Автор: VIK@ 25.12.2005 22:17

спасибо.. а разве есть в русском языке слова без гласных?

Автор: Shura 25.12.2005 22:20

Та в русском языке полно таких слов!!! smile.gif)) Тебе для русского надо? Ну тогда все в порядке - просто поменяй в функции множество латинских на множество русских гласных, и готово. А в английском языке по-другому слога считаются... Ну, я думаю преподу сдать - это подойдет.

Автор: VIK@ 25.12.2005 22:23

Заинтересовал... какие например?

Автор: volvo 25.12.2005 22:24

Цитата
Ну тогда все в порядке

Еще пример привести? wink.gif

Автор: Гость 25.12.2005 22:32

Все, разобралась... Спасибо!!!

Автор: VIK@ 25.12.2005 23:03

Небольшой вопросик ? А почему массив от 0 до 130?? И что мне нужно изменить, чтобы слова без гласных не считались как один слог???

Автор: VIK@ 25.12.2005 23:06

Begin
Write('Enter string: ');
ReadLn(s);
s:=' ' + s;

w:='';
f:=false;
for i:=2 to length(s)
do begin
if (s[i] <> ' ')and(s[i-1] = ' ')
then f:=true;
if ((s[i] = ' ')or(i = length(s)))and(f)
then begin
f:=false;
Inc(a[slogs(w)]);
w:=''
end;
if f
что писать тут? что-то пропущено..

then w:=w+s[i]
end;

for i:=0 to 130
do if a[i] <> 0
then WriteLn('Slov, soderzhaschih ', i, ' slogov: ', a[i], '.');

ReadLn
End.

Автор: volvo 25.12.2005 23:34

Цитата
что-то пропущено..
blink.gif Ничего тут не пропущено... F это Boolean, все в порядке... Ты бы запустила программу сначала, потом - критикуй...

Цитата
чтобы слова без гласных не считались как один слог

Function Slogs(s: String): Byte; {Возвращает кол-во слогов}
var i, p: Byte;
begin
p:=0;
for i:=1 to length(s)
do if s[i] in ['e','y','u','i','o','a']
then Inc(p);
{ if p = 0 then p:=1; } { <--- Убрать это !!! }
Slogs:=p
end; {Slogs}

Автор: VIK@ 25.12.2005 23:39

Пробовала - не работает.. sad.gif((((

Автор: VIK@ 25.12.2005 23:41

А почему массив от 0 до 130??

Автор: VIK@ 25.12.2005 23:57

Ничего она не делает... вводишь строку - и ничего... sad.gif((

Автор: Shura 26.12.2005 0:07

Эт я немного спутал... Я писал, думая, что слог - это минимум согласная+гласная, и следовательно слогов в слове может быть до 127, т.к. длина строки до 255, ну и округлил до 130. smile.gif А так как мы договорились, что слогом может быть даже одна буква, то массив следует сделать аж до 255. Поменяй 130 на 255 в описании массива, и в конце программы - в цикле. А чтобы 0 слогов было в слове без гласных, убери строку "if p = 0 then p:=1;". У меня все работает! Может ты там уже намудрила что-нибудь?.. smile.gif Скопируй заново из этого топика, и сделай вышеописанные изменения.

Автор: VIK@ 26.12.2005 2:30

может, конечно, прога что-то и делает.. но результат не выводит... сделала пошагово, заедает на

for i:=0 to 130

do if a[i] <> 0

then WriteLn('Slov, soderzhaschih ', i, ' slogov: ', a[i], '.');

Автор: volvo 26.12.2005 2:41

Значит, что-то меняла в самой программе... Вот что делает программа у меня:

Enter string: привет стоп вперед назад
Slov, soderzhaschih 1 slogov: 1.
Slov, soderzhaschih 2 slogov: 3.


Присоединяй свой PAS-файл (не копируй сюда программу, а именно присоедини файл), будем разбираться...

Автор: VIK@ 26.12.2005 3:19

выдает ошибку: Общее дисковое пространство требует для всех загружаемых файлов больше, чем на каждое сообщение или глобальный лимит. Пожалуйста, уменьшите число или размер загружаемых файлов.
хотя размер файла всего 8 байт

Автор: Гость 2.12.2006 20:49

все работает! огромное спасибо, Shura. щас кое что исправлю и можно будет отдавать преподу))