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

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

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

Автор: Rom1k 6.05.2007 5:00

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

Вот есть подобная задача.только с повторением слов.Что там надо исправить,чтобы всё работало?

помогите.Со строками у меня проблемы(

program k_3;
var
a:array [1..20] of string;{массив слов}
b:array [1..20] of byte;{Массив счетчиков появления слов}
r,i,j,k:byte;
st,st1:string;
Begin
WriteLn('Введите строку слов');
ReadLn(st);
k:=0;{индекс для перемещения по массиву слов и массиву счётчиков}
r:=1;
while r<= length(st) do
begin
while(st[r]='') and (i<=length(st)) do
r:=r+1;
j:=r; {Левая граница слова}
while (st[r]<>'') and (r<=length(st)) do
r:=r+1; {Правая граница слова}
st1:=copy(st,j,r-j);

{Поиск слова в массиве слов - а}
i:=1;
while (i<=20) and (a[i]<>st1) do
i:=i+1;

{Анализируем значение индекса i}
if i>20 then
begin
k:=k+1;
b[k]:=b[k]+1;
a[k]:=st1;
end
else
b[i]:=b[i]+1;
end;
WriteLn('В массиве (а) ',k,' различных слов ');
writeln('Частота появления каждого слова ');
for i:=1 to k do
writeln(a[i],' ',b[i]);
END.


Автор: мисс_граффити 6.05.2007 6:02

С буквами намного проще smile.gif
По условию можно пользоваться множествами?
К=к? или это разные буквы?

Автор: Rom1k 6.05.2007 17:03

нет там берется строка слов.
проверяются слова,буквы заносяся в массив слов,если буква присутствует,то её больше не надо заносить в массив.К=к одинаковые буквы.кароче надо только подсчитать кол-во различных букв,которые входят в предложение.А предложение заканчивается точкой.т. наверное надо делать до точки!

Автор: Rom1k 6.05.2007 18:20

ээээм....Никто не знает?!?!?!

Автор: Malice 6.05.2007 18:35

Цитата(Rom1k @ 6.05.2007 15:20) *

ээээм....Никто не знает?!?!?!

Чтобы исправить твою программу достаточно убрать while, который ищет правую границу слова, т.е.
   j:=r; {Левая граница слова}
while (st[r]<>'') and (r<=length(st)) do
r:=r+1; {Правая граница слова}
st1:=copy(st,j,r-j);

заменить на:
   j:=r; {Левая граница слова}
r:=r+1; {Правая граница слова}
st1:=copy(st,j,r-j);

Останется убрать разницу между большими и мал. буквами и не учитывать пробелы и знаки препинания. Но, конечно, лучше сделать заново с помощью множества..

Автор: Rom1k 6.05.2007 18:40

А можешь помочь сделать с помощью множества или хотя-бы объяснить,как это делается?

Автор: Malice 6.05.2007 18:55

Цитата(Rom1k @ 6.05.2007 15:40) *

А можешь помочь сделать с помощью множества или хотя-бы объяснить,как это делается?


Объявляешь множества, b-для проверки, al - весь алфавит:
b,al: set of char;


дальше:


i:=1; count:=0; b:=[];
al:=[алфавит заносишь сюда];
repeat
if (s[i] in al) and not(s[i] in b) then begin
inc (count); b:=b+[s[i]];
end;
inc (i);
until (i>length(s)) or (s[i]='.');
..


и все.. К<>к пока, немного доработать надо будет.

Автор: Rom1k 6.05.2007 19:08

щас попробую сделать,не получится,напишу.спасибо заранее

Добавлено через 8 мин.
не могу все это реализовать в программе.куда это надо вставить в моей программе,скажите пожалуйста!

Автор: Malice 6.05.2007 19:40

Это практически вся программа, нужно только добавить описания переменных, ввод строки (readln (s)) и вывод результата (writeln (count)).

Автор: Rom1k 7.05.2007 0:58

Цитата
b:=[];
al:=[алфавит заносишь сюда];

вот это не могу понять??? blink.gif wacko.gif

Автор: Артемий 7.05.2007 1:02

Ну я так понял,что:

al:=['a'..'z'];

И так у тебя в множестве весь алфавит будет...

2 volvo успел отредоктировать! smile.gif

Автор: volvo 7.05.2007 1:05

Артемий
Не будет... То, что сделал ты - не заполнение множества...

AL := ['а' .. 'п', 'р' .. 'я', 'А' .. 'Я'];
Вот это - заполнение... При том, что алфавит должен быть русским, как следует из условия...

Автор: Rom1k 7.05.2007 1:11

вот то,что я написал.Что там может быть не правильно?

что-то я вообще не могу понять,что к чему( mega_chok.gif


program k_3;
var
a:array [1..20] of string;
n,al:set of char;
r,i,j,k,count,b:byte;
st,st1:string;
Begin
WriteLn('введите строку слов,признак окончания-точка');
ReadLn(st);

i:=1; count:=0; b:=0;
al:=[];
repeat
if (st[i] in al) and not(st[i] in b) then begin
inc(count);
b:=b+[s[i]];
end;
inc(i);
until(i>length(s)) or (s[i]:='.');
writeln(count)
END.

Автор: Артемий 7.05.2007 1:20

А так?

program ad;
uses crt;
var
b,al:set of char;
r,i,j,k,count: integer;
st,st1:string;
Begin
WriteLn('введите строку слов,признак окончания-точка');
ReadLn(st);
i:=1; count:=0; b:=[];
al:=['а' .. 'п', 'р' .. 'я', 'А' .. 'Я'];
repeat
if (st[i] in al) and not(st[i] in b) then begin
inc(count);
b:=b+[st[i]];
end;
inc(i);
until(i>length(st)) or (st[i]='.');
writeln(count)
END.

Автор: Rom1k 7.05.2007 1:28

он мне выводит 14,а задание было подсчитать количество различных букв,которые входят в это предложение.
т.е,если я ввожу :

"Привет, как дела."

он мне должен говорить,что:

Букв "о" - 5, Букв "н" - 3 и т.д....

Автор: Артемий 7.05.2007 1:36

Кстати воспользуйся поиском,подобная задача уже была.

Автор: Rom1k 7.05.2007 1:46

искал я...что-то ничего похожего.А вы не можете помочь мне её решить,очень надо!

Автор: Артемий 7.05.2007 1:54

Например,мой рейтинг,ссылка Текстовый файл.

Автор: Malice 7.05.2007 1:55

Тогда чуть иначе:

var 
al:set of char;
i: integer;
st:string;
c:char;
b:array [char] of byte;
Begin
fillchar (b,sizeof (b),0);
WriteLn('введите строку слов,признак окончания-точка');
ReadLn(st);
i:=1; al:=['а' .. 'п', 'р' .. 'я', 'А' .. 'Я'];
repeat
if (st[i] in al) then inc(b[st[i]]);
inc(i);
until(i>length(st)) or (st[i]='.');
for c:=#0 to #255 do if b[c]>0 then writeln (c,'-',b[c]);
end.

Двоякое условие, пояснять надо..

Автор: Rom1k 7.05.2007 2:38

спасибо тебе огромное!!!!! Сейчас буду разбираться,как работает! rolleyes.gif

Добавлено через 2 мин.
ой...А он мне и большие буквы считывает как за отдельные символы.Как сделать,чтобы и большая и маленькая буква были одинаковы???


Добавлено через 2 мин.
да,ещё вопрос.ЧТо значит fillchar (b,sizeof (b),0); ???

Автор: Malice 7.05.2007 2:56

Цитата(Rom1k @ 6.05.2007 23:38) *

ой...А он мне и большие буквы считывает как за отдельные символы.Как сделать,чтобы и большая и маленькая буква были одинаковы???


Надо приводить все буквы к одному регистру, например с помощью такой функции:
Function UpCase(Ch: Char): Char;
begin
case Ch of
'a'..'z': UpCase := Chr(ord('A')+ord(Ch)-ord('a'));
'a'..'n': UpCase := Chr(ord('A')+ord(Ch)-ord('a'));
'p'..'я': UpCase := Chr(ord('P')+ord(Ch)-ord('p'));
else
UpCase:= Ch
end
end;


Цитата

да,ещё вопрос.ЧТо значит fillchar (b,sizeof (b),0); ???

Обнуление массива b.

Автор: Rom1k 7.05.2007 2:59

а как потом эту функцию использовать в программе и как она работает скажи пожалуйста?!

Автор: Rom1k 7.05.2007 3:47

я её вызываю после ввода строки
UpCase(с);

Только ничего почему-то не происходит(

Автор: Артемий 7.05.2007 3:51

for i:=1 to length(st) do s[i]:=UpCase(st[i]);
и по старому далее

Добавлено через 3 мин.
В s теперь новая строка,с ней работай..

Автор: Rom1k 7.05.2007 4:00

ты имеешь ввиду в конце на выходе? что-то ничего не просходит(

Автор: мисс_граффити 7.05.2007 4:06

нет, это должно быть сразу после ввода строки

Автор: Rom1k 7.05.2007 4:08

Вот код программы...Почему-то не учитывается большая или маленькая буква.Выводит всё также,хотя вроде бы и все правильно сделал!

Program kur_3;
uses crt;
var
al:set of char;
i: integer;
st:string;
c:char;
b:array [char] of byte;

function UpCase(Ch:Char):Char;
begin
case Ch of
'а'..'п':UpCase:=Chr(ord('А')+ord(Ch)-ord('а'));
'р'..'я':UpCase:=Chr(ord('Р')+ord(Ch)-ord('р'));
'А'..'Я':UpCase:=Chr(ord('А')+ord(Ch)-ord('а'));
else
UpCase:=Ch;
end;
end;

Begin
fillchar (b,sizeof (b),0);
WriteLn('Введите строку слов,признак окончания-точка.');
ReadLn(st);
i:=1;
al:=['а' .. 'п', 'р' .. 'я', 'А' .. 'Я'];
repeat
if (st[i] in al) then
inc(b[st[i]]);
inc(i);
st[i]:=UpCase(st[i]);
until(i>length(st)) or (st[i]='.');
for c:=#0 to #255 do
if b[c]>0 then
writeln (c,'-',b[c]);
End.

Автор: Rom1k 7.05.2007 4:34

я наверное что-то неправильно в процедуре написал.Или не правильно её использовал(

Автор: Malice 7.05.2007 4:58

Цитата(Rom1k @ 7.05.2007 1:34) *

я наверное что-то неправильно в процедуре написал.Или не правильно её использовал(

Наверное ты ее скопировал неправильно.. Да и st[i]:=UpCase(st[i]); лучше после repeat поставить.

Автор: Rom1k 7.05.2007 5:39

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


Прикрепленные файлы
Прикрепленный файл  Z_3.PAS ( 774 байт ) Кол-во скачиваний: 180

Автор: Артемий 7.05.2007 10:44

Знаешь,если как я смотреть без компилятора,то вроде должно работать..

Добавлено через 3 мин.
И может

al:=['А'..'Я'];
?

Автор: Malice 7.05.2007 14:19

Проверь, не поставил ли ты в функции UpCase неправильно буквы диапазона, т.е.:
'а'..'п':UpCase:=Chr(ord('А')+ord(Ch)-ord('а'));
'р'..'я':UpCase:=Chr(ord('Р')+ord(Ch)-ord('р'));
'А'..'Я':UpCase:=Chr(ord('А')+ord(Ch)-ord('а'));
все веделенные буквы должны быть русскими.

Автор: Rom1k 9.05.2007 18:45

всё ... UpCase мне не надо.А терь можете исправит,если что не правильно

var
al:set of char;{???}
i: integer; {позиция буквы в строке}
st:string;{строка ввода}
c:char; {???}
b:array [char] of byte;{Сохраняет символ массива,кот попался}


и вот сюды нужны комменты(((

WriteLn('Введите строку слов,признак окончания-точка.');
ReadLn(st);
i:=1;
al:=['а' .. 'п', 'р' .. 'я', 'А' .. 'Я']; {буквы русского алфавита}
repeat
if (st[i] in al) then {Если в строке есть символ сассива}
inc(b[st[i]]);
inc(i);
until(i>length(st)) or (st[i]='.');
for c:=#0 to #100 do
if b[c]>0 then
writeln (c,'-',b[c]);

Автор: Rom1k 9.05.2007 20:01

никто не может помочь?

Автор: Malice 9.05.2007 20:30

Цитата(Rom1k @ 9.05.2007 17:01) *

никто не может помочь?

Чем ?
Объясни, прога работает ? Какие строки вызывают у тебя затруднение ?

Автор: Rom1k 9.05.2007 20:55

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

Автор: Rom1k 10.05.2007 0:38

кто-нить может помочь?