Documente Academic
Documente Profesional
Documente Cultură
Funcții
I. APLICAȚII LA DIVIZIBILITATE
Aplicație rezolvată 1. Se citește un număr n natural (n>1). Să se afișeze dacă este prim sau nu. Exemple: n =
17 => 17 e prim; n = 77 => 77 nu e prim
#include <stdio.h>
main()
{
int n, i, prim = 1;
printf("Dati numarul = ");
scanf("%d",&n);
for ( i = 2; i <= n - 1; ++i )
if ( n%i == 0 ){
prim = 0;
/* break; */
}
if ( prim )
printf("%d e prim\n", n);
else
printf("%d nu e prim\n", n);
}
Aplicație propusă 2. Îmbunătățiți programul de la Aplicația rezolvată 1 substituind limita n-1 a ciclului for cu
limitele n/2, respectiv n .
Aplicație propusă 3. Îmbunătățiți codul care testează că un număr este prim evitând valorile pare ale lui i din
testul de divizibilitate.
Aplicație propusă 4. Afișați toți divizorii unui număr n natural dat. Exemplu: n = 6
=> 1, 2, 3, 6. Indicație: Se parcurg cu un for() toți divizorii posibili pentru n (de la
1 la n) și se verifică dacă restul împărțirii lui n la ei este zero; în acest caz se afișează
divizorul respectiv.
Aplicație rezolvată 2. Afișați toți divizorii unui număr n natural dat cu un algoritm
mai eficient ca cel anterior parcurgând - pentru căutarea divizorilor - în locul
intervalului 1…n, intervalul 1…n/2. Exemplu: n = 6 => 1, 2, 3, 6.
#include <stdio.h>
main()
{
int n, i;
printf("Dati numarul = ");
scanf("%d",&n);
for ( i = 1; i <= n/2; ++i )
if ( n%i == 0 )
printf("%5d e divizor pt %d\n", i, n);
printf("%5d e divizor pt %d\n", n, n);
}
Aplicație propusă 5. Se dă un număr natural n. Să se afișeze descompunerea lui n în factori primi. Exemplu: n
= 360 => 2^3 * 3^2 * 5. Scrieți programul C corespunzător pseudocodului prezentat mai jos:
întreg n, d, p
citește n
d <- 2
cât timp n > 1 execută
dacă n%d = 0 atunci
p <- 0
cât timp n%d = 0 execută
p <- p + 1
n <- n/d
sfârşit cât timp
scrie d, “^”, p
sfârşit dacă
d <- d + 1
sfârșit cât timp
Aplicație propusă 6. Se dau două numere naturale nenule n și m. Să se calculeze cmmdc(n, m) folosind
scăderile repetate ale celui mai mic număr din cel mai mare. Exemplu: n = 36, m = 30 => cmmdc(36, 30)= 6.
Scrieți programul C corespunzător pseudocodului prezentat mai jos:
întreg n, m
citește n, m
cât timp n m execută
dacă n > m atunci
n <- n – m
altfel
m <- m – n
sfârșit dacă
sfârșit cât timp
scrie n
Aplicație propusă 7. Se dau două numere naturale nenule n și m. Să se calculeze cmmdc(n, m) folosind
algoritmul lui Euclid. Exemplu: n = 36, m = 30 => cmmdc(36, 30)= 6. Scrieți programul C corespunzător
pseudocodului prezentat mai jos:
întreg n, m, rest
citește n, m
cât timp m 0 execută
rest <- n%m
n <- m
m <- rest
sfârșit cât timp
scrie n
Aplicație propusă 8. Se dau două numere naturale nenule n şi m. Să se calculeze cmmmc(n, m). Exemplu: n =
36, m = 30 => cmmmc(36,30)= 180. Indicaţie: Dacă se cunoaşte cmmdc(n,m),
atunci: cmmmc(n, m) = (n * m) / cmmdc(n, m). Atenție la procesul de calcul a
cmmmc(n, m) care modifică valorile lui n și ale lui m.
2
II. APLICAȚII CU CONVERSII ÎNTRE BAZE DE NUMERAȚIE
Conversia din baza 10 în baza b: Se dă un număr n în baza 10. Să se convertească numărul în baza b (2 <= b
<= 9). Se folosește metoda împărțirilor succesive: Se împarte numărul dat n la baza b. Se reține restul, iar câtul
se împarte din nou la b. Procesul se repetă până când câtul devine 0. În acel moment se afișează resturile în
ordinea inversă obținerii lor. Exemple: 5(10) = 101(2); 10(10) = 12(8).
Aplicație propusă 9. Scrieți programul C corespunzător pseudocodului prezentat mai jos pentru conversia din
baza 10 în baza b (2 <= b <= 9) :
întreg n, b, nb, z
citeşte n, b
nb <- 0
z <- 1
cât timp n 0 execută
nb <- nb + z * (n%b)
n <- n/b
z <- 10 * z
sfârşit cât timp
scrie nb
Aplicație rezolvată 5. Se citește un număr n natural în baza 10. Să se afișeze cifrele sale începând cu cifra cea
mai puțin semnificativă ale reprezentării sale într-o bază oarecare b (2 <= b <= 9). b se citește pe intrare.
Exemplu: n = 9301, b = 8 => 5 2 1 2 2.
#include <stdio.h>
main()
{
int n, b , c;
printf("numarul = ");
scanf("%d",&n);
printf("baza = ");
scanf("%d",&b);
while( n != 0 ){
c = n % b;
printf("%d ",c);
n = n / b;
}
}
Aplicație propusă 10. Modificați codul Aplicației rezolvate 5 care citește un număr n natural în baza 10 și
afișează cifrele sale începând cu cifra cea mai puțin semnificativă ale reprezentării sale într-o bază oarecare b;
3
astfel încât pentru cifrele mai mari decât 9 ale bazelor mai mari decât 10, programul să afișeze corect cifrele A
pentru 10, B pentru 11 ş.a.m.d.
Aplicație rezolvată 6. Se citește un număr n natural în baza 8. Să se afișeze cifrele sale începând cu cifra cea
mai puțin semnificativă ale reprezentării sale într-o bază oarecare b. b se citește pe intrare.
#include <stdio.h>
main()
{
int n, b, c;
printf("numarul = ");
scanf("%o",&n);
printf("baza = ");
scanf("%d",&b);
while( n != 0 ){
c = n % b;
if( c < 10 )
printf("%d ", c);
else
printf("%c ", c+55);
n = n / b;
}
}
Aplicație rezolvată 7. Se citește un număr n natural în baza 16. Să se afișeze cifrele sale începând cu cifra cea
mai puțin semnificativă ale reprezentării sale într-o bază oarecare b. b se citește pe intrare.
#include <stdio.h>
main()
{
int n, b, c;
printf("numarul = ");
scanf("%x",&n);
printf("baza = ");
scanf("%d",&b);
while( n != 0 ){
c = n % b;
if( c < 10 )
printf("%d ",c);
else
printf("%c ",c+55);
n = n / b;
}
}
Aplicație rezolvată 8*: Program de conversie a părții zecimale din baza 10 într-o bază oarecare (2, 8, 16)
Pentru numere reale conversia se face în doi pași. Întâi se convertește partea întreagă, apoi se convertește partea
zecimală și în final se reunesc. Conversia părții zecimale a unui număr din baza 10 în altă bază se realizează
înmulțind repetat baza în care facem conversia cu partea zecimală, eliminând și reținând de fiecare dată partea
întreagă a rezultatului. Șirul cifrelor reținute în ordinea obținerii lor reprezintă partea fracționară convertită.
Teoretic ar trebui să ne oprim atunci când partea fracționară a rezultatului înmulțirii cu baza este zero. De
obicei, calculele se opresc la obținerea unui număr de cifre la partea fracționară numit precizia de reprezentare.
Exemplu: conversia din baza 10 în baza 16 a numărului real 0,123(10) furnizează partea fracționară 0,1F7CE(16)
#include <stdio.h>
main()
{
int b, p, i = 0, prec;
/* prec este precizia */
/* i pasii pentru gasirea celor prec cifre */
/* b este baza in care se face conversia din baza 10 */
/* p sunt cifrele partii zecimale ale reprezentarii in baza b */
float f, s;
f = 0.123; /* numarul zecimal dat, poate fi citit cu scanf */
4
b = 16; /* baza poate fi 2, 8, 16 */
prec = 5;
while (i < prec) {
s = b * f;
printf("%10.6f ",s);
p = (int)s;
f = s - p;
++i;
if ( p < 10)
printf("%d\n", p);
else
printf("%c\n", p + 55);
}
printf("\n");
}
III. FUNCŢII
Aplicație propusă 11. Rescrieți programul de mai jos, de conversie a temperaturilor din scala Fahrenheit în
scala Celsius, utilizând o funcție pentru conversie.
#include <stdio.h>
main()
{
float fahr, celsius;
float lower, upper, step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr - 32.0); /* se va substuitui cu apelul de functie */
printf("%3.0f %6.1f\n", fahr, celsius);
fahr = fahr + step;
}
}
Aplicație rezolvată 9. Scrieți un program care apelează o funcție care calculează diferența a două numere reale.
#include <stdio.h>
float scad(float, float);
main()
{
float x, y, dif;
x = 3.25;
y = 4.05;
dif = scad(x, y);
printf("%g - %g = %g\n", x, y, dif);
}
float scad(float a, float b)
{
float s;
s = a - b;
return s;
}
Aplicație rezolvată 10. Scrieți un program care conține o funcție power(m,n) pentru a ridica
un întreg m la o putere întreagă pozitivă n. Adică valoarea returnată de power(2,5) este 25 =
32. Programul afișează trei coloane: pe prima numerele de la 0 la 9, pe a doua coloană 2 la
puterea valorii din prima coloană, iar pe a treia coloana -3 la puterea valorii din prima coloană.
#include <stdio.h>
int power(int base, int n);
int main()
{
5
int i;
Aplicație rezolvată 11. Rescrieți funcția power(m,n) pentru a ridica un întreg m la o putere întreagă pozitivă n.
Parametrul n este utilizat ca o variabilă temporară, el numărând înapoi în ciclul for până când devine zero; se
elimină necesitatea variabilei i. Tot ceea ce este făcut asupra lui n în interiorul funcţiei power nu are niciun
efect asupra argumentului n original cu care power a fost apelată.
/* power: raise base to n-th power; n >= 0; version 2 */
int power(int base, int n)
{
int p;
for (p = 1; n > 0; --n)
p = p * base;
return p;
}
Aplicație propusă 12. Rescrieți programul de mai jos al testării unui număr dacă este prim sau nu, folosind o
funcție pentru testul de număr prim.
#include <stdio.h>
int main() /* testul de numar prim */
{
int n, i, prim = 1;
printf("Introduceti nr care trebuie testat ca e prim\n");
scanf("%d",&n);
for ( i = 2; i <= n - 1; ++i ){
if ( n%i == 0 ){
prim = 0;
/* break; */
}
}
if ( prim )
printf("%d e prim\n", n);
else
printf("%d nu e prim\n", n);
return 0;
}
Aplicație propusă 13. Scrieți un program care conține o funcție pentru afișarea tuturor
divizorilor unui număr n natural dat, funcție care spune și câți divizori are numărul .
Exemplu: n = 6 => 1, 2, 3, 6, are 4 divizori.
Aplicație propusă 15. Scrieți un program care conține o funcție pentru calcularea cmmdc(n, m) cu n și m
numere naturale folosind algoritmul lui Euclid. Exemplu: n = 36, m = 30 => cmmdc(36, 30)= 6.
6
Aplicație propusă 16. Scrieți un program care conține o funcție pentru calcularea
cmmmc(n, m) cu n și m numere naturale. Exemplu: n = 36, m = 30 =>
cmmmc(36,30)= 180.
Aplicație propusă 17. Scrieți un program care conține o funcție pentru conversia unui număr natural din baza
10 în baza b (2 <= b <= 9). Exemple: 5(10) = 101(2); 10(10) = 12(8).
Aplicație propusă 18. Scrieți un program care conține o funcție pentru conversia unui număr nb dintr-o bază
oarecare b (2 <= b <= 9) în baza 10. Exemplu: nb = 177, b = 8
n = 1*82 + 7*81 + 7*80 = 127.
Aplicație rezolvată 12*. Programul următor citește o mulțime de linii de text și o afișează pe cea mai lungă.
Schița programului este destul de simplă:
while (este o linie nouă)
if (lungimea ei este mai mare decât a celei mai lungi linii anterioare)
salveaz-o
salvează-i lungimea
afişează cea mai lungă linie
O bucată a codului obține o line nouă, o alta o salvează, iar restul controlează procesul. Funcția getline
încărcă o linie nouă de pe intrare. Orice linie de text are cel puțin un caracter; chiar și o linie conținând numai
un caracter newline are lungimea 1. Când găsim o linie care este mai lungă decât cea mai lungă linie anterioară
o salvăm pe baza unei a doua funcții, copy, care copiază linia nouă la un loc sigur.
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
7
}
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
Aplicație rezolvată 13*. Corectați programul anterior astfel încât acesta să afișeze corect lungimea liniilor de
intrare arbitrar de lungi (adică și cele care depășesc valoarea lui MAXLINE) și, cât de mult este posibil din textul
acestor linii.
Pentru a putea exemplifica am redus MAXLINE la valoarea 5.
#include <stdio.h>
#define MAXLINE 5 /* maximum input line length */
max = 0;
while ((len = get_line(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) {
printf("The longest line is:\n");
printf("%s\n", longest);
printf("The length of it is %d.\n", max);
}
return 0;
}
return i;
}
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
Aplicație rezolvată 14*. Scrieți un program care să afișeze toate liniile citite pe intrare care au mai mult de 5
caractere.
#include <stdio.h>
#define MAXLINE 1000
#define MAXLENGTH 5
int main(void)
{
int len; /* current line length */
char line[MAXLINE]; /* current input line */
return 0;
}
return l;
}
Aplicaţie rezolvată 15*. Scrieţi un program care să îndepărteze spaţiile albe (blank-uri şi taburi) de la finalul
liniilor (trailing whitespaces), îndepărtând complet liniile fără conţinut.
#include <stdio.h>
#define MAXLINE 1000
return 0;
9
}
return l;
}
Aplicație propusă 20*. Scrieți o funcție reverse(s) care inversează șirul de caractere s. Utilizați
această funcție pentru a scrie un program care inversează linie cu linie intrarea sa.
Constanta enumerare
O enumerare este o listă de valori întregi constante. Primul nume într-un enum are valoarea 0, următorul
are valoarea 1 ş.a.m.d. dacă nu sunt specificate nişte valori explicite. Dacă nu sunt specificate toate valorile,
valorile nespecificate continuă progresia de la ultima valoare specificată.
Aplicație rezolvată 16. Programul următor exemplifică utilizarea enumerărilor, un mod convenabil de a asocia
valori constante cu nume. Numele (JAN, FEB etc.) care apar în enumerări trebuie să fie distincte. Valorile (1, 1, 2
etc.) nu trebuie să fie distincte, deși de obicei sunt. Dacă nu sunt specificate niște valori explicite primul nume
într-un enum are valoarea 0, următorul are valoarea 1 ş.a.m.d.
#include <stdio.h>
int main()
{
enum months { JAN = 1, FEB = 1, MAR = 1, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
printf("JAN=%d,FEB=%d,MAR=%d, APR=%d \n", JAN, FEB, MAR, APR);
return 0;
}
10
REZOLVĂRI
Aplicație propusă 1. Modificați programul de la Aplicație rezolvată 1 astfel încât să funcționeze pentru orice
n natural.
#include <stdio.h>
main()
{
int n, i, prim = 1;
printf("Dati numarul = ");
scanf("%d",&n);
if( n == 0 || n == 1 )
prim = 0;
else
for ( i = 2; i <= n - 1; ++i )
if ( n%i == 0 ){
prim = 0;
/* break; */
}
if ( prim )
printf("%d e prim\n", n);
else
printf("%d nu e prim\n", n);
}
Aplicație propusă 2. Îmbunătățiți programul de la Aplicație rezolvată 1 substituind limita n-1 a ciclului for cu
limitele n/2, respectiv n .
#include <stdio.h>
#include <math.h>
main()
{
int n, i, prim = 1;
printf("Dati numarul = ");
scanf("%d",&n);
for ( i = 2; i <= sqrt(n); ++i )
if ( n%i == 0 ){
prim = 0;
/* break; */
}
if ( prim )
printf("%d e prim\n", n);
else
printf("%d nu e prim\n", n);
}
Aplicație propusă 3. Îmbunătățiți codul care testează că un număr este prim evitând valorile pare ale lui i din
testul de divizibilitate.
#include <stdio.h>
#include <math.h>
main()
{
int n, i, prim = 1;
printf("Dati numarul = ");
scanf("%d",&n);
if ( ( n%2 == 0 && n != 2) || ( n < 2 ) )
prim = 0;
else
for ( i = 3; i <= sqrt(n); i = i + 2 )
if ( n%i == 0 ){
prim = 0;
11
break;
}
if ( prim )
printf("%d e prim\n", n);
else
printf("%d nu e prim\n", n);
}
Aplicație propusă 6. Se dau două numere naturale nenule n şi m. Să se calculeze cmmdc(n, m) folosind metoda
scăderilor repetate a celui mai mic număr din cel mai mare.
#include <stdio.h>
main()
{
int n, m, x, y;
12
Aplicație propusă 7. Se dau două numere naturale nenule n și m. Să se calculeze cmmdc(n, m) folosind
algoritmul lui Euclid.
#include <stdio.h>
main()
{
int n, m, x, y, rest;
Aplicație propusă 8. Se dau două numere naturale nenule n şi m. Să se calculeze cmmmc(n, m).
#include <stdio.h>
main()
{
int n, m, x, y, rest;
Aplicație propusă 9. Programul C pentru conversia din baza 10 în baza b (2 <= b <= 9):
#include <stdio.h>
main()
{
int n, b, nb, z, temp;
printf("Numarul in baza 10 = ");
scanf("%d",&n);
printf("Baza in care se face conversia = ");
scanf("%d",&b);
temp = n;
nb = 0;
z = 1;
while ( temp != 0 ){
nb = nb + z * (temp%b);
temp = temp/b;
z = z * 10;
}
printf("%d convertit in baza %d = %d", n, b, nb);
}
13
Aplicație propusă 10. Modificați codul Aplicației rezolvate 5 care citește un număr n natural în baza 10 și
afișează cifrele sale începând cu cifra cea mai puțin semnificativă ale reprezentării sale într-o bază oarecare b,
astfel încât pentru cifrele mai mari decât 9 ale bazelor mai mari decât 10, programul să afișeze corect cifrele A
pentru 10, B pentru 11 ş.a.m.d.
#include <stdio.h> /* varianta cu printf continand operatorul conditional */
main() #include <stdio.h>
{ main()
int n, b , c; {
printf("numarul = "); int n, b, c;
scanf("%d",&n); printf("numarul = ");
printf("baza = "); scanf("%d",&n);
scanf("%d",&b); printf("baza = ");
while( n != 0 ){ scanf("%d",&b);
c = n % b; while( n != 0 ){
if( c < 10 ) c = n % b;
printf("%d ",c); printf(c < 10 ? "%d " : "%c ", c < 10 ? c : c + 55);
else n = n / b;
printf("%c ",c + 55); }
n = n / b; }
}
}
Aplicație propusă 11. Rescrieți programul de conversie a temperaturilor din scala Fahrenheit în scala Celsius,
utilizând o funcție pentru conversie.
#include <stdio.h>
float ftoc(float fahr);
int main(void)
{
float fahr, celsius;
float lower, upper, step;
lower = 0; /* lower limit of temperatuire scale */
upper = 300; /* upper limit */
step = 20; /* step size */
fahr = lower;
return 0;
}
Aplicație propusă 12. Rescrieți programul testării unui număr dacă este prim sau nu, folosind o funcție pentru
testul de număr prim.
#include <stdio.h>
int prim(int);
int main()
{
int n;
printf("Introduceti nr care trebuie testat ca e prim\n");
scanf("%d",&n);
if ( prim(n) )
printf("%d e prim\n", n);
else
14
printf("%d nu e prim\n", n);
return 0;
}
int prim(int n)
{
int i;
for ( i = 2 ; i <= n - 1 ; ++i )
if ( n%i == 0 )
return 0;
return 1;
}
Aplicație propusă 13. Scrieți un program care conține o funcție pentru afișarea tuturor divizorilor unui număr
n natural dat, funcție care spune și câți divizori are numărul.
#include <stdio.h>
int divizori(int);
int main()
{
int n, i;
i = divizori(n);
printf("%d are %d divizori\n", n, i);
return 0;
}
int divizori(int n)
{
int i, k;
k = 0;
for ( i = 1; i <= n; ++i )
if ( n%i == 0 ){
printf("%5d e divizor pt %d\n", i, n);
++k;
}
return k;
}
Aplicație propusă 14. Scrieți un program care conține o funcție pentru calcularea cmmdc(n, m) cu n și m
numere naturale folosind scăderile repetate ale celui mai mic număr din cel mai mare.
#include <stdio.h>
int main()
{
int n, m, d;
d = cmmdc(n, m);
printf("\ncmmdc(%d, %d) = %d ", n, m, d);
return 0;
}
15
int cmmdc(int x, int y)
{
while ( x != y )
if ( x > y )
x = x - y;
else
y = y - x;
return x;
}
Aplicație propusă 15. Scrieți un program care conține o funcție pentru calcularea cmmdc(n, m) cu n și m
numere naturale folosind algoritmul lui Euclid.
#include <stdio.h>
int main()
{
int n, m, d;
d = cmmdc(n, m);
printf("\ncmmdc(%d, %d) = %d ", n, m, d);
return 0;
}
return x;
}
Aplicație propusă 16. Scrieți un program care conține o funcție pentru calcularea cmmmc(n, m) cu n și m
numere naturale.
#include <stdio.h>
int main()
{
int n, m;
long c;
c = cmmmc(n, m);
printf("\ncmmmc(%d, %d) = %ld ", n, m, c);
return 0;
}
16
long cmmmc(int x, int y)
{
long p;
int rest;
p = x * y;
while ( y != 0 ){
rest = x%y;
x = y;
y = rest;
}
return p / x;
}
Aplicație propusă 17. Scrieți un program care conține o funcție pentru conversia unui număr natural din baza
10 în baza b (2 <= b <= 9).
#include <stdio.h>
int main()
{
int n, b, nb;
return 0;
}
nb = 0;
z = 1;
while ( n != 0 ){
nb = nb + z * (n%b);
n = n/b;
z = z * 10;
}
return nb;
}
Aplicație propusă 18. Scrieți un program care conține o funcție pentru conversia unui număr nb dintr-o bază
oarecare b (2 <= b <= 9) în baza 10.
#include <stdio.h>
int main()
{
int n, b, nb;
printf("Numarul nb = ");
scanf("%d",&nb);
printf("Baza din care se face conversia = ");
scanf("%d",&b);
n = convb10(nb, b);
17
printf("%d convertit din baza %d in baza 10 = %d", nb, b, n);
return 0;
}
n = 0;
z = 1;
while( nb != 0 ){
n = n + z * (nb%10);
nb = nb/10;
z = b * z;
}
return n;
}
Aplicație propusă 19. Același enunț ca la Aplicația rezolvată 5, dar se cere în plus să vizualizăm eliminarea
spațiilor albe de la finalul liniilor, astfel încât la afișare liniile să fie postfixate cu simbolul # (plasat înainte de
’\n’ şi ’\0’).
#include <stdio.h>
#define MAXLINE 1000
int main(void)
{
int len; /* lungimea curenta a liniei */
char line[MAXLINE]; /* sirul care stocheaza linia curenta */
return 0;
}
Aplicație propusă 20. Scrieți o funcție reverse(s) care inversează șirul de caractere s. Utilizați această
funcție pentru a scrie un program care inversează linie cu linie intrarea sa.
#include <stdio.h>
#define MAXLINE 20
18
int getline(char line[], int maxline);
void reverse(char s[]);
int main(void)
{
int len; /* lungimea curenta a liniei */
char line[MAXLINE]; /* sirul care stocheaza linia curenta */
return 0;
}
19