Sunteți pe pagina 1din 6

Probleme Haskell

1. Un sir de caractere xs care se obtine dintr-un alt sir de caractere ys prin eliminarea
unora dintre caracterele acestuia (si pastrarea celor ramase in aceeasi ordine) il
vom numi subcuvant al lui ys.
Exemple:
i. “Hkl” este un subcuvant al sirului “Haskell”
ii. “145” este un subcuvant al sirului “12345”
b. Definiti o functie subCuvinte::String->[String] care returneaza lista
tuturor subcuvintelor sirului de caractere primit ca argument.
Exemplu de apel al functiei:
i. subCuvinte ”has”
[””, ”h”, ”a”, ”s”, ”ha”, ”as”, ”hs”, ”has”]
c. Definiti o functie estesubCuvant::String->String->Bool care primeste
doua siruri de caractere ca argumente si returneaza True, daca primul este
subbcuvant al celui de-al doilea si False, in caz contrar. Scrieti doua
variante: prima, folosind functia elem, din biblioteca Prelude si functia
subCuvinte-ea are dezavantajul ca necesita un numar foarte mare de
verificari (cate, pentru un sir xs avand lungimea n?); cea de-a doua
directa.
d. Scrieti un program care sa preia de la tastatura doua siruri de caractere si
sa afiseze daca primul sir este un subcuvant al celui de-al doilea.
2. a) Mutand orice numar de elemente de la inceputul unei liste la sfarsitul ei
obtinem un numar de noi liste pe care le vom numi rotatii ale listei initiale. Scrieti
o functie rotatii::[a]->[[a]], care returneaza o lista cu toate rotatiile listei primite
ca argument.
Exemplu de apel: rotatii [1,2,3,4]==[[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]].
b) O rotatie a titlului unei carti este o rotatie a cuvintelor din titlu, dar care nu
incepe cu un cuvant de legatura, acestea fiind sirurile de caractere
“in”,”din”,”sau”,”si”,”o”,”un”. Definiti o functie rotatiiTitlu::String->[String],
care “intoarce” toate rotatiile asociate titlului unei carti.
Exemplu de apel:
rotatiiTitlu “Un veac de singuratate”==[”veac de singuratate Un”,”singuratate
Un veac de”].
c) In anumite situatii dorim sa gasim intr-o baza de date, titlul unei carti care
contine un cuvant cheie. Pentru aceasta scrieti o functie
indexTitluri::[String]->[String], care returneaza o lista cuprinzand toate
rotatiile titlurilor de carti primite in lista argument, sortata crescator dupa prima
litera.
De exemplu :
indexTitluri [“Un veac de singuratate”,”Un tramvai numit dorinta”]==[”dorinta
Un tramvai numit”,” singuratate Un veac de”, ”tramvai numit dorinta Un”,” veac
de singuratate Un”].
d) Scrieti o functie cautareTitlu::[String]->String->[String], care primeste ca
argumente o lista de valori de tip String (reprezentand o lista de titluri-baza de
date) si un cuvant cheie ca un String si returneaza o lista cuprinzand toate titlurile
care contin acest cuvant.
3.
a. Definiti o functie pal::(a->Bool)->[a]->([a],[a]) care primeste doua
argumente: un predicat p si o lista xs si returneaza o pereche de doua liste
ys si zs astfel incat:
i. xs=ys++zs
ii. fiecare element al listei ys satisface p
iii. primul element al lui zs nu satisface p
Exemplu: pal isLower “casa Bolta Rece” va returna
(“casa”,”Bolta Rece”)
sau pal (>4) [5,6,7,1,2,3,4] va returna ([5,6,7],[1,2,3,4])
b. Definim un cuvant ca fiind un sir de caractere alphanumerice consecutive.
Scrieti o functie
esteCuvant::String->Bool care returneaza True sau False dupa cum sirul
argument este un cuvant sau nu.
c. Definiti o functie cuvinte::String->[String] care “intoarce” lista
cuvintelor maximale gasite in sirul primit ca argument.
Exemplu: apelul cuvinte “abcd2xyz7defgh” va returna lista
[“abcd”,”xyz”,”defgh”]
d. Realizati un program care preia de la tastatura un sir de caractere si
afiseaza, pe linii diferite, toate cuvintele care se gasesc in acest sir.
4. Declarati un tip sinonim cu String numit Nume si un tip sinonim cu Int numit
Nota. Definiti apoi un tip Catalog sinonim cu [(Nume,Nota)].

a. Scrieti un program care sa citeasca dintr-un fisier o valoare de tip Catalog


(o baza de date, in fond, care reprezinta o lista de studenti si notele lor la
un examen) si afiseaza numele acestora in ordine alfabetica crescatoare,
avand alaturi (pe acelasi rand) scrisa nota corespunzatoare.
Exemplu:
Alexandrescu 7
Baciu 10
Ionescu 9
etc.
Numele studentilor si notele trebuie sa fie aliniate pe verticala la stanga,
respectiv la dreapta.
Afisati apoi studentii in ordinea descrescatoare a notelor (folositi functia
sort din Prelude).
De asemenea, programul sa afiseze cate note sunt intre 1 si 4, intre 5 si 8 si
intre 9 si 10 si o eroare, daca una din note nu este cuprinsa intre 1 si 10.
5. Scrieti un program care cere utilizatorului sa introduca de la tastatura un numar
natural n si sa afiseze descompunerea in factori a numarului n (in scriere
obisnuita!). Pentru aceasta veti scrie:
a. o functie Prim care primeste ca argument un nr nat p si returneaza True
daca acesta este un nr prim si False daca acesta este nr compus.
b. o functie divPrimi care primeste ca arg un nr nat n si returneaza o lista cu
toti divizorii primi ai nr, scrisi in ordine crescatoare, de atatea ori cat este
multiplicitatea lor. ( Exemplu: divPrim 12=[2,2,3])
c. o functie afisDescomp care primeste ca argument o lista de valori Int care
reprezinta divizorii primi si returneaza o valoare de tip String, scrierea
obisnuita a descompunerii in factori a nr n.
Exemplu: afisDescomp [2,2,3]=”2^2*3”)
a. functia main
6. Scrieti un program care cere utilizatorului sa introduca de la tastatura mai multe
numere intregi si care returneaza cmmdc , respective cmmmc al acestora. Pentru
aceasta veti scrie:
a. o functie cmmdc care primeste ca argumente doua nr nat si returneaza
cmmdc al lor . Analog o functie cmmmc pentru a calcula cmmmc al lor.
b. o functie cmmdcNr care primeste ca argumente mai multe nr nat si
returneaza cmmdc al lor . Analog pentru cmmmc.
c. Functia main (se va afisa lista numerelor introduse si cmmdc, cmmmc).
7. Se citeste un text dintr-un fisier (o valoare de tip String ). Cuvintele sunt siruri
maximale de caractere alfanumerice, separate prin spatiu sau caracterele : ; , . ? !
Sa se afiseze, pe acelasi rand, fiecare cuvant impreuna cu nr de aparitii ale sale in
text. Pentru aceasta veti scrie:
a. O functie care primeste o valoare de tip String si ”intoarce ” lista cu toate
cuvintele din aceasta.
b. O functie care primeste o valoare de tip a si o lista de tip [a] si returneaza
nr de aparitii ale valorii date in lista.
c. O functie de afisare pentru cuvinte si nr lor de aparitii.
d. Functia main.
8.
a. Pentru tipul de data Exp definit la laborator, adaugati si alte valori
(folosind noi functii constructor) corespunzatoare operatiilor de obtinere a
opusului unui numar, de impartire, functiilor putere, log, exp, tg, ctg,
arctg. Completati functiile derivare si scriereExp corespunzator noilor
valori.
b. Definiti o functie integrare::Exp->Exp, care sa primeasca ca argument o
valoare de tip Exp si sa returneze valoarea care sa reprezinte primitiva
expresiei initiale. Trebuie sa aveti in vedere expresii ale caror primitive se
pot calcula imediat-spre exemplu functiile elementare, polinoamele,
functii care se obtin din acestea prin adunari, scaderi, inmultire cu un
scalar.
c. Definiti o functie care sa preia de la tastatura, ca un String, o functie de
gradul 1scrisa in forma “a*x+b“ sis a returneze scrierea acestei expresii ca
o valoare de tip Exp si primitiva acestei functii.
9. Se citesc de la tastatura cele n elemente ale unei multimi avand toate acelasi tip a,
sub forma unei liste.
a. Scrieti o functie inser::a->[a]->[[a]] care are doua argumente o valoare de
tip a si o lista de valori de tip a si care returneaza o lista cuprinzand toate
listele obtinute inserand valoarea data in lista initiala in toate pozitiile
posibile. Exemplu: la apelul inser 1 [2,3] va returna [[1,2,3],[2,1,3],
[2,3,1]] .
b. Folosind, eventual, punctual a) sa se defineasca o functie permut::[a]-
>[[a]], care preia de la tastatura cele n elemente ale unei multimi avand
toate acelasi tip a, sub forma unei liste si care “intoarce ” lista
permutarilor acestei multimi ca o lista de liste, afisand-o pe ecran.
c. Analog cu punctul b) scrieti o functie care sa afiseze pe ecran toate
submultimile multimii date.
10. Se definesc, mai intai , urmatoarele tipuri de date:
type Nume=String
type Prenume =String
type Persoana=(Nume,Prenume)
type Adresa=String
type SalariuBrut=Float
type Salariat=(Persoana,Adresa,SalariuBrut)
type BazaDate=[Salariat]
a. Se introduce de la tastatura numele unei persoane ( o valoare de tip
Nume) si se cere afisarea tuturor salariatilor avand acest nume-nume,
prenume, adresa -pe randuri diferite. Datele sunt intr-o baza de date ( o
valoare de tip BazaDate ) care trebuie citita dintr-un fisier.
b. Apoi o problema similara: sunt introduse de la tastatura numele si
adresa unui salariat si trebuie afisati toti salariatii care verifica aceste
conditii.
c. Sa se scrie o functie care ordoneaza lexicografic o valoare de tip
BazaDate dupa campul Nume.

11. In cele ce urmeaza, vom reprezenta simbolic un polinom de o variabila prin


lista coeficientilor sai (pe care ii vom considera intregi) incepand cu cel
corespunzator termenului de grad minim. Se defineste, mai intai, tipul de data
Polinom prin declaratia type Polinom=[Int].
a. Definiti o functie scriePolinom care primeste ca argument o valoare
de tip Polinom si returneaza o valoare de tip String, care reprezinta
scrierea uzuala a polinomului dat. Exemplu: la apelul
scriePolinom [2,-5,1] se va obtine “2*x^0-5*x^1+1*x^2”.
b. Scrieti 2 functii derivarePolinom, integrarePolinom care primesc
ca argument o valoare de tip Polinom si “intorc” o valoare de tip
Polinom care reprezinta coeficientii functiei polinom obtinute din
cea initiala prin derivare, respectiv integrare. Realizati , apoi un
program prin care se cere utilizatorului de la tastatura un polinom ca
o lista de intregi (coeficientii polinomului) si care sa afiseze, in
scriere uzuala, functia polinom obtinuta din cea initiala prin
derivare, respectiv integrare.
c. Definiti o functie care primeste ca argument o valoare de tip Polinom
si o valoare de tip Int reprezentand valoarea variabilei “x” si
returneaza un numar intreg, valoarea numerica corespunzaoare a
polinomului.
12. Declarati un tip sinonim cu (Float,Float) numit Punct si un tip sinonim cu
[Punct] numit Poligon.
a) Definiti o functie numita dist::Punct->Punct->Float care calculeaza
distanta intre doua puncte din plan reprezentate prin valori de tip
Punct.
b) Scrieti un program prin care se preia de la tastatura, folosind functia
getArgs, o valoare de tip Poligon (coordonatele varfurilor unui
poligon) si care returneza perimetrul acestui poligon.
c) Scrieti o functie care primeste ca argumente doua valori de tip Punct
(care determina o dreapta d) si o alta valoare Punct (un punct, notat
A) si returneaza True sau False dupa cum punctul A se gaseste sau
nu in acelasi semiplan cu punctul (0,0).
d) Def o functie avand tipul Poligon->Poligon->Bool, care stabileste
daca un poligon este convex, concav sau degenerat ( cand trei varfuri
ale poligonului sunt coliniare).
e) Scrieti un program prin care se preia de la tastatura o valoare de tip
Poligon si care afiseaza mesaje in cazul in care poligonul este
degenerat, concav sau convex.
13. In cele ce urmeaza, vom reprezenta simbolic un polinom de o variabila prin
lista coeficientilor sai (pe care ii vom considera intregi) incepand cu cel
corespunzator termenului de grad minim. Se defineste, mai intai, tipul de data
Polinom prin declaratia type Polinom=[Int].
a. Definiti o functie parsarePolinom care primeste ca argument o
valoare de tip String, care reprezinta scrierea uzuala a polinomului dat
si returneaza o valoare de tip Polinom. Exemplu: la apelul
parsarePolinom “2*x^2-5*x+1” se va obtine [1,-5,2]. Vom
presupune ca in scrierea polinomului sunt scrisi si acei termeni avand
coeficientul 0; de asemenea si exponentii egali cu 1 sau 0 .
b. Scrieti 3 functii numite sumaPolinom, diferentaPolinom si
produsPolinom care cer utilizatorului sa tasteze doua polinoame in
scrierea uzuala, preiau aceste doua valori de tip String si afiseaza pe
ecran coeficientii polinomului suma ( respectiv diferenta, produs) ca o
lista de intregi -valoare de tip Polinom.
c. Scrieti o functie care primeste ca argument o valoare de tip Polinom si
care “intoarce” toate radacinile intregi si rationale ale acestuia.
14. Declarati un tip sinonim cu (Float,Float) numit Punct si un tip sinonim cu
[Punct] numit Poligon.
f) Definiti o functie numita dist::Punct->Punct->Float care calculeaza
distanta intre doua puncte din plan reprezentate prin valori de tip
Punct.
g) Scrieti o functie care primeste ca argument 3 valori de tip Punct si
intoarce aria triunghiului format de ele.
h) Scrieti un program prin care se preia de la tastatura, element cu
element o valoare de tip Poligon (lista reprezentand coordonatele
varfurilor unui poligon)-pana cand se tasteaza sirul vid si care
returneza aria acestui poligon.
i) Definiti o functie care stabileste daca un anumit punct se gaseste pe
una din laturile unui poligon.
15. Sa se scrie un program Haskell respectand urmatoarele cerinte:
a. Mai intai, se va afisa un mesaj pentru utilizator prin care i se solicita
introducerea de la tastatura a unei relatii sub forma unei liste avand
tipul [(Int,Int)].
b. Programul va stabili daca aceasta relatie este una de echivalenta sau de
ordine si va afisa pe ecran rezultatul obtinut
Va fi necesar sa definiti functii care sa determine inversa unei relatii,
compunerea a doua relatii, daca o relatie este inclusa in alta relatie,
daca doua relatii sunt egale.
Pentru a stabili daca o relatie este reflexiva, simetrica, antisimetrica
sau tranzitiva, va sugeram sa folositi cele mai adecvate caracterizari
ale acestor proprietati.

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