25 Aug 2012

Introducere C - despre funcții

Salutare tuturor!

Astăzi  vom vedea cum putem modulariza codul astfel încât să fie mult mai ușor de citit și de înțeles. Acest lucru se realizează, în principal, cu ajutorul funcțiilor, C-ul fiind prin excelență un limbaj procedural.
Funcțiile ne permit, totodată, să le reutilizăm după necesități. De exemplu, să presupunem că am făcut o funcție care verifică dacă un număr este prim. Dacă avem de rezolvat, o problemă mai complicată care necesită, la un moment dat, testarea unor numere pentru a vedea dacă ele sunt prime, atunci putem folosi funcția realizată anterior. Important este ca funcțiile să fie cât mai generale și să preia numai parametrii absolut necesari. Și pentru că am pomenit de parametrii, iată cum arată semnătura generică a unei funcții:

tip_rezultat nume_funcție(tip parametru1, tip parametru2, ...) {
    // declarații și instrucțiuni
 }

Apelarea se face în modul următor:

nume_funcție(lista parametri) daca tip_rezultat este void (adică nu întoarce nimic)
sau
variabila = nume_funcție(lista parametri) daca funcția întoarce ceva

Iar acum să modificăm ultimele exemple prezentate astfel încât programele să fie cu funcții.

1. Fiind date de la tastatură două numere întregi, să se afișeze cel mai mare divizor comun al lor. (Indiciu: Algoritmul lui Euclid)

#include <stdio.h>

int cmmdc (int a, int b) {
   int r;

   // testam cazul limita cand b este zero
   if (b == 0) {
       return a;
   }
   // aici ar fi mers un 'else', dar nu e nevoie datorita return-ului anterior
   // aici este algoritmul propriu-zis
   do{
       r = a % b;
       a = b;
       b = r;
   }while(r);

   // la final, cmmdc-ul este in 'a'
   return a;
}

int main(){
   // declaram variabilele; ele vor fi initializate automat la zero
   int a, b, c;

   printf("Introduceti primul numar: ");
   scanf("%d",&a);

   printf("Introduceti al doilea numar: ");
   scanf("%d",&b);
 
   c = cmmdc(a,b);
  
   printf("Cmmdc este %d\n",c);
  
   return 0; 
}


2. Să se verifice dacă un număr introdus de la tastatură este prim.

#include <stdio.h>

// functia va intoarce 0 (fals) sau 1 (adevarat) in functie de rezultatul testului
int e_prim(int nr){
   int i, prim = 1;
   /* pentru fiecare numar mai mic decat numarul nostru, verificam daca exista vreunul la care
   * acesta acesta din urma se imparte exact
   * s-a aratat ca nu e cazul sa verificam toate numerele, ci doar pe acelea mai mici decat nr/2
   */
   for (i = 2; i < nr/2; ++i) {
       if (nr % i == 0) {
           printf("Numarul nu este prim\n");
           prim = 0;
           break; // am gasit ca numarul nu este prim si iesim fortat din bucla; nu are sens sa continuam
       }
   } 
   return prim;
}

int main(){
   // vom folosi o variabila auxiliara pentru a putea afisa mesajul afirmativ de la sfarsit
   // pornim de la ideea ca numarul este prim
   int nr, i, prim = 1;

   printf("Introduceti numarul: ");
   scanf("%d",&nr);

   prim = e_prim(nr);

   if (prim) {
       printf ("Numarul este prim\n");
   }
   else {
      printf("Numarul nu este prim\n");
   }

   return 0;
}

No comments:

Post a Comment