Строка символов представляет собой предложение,написанное на русском языке.Предложение имеет длину не более 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
С буквами намного проще По условию можно пользоваться множествами? К=к? или это разные буквы?
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]='.'); ..
Добавлено через 8 мин. не могу все это реализовать в программе.куда это надо вставить в моей программе,скажите пожалуйста!
Malice
6.05.2007 19:40
Это практически вся программа, нужно только добавить описания переменных, ввод строки (readln (s)) и вывод результата (writeln (count)).
Rom1k
7.05.2007 0:58
Цитата
b:=[]; al:=[алфавит заносишь сюда];
вот это не могу понять???
Артемий
7.05.2007 1:02
Ну я так понял,что:
al:=['a'..'z'];
И так у тебя в множестве весь алфавит будет...
2 volvo успел отредоктировать!
volvo
7.05.2007 1:05
Артемий Не будет... То, что сделал ты - не заполнение множества...
AL := ['а' .. 'п', 'р' .. 'я', 'А' .. 'Я'];
Вот это - заполнение... При том, что алфавит должен быть русским, как следует из условия...
Rom1k
7.05.2007 1:11
вот то,что я написал.Что там может быть не правильно?
что-то я вообще не могу понять,что к чему(
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
спасибо тебе огромное!!!!! Сейчас буду разбираться,как работает!
Добавлено через 2 мин. ой...А он мне и большие буквы считывает как за отдельные символы.Как сделать,чтобы и большая и маленькая буква были одинаковы???
ой...А он мне и большие буквы считывает как за отдельные символы.Как сделать,чтобы и большая и маленькая буква были одинаковы???
Надо приводить все буквы к одному регистру, например с помощью такой функции:
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;
а как потом эту функцию использовать в программе и как она работает скажи пожалуйста?!
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
Вот прикрепил программу.Я там все,что можно пытался переделать.Но ничего не помогает.Несколько раз перепроверял,всё равно Буквы большие и маленькие считает за разные.Помогите пожалуйста переделать?!
Артемий
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
кто-нить может помочь?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.