Pentru fisierele sursa cu rezolvarile, verificati arhiva.
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p01.c.html
/*
* Problema 1
*/
// Pentru functiile pe care le vom folosi in program, trebuie sa
// includem biblioteci suplimentare astfel:
// 1) pentru a putea folosi functia printf() vom include:
# include <stdio.h>
// 2) pentru a putea folosi functiile srand() si rand() vom include:
# include <stdlib.h>
int main()
{
// Atentie!! In ANSI C, declaratiile de variabile nu se pot face in
// interiorul buclelor (de exemplu, la bulca "for").
int i;
// Trebuie sa initializam generatorul de numere aleatoare cu o valoare.
// Am ales in acest exemplu ca acea valoare sa fie "0". De obicei, in
// practica se foloseste timpul local in secunde (ca sa fie diferit de
// la o rulare la alta)
srand(0);
for (i = 0; i < 5; i++) {
// Pentru a trece pe linia urmatoare, afisam caracterul "\n",
// care se numeste "newline", din motive evidente.
// Observatie: functia printf() returneaza valori, deci putem
// sa afisam efectiv rezultatul intors de apelul functiei
// rand(), fara sa folosim variabile auxiliare.
printf("%d %d %d\n", rand(), rand(), rand());
}
// Orice program care are functia main de tipul <int> si a carui
// executie se incheie fara erori trebuie sa intoarca valoarea "0",
// prin conventie. (motivul il veti afla mai tarziu la USO)
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p02.c.html
/*
* Problema 2
*/
// Includem biblioteca <stdio.h> pentru a avea functiile scanf() si printf()
# include <stdio.h>
int main()
{
float a, b, c;
// Atentie! In stringurile de format pe care le primeste scanf() nu
// trebuie - in marea majoritate a cazurilor - sa introduceti altceva
// in afara de specificatorii de format (ca de exemplu, spatii).
// De asemenea, numele variabilelor ce vor fi citite trebuie precedat de
// caracterul "&" - numit si "ampersand".
scanf("%e%f%g", &a, &b, &c);
// Prin comparatie, stringul de format primit de printf() poate contine
// orice caractere, si doar specificatorii de format vor fi inlocuiti,
// in ordinea in care sunt intalniti, cu valorile variabilelor din
// lista care urmeaza.
printf("%e %f %g\n", a, b, c);
// Nu uitati sa intoarceti valoarea "0" la iesirea din functia main()!
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p03.c.html
/*
* Problema 3
*/
// Pentru a avea functiile printf() si scanf():
# include <stdio.h>
// Pentru a avea functiile sin() si cos(), si valoarea lui "pi":
# include <math.h>
int main()
{
// Valoarea constantei "pi" este data - pana la o anumita precizie - in
// macrodefinitia M_PI din biblioteca <math.h>
double x, PI = M_PI;
// Pentru a afisa un tabel, vom afisa datele linie cu linie, avand grija
// ca ele sa fie aliniate unele sub altele astfel incat sa cream
// impresia vizuala a unui tabel. Aceeasi conventie o va respecta si
// capul de tabel.
printf(" x sin(x) cos(x)\n" );
for(x = 0; x <= 2 * PI; x = x + PI / 20) {
// Pentru semnificatia specificatorilor de format, recapitulati
// din laborator/curs partea teoretica de la afisare.
printf( "%+2.3lf %+2.3lf %+2.3lf\n", x, sin(x), cos(x));
}
// Pentru ca functia main() s-a incheiat cu succes:
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p04.c.html
/*
* Problema 4
*/
# include <stdio.h>
int main()
{
float x, y;
scanf("%f%f", &x, &y);
// Verificam intai daca nu cummva punctul este pe una din axe:
if (x == 0 || y == 0) {
// Daca e pe axe, atunci afisam mesajul si am terminat:
printf("Punct pe axe");
} else {
// In acest moment stim SIGUR ca nu este pe axe si verificam
// daca nu cumva este deasupra axei Ox
if (x > 0) {
// Mai ramane de verificat pozitia in raport cu Oy
if (y > 0)
printf("Cadranul 1");
else
printf("Cadranul 4");
} else {
// In acest moment stim SIGUR ca nu este deasupra axei
// Ox si verifica pozitia in raport cu Oy
if (y > 0)
printf("Cadranul 2");
else
printf("Cadranul 3");
}
}
// Incheierea cu succes a functiei main()
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p05.c.html
/*
* Problema 5
*/
#include <stdio.h>
int main()
{
int a, b, c;
// Nu uitati sa nu introduceti caractere suplimentare pe langa
// specificatorii de format in scanf()
scanf("%d%d%d", &a, &b, &c);
// Trei numere intregi pot forma laturile unui triunghi doar daca suma a
// ORICARE doua dintre ele este mai mare sau egala cu alt treilea
// (cazul de egalitate reprezinta un triunghi denaturat). Asta
// inseamna:
// (c + b >= a && a + c >= b && a + b >= c)
// sau daca negam expresia de mai sus se obtine conditia sa NU formeze
// triunghi:
// (a > b + c || b > a + c || c > a + b)
// De exemplu, am ales sa folosim a doua varianta:
if (a > b + c || b > a + c || c > a + b)
printf("NU");
else
printf("DA");
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p06.c.html
/*
* Problema 6
*/
// Pentru a avea functiile scanf() si printf():
# include <stdio.h>
int main()
{
// a, b si c - laturile triunghiului
int a, b, c;
// asq, bsq si csq - patratele acestor laturi
int asq, bsq, csq;
// Ipoteze despre triunghi: (0 = fals) si (1 = adevarat)
// La inceput le vom presupune pe toate false
int drept = 0, isoscel = 0, echilateral = 0;
scanf("%d%d%d", &a, &b, &c);
// Verificam ca cele trei numere formeaza intr-adevar, un triunghi
if (a > b + c || b > a + c || c > a + b) {
// Daca NU, atunci termina programul!
return 0;
} else {
// Verificam prin teorema lui Pitagora daca exista un unghi
// drept in triunghi.
asq = a * a;
bsq = b * b;
csq = c * c;
if (asq + bsq == csq || asq + csq == bsq || bsq + csq == asq)
drept = 1;
// Verificam daca triunghiul este echilateral (evident, posibil
// doar daca nu este deja dreptunghic)
if (drept != 1 && (a == b && b == c))
echilateral = 1;
// Observatie: operatorul logic SI (&&) isi evalueaza operanzii
// de la stanga la dreapta, iar daca o conditie este false,
// restul de operanzi nu se mai evalueaza (deja stim ca
// rezultatul va fi fals)
// Verificam daca triunghiul este isoscel (evident, doar daca nu
// este deja echilateral)
if (echilateral != 1 && (a == b || b == c || a == c))
isoscel = 1;
// Afisarea concluziilor
if (drept == 1) {
printf ("dreptunghic\n");
} else if (echilateral == 1) {
printf ("echilateral\n");
} else if (isoscel == 1) {
printf ("isoscel\n");
} else {
printf ("oarecare\n");
}
}
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p07.c.html
/*
* Problema 7
*/
# include <stdio.h>
int main()
{
int a, b, c, d, min, max;
scanf ("%d%d%d%d", &a, &b, &c, &d);
// Aflam mai intai maximul dintre "a" si "b" si il stocam in variabila
// "max", apoi verificam pe rand daca nu cumva "c" si "d" sunt mai mari
// si in caz afirmativ, actualizam valoarea pe care o consideram noi
// maxima.
if (a>b)
max = a;
else
max = b;
if (c>max) max = c;
if (d>max) max = d;
// Pentru aflarea minimului se procedeaza analog.
if (a<b)
min = a;
else
min = b;
if (c<min) min = c;
if (d<min) min = d;
// Afisarea concluziilor (Observatie: am afisat doua linii consecutive
// cu un singur apel de functie printf(), inserand la locul potrivit
// caracterul "\n", care are rolul de a trece pe linia urmatoare.
printf("Minimul este: %d\nMaximul este: %d\n", min, max);
// Nu uitati ca executia cu succes inseamna intoarcerea valorii 0 in
// main()!
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p08.c.html
/*
* Problema 8
*/
// Pentru a avea functiile scanf() si printf()
#include <stdio.h>
int main()
{
int a, b, c, aux;
scanf("%d%d%d", &a, &b, &c);
// Vom sorta cele trei numere prin interschimbari. Intai urmarim sa
// aducem in variabila "a" minimul dintre cele trei numere.
if (a>b) {
aux = a;
a = b;
b = aux;
}
if (a>c) {
aux = a;
a = c;
c = aux;
}
// In acest moment, in "a" avem valoarea minima. Verificam acum ca si
// "b" si "c" sa fie in ordinea corecta!
if (b>c) {
aux = b;
b = c;
c = aux;
}
// Observatie! Metoda de sortare folosita mai sus este de fapt o
// defasurare pas cu pas a algoritmului de sortare "Bubble Sort".
// Pentru mai multe detalii despre aceasta metoda de sortare, puteti
// verifica, de exemplu pagina algoritmului de pe wikipedia:
//
// http://en.wikipedia.org/wiki/Bubble_sort
// Afisam numerele in ordine:
printf("Numerele sortate: %d, %d, %d\n", a, b, c);
// Nu uitati sa intoarceti valoarea 0 in main()!
return 0;
}
~/Desktop/working/pc-materiale/Rezolvari/2010_2011/lab2/rezolvari2p09-10.c.html
/*
* Problema 9 + 10
*/
// Pentru a avea functiile scanf() si printf()
#include <stdio.h>
int main()
{
// Variabilele in care sa retinem ORA, MINUTUL si SECUNDA
int h, m, s;
// Citim ora (si verificam ca a fost citita corect)
if (scanf("%d", &h) != 1) {
// Exemplu de situatie in care functia main() ar putea sa
// introduca o valoare diferita de 0: caz de eroare, care poate
// fi interpretat la nevoie sau poate fi ignorat. In orice caz,
// se incheie executia programului.
printf("Ora a fost introdusa eronat.\n");
return 1;
}
// Testam ora: s-a citit un intreg, dar este el corect?
if (h < 0 || h > 23) {
// Intoarcem un alt cod de eroare (ce poate fi interpretat sau
// ignorat de un al program din exterior)
printf("Ora trebuie sa fie in intervalul 0..23\n");
return 11;
}
// Procedam analog pentru minute
if (scanf("%d", &m) != 1) {
// De data aceasta intoarcem un alt cod de eroare, pentru a face
// distinctie intre sursele diferite de erori.
printf("Minutul a fost introdus eronat.\n");
return 2;
}
// Testam minutul: s-a citit un intreg, dar este el corect?
if (m < 0 || m > 59) {
printf("Minutul trebuie sa fie in intervalul 0..59\n");
return 22;
}
// Procedam analog pentru secunde
if ( scanf("%d", &s) != 1) {
printf("Secunda a fost introdusa eronat.\n");
return 3;
}
// Testam secunda: s-a citit un intreg, dar este el corect?
if (s < 0 || s > 59) {
printf("Secunda trebuie sa fie in intervalul 0..59\n");
return 33;
}
// Daca am ajuns aici, inseamna ca toate datele au fost citite corect
// (au fost introduse numere intregi in intervalele corect) si afisam
// ora in formatul HH:MM:SS (fiecare cifra pe doua pozitii):
printf("%02d:%02d:%02d\n", h, m, s);
return 0;
}