Sunteți pe pagina 1din 19

PCLP. Laborator 4: Aplicații cu numere și tablouri de caractere.

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ă 1. Modificați programul de la Aplicație rezolvată 1


astfel încât să funcționeze pentru orice n natural.

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 rezolvată 3. 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/2, intervalul 1… n şi observând că dacă i este divizor
pentru n, atunci şi n/i este divizor pentru n.
#include <stdio.h>
#include <math.h>
main()
{
int n, i;
printf("Dati numarul = ");
scanf("%d",&n);
for ( i = 1; i <= sqrt(n); ++i )
if ( n%i == 0 ) {
printf("%5d e divizor pt %d\n", i, n);
if ( n/i != i ) /* daca n e patrat perfect */
printf("%5d e divizor pt %d\n", n/i, 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

Conversia din baza b în baza 10


Aplicație rezolvată 4. Se dă un număr nb în baza b (2 <= b <= 9) să se convertească numărul în baza 10.
Pentru conversie se înmulțește fiecare cifră a lui nb cu baza ridicată la o putere corespunzătoare poziției pe care
o ocupă cifra în număr. Cifra unităților se înmulțește cu baza b la puterea 0 ş.a.m.d. Exemplu: nb = 177, b = 8
n = 1*82 + 7*81 + 7*80 = 127.
#include <stdio.h>
main()
{
int n, b, nb, z;
printf("nb = "); scanf("%d", &nb);
printf("baza = "); scanf("%d", &b);
n = 0;
z = 1;
while( nb != 0 ){
n = n + z * (nb%10);
nb = nb/10;
z = b * z;
}
printf("n in baza 10 = %d\n", n);
}

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;

for (i = 0; i < 10; ++i)


printf("%d %d %d\n", i, power(2,i), power(-3,i));
return 0;
}
int power(int base, int n)
{/* power: raise base to n-th power; n >= 0 */
int i, p;
p = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}

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ă 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. Exemplu: n = 36, m = 30 => cmmdc(36,
30)= 6.

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.

IV. TABLOURI DE CARACTERE

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 */

int getline(char line[], int maxline);


void copy(char to[], char from[]);

main() /* print the longest input line */


{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */

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;
}

/* getline: read a line into s, return length */


int getline(char s[],int lim)
{
int c, i;

for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)


s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;

7
}

/* copy: copy 'from' into 'to'; assume to is big enough */


void copy(char to[], char from[])
{
int i;

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 */

int get_line(char line[], int maxline);


void copy(char to[], char from[]);

/* print the longest input line */


int main(void)
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */

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;
}

/* get_line: read a line into s, return length */


int get_line(char s[], int lim)
{
int c, i, l;

for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) {


if (i < lim - 1)
s[l++] = c;
}
if (c == '\n') {
if (l < lim - 1)
s[l++] = c;
++i;
}
s[l] = '\0';

return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */


8
void copy(char to[], char from[])
{
int 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 get_line(char line[], int maxline);

int main(void)
{
int len; /* current line length */
char line[MAXLINE]; /* current input line */

while ((len = get_line(line, MAXLINE)) > 0)


if (len > MAXLENGTH)
printf("%s\n", line);

return 0;
}

/* get_line: read a line into s, return length */


int get_line(char s[], int lim)
{
int c, i, l;

for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) {


if (i < lim - 1)
s[l++] = c;
}
if (c == '\n')
if (l < lim - 1)
s[l++] = c;
s[l] = '\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

int get_line(char line[], int maxline);

int main(void) Trailing whitespaces


{
int len; /* current line length */
char line[MAXLINE]; /* current input line */

while ((len = get_line(line, MAXLINE)) > 0) {


if (len == 1 && line[0] == '\n')
continue;
printf("%s\n", line);
}

return 0;

9
}

int get_line(char s[], int lim)


{
int c, i, l;

for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) {


if (i < lim - 1)
s[l++] = c;
}
if (c == '\n')
if (l < lim - 1)
s[l++] = c;
s[l] = '\0';

return l;
}

Aplicație propusă 19*. Același enunț ca la Aplicaţie rezolvată


15, 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’).

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;
}

Aplicație rezolvată 17. Programul următor este un exemplu cu variabilele luna şi


luna_curenta de tip enum:
#include <stdio.h>
int main()
{
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC } luna;
enum months luna_curenta = OCT;
for(luna = JAN; luna <= DEC; luna++)
printf("indexul lunii = %d\n", luna);
printf("luna curenta = %d\n", luna_curenta);
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ă 4. Afișați toți divizorii unui număr n natural dat.


#include <stdio.h>
main()
{
int n, i;
printf("Dati numarul = ");
scanf("%d",&n);
for ( i = 1; i <= n; ++i )
if ( n%i == 0 )
printf("%5d e divizor pt %d\n", i, n);
}

Aplicație propusă 5. Se dă un număr natural n. Să se afișeze descompunerea lui n în factori primi.


#include <stdio.h>
main()
{
int n, d, p;
printf("Dati numarul = ");
scanf("%d",&n);
d = 2;
while ( n > 1 ){
if ( n%d == 0 ) {
p = 0;
while( n%d ==0 ){
++p;
n = n/d;
}
printf("%d^%d", d, p); /* printf(p>1?"%d^%d":"%d", d, p); */
if ( n > 1 )
printf(" * ");
}
++d;
}
}

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;

printf("Dati primul numar = ");


scanf("%d",&n);
printf("Dati al doilea numar = ");
scanf("%d",&m);
x = n;
y = m;
while ( x != y )
if ( x > y )
x = x - y;
else
y = y - x;
printf("cmmdc(%d, %d) = %d ", n, m, x);
}

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;

printf("Dati primul numar = ");


scanf("%d",&n);
printf("Dati al doilea numar = ");
scanf("%d",&m);
x = n;
y = m;
while ( y != 0 ){
rest = x%y;
x = y;
y = rest;
}
printf("cmmdc(%d, %d) = %d ", n, m, x);
}

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;

printf("Dati primul numar = ");


scanf("%d",&n);
printf("Dati al doilea numar = ");
scanf("%d",&m);
x = n;
y = m;
while ( y != 0 ){
rest = x%y;
x = y;
y = rest;
}
printf("cmmmc(%d, %d) = %d ", n, m, n * m / x);
}

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;

while (fahr <= upper) {


celsius = ftoc(fahr);
printf("%3.0f %6.1f\n", fahr, celsius);
fahr = fahr + step;
}

return 0;
}

float ftoc(float fahr)


{
float celsius;
celsius = (5.0 / 9.0) * (fahr - 32.0);
return celsius;
}

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;

printf("Dati numarul = ");


scanf("%d",&n);

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 cmmdc(int, int);

int main()
{
int n, m, d;

printf("Dati primul numar = ");


scanf("%d",&n);
printf("Dati al doilea numar = ");
scanf("%d",&m);

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 cmmdc(int, int);

int main()
{
int n, m, d;

printf("Dati primul numar = ");


scanf("%d",&n);
printf("Dati al doilea numar = ");
scanf("%d",&m);

d = cmmdc(n, m);
printf("\ncmmdc(%d, %d) = %d ", n, m, d);

return 0;
}

int cmmdc(int x, int y)


{
int rest;
while ( y != 0 ){
rest = x%y;
x = y;
y = rest;
}

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>

long cmmmc(int, int);

int main()
{
int n, m;
long c;

printf("Dati primul numar = ");


scanf("%d",&n);
printf("Dati al doilea numar = ");
scanf("%d",&m);

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 conv10b(int, int);

int main()
{
int n, b, nb;

printf("Numarul in baza 10 = ");


scanf("%d",&n);
printf("Baza in care se face conversia = ");
scanf("%d",&b);
nb = conv10b(n, b);
printf("%d convertit in baza %d = %d", n, b, nb);

return 0;
}

int conv10b(int n, int b)


{
int z, nb;

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 convb10(int, int);

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;
}

int convb10(int nb, int b)


{
int z, n;

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 getline(char line[], int maxline);

int main(void)
{
int len; /* lungimea curenta a liniei */
char line[MAXLINE]; /* sirul care stocheaza linia curenta */

while ((len = getline(line, MAXLINE)) > 0) {


if (!(len == 1 && line[0] == '\n')) /* eliminare linii vide */
printf("%s", line);
}

return 0;
}

int getline(char s[],int lim)


{
int c, i;

for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)


s[i] = c;
if (c == '\n') {
--i; /* caracterul citit a fost un \n deci merg o pozitie inapoi */
while(s[i]=='\t'||s[i]==' ') /* cat timp la final sunt tab si blank merg inapoi
*/
--i; /* ma opresc cu i pe primul caracter ne-alb */
s[++i] = '#'; /* dupa el pun un # */
++i;
s[i] = c; /* la finalul liniei pun \n */
++i;
}
s[i] = '\0'; /* la finalul sirului de caractere se pune \0 */
return i;
}

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 */

while ((len = getline(line, MAXLINE)) > 0) {


reverse(line);
printf("%s\n", line);
}

return 0;
}

int getline(char s[],int lim)


{
int c, i;

for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)


s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

void reverse(char s[])


{
int i, j;
char tmp;

for (j = 0; s[j] != '\0'; ++j)


;
--j;

for (i = 0; i < j; ++i, --j) {


tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}

19

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