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

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

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

Автор: shyrik 14.01.2005 2:41

опять у меня есть вопрос
Задание
Дан текст на русском языке. Напечатать в алфавитном порядке все гласные буквы, которые входят в каждое слово; все согласные, которые не входят хотя бы в одно слово.

я правильно начинаю прогу??и веду подсчёт гласных букв??

Цитата
Program bukvi;
const r=ord('а')-ord('А');
var m:set of 'а'..'я';
    sl:array[1..50] of string;
    s:string;
    i,k,l:integer;
    c:char;
begin m:=['а','е','ё','и','о','у','ы','э','ю','я']
      write('введите текст на русском языке:');
      readln(s);

      writeln('Вот эти буквы:');
      for c:='а' to 'я' do if c in m then write( с );
      writeln


Автор: volvo 14.01.2005 2:52

shyrik
А почему бы вместо

Код
var m:set of 'а'..'я';
...
m:=['а','е','ё','и','о','у','ы','э','ю','я'];
не сделать
Код
const
 m:set of 'а'..'я' = ['а','е','ё','и','о','у','ы','э','ю','я'];


Цитата
веду подсчёт согласных букв
Я не увидел в программе никакого "подсчета" - только распечатка всех гласных букв...

Автор: shyrik 14.01.2005 2:55

Цитата(volvo @ 13.01.05 22:52)
Я не увидел в программе никакого "подсчета" - только распечатка всех гласных букв...

я это ещё не написал, у меня там была ошибка которую я ещё не исправил, ща подумаю, напишу.

Автор: shyrik 24.01.2005 5:48

вот опять вернулся к этой проге и окончательно запутался, что тут не то?
подсчёт гласных букв которые входят в каждое слово.

Цитата
program lr_9;
uses Crt;
var
  text: string;
  MySet: set of char;
  i,j,k, StCh,EndCh: integer;
  test:boolean;
res: array [-1..1] of byte;
begin
MySet := ['а','е', 'ё', 'и', 'й', 'о','у','ы','э','ю','я'];
writeln('You must wirte some text. End of text is point');
readln(text);
StCh := 1; EndCh:=-1;
for i :=  1 to length(text) do
begin
if (text[i]=' ')or(text[i]='.') then
begin
if text[i] in MySet then  inc(res[i]);
end;
for k := i+1 to EndCh do
writeln(text[k]);
end;
readln;
end.

Автор: volvo 24.01.2005 20:06

shyrik
Вот правильный вариант:

Код
const
 all_vowels: set of char =
   ['а', 'е', 'ё', 'и', 'й', 'о', 'у', 'ы', 'э', 'ю', 'я'];
 word_ch: set of char = [];
var
 s: string;
 i: byte;
 in_all: set of char;
begin
 in_all := all_vowels;
 readln(s);
 for i := 1 to length(s) do
   begin
     if s[i] in [' ', '.'] then
       begin
         in_all := in_all * word_ch;
         word_ch := [];
       end
     else
       if s[i] In all_vowels Then
         word_ch := word_ch + [ s[i] ];
   end;
 for i := 0 to 255 Do
   If chr(i) in in_all Then write(chr(i):3);
 writeln
end.


Эта программа считает также все гласные, которые не входят хотя бы в одно слово:
Код
const
 all_vowels: set of char =
   ['а', 'е', 'ё', 'и', 'й', 'о', 'у', 'ы', 'э', 'ю', 'я'];
 word_ch: set of char = [];
var
 s: string;
 i: byte;
 in_all, in_one: set of char;
begin
 in_all := all_vowels; in_one := all_vowels;
 readln(s);
 for i := 1 to length(s) do
   begin
     if s[i] in [' ', '.'] then
       begin
         in_all := in_all * word_ch;
         in_one := in_one - word_ch;
         word_ch := [];
       end
     else
       if s[i] In all_vowels Then
         word_ch := word_ch + [ s[i] ];
   end;
 writeLn('В каждом слове: ');
 for i := 0 to 255 Do
   If chr(i) in in_all Then write(chr(i):3);
 writeln;

 writeLn('Ни в одном слове: ');
 for i := 0 to 255 Do
   If chr(i) in in_one Then write(chr(i):3);
 writeln
end.

Автор: Romtek 25.01.2005 3:37

При работе со множествами лучше использовать
Include
Exclude


Пример:

Код
Include (ChSet, 'a');  { <=> ChSet := ChSet + ['a'] }

Автор: shyrik 27.01.2005 0:52

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

Код
s[i]:=s[i]-chr(i)
 writeln ('',s[i]);

или можно раньше это подсчитать?исправив в этой строке плюс на минус:
Код
word_ch := word_ch + [ s[i] ];

тогда он вообще ничего хорошего не получается.

Автор: volvo 27.01.2005 0:57

shyrik
Я же привел программу, которая считает все, что нужно. Почему надо не проверив обязательно что-то менять?

Этот фрагмент, по Вашему, что делает?

Код
for i := 0 to 255 Do
  If chr(i) in in_all Then write(chr(i):3);

Автор: shyrik 27.01.2005 1:53

я и вправду сначала не обратил особого внимания на этот фрагмент.
Если я ставлю not то у меня выводятся все знаки, как от этого избавиться?

Автор: volvo 27.01.2005 2:12

shyrik
Можете мне объяснить, что требуется выводить вообще? По условию задачи надо было

Цитата
Напечатать в алфавитном порядке все гласные буквы, которые входят в каждое слово
Что моя программа и делает.

Автор: shyrik 27.01.2005 2:24

верно, но мне надо ещё сделать:вывести гласные которые не входят хотя бы в одно слово.
если я ввожу

Код
if not (chr(i) in in_all)_ Then write(chr(i):3);

то у меня получается что всё работает тока много лишних знаков,как от них избавиться и оставить нужное??

Автор: volvo 27.01.2005 2:39

shyrik
Смотри первый ответ: http://forum.pascal.net.ru/index.php?s=&showtopic=3767&view=findpost&p=34262 ... Я добавил еще кое-что... :yes:

Автор: shyrik 27.01.2005 2:51

оп-па, большое спасибо за помощь.

Автор: Guest 28.11.2005 21:25

Люди Помогите!!!!!!!!!!! Дан текст, за которым следует точка. В алфавитном порядке напечатать (по разу) все строчные русские гласные буквы, входящие в этот текст.

Автор: klem4 28.11.2005 21:29

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

Автор: CrAzY99999 12.06.2008 19:06

Помогите появились ошибки не знаю что делать. Завтра защита, а я ещё одну должен сделать PLEASE HELP SOS

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

My

program ___CrAzY___; {Название программы}
uses WinCRT; {Включение библиотеки}
type letters=set of char;
mass=array[1..33] of string;
const empty:letters=[];
var Deafs,setX:letters;
str:string;
M:mass;
F_InTen,F_NoTest:boolean;
k,kol_slov:byte;

procedure Init(s:string;var X:mass;var c:byte);
var i,l:integer;
begin
l:=length(s);
c:=1;
for i:=1 to l-1 do
if (s[i]<>',') and (s[i]<>'.') then
X[c]:=X[c]+s[i]
else
begin
inc©;
X[c]:='';
end;
end;

function Set_Letters(slovo:string):letters;
var i:byte;
tmp:letters;
begin
for i:=1 to length(slovo) do
include(tmp,slovo[i]);
Set_Letters:=tmp;
end;

procedure Output;
var i:byte;
begin
setX:=Deafs;
write('[');
for i:=1 to length(str) do
if (str[i] in Deafs) and (str[i] in setX) then
begin
exclude(setX,str[i]);
if setX=[] then write(str[i],']')
else write(str[i],',');
end;
end;

begin
clrscr;
writeln('Please, input the text: ');
readln(str);
Init(str,M,kol_slov);
F_InTen:=true;
F_NoTest:=false;
Deafs:=['а','е','ё','и','й','о','у','э','ю','я'];
for k:=1 to kol_slov do
begin
if odd(k) and (Deafs*Set_Letters(M[k])=empty) then F_InTen:=false
else Deafs:=Deafs*Set_Letters(M[k]);
if not odd(k) and (Deafs*Set_Letters(M[k])<>empty) then F_NoTest:=true;
end;
if F_InTen and F_NoTest then Output
else writeln('Таких гласных нет!');
readkey;
end.

Автор: volvo 12.06.2008 19:54

Выше было приведено решение задачи (если ты собираешься делать по-своему, зачем спрашиваешь? Делай... За тебя никто ничего делать не будет...)... А ссылку я тебе дал не для того, чтоб ты зафлудил и эту тему, а для того чтоб ты ее просто ПРОЧЕЛ. dry.gif