IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Строки, Подсчитать....
Rom1k
сообщение 6.05.2007 1:00
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Строка символов представляет собой предложение,написанное на русском языке.Предложение имеет длину не более 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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 6.05.2007 2:02
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 13:03
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

Сообщение отредактировано: Rom1k - 6.05.2007 13:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 14:20
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


ээээм....Никто не знает?!?!?!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.05.2007 14:35
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

Останется убрать разницу между большими и мал. буквами и не учитывать пробелы и знаки препинания. Но, конечно, лучше сделать заново с помощью множества..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 14:40
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


А можешь помочь сделать с помощью множества или хотя-бы объяснить,как это делается?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.05.2007 14:55
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(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]='.');
..


и все.. К<>к пока, немного доработать надо будет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 15:08
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

Добавлено через 8 мин.
не могу все это реализовать в программе.куда это надо вставить в моей программе,скажите пожалуйста!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.05.2007 15:40
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Это практически вся программа, нужно только добавить описания переменных, ввод строки (readln (s)) и вывод результата (writeln (count)).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 20:58
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

вот это не могу понять??? blink.gif wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Артемий
сообщение 6.05.2007 21:02
Сообщение #11


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Ну я так понял,что:
al:=['a'..'z'];

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

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

Сообщение отредактировано: Артемий - 6.05.2007 21:07


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.05.2007 21:05
Сообщение #12


Гость






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

AL := ['а' .. 'п', 'р' .. 'я', 'А' .. 'Я'];
Вот это - заполнение... При том, что алфавит должен быть русским, как следует из условия...
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 21:11
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

что-то я вообще не могу понять,что к чему( 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Артемий
сообщение 6.05.2007 21:20
Сообщение #14


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


А так?
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.


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 21:28
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

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

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

Букв "о" - 5, Букв "н" - 3 и т.д....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Артемий
сообщение 6.05.2007 21:36
Сообщение #16


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


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


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 21:46
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


искал я...что-то ничего похожего.А вы не можете помочь мне её решить,очень надо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Артемий
сообщение 6.05.2007 21:54
Сообщение #18


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


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


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.05.2007 21:55
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Тогда чуть иначе:
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.

Двоякое условие, пояснять надо..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 6.05.2007 22:38
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

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


Добавлено через 2 мин.
да,ещё вопрос.ЧТо значит fillchar (b,sizeof (b),0); ???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.06.2025 4:43
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"