Sunteți pe pagina 1din 8

Probleme propuse Mulimi program probl_1; {Operaii cu mulimi} uses crt; type multime=set of byte; var A,B:multime; i,j,n,m:integer;

x:byte; procedure citire(var A:multime; var n:integer); Begin A:=[]; for i:=1 to n do begin write('Elementul ',i,'='); readln(x); A:=A+[x]; end; End; procedure afisare(var A:multime); Begin for i:=0 to 255 do if i in A then writeln(i:4); writeln; End; procedure intersectie(A,B:multime); var C:multime; Begin C:=A*B; afisare(C); End; procedure reuniune(A,B:multime); var R:multime; Begin R:=A+B; afisare(R); End; procedure diferenta(A,B:multime); var D:multime; Begin D:=A-B; afisare(D); End; BEGIN clrscr; write('n='); readln(n); citire(A,n); write('m='); readln(m); citire(B,m); writeln('Elementele multimii A sunt:'); afisare(A); writeln('Elementele multimii B sunt:'); afisare(B); writeln('Intersectia elementelor este:'); intersectie(A,B); writeln('Reuniunea elementelor este:'); reuniune(A,B); writeln('Diferenta celor doua multimi este:'); diferenta(A,B); readln; END.

Prof. Kabai Timea

Probleme propuse Mulimi 2.

Prof. Kabai Timea

Scriei un program care citete de la tastatur mai multe perechi de numere naturale pn ce se introduce perechea (0,0) i creaz dou mulimi: - prima mulime va memora irul primelor valori din pereche - a doua mulime va conine irul valorilor secundare din fiecare pereche. Elmentele perechii (0,0) nu se vor introduce n mulimi. Programul va afia cele dou mulimi create precum i intersecia acestora. EXEMPLU. Dac de la tastatur se introduc perechile (8,2), (9,0), (4,128), (0,0) mulimile vor fi: {8,9,4} i {2,0,128}. program probl_2; uses crt; type pereche=record a,b:longint; end; multime=set of byte; var n,i:integer; p:pereche; x,y,intersectie:multime; BEGIN ClrScr; x:=[]; y:=[];{Multimea x va contine primul numar din pereche, iar y cel de-al doilea numar} write('a='); readln(p.a); {Se citeste prima pereche: (p.a,p.b)} write('b='); readln(p.b); repeat x:=x+[p.a]; y:=y+[p.b]; {Se depun elementele in multimile corespunzatoare} write('a='); readln(p.a); write('b='); readln(p.b); until (p.a=0) and (p.b=0); {Se termina citirea cand ambele elemente ale perechii =0} write('Elementele multimii X sunt: '); for i:=0 to 255 do {Afisez elementele multimii x} if i in x then write(i:4); writeln; write('Elementele multimii Y sunt: '); for i:=0 to 255 do {Afisez elementele multimii y} if i in y then write(i:4); writeln; intersectie:=x*y; {Intersectia celor doua multimi} if intersectie<>[] then begin write('Intersectia este: '); for i:=0 to 255 do if i in intersectie then write(i:4); end else writeln ('Nu exista elemente comune.'); readln; END.

Probleme propuse Mulimi 3.

Prof. Kabai Timea

Se citete de la tastatur un ir de caractere reprezentnd numele unei persoane. S se verifice dac numele a fost introdus correct (conine numai litere) i n caz afirmativ s se afieze mulimea literelor distincte care apar n numele respective.

program probl_3; uses crt type multime=set of char; var s:string; j:integer; m:multime; ok:boolean; litera:char; BEGIN ClrScr; write('Dati sirul de caractere: '); readln(s); ok:=true; {Se presupune ca numele (cuvantul) introdus e corect} for j:=1 to length(s) do {Se verifica daca contine numai litere mici si mari (nu si alte caractere)} if not (s[j] in ['A'..'Z']+['a'..'z']) then ok:=false; writeln(ok); if ok then begin {Daca sirul contine numai litere, alcatuieste multimea M a literelor distincte din s} M:=[]; for j:=1 to length(s) do M:=M+[s[j]]; for litera:='a' to 'z' do {Afisez multimea caracterelor} if litera in M then write(litera,' '); for litera:='A' to 'Z' do if litera in M then write(litera,' '); end; readln; END.

Probleme propuse Mulimi

Prof. Kabai Timea

4. Se citesc de la tastatur n cuvinte. S se afieze caracterele comune tuturor cuvintelor citite. program probl_4; uses crt; type multime=set of 'a'..'z'; cuvinte=array[1..100] of multime; var i,j,n:integer; a:cuvinte; inters:multime; x:'a'..'z'; BEGIN ClrScr; inters:=['a'..'z']; write('n='); readln(n); for i:=1 to n do begin {Citesc cele n cuvinte} write('Dati cuvantul ',i,' :'); a[i]:=[];{Formez pentru fiecare cuvant multimea caracterelor din care e alcatuit cuvantul } while not eoln do begin {Un cuvant se termina, cand este sfarsit de linie} read(x); {x-caracterul din cuvant (litera)} a[i]:=a[i]+[x]; end; readln; inters:=inters*a[i]; end; write('Literele comune sunt: '); if inters<>[] then begin for x:='a' to 'z' do {Afisez elementele intersectiei} if x in inters then write(x:4); end else writeln('Nu exista litere comune.'); readln; END.

Probleme propuse Mulimi

Prof. Kabai Timea

5. De pe un rnd al ecranului se citete un text de lungime cel mult 70 de caractere. S se determine mulimea vocalelor i mulimea consoanelor care apar n text. program probl_5; uses crt; const M: set of char=['a','e','i','o','u','A','E','I','O','U']; { M multimea vocalelor} X: set of char=['a'..'z','A'..'Z']; var s:string[70]; V,C,L,Y:set of char; i:integer; k:char; BEGIN ClrScr; write('Dati sirul de caractere: ');readln(s); V:=[]; C:=[]; L:=[]; for i:=1 to length(s) do L:=L+[s[i]]; {Alcatuiesc multimea alcatuita din caracterele distincte din s} for k:='a' to 'z' do if (k in L) and (k in M) then V:=V+[k];{Daca litera mica se gaseste in sir si e vocala se depune in V} for k:='A' to 'Z' do if (k in L) and (k in M) then V:=V+[k]; {Daca litera mare se gaseste in sir si e vocala se depune in V} writeln('Multimea vocalelor:'); for k:='a' to 'z' do {Afisez multimea vocalelor} if (k in V) then write(k:4); for k:='A' to 'Z' do if (k in V) then write(k:4); writeln; Y:=X-M; {Y: reprezinta multimea consoanelor} for k:='a' to 'z' do if (k in L) and (k in Y) then C:=C+[k]; for k:='A' to 'Z' do if (k in L) and (k in Y) then C:=C+[k]; writeln('Multimea consoanelor:'); for k:='a' to 'z' do if (k in C) then write(k:4); for k:='A' to 'Z' do if (k in C) then write(k:4); readln; END.

Probleme propuse Mulimi

Prof. Kabai Timea

6. Construii un algoritm eficient care determin toate perechile de numere naturale a, b cu ab, numerele ce formeaz o pereche avnd proprietatea c nu au nici o cifr comun i suma lor este egal cu S. Valoarea S este un numr citit de la tastatur (S<100000000). Fiecare pereche se va scrie pe un rand al ecranului, cu un spaiu ntre elementele ce compun perechea. EXEMPLU. Pentru S=16, se vor afia (nu neaprat n aceast ordine) perechile: (2,14), (6,10), (4,12), (5,11), (0,16), (7,9). (Bacalaureat, 2001) program probl_6; type multime=set of char; var a,b,i:integer; s:longint; m1,m2:multime; sir1,sir2:string; BEGIN write('S='); readln(s); for a:=0 to S div 2 do begin {Formeaza perechile de forma (a,S-a)} m1:=[]; {Alcatuieste multimea m1 a cifrelor lui a} str(a,sir1); for i:=1 to length(sir1) do m1:=m1+[sir1[i]]; b:=S-a; m2:=[]; {Alcatuieste multimea m2 a cifrelor lui b=S-a} str(b,sir2); for i:=1 to length(sir2) do m2:=m2+[sir2[i]]; if m1*m2=[] then writeln(a,' ',b); {daca a si b nu au cifre comune, adica intersectia} end; {multimilor m1 si m2 este multimea vida} readln; END. OBSERVAII Perechile de numere naturale (a,b) cu proprietatea c a+b=S sunt: (0,S), (1,S-1), (2,S-2) etc, deci pe caz general de forma (a,S-a). Algoritmul de formare a acestor perechi este suficient dac valorile lui a pleac de la 0 i merg pn la jumtatea lui S (de exemplu, pentru S=9, dac am luat perechea (3,6) nu mai are rost s lum i perechea (6,3), ntruct este una i aceeai). ntr-un ciclu, prin variabila a vor trece pe rnd valorile 0,1,S DIV 2, i la fiecare pas: Formm mulimea m1 a cifrelor lui a: iniializm m1 cu mulimea vid, transformm numrul ntreg a n irul sir1, apoi parcurgnd caracterele irului, le adugm prin reuniune la mulimea m1. Asemntor se formeaz mulimea m2.

Probleme propuse Mulimi

Prof. Kabai Timea

7. Se consider o mulime finit B i m mulimi A1, A2,, Am. Stabilii dac cele m mulimi alctuiesc o partiie a mulimii B. Mulimile A1, A2,, Am alctuiesc o partiie a mulimii B, dac ndeplinesc simultan trei condiii: toate mulimile sunt incluse n B mulimile sunt disjuncte dou cte dou (intersecia a oricror dou este mulimea vid) reuniunea tuturor mulimilor este B. program probl_7; uses crt; type multime=set of byte; vector=array[1..100] of multime; var A:vector; B,R:multime; i,j,m:integer; x:byte; e_partitie:boolean; BEGIN Repeat write('Cate multimi? : '); readln(m); until m>1; for i:=1 to m do begin {Citeste elementele multimii A[i]} writeln('dati elementele multimii ',i,': '); A[i]:=[]; while not eoln do begin write('x='); readln(x); A[i]:=A[i]+[x]; end; readln; end; writeln('dati elementele multimii B: '); {Citeste elementele multimii B} B:=[]; while not eoln do begin write('x='); readln(x); B:=B+[x]; end; readln; e_partitie:=true; {Se presupune ca este partitie} for i:=1 to m do {Testeaza incluziunea multimilor A[i] in B} if not(A[i]<=B) then e_partitie:=false; if e_partitie then begin {Testeaza daca reuniunea multimilor A[i] este egala cu B} R:=[]; for i:=1 to m do R:=R+A[i]; if R<>B then e_partitie:=false; end; if e_partitie then begin {Testeaza daca multimile A[i] sunt disjuncte doua cate doua} for i:=1 to m-1 do for j:=i+1 to m do if A[i]*A[j]<>[] then e_partitie:=false; end; if e_partitie then writeln('Multimile sunt partitie.') else writeln('Nu sunt partitie.'); readln; END.

Probleme propuse Mulimi

Prof. Kabai Timea

8. Scriei un program care citete de la tastatur dou numere naturale a i b (0a<b255), apoi construiete mulimea numerelor prime din intervalul [a,b] i afieaz aceast mulime. Elementele mulimii se scriu toate pe un rnd de ecran separate prin cte un spaiu. program probl_7; uses crt; type multime=set of byte; var M:multime; a,b,i,j:byte; function prim(n:byte):boolean; {Functia testeaza primalitatea} var d:byte; p:boolean; Begin p:=true; for d:=2 to trunc(sqrt(n)) do if n mod d=0 then p:=false; prim:=p; End; BEGIN ClrScr; repeat write('a='); readln(a); write('b='); readln(b); until (a>=0) and (a<=255) and (a<b) and (b>=0) and (b<=255); M:=[]; for i:=a to b do {Verific daca numarul i din interval este prim} if prim(i) then M:=M+[i]; {Daca este prim, depun numarul in multime} writeln('Multimea numerelor prime din intervalul [',a,',',b,'] este:'); for j:=2 to 255 do {Afisez elementele multimii} if j in M then write(j:4); readln; END.

S-ar putea să vă placă și