symp

Subprograme

Informatică - clasa a X-a

main2 subprograme
subprogram funcție procedură

prof. Adina Stănculescu

Colegiul Național "Gheorghe Lazăr" Sibiu

GENERALITĂȚI

definiție, clasificare, avantaje

Definiții

În practică, pentru a rezolva o problemă complexă P se pot identifica una sau mai multe probleme, ce pot fi considerate ca subprobleme S ale problemei P, astfel încât în urma rezolvării acestor subprobleme sau module să se obțină rezolvarea problemei P. În acest caz, algoritmul de rezolvare al subproblemei S devine un SUBPROGRAM, pentru algoritmul de rezolvare al problemei P.

Un subprogram asemenea unui program, este o colecție de: instrucțiuni de declarare (pentru declararea tipurilor de date, a variabilelor) și instrucțiuni de execuție (pentru realizarea prelucrărilor necesare), el se poate identifica prin numele său și îndeplinește doar o anumită sarcină, realizează o anumită prelucrare, are o anumită funcționalitate simplă și precisă atunci când este apelat (folosit) de un program sau de un alt subprogram.

Clasificare

1. din punct de vedere al tipului lor:

    În general, se identifică două tipuri de subprograme:
  • cele care în urma realizării unor prelucrări întorc, returnează o valoare, ce reprezintă rezultatul prelucrării – ele numesc de regulă funcții (sunt asemănătoare funcțiilor matematice)
  • cele care realizează prelucrări care au un anumit efect – ele se numesc de regulă proceduri.
În C/C++ subprogramele sunt de tip funcție. O procedură este considerată un caz particular de funcție, iar pentru a le putea deosebi se utilizează de obicei termenii:
  • funcție cu tip sau funcție operand pentru subprogramele de tip funcție – cele care returnează o valoare;
    exemplu: suma cifrelor unui număr, produsul elementelor unui vector, determinarea numărului de numere pare citite, verificarea dacă un număr este prim, etc.
  • funcție fără tip sau funcție void sau funcție procedurală pentru subprogramele de tip procedură – cele care nu returnează valori (decât eventual prin parametri) și au un anumit efect;
    exemplu: ordonarea elementelor unui vector, citirea elementelor unui vector, afișarea elementelor unui vector, etc.
Un program C/C++ este alcatuit din una sau mai multe funcții, din care una este rădacina sau funcția principală - adică funcția care nu poate lipsi și cu care începe automat execuția programului. Această funcție se numește main.

2. din punct de vedere al autorului lor se identifică două categorii:

  • funcții predefinite – sunt funcțiile standard, care pot fi utilizate după includerea în program a fișierului header în care au fost declarate (în care sunt prototipurile funcțiilor);
    exemplu: pentru operațiile de citire/afișare este necesară includerea header-ului iostream în forma: #include <iostream>
  • funcții utilizator – sunt funcțiile definite și apelate de programator în cadrul programului său, pentru a rezolva cerințele specifice;

Avantaje

  • descompunerea unei probleme complexe în subprobleme care sunt mai ușor de rezolvat și de implementat;
  • portabilitate - un subprogram este în general o componentă independentă de restul aplicației și poate fi preluat și inclus în alte aplicații, fără multe sau uneori chiar fără modifiări;
  • economie de timp – un subprogram este scris o singură dată și apoi este apelat (folosit) de câte ori este nevoie în cadrul aplicației, fără a necesita rescrierea secvenței de cod;
  • depistarea mai rapidă și ușoară a erorilor – fiecare subprogram poate fi testat imediat după implementare, astfel încât eventualele erori pot fi detectate mai rapid și ușor deoarece sunt căutate doar în secvența de cod corespunzătoare subprogramului testat;
  • facilitează lucrul în echipă – subprogramele necesare pentru realizarea aplicației pot fi scrise de persoane diferite;

NOȚIUNI DE BAZĂ

subprogram apelat, apelant, parametri,
subprogram definire, apel, declarare (prototip),
utilizarea stivei
transmiterea parametrilor prin valoare și prin referință

Noțiunile de bază vor fi exemplificate utilizând problema:

Exemplu: Se citește o valoare n (n<100) și apoi n valori, numere naturale <1.000.000 care se vor memora într-un vector. Să se calculeze prims - suma primelor două elemente din vector și ultp - produsul ultimelor două elemente. Să se afișeze elementele citite în ordine inversă citirii lor și să se precizeze care dintre cele două valori calculate are suma cifrelor mai mare, prims sau ultp

Soluție: Pentru a rezolva problema se citesc cele n valori în vectorul a, se calculează apoi prims și ultp, se afișează elementele vectorului începând de la ultimul element până la primul, se determină suma cifrelor numărului memorat în variabila prims și apoi, folosind o secvență de program aproape identică, se determină suma cifrelor numărului memorat în variabila ultp. La final se verifică cele două sume și se precizează valoarea variabilei pentru care suma cifrelor calculată este mai mare.

Pentru a nu scrie de două ori aceeași secvență de cod aproape identică, ce determină suma cifrelor lui prims și respectiv ultp, putem construi un subprogram care obține și returnează suma cifrelor unui număr natural oarecare, număr pe care îl furnizăm subprogramului. Subprogramul va fi utilizat, apelat de două ori pentru a calcula suma cifrelor atât pentru prims cât și pentru ultp și obținem două sume pe care le memorăm eventual în variabilele sumprims și respectv sumultp, variable pe care le vom compara la final.

În plus, pentru a descompune problema în subprobleme putem utiliza un subprogram care citește elemente pe care le memorează într-un vector și un subprogram care afișează elementele unui vector în ordine inversă, de la ultimul spre primul.

Apelat, apelant, parametri

Pentru a utiliza un subprogram el este apelat din cadrul programului principal sau a unui alt subprogram. Un program C/C+ este constituit din una sau mai multe funcții, deci o funcție este utilizată atunci când ea este apelată din funcția main (funcția principală) sau dintr-o altă funcție utilizator. Funcția main sau funcția utilizator din care se face apelul au rol de apelant, iar funcția utilizată este apelat.

Parametru

Un element furnizat din exterior, de la apelant spre funcția apelată sau furnizat de funcția apelată spre exterior, spre funcția apelantă, se numește parametru. Parametrii sunt folosiți pentru comunicarea cu funcția și se mai numesc și argumente.

Parametrii pot fi:
  • de intrare- elemente furnizate din exterior funcției, de la apelant spre apelat;
  • de ieșire - elemente obținute, calculate, determinate în interiorul funcției și care vor fi furnizate la final spre exterior, de la apelat spre spre apelant;
  • de intrare - ieșire (atât de intrare cât și de ieșire) - elemente furnizate din exterior funcției apelate care au fost modificate în interiorul acestei funcții și care vor fi apoi furnizate spre exterior, modificate.

Exemplu

  • pentru funcția ce calculează suma cifrelor trebuie furnizat un parametru reprezentând numărul pentru care se calculează suma cifrelor, acel număr reprezintă un parametru de intrare;
  • pentru subprogramul care citește elemente și le memorează într-un vector, elementele sunt citite în timpul execuției subprogramului deci nu vor fi furnizate ca parametru, dar ele sunt salvate într-un vector, iar acel vector și dimensiunea lui vor trebui să fie furnizate, la finalul execuției, spre exterior, spre apelant pentru a putea fi utilizate și mai departe în cadrul programului deci reprezintă parametri de ieșire;
  • în cazul în care ar fi existat și un subprogram în care se realiza sortarea unui vector, vectorul ar fi reprezentat un parametru de intrare-ieșire, deoarece apelantul furnizează subprogramului de sortare un vector, care este modificat în cadrul subprogramului prin rearanjarea elementelor iar la final este necesară furnizarea vectorului în noua formă, cea sortată spre apelant

Definire, Apel, Declarare

Definire funcție (descriere)

cuprinde precizarea antetului funcției și a corpului (instrucțiunilor) ei și se realizează astfel:

tip_functie nume_functie(lista_parametri_formali)
{
  .....
  //pt funcție operand, trebuie și o instrucțiune de
forma: return val;
};

antet funcție
corp funcție conține:

  • declarațiile propriilor variabile (ce sunt utile în cadrul funcției) și se numesc variabile locale;
  • instrucțiunile necesare pentru realizarea scopului funcției

Observații:

  • tip_funcție specifică tipul valorii returnate de funcție sau void în cazul în care funcția este de tip procedură și nu returnează valori;
  • nume_funcție reprezintă numele prin care este identificată funcția;
  • lista_parametri_formali:
    • poate lipsi, caz în care și lista_parametri_actuali, de la apel, va lipsi
    • conține secvențe separate prin intermediul caracterului ,
    • pentru fiecare parametru, secvența conține: tip parametru, specificare mod de transmitere (poate lipsi) și nume parametru;
  • nu se poate declara o variabilă locală cu același identificator (nume) ca și un parametru formal;
  • rezultatul determinat în cadrul funcției este întors în funcția apelantă prin intermediul valorii variabilei prezentă în instrucțiunea return;
  • dacă funcția este de tip procedural instrucțiunea return poate lipsi sau în cazul în care există va fi urmată doar de caracterul;

Definire funcție (exemplu)

 

- funcția care calculează suma cifrelor este o funcție operand (întoarce o valoare) și este definită astfel:


	int suma_cifre (int x)
	{ 
		int cif, s=0;
		while(x!=0)
		{ 
			cif =c%10; 
			x=x/10;
			s=s+cif;
		}
		return s;
	}
											

tip funcție
nume funcție
parametru formal
rezultat returnat

- int, la fel ca tipul returnat
- suma_cifre
- tip: int, nume: x
- valoarea variabilei s

s va conține suma cifrelor numărului transmis prin parametrul actual, efectiv, care va înlocui la momentul apelului parametrul formal x

 

- funcția care afișează elementele unui vector în ordine inversă, este o funcție procedurală (are un efect - afișarea) și este definită astfel:


	void  afisInv (int v[100], int nrelem)
	{
		int i;
		for (i=nrelem-1; i≥0; i--)
		cout<<v[i]<<” ”;
		cout<<endl;
	}
											


tip funcție
nume funcție
parametri formali


rezultat returnat

- void
- afisInv
- 2 parametri
- tip: vector cu 100 elemente int, nume: v
- tip: int, nume: nrelem
-nu e cazul

Notă: S-a considerat că în vector elementele sunt memorate începând de la poziția 0 (specific limbajului C/C++)


Apel funcție (utilizare funcție)

Apel

pentru funcția de tip operand

apelul funcției poate fi utilizat în orice context în care poate exista o valoare de tipul returnat de funcție exemplu: dacă funcția f1 returnează o valoare de tip int, iar v și v1 sunt variabile de tip int, apelul poate fi făcut în forma:
v = f1 ( lista_parametri_actuali );  (apel la atribuire)
cout<< f1 ( lista_parametri_actuali );  (apel la afișare)
v = v1 - f1( lista_parametri_actuali );  (apel în expresie) etc.


pentru funcția de tip procedural

apelul este o instrucțiune de sine stătătoare, numită instrucțiune de apel și are forma:
nume_functie ( lista_parametri_actuali );

Observații:
- parametrii actuali sunt cei pe care se execută efectiv acțiunile din funcție, cei cu care se folosește efectiv funcția;
- parametrii actuali și formali trebuie să corespundă ca număr, ca tip și ca poziție ( în C/C++ e suficient ca parametrii actuali și formali să aibă tipuri compatibile, nu neapărat același tip deoarece se fac conversii implicite);
- în lista_parametri_actuali elementele sunt separate prin caracterul , și se precizează doar identificatorul (numele) fiecărui parametru.

Exemplu

utilizând apelul funcției operand sum_cifre definită pe pagina anterioară, pentru a obține și compara suma cifrelor celor două valori memorate în prims și ultp se pot scrie următoarele variante de secvențe de instrucțiuni:

varianta 1:
se determină pe rând suma cifrelor celor două valori și se memorează în două variabile; se compară valorile celor două variabile

sumprims = suma_cifre (prims);
sumultp = suma_cifre (ultp);
if (sumprims > sumultp)
            cout<<prims<<” are suma cifrelor mai mare”;
else
            cout<<ultp<<” are suma cifrelor mai mare”;


varianta 2:
se determină suma cifrelor doar pentru prima valoare și se memorează în variabila sumprims; se compară valoarea din sumprims cu valoarea returnată după apelul funcției cu parametrul actual ultp ce reprezintă suma cifrelor lui ultp

sumprims = suma_cifre (prims);
if (sumprims > sumultp)
            cout<<prims<<” are suma cifrelor mai mare”;
else
            cout<<ultp<<” are suma cifrelor mai mare”;


varianta 3:
se compară valorea returnată în urma primului apel (reprezintă suma cifrelor lui prims) cu valoarea returnată în urma celui de al 2-lea apel (reprezintă suma cifrelor lui ultp);

if (sumprims > sumultp)
            cout<<prims<<” are suma cifrelor mai mare”;
else
            cout<<ultp<<” are suma cifrelor mai mare”;


- apelul funcției procedurale afisInv se face în forma:
  afisInv (a, n);
unde a este un vector cu maximum 100 de elemente, iar n este numărul efectiv de elemente ale vectorului

Declarare funcție - prototip

Declarare

  • în limbajul C/C++ pentru a putea fi folosit orice identificator trebuie întâi declarat;
  • acest lucru este valabil și pentru identificatorul (numele) unei funcții care nu este o funcție predefinită, standard;
  • declararea unei funcții poate fi făcută:
    • la definirea ei - în acest caz, pe lângă antet, apare precizat și corpul funcției;
    • într-o instrucțiune declarativă ce se numește prototipul funcției - constă din precizarea antetului funcției urmat de caracterul ;

Observații:

  • o funcție declarată prin precizarea prototipului funcției trebuie apoi și definită, în cadrul programului;
  • prototipul unei funcții este o instrucțiune care trebuie să-i precizeze compilatorului numele funcției, tipul returnat, numărul și tipul parametrilor; informații pe care compilatorul le verifică la apelul dar și la definirea funcției, pentru compatibilitate;

Prototipul unei funcții are forma:
tip_functie> nume_functie(lista_parametri_formali);

Exemplu

  • prototipul funcției ce calculează suma cifrelor:

    int suma_cifre (int x); sau
    int suma_cifre (int );

  • prototipul funcției ce afișează elementele unui vector în ordine inversă:

    void afisInv (int v[100], int nrelem); sau
    void afisInv (int v[], int nrelem); sau
    void afisInv (int [100], int ) sau
    void afisInv (int [], int );

Observații:

  • sunt corecte mai multe forme de declarare ale aceleași funcții, deoarece prototipul trebuie să furnizeze ca informație doar tipul parametrilor nu și numele lor

Utilizarea stivei

  • într-o zonă a memoriei interne numită stiva sistemului (stack) se păstrează temporar informații despre subprogramul, funcția aflată în execuție la momentul respectiv (modulul apelat);
  • în cadrul modulului apelant, la momentul întâlnirii apelului unei funcții, compilatorul predă controlul modulului apelat (funcției) și începe să execute instrucțiunile ei până la întâlnirea instrucțiunii return sau până la sfârșitul blocului care formează corpul funcției }; după care redă controlul modulului apelant;
  • adresa instrucțiunii de revenire se memorează pe stiva sistem;
  • execuția în modulul apelant se continuă:
    • de la instrucțiunea curentă - dacă modulul apelat este o funcție operand sau
    • de la instrucțiunea următoare - dacă modulul apelat este o funcție void
  • În apelant, la întâlnire apel funcție:
    • se intrerupe execuția modulului apelant;
    • pe stiva sistem se păstrează:
      • adresa de revenire în modulul apelant;
      • copia parametrilor, dacă aceștia sunt transmiși prin valoare (copiile primesc valorile parametrilor actuali) sau adresa pentru parametrii transmiși prin referință;
      • se rezervă spațiu pentru variabilele locale;
    • se lansează în execuție modulul apelat;
  • În apelat, la terminarea execuției funcției:
    • se eliberează stiva eliberându-se și spațiul alocat pentru parametri și variabile locale;
    • se preia din stivă adresa de revenire și se continuă execuția de la instrucțiunea aflată în modulul apelant la acea adresă;
apel functie

Transmitere parametri

În C/C++ există 2 metode de transmitere/transfer a parametrilor:

  • prin valoare
  • prin referință
01

Prin valoare

  • se utilizează pentru parametrii care sunt doar de intrare;
  • orice modificare făcută în interiorul funcției, asupra parametrilor transmiși prin valoare NU se va vedea în afara funcției;
  • nu se folosește nimic în plus ca notație;
  • pe stiva de execuție se face o copie a parametrilor transmiși prin valoare (deci se lucrează pe copie), în acea copie se memorează valoare parametrului actual corespunzător;
02

Prin referință

  • se utilizează pentru parametrii care sunt de ieșire sau de intrare-și-ieșire;
  • orice modificare făcută în interiorul funcției, asupra parametrilor transmiși prin referință se va vedea și în afara funcției;
  • se utilizează caracterul & înaintea numelui parametrului;
  • pe stiva de execuție se memorează adresa parametrilor transmiși prin referință (deci se lucrează direct pe parametru, în zona în care este memorat);

Observații

  • în C/C++ - vectorii, matricile, șirurile de caractere se transmit automat prin referință
  • în cazul parametrilor transmiși prin referință apelul NU se poate face cu o valoare
    exemplu: void ex(int a, int &b) { ... }
    NU se poate apela în forma: ex(5,6);
    dar dacă există o declarație de forma int x=6; se poate apela în forma: ex(5,x);
    sau dacă există o declarație de forma int x,y; se poate apela în forma: ex(y,x);

APLICAȚII

Descompunere problemă în subprobleme
Funcții implementare in C/C++
Site-uri probleme propuse, probleme rezolvate

Descompunere problemă în subprobleme

Problema 1

Textul problemei

Se citesc n elemente care se memorează într-un vector a și m elemente care se memorează într-un vector b. Să se afișeze cei doi vectori. Să se determine numărul de elemente prime din fiecare vector și să se precizeze care dintre cei doi vectori conține mai multe elemente prime. Să se calculeze suma cifrelor primului element din vectorul a și al ultimului element din vectorul b.


	#include <iostream>
	#include <cmath.h>
	using namespace std;
	
	void citire(int v[], int &nr)
	{  int i;
		cin>>nr;
		for(i=0; i<nr; i++)
			cin>>v[i];
	}
	void afisare(int z[], int k)
	{    int i;
		cout<<"elemente vector:";
		for(i=0; i<k; i++)
			cout<<z[i]<<" ";
		cout<<endl;
	}
	int prim (int x)
	{   int ok=1, i;
		 if (x<2) ok=0;
		 else
			 for(i=2; i<=sqrt(x) && ok; i++)
			 {   if (x%i == 0)
					  ok=0;
			 }
		return ok;
	}
	int nrPrime (int ve[], int p)
	{  int i, ct=0 ;
		for(i=0; i<p; i++)
			if (prim(ve[i]) == 1 )
				 ct++;
		 return ct;
	}											
												

	int sumCif (int t)
	{  int s=0, cif;
		while (t>0)
		{  cif=t%10;
			t=t/10;
			s=s+cif;
		  }
		return s;
	}	
	int main()
	{
		int a[50], b[50], n, m, nrpA, nrpB;
		citire(a,n);
		cout<<"Vectorul a - ";
		afisare(a,n);
		citire(b,m);
		cout<<"Vectorul b - ";
		afisare(b,m);
		nrpA=nrPrime(a,n);
		nrpB=nrPrime(b,m);
		if(nrpA >nrpB)
			cout<<"Vectorul a contine mai multe numere prime "<<nrpA<<endl;
		else
			if(nrpA == nrpB)
				cout<<"Vectorii contin la fel de multe numere prime "<<nrpA<<endl;
			else
				cout<<"Vectorul b contine mai multe numere prime "<<nrpB<<endl;
		cout<<"Suma cifre primul element din a:“<<sumCif ( a[0] )<<endl;
		cout<<"Suma cifre ultimul element din b:“<<sumCif ( b[m-1] );
		return 0;
	}				
												

Problema 2

Textul problemei

Se citește o valoare n (n<100) și apoi n valori, numere naturale <1.000.000 care se vor memora într-un vector. Să se calculeze prims - suma primelor două elemente din vector și ultp – produsul ultimelor două elemente. Să se afișeze elementele citite în ordine inversă citirii lor și să se precizeze care dintre cele două valori calculate are suma cifrelor mai mare, prims sau ultp.


#include <iostream>
using namespace std;

void citire (int v[100], int &nrelem)
{   int i;
	cin>>nrelem;
	for (i=0; i<nrelem; i++)
		cin>>v[i];
}

void afisInv (int v[100], int nrelem)
{   int i;
	for (i=nrelem-1; i>=0; i--)
		cout<<v[i]<<" ";
	cout<<endl;
}

int suma_cifre (int x)
{   int cif, s=0;
	while(x!=0)
	{   cif=x%10;
		x=x/10;
		s=s+cif;
	}
	return s;
}																							
											

int main()
{
	int a[50], n, prims, ultp, sprims;
	citire(a,n);
	prims=a[0]+a[1];
	ultp=a[n-2]*a[n-1];
	cout<<"Vectorul cu elementele in ordine inversa";
	afisInv(a,n);       //apel functie procedurala
	sprims=suma_cifre(prims); //apel functie operand in indtructiune de atribuire
	if (sprims>suma_cifre(ultp)) //apel in expresie
		cout<<"Suma cifrelor sumei "<<sprims<<"este mai mare";
	else
		if (sprims == suma_cifre(ultp)) //apel in expresie
			cout<<"Suma cifrelor este aceeasi pentru ambele numere "<<sprims;
		else
			cout<<"Suma cifrelor produsului "<<suma_cifre(ultp)<<"este mai mare"; //apel in afisare
	return 0;
}													
											

Funcții implementare in C/C++

Sesiune specială - mai 2024 V4

Textul problemei

La un laborator sunt studiate aglomerările de fulgi de nea formate din câte nouă cristale de patru tipuri diferite date (notate cu 1, 2, 3 sau 4), astfel încât din fiecare tip să existe cel puțin câte un cristal. O astfel de aglomerare de fulgi a fost reprezentată printr-un număr natural, în care fiecare cifră reprezintă tipul unui cristal. Subprogramul fulg are un parametru, n, prin care primește un număr natural (n [0,109)). Subprogramul returnează valoarea 1, dacă prin n este reprezentată o aglomerare de fulgi de nea dintre cele studiate, sau 0 în caz contrar. Scrieți în C/C++ definiția completă a subprogramului. Exemplu: dacă n=112243413 subprogramul returnează 1, iar dacă n=12314 sau n=112253513 sau n=112243457 sau n=111122223, subprogramul returnează 0.


#include <iostream>
using namespace std;

//Varianta 1
int fulg (int n)
{
    int ct=0, vcif[5]={0}, cif, ok=1, i;
    while(n != 0 && ok==1)
    {   cif=n%10;
        n=n/10;
        ct++;
        if(cif == 0 || cif>4)
            ok=0;
        vcif[cif]=1;
    }
    if (ok==1 && ct==9 && n==0)
    {  for(i=1; i<=4; i++)
            if (vcif[i] == 0)
                ok=0;
    }
    else
        ok=0;
    return ok;
}	

int main()
{   int n;
    cout<<"Dati numarul "<<endl;
    cin>>n;
    if (fulg(n) ==1)
        cout<<"Este fulg " ;
    else
        cout<<"Nu este fulg " ;
    return 0;
}
											

//Varianta 2
int fulg (int n)
{
    int ct=0, cif1=0, cif2=0, cif3=0, cif4=0, cif, ok=1, i;
    while(n != 0 )
    {   if(ok==1)
        {
            cif=n%10;
            ct++;
            switch (cif)
            {   case 1: cif1=1;break;
                case 2: cif2=1;break;
                case 3: cif3=1;break;
                case 4: cif4=1;break;
                default: ok=0;
            }
        }
        n=n/10;
    }
    if (ok==1)
        if (ct==9)
        {
            if (cif1 == 0 || cif2 == 0 || cif3 == 0 || cif4 == 0 )
                ok=0;
        }
        else
            ok=0;
    return ok;
}					
											

Simulare 2024

Textul problemei

Subprogramul Impare are un parametru, n, prin care primește un număr natural (n[1,104]). Subprogramul returnează numărul obținut prin duplicarea fiecărei cifre impare a lui n sau -1 dacă acesta nu are nicio cifră impară. Scrieți definiția completă a subprogramului. Exemplu: dacă n=3361, subprogramul returnează 3333611.


#include <iostream>
using namespace std;

//Varianta 1
int Impare (int n)
{  int p=1, cif, nn=0, ok=0;
    while(n != 0)
    {  cif=n%10;
        n=n/10;
        if(cif%2 != 0)
        {  ok=1;
            nn=nn+cif*p;
            p=p*10;
        }
        nn=nn+cif*p;
        p=p*10;
    }
    if (ok==0)
        return -1;
    else
        return nn;
}

int main()
{   int nr;    
    cout<<"Dati numarul "<<endl;
    cin>>nr;
    cout<<"Noul numar "<<Impare(nr);
    return 0;
}
											

//Varianta 2
int Impare (int n)
{  int p=1, cif, nn=0, na=n;
    while(n != 0)
    {  cif = n%10;
        n=n/10;
        if(cif%2 != 0)
        {   nn=nn+(cif*10+cif)*p;
            p=p*100;
        }
        else
        {   nn=nn+cif*p;
             p=p*10;
        }
    }
    if (nn==na)
        return -1;
    else
        return nn;
}								
											

Model 2024

Textul problemei

Subprogramul produs are doi parametri, a și b, prin care primește câte un număr natural din intervalul [1,103]. Subprogramul returnează produsul divizorilor naturali comuni lui a și b. Scrieți definiția completă a subprogramului. Exemplu: dacă a=20 și b=12, atunci subprogramul returnează valoarea 8 (1*2*4=8).


#include <iostream>
using namespace std;

//Varianta 1
long long produs (int a, int b)
{  long long p=1;
	for(int d=2; d<=a; d++)
		if(a%d==0 && b%d==0)
			p=p*d;
	return p;
}
int main()
{   int a,b;
	cout<<"Dati a si b "<<endl;
	cin>>a>>>b;
	cout<<"Produs divizori "<<produs(a,b);
	return 0;
}
											

//Varianta 2
long long produs (int a, int b)
{ long long p=1;
	int prim,ultim,d;
	if(a<=b)
		{ prim=a; ultim=b; }
	else
		{ prim=b; ultim=a; }
	for(d=2; d<=prim/2; d++)
		if(a%d==0 && b%d==0)
			p=p*d;
	if (ultim%prim==0)
		p=p*prim;
	return p;
}									
											

Contact

Trimite un comentariu sau o sugestie.