Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Functii simple; recursivitate

c



+ Font mai mare | - Font mai mic



Functii simple; recursivitate

Probleme rezolvate

P8.1 Scrieti un program care calculeaza integrala unei functii oarecare, intr‑un interval [ab] ale carui limite se vor citi de la tastatura. Utilizatorul va specifica si numarul de subintervale de discretizare. Metoda de integrare este metoda dreptunghiurilor.



#include <stdio.h>

#include <stdlib.h>

float f(float x)

int main()

Programul va afisa pe ecran, dupa compilare si executie:

Introduceti limita de inceput a intervalului: 0

Introduceti limita de sfarsit a intervalului: 2

Introduceti numarul de subintervale de discretizare: 1000

Valoarea integralei este 2.671

Discutie

-  Programul reprezinta implementarea directa a metodei dreptunghiurilor folosita la integrarea numerica a unei functii pe un interval dat. Calculul valorii functiei intr‑un punct se face cu ajutorul functiei f()

P8.2 Scrieti un program care afiseaza numerele pare dintr un interval [ab] cu ajutorul unei functii. Limitele intervalului vor fi specificate de utilizator.

#include <stdio.h>

#include <stdlib.h>

int par(int k)

int main()

Programul va afisa pe ecran, dupa compilare si executie:

a = 1

b = 20

Discutie

-  Parcurgerea intervalului se face in programul principal. Pentru fiecare element din interval functia par() verifica daca acesta este par. Daca este par functia returneaza 1, daca nu este par returneaza 0.

P8.3 Scrieti un program care citeste un numar natural n si calculeaza si afiseaza factorialul numarului n definit astfel:

Calculul factorialului se va realiza cu ajutorul unei functii recursive.

#include <stdio.h>

#include <stdlib.h>

int factorial(int n)

int main() while(n < 1);

k = factorial(n);

printf('%d! = %dn', n, k);

system('PAUSE');

return 0;

Programul va afisa pe ecran, dupa compilare si executie:

Introduceti n: 12

Discutie

-  Programul verifica valoarea introdusa deoarece o valoare eronata poate conduce la executarea la nesfarsit a functiei factorial(). Functia factorial() se auto‑apeleaza pana cand se ajunge la factorial de 1.

P8.4 Scrieti un program care citeste doua numere naturale a si b si calculeaza si afiseaza cel mai mare divizor comun, c.m.m.d.c., al celor doua numere. Cel mai mare divizor comun se va calcula recursiv astfel:

#include <stdio.h>

#include <stdlib.h>

int cmmdc(int a, int b)

int main()

Discutie

-  Se remarca faptul ca functia cmmdc() implementeaza exact definitia matematica formulata in enunt. Programul principal nu face decat sa citeasca cele doua numere, sa apeleze functia cmmdc() si sa afiseze rezultatul.

P8.5 Scrieti un program care citeste un numar si stabileste si afiseaza daca numarul este prim sau nu. Se va scrie si utiliza o functie care verifica daca un numar este prim.

#include <stdio.h>

#include <stdlib.h>

int divizibil(int n , int i)

int main()

}

if(i == n)

printf('Este primn');

system('PAUSE');

return 0;

Programul va afisa pe ecran, dupa compilare si executie:

Introduceti un numar natural: 397

Este prim

Discutie

-  Pentru a verifica daca un numar, n, este prim se parcurge intervalul (1, n) si pentru fiecare numar din interval se verifica daca acesta este divizor al lui n. Atunci cand am gasit un divizor inseamna ca numarul nu este prim si iesim din ciclul while (i devine n + 1). Functia divizibil verifica daca contorul i care parcurge intervalul divide pe n. Daca il divide returneaza 0 iar daca nu il divide returneaza 1.

P8.6 Scrieti un program care citeste doua numere naturale n si p si calculeaza cu ajutorul unei functii recursive valoarea expresiei np. Valoarea expresie va fi afisata. Functia np se va defini astfel:

#include <stdio.h>

#include <stdlib.h>

int putere(int n, int p)

int main()

Programul va afisa pe ecran, dupa compilare si executie:

Introduceti 2 numere naturale: 2 16

Discutie

-  Functia putere implementeaza direct definitia propusa. Ea se poate scrie mai compact astfel:

int putere(int n, int p)

P8.7 Scrieti un program care calculeaza media aritmetica a elementelor unui vector cu ajutorul unei functii.

#include <stdio.h>

#include <stdlib.h>

float medie(int x, float s , int z, int n)

int main()

s = 0;

for(i = 1; i <= n; i++)

printf('Media este %fn', s);

system('PAUSE');

return 0;

Programul va afisa pe ecran, dupa compilare si executie:

n = 4

v[1] = 1

v[2] = 2

v[3] = 3

v[4] = 4

Media este 2.500000

Discutie

-  La parcurgerea vectorului, functiei medie() i se transmit pozitia curenta (i), suma elementelor anterioare (s), elementul curent (v[i]) si lungimea vectorului (n). Functia medie() insumeaza elementele vectorului (s = s + z) pana in momentul in care a insumat si ultimul element. Atunci va imparti aceasta suma la numarul de elemente.

P8.8 Scrieti un program care verifica transferul unei structuri, ca parametru, catre o functie.

#include <stdio.h>

#include <stdlib.h>

struct strp2 var1;

void f(struct strp2 temp);

int main()

void f(struct strp2 temp)

Programul va afisa pe ecran, dupa compilare si executie:

Diferenta dintre cele 2 elemente ale structurii este: -0.400000

Discutie

-  Pentru a face verificarea ceruta s‑a definit o structura cu marca strp2 care are doua campuri i de tip intreg si d de tip fractionar cu precizie dubla. In programul principal se atribuie valori celor doua campuri ale structurii si apoi se apeleaza functia  f. Aceasta functie calculeaza si afiseaza diferenta dintre cele doua campuri.

P8.9 Scrieti un program care determina si afiseaza lungimea unui sir de maxim 200 de caractere cu ajutorul unei functii.

#include <stdio.h>

#include <stdlib.h>

int lungime(char sir[])

int main()

Programul va afisa pe ecran, dupa compilare si executie:



Introduceti sirul dorit:

Acesta este sirul a carui lungime o dorim.

Lungimea sirului este de 42 caractere

Discutie

-  Citirea sirului de caractere se realizeaza apeland functia gets(). Asa cum am mai precizat in Capitolul 6, folosirea acestei functii este nerecomandabila. Pentru citirea sirului de caractere recomandam utilizarea instructiunilor:

fgets(sir, 201, stdin);

if(sir[strlen(sir)-1] == 'n') sir[strlen(sir)-1] = '0';

Cea de a doua instructiune elimina caracterul "newline" din sirul citit.

-  Functia lungime() primeste ca parametru un vector de caractere. Lungimea sirului de caractere este determinat prin oprirea ciclului for la intalnirea caracterului . Se remarca utilizarea instructiunii vide pentru ciclul for. Functia lungime() functioneaza similar cu functia standard strlen().

P8.10 Scrieti un program care citeste de la tastatura o matrice patrata de dimensiune maxima 10  10 elemente reale impreuna cu dimensiunea sa efectiva si determina si afiseaza suma elementelor de pe diagonala principala si de pe diagonala secundara. Se vor scrie si utiliza functii separate pentru: citirea matricei, scrierea matricei, calculul sumei de pe diagonala principala si calculul sumei de pe diagonala secundara. Precizare: este vorba de reluarea problemei P6.6 dar cu utilizarea unor functii.

#include <stdio.h>

#include <stdlib.h>

void citeste(float mat[][10], int dim)

float suma1(float mat[][10], int dim)

float suma2(float mat[][10], int dim)

void tip_mat(float mat[][10], int dim)

printf('n');

}

int main() while(dim < 1 || dim > 10);

citeste(matrice, dim);

print(matrice, dim);

printf('nSuma elementelor de pe diagonala principala');

printf(' este %1.3fn', suma1(matrice, dim));

printf('nSuma elementelor de pe diagonala secundara');

printf(' este %1.3fn', suma2(matrice, dim));

system('PAUSE');

return 0;

Programul va afisa pe ecran, dupa compilare si executie:

Introduceti dimensiunea matricei patrate: 4

Introduceti mat[0][0]: 1

Introduceti mat[0][1]: 2

Introduceti mat[0][2]: 3

Introduceti mat[0][3]: 4

Introduceti mat[1][0]: 5

Introduceti mat[1][1]: 6

Introduceti mat[1][2]: 7

Introduceti mat[1][3]: 8

Introduceti mat[2][0]: 9

Introduceti mat[2][1]: 10

Introduceti mat[2][2]: 11

Introduceti mat[2][3]: 12

Introduceti mat[3][0]: 13

Introduceti mat[3][1]: 14

Introduceti mat[3][2]: 15

Introduceti mat[3][3]: 16

Matricea introdusa este:

2.000 3.000 4.000

6.000 7.000 8.000

10.000 11.000 12.000

Suma elementelor de pe diagonala principala este 34.000

Suma elementelor de pe diagonala secundara este 34.000

Discutie

-  Functia citeste() realizeaza citirea efectiva a elementele matricei folosind proprietatea particulara a tablourilor de a putea fi modificate intr‑o functie astfel incat modificarile sa fie permanente. Functia tip_mat() afiseaza matricea citita. Functiile suma1() si suma2() calculeaza suma elementelor de pe diagonala principala si, respectiv, de pe diagonala secundara. Programul principal citeste dimensiunea efectiva a matricei si apeleaza functiile definite anterior.

Probleme propuse

Scrieti un program C care citeste de la tastatura un vector de maximum 10 numere intregi impreuna cu dimensiunea sa efectiva si separa acest vector in doi vectori: primul vector va fi format din numerele pare din vectorul initial iar cel de al doilea va fi format din numerele impare din vectorul initial. Citirea vectorului se va face cu ajutorul unei functii cu prototipul:

void cit_vect(int v[10], int dim);

Reluati programul anterior, dar pentru formarea vectorilor scrieti si utilizati doua functii avand prototipurile:

int pare(int v[10], int par_v[10]);

int impare(int v[10], int impar_v[10]);

Functiile vor returna numarul valorilor pare si respectiv, numarul valorilor impare.

Scrieti un program C care calculeaza suma complexa a elementelor dintr‑un tablou unidimensional de numere complexe.

Precizari:

a. Tabloul de numere complexe va fi declarat utilizand urmatoarele definitii:

typedef struct complex;

complex vector[10];

b. Elementele tabloului se citesc de la tastatura, element cu element, iar pentru fiecare element, partea reala si partea imaginara.

c. Scrieti cate o functie care calculeaza partea reala si, respectiv, partea imaginara a sumei a doua numere complexe. Prototipurile acestor functii sunt:

float suma_re(complex a, complex b);

float suma_im(complex a, complex b);

Suma globala ceruta se va calcula folosind functiile definite anterior.

Reluati programul anterior dar pentru calculul sumei a doua numere complexe scrieti si utilizati o functie avand prototipul:

complex suma(complex a, complex b);

Scrieti un program C care citeste de la tastatura o matrice de numere reale de dimensiuni maxime 100  100 impreuna cu dimensiunile sale efective si afiseaza elementele maxime de pe fiecare linie si apoi de pe fiecare coloana.

Precizari:

a. Pentru determinarea maximului de pe linii / coloane se va scrie si utiliza o functie cu prototipul:

float max_vec(int dim, float vec[100]);

b. Se vor forma, pe rand, vectori din fiecare linie si apoi din fiecare coloana.

Scrieti un program care citeste un numar natural si calculeaza si afiseaza secventa Halberstam a acestui numar.

Precizari:

a.    Secventa Halberstam a unui numar se calculeaza astfel: daca numarul este par el se imparte la 2; daca numarul este impar se aduna 3 si se aduna 1; se reiau operatiile pana cand valoarea ajunge egala cu 1.

b.    Calculul numarului urmator al secventei Halberstam se va face cu ajutorul unei functii.

Scrieti o functie care afiseaza o intrebare si citeste raspunsul utilizatorului care poate fi doar ,d', pentru "da", sau ,n', pentru "nu"; citirea se repeta pana cand raspunsul este ,d' sau ,n'. Scrieti apoi un program care verifica functionarea corecta a functiei.

Precizare: Prototipul functiei este:

int ok(char s[]);

Scrieti o functie care calculeaza suma de plata pentru o activitate primind numarul de ore lucrate si salariul orar. Daca numarul de ore lucrate este mai mic decat sau egal cu 40 se plateste salariul orar. Pentru orele cuprinse intre 40 si 60 salariul orar creste cu 50 %. Pentru orele care depasesc 60 se plateste dublu. Scrieti si programul principal care verifica functionarea functiei.

Scrieti o functie care cauta toate spatiile dintr‑un sir de caractere si le inlocuieste cu semnul ,‑' returnand numarul de spatii inlocuit. Prototipul functiei este:

int inlocuieste(char sir[]);

Scrieti si programul principal care verifica functionarea functiei.

Scrieti o functie care determina si returneaza momentul sosirii primului tren intr‑o statie de cale ferata. Functia primeste ca argumente momentul plecarii din statie si o structura care contine orele de plecare si de sosire.

Precizari:

a. Structura pentru memorarea programului de circulatie a unui tren va fi definita astfel:

typedef struct moment Moment;

typedef struct program Program_tren;

b. Programul de circulatie intre doua statii este alcatuit dintr‑un tablou format din structuri de tip Program_tren

c. Functia va cauta primul tren care pleaca dupa ora indicata si va afisa orele de plecare si sosire.

Scrieti si programul principal care verifica functionarea functiei.

Scrieti o functie care afiseaza sirul de caractere primit ca parametru si apoi il subliniaza scriind numarul corespunzator de caractere , ' pe randul urmator. Pentru determinarea lungimii sirului de caractere se va folosi functia standard strlen() string length", care are urmatorul prototip:

int strlen(char s[]);

Scrieti si programul principal care verifica functionarea functiei.





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2449
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved