Setul 1

Exerciții propuse

Curs

Exercițiul 1: Rotunjirea numerelor

Ocaml dispune de funcția standard truncate : float -> int (nume echivalent: int_of_float) care trunchiază partea zecimală a unui număr real.

Există de asemenea funcția de conversie float_of_int (echivalent mai scurt: float) care convertește un întreg la real (utilă pentru a face aritmetică între întregi și reali).

a) Scrieți o funcție round : float -> int care rotunjește un real la cel mai apropiat întreg.

Dacă partea zecimală e 0.5, rotunjiți numărul în direcția opusă lui zero: round (-. 0.5) = -1, round 1.5 = 2.

Atenție, funcția trebuie să funcționeze corect pentru numere pozitive și negative.

Operatorii pentru numere reale se scriu cu punct: +. -. *. /. (ca și constantele reale).

(opțional) b) Scrieți o funcție care rotunjește un număr real la două zecimale, folosind definiția de mai sus.

Exercițiul 2

Câte funcții de pe o mulțime cu 3 elemente pe o mulțime cu 3 elemente nu sunt injective ? Argumentați cât mai simplu răspunsul.

Exercițiul 3

a) Compunerea a două funcții injective e injectivă? Demonstrați.

b) Invers, dacă f ⚪ g e injectivă, rezultă că f și g sunt injective? Demonstrați sau dați un contraexemplu.

Indicație: E util să faceți o figură cu compunerea (v. curs p.27). Pot exista puncte neacoperite în codomeniul uneia din funcții? Cum pot influența ele răspunsul?

Exercițiul 4: Compunerea funcțiilor

La curs, am definit

let comp f g x = f (g x) (* compunerea functiilor *) let appl2 f = comp f f (* f compusă cu ea însăși *)

sau în notație matematică: appl2 f = f ⚪ f

Putem arăta, expandând definiția, că appl2 appl2 reprezintă compunerea de 4 ori (am subliniat termenul înlocuit conform definiției la fiecare pas de transformare):

appl2 appl2 f

= comp appl2 appl2 f

= appl2 (appl2 f)

= appl2 (f ⚪ f)

= (f ⚪ f) ⚪ (f ⚪ f)

= f ⚪ f ⚪ f ⚪ f

Considerați următoarele definiții:

let appl3 f = comp f (appl2 f) let appl23c f = comp appl2 appl3 f let appl32c f = comp appl3 appl2 f

Explicați, expandând definițiile (pe hârtie) ce reprezintă fiecare din funcțiile definite.

Verificați pe calculator rezultatul, aplicând fiecare din ele funcției f(x)=2*x+1 în punctul x=0.

Laborator

Exercițiul 1 Scrieți o funcție care ia ca parametri trei întregi a, b, c și tipărește soluțiile ecuației de gradul doi ax2+bx+c=0, sau un mesaj dacă nu există soluții reale. Folosiți funcția predefinită sqrt : float -> float pentru rădăcina pătrată și nu uitați conversiile de la întreg la real unde sunt necesare. Folosiți secvențierea când trebuie tipărite două soluții.

Exercițiul 2 Scrieți o funcție care returnează minimul/maximul a trei valori date ca parametri. Folosiți funcțiile predefinite min respectiv max care funcționează cu orice valori de același tip. Remarcați tipul funcției scrise și verificați că funcționează și cu întregi și cu reali (și chiar cu șiruri), însă nu cu un amestec.

Exercițiul 3 Scrieți o funcție care determină dacă un an (întreg) dat ca parametru e bisect, returnând un boolean. Dacă un an e bisect sau nu se poate determina după următoarele reguli (va trebui sa le reformulați sau reordonați pentru a scrie funcția):

a) un an divizibil la 4 e bisect, altfel nu

b) prin excepție de la a), anii divizibili cu 100 nu sunt bisecți

c) prin excepție de la b), anii divizibili cu 400 sunt bisecți

Exercițiul 4 Mediana

Scrieți o funcție care calculează mediana a trei valori (valoarea aflată între celelalte două).

Încercați să scrieți cod cât mai simplu, și să nu-l repetați. Puteți folosi o funcție auxiliară care calculează mediana a trei numere, pentru care știm că primul e mai mic sau egal decât al doilea.

Exercițiul 5

În matematică, am extins uneori operatorul + de la numere la funcții, defining funcția f + g prin relația (f + g)(x) = f(x) + g(x)

a) Definiți în ML o funcție care ia ca parametru două funcții f și g și returnează funcția definită ca suma lor prin relația de mai sus.

b) Scrieți o funcție mai generală, care primește ca parametru și operatorul binar (o funcție de două argumente) care e aplicată (valorilor) celor două funcții. Verificați că o puteți folosi cu operatorul (+) și ( *) pentru a calcula suma și produsul.

În scrierea operatorului ( *) trebuie un spațiu între ( și * pentru a nu fi interpretat ca și comentariu. În ML, comentariile sunt încadrate între (* și *).

REZOLVARI

Rezolvare curs

Rezolvare laborator C++

1)

Rezolvarea ecuatiei de gradul al doilea

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

cout << "Rezolvarea ecuatiei de gradul al doilea" << endl;

float a,b,c,d,x1,x2;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

cout<<"c=";cin>>c;

if(a!=0&&b!=0)

{

{d=b*b-4*a*c;

}

if(d>=0)

{x1=(-b+sqrt(d))/(2*a);

x2=(-b-sqrt(d))/(2*a);

cout<<"x1="<<x1<<endl;

cout<<"x2="<<x2<<endl;

}

else

if(d<0)

{cout<<"Ecuatia nu are solutii in R.";

}

}

if (a==0&&b==0&&c==0)

{cout<<"Ecuatia are o infinitate de solutii!";

}

else

if(a==0&&b==0)

{cout<<"Ecuatia nu are solutii!";

}

else

if(a==0)

{if(c!=0)

{x1=-b/c;

cout<<"x="<<x1;

}

else

cout<<"Ecuatia nu are solutii!";

}

else

if(b==0)

{if(-c/a>=0&&c!=0)

{x1=sqrt(-c/a);

cout<<"x="<<x1;

}

else

if(c==0)

{cout<<"x=0";

}

else

{cout<<"Ecuatia nu are solutii!";

}

}

return 0;

}

2)

#include <iostream>

using namespace std;

int minim(int a, int b, int c)

{

if(a>b)

if(b>c)

return c;

else

return b;

else

if(a>c)

return c;

else

return a;

}

int maxim(int a, int b, int c)

{

int max;

if(a>b)

max=a;

else

max=b;

if(c>max)

max=c;

return max;

}

int main()

{

cout << "Hello world!" << endl;

int a,b,c;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

cout<<"c=";cin>>c;

cout<<minim(a,b,c)<<" "<<maxim(a,b,c);

return 0;

}

3)

#include <iostream>

using namespace std;

int bisect(int a)

{

if(a%4==0)

if(a%100==0)

if(a%400==0)

return 1;

else

return 0;

else

return 1;

else

return 0;

}

int main()

{

cout << "Hello world!" << endl;

int a;

cout<<"an=";cin>>a;

cout<<bisect(a);

return 0;

}

4)

#include <iostream>

using namespace std;

int mediana(int a, int b, int c)

{

if(a>b)

if(c>a)

return a;

else

if(b>c)

return b;

else

return c;

else

if(c>b)

return b;

else

if(a>c)

return a;

else

return c;

}

int main()

{

cout << "Hello world!" << endl;

int a,b,c;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

cout<<"c=";cin>>c;

cout<<'\n'<<mediana(a,b,c);

return 0;

}

Rezolvare laborator ML

Exercitiul 1

open Printf

let delta a b c = b*. b -. 4. *. a *. c;;

let sol a b c =

let d = delta a b c in (

if d <0. then

(printf "Nu exista solutii")

else (if d=0.

then (printf "Solutia este: %f" ((-.b)/.(2.*.a)) )

else (printf "Solutiile sunt:\n";

printf "%f "(((-.b)+.sqrt d)/.(2.*.a));

printf "%f "(((-.b)-.sqrt d)/.(2.*.a)) )

)

);;

Exercitiul 2

let maxim a b c =

let m = max a b in

(

max m c

);;

let minim a b c =

let m = min a b in

(

min m c

);;

Exercitiul 3

let bisect x =

if x mod 4 = 0 then

(

if x mod 100 != 0 then true

else

(

if x mod 400 = 0 then true

else false

)

)

else false;;

Exercitiul 4

let aux a b c = if b<c then b

else

(

if c<a then a

else c

);;

let mediana a b c = if a<b then aux a b c

else aux b a c;;

Exercitiul 5

a)

let main f g x = (+) (f x) (g x);;

let f x = 2*x+1;;

let g x = 3*x;;

let suma = main f g;;

b)

let sum (f, g) x = (+) (f x) (g x);;

let prod (f, g) x = ( *) (f x) (g x);;