Sunteți pe pagina 1din 16

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Facultatea Calculatoare, Informatic i Microelectronic

Raport
La Programarea Calculatoarelor
LUCRAREA DE LABORATOR Nr. 5

Tema: Subprograme n C: FUNCII

A efectuat studentul grupei C-141:


Tutunaru Dan
A verificat:
tefan Marin

Chiinu, 2014

Obiectivele temei
-Aprofundarea cunotinelor n limbajul i mediul TurboC i perfecionarea
tehnicii de programare cu subprograme n prelucrarea structurilor complexe.
-nsuirea procedeelor de algoritmizare i progamare prin descompunerea
problemei n module autonome care, apoi, vor fi reprezentate prin secvene
/fragmente de program pentru prelucrarea unor informaii dup principii
comune cu apeluri multiple, analiznd soluiile stereotipe i cele eficiente de
introducere, afiare i rearanjri ale tablourilor etc.
-nsuirea tehnicilor eficiente de parcurgere, cutare, schimbare i ordonare a
structurilor i calculul conform cunotinelor obinute din matematic n baza
ciclurilor i ncorporate ntr-un program complex, alctuit dup principiile
structurale i modulare.

Subiectele temei i ordinea executrii


-Studierea principiilor prelucrrii (descrierii, declarrii, formrii, etc.)
tablourilor.
-Studierea metodei de descompunere top-down a programului pe module aparte
care s fie apelate n diferite sectoare a programului, utiliznd subprograme.
-nsuirea tehnicilor moderne de elaborare a programelor complexe n C n
baza problemelor din lucr. de laborator nr.3.
-Elaborarea testelor i depanarea programului diverse moduri n mediul
integrat C.
-Compararea tehnicilor simple i celor bazate pe principiile structurale i
modulare.

Funcii si programarea structurata


Programarea structurata este o metod ce rezolva problema cu o strategie a
programrii mai eficient si are urmtoarele principii:
1. Structurile de control trebuie sa fie ct se poate de simple;
2. Construcia unui program trebuie sa fie descrisa top-down.
Definirea i apelarea funciilor n C.
n C noiunea de funcie este esenial, deoarece asigur un
mecanism de abstractizare a controlului: rezolvarea unei pri a
problemei poate fi ncredinat unei funcii, moment n care
suntem preocupai de ce face funcia, fr a intra n detalii
privind cum face funcia anumite operaii. nsi programul
principal este o funcie cu numele main(), iar programul C este
reprezentat de o mulime de definiri de variabile i de funcii.
Funciile pot fi clasificate n:
- funcii care ntorc un rezultat;
- funcii care nu ntorc nici
procedurilor din Pascal).

un

rezultat

(similare

Un program este compus din una sau mai multe funcii, printre care si
"main()" principala funcie. ntotdeauna execuia unui program ncepe cu
"main()". Cnd o funcie este apelata (sau invocata) atunci controlul
programului este pasat funciei apelate. Dup ce aceasta i termina
execuia, atunci se paseaz napoi controlul ctre principala funcie.

Codul surs C care descrie ce face o funcie se numete "definiia funciei".


Aceasta are urmtoarea form generala:
tip nume_funcie (lista_parametri_formali)
{
< declaraia variabilelor locale, vizibile numai pentra aceast
funcie; >
< instruciuni executabile; >
return <rezultatul final>;
}
Primul rnd se numete "header-ul" (antetul) funciei, iar ceea ce este inclus
intre acolade se numete corpul funciei. Daca in antet nu precizam parametrii,
atunci se va scrie "void" (cuvnt rezervat pentru lista vida). Daca Funcia nu
ntoarce nici o valoare, atunci se va scrie ca tip ntors tot "void". Tipul returnat
(ntors) de funcie este cel precizat in "return" (ce va fi ndat explicat).
Parametrii din antetul funciei (lista_parametri_formali) sunt dai printr-o lista cu
argumente separate prin virgula. Aceste argumente sunt date de tipul
argumentului urmat de un identificator ce aparine acelui tip. Se mai spune ca
acel identificator este "parametru formal".

#include <>
void tipareste_mesaj(int k)
{
int i;
printf("Iti urez:\n");
for (i = 0; i < k; ++i)
printf(" O zi buna ! \n");
}
main()
{
int n;
printf("Dati un numar natural mic: ");
scanf("%d", &n);
tipareste_mesaj(n); // apelul functiei tipareste_mesaj
}

Instruciunea "return" Instruciunea "return" este folosita pentru doua


scopuri. Cnd se executa o instruciune "return", controlul programului este
pasat napoi programului apelant. In plus, daca exista o expresie dup acest
"return", atunci se va returna valoarea acestei expresii. Instruciunea "return"
poate avea formele:
return;
sau
return expresie;
Exemplul 2: Gsirea minimului a doi intregi.
#include <>
int min(int x, int y)
{
if (x < y) return x;
else return y
}
main()
{
int j, k, m;
printf("Dati doi intregi: ");
scanf("%d%d", &j, &k);
m = min(j, k); / apelul functiei min /
printf("\n%d este minimul dintre %d si %d.\n", m, j, k);

Exemplul definirii funciilor n C prin prototipurile funciilor, n stil nou,


cnd corpul funciei se amplaseaz dup necesitate fr restricii n afara
lui main():
In C, apelul unei funcii poate apare naintea declarrii ei. Funcia poate fi
definita mai trziu in acelai fiier, sau in alt fiier sau dintr-o biblioteca
standard. In ANSI C, prototipul funciei remediaz problema punnd la
dispoziie numrul si tipul argumentelor funciei. Prototipul specifica, de
asemenea, si tipul returnat de funcie.
Sintaxa prototipului unei funcii este:
tip nume_funcie (lista_tipuri_parametri_formali);
In lista de parametri putem specifica chiar si parametrul, dar acesta este
optional. Daca Funcia nu are parametri, atunci se folosete "void".
Exemplu: Reluam un exemplu precedent.
#include <>
main()
{
int n;
void tipareste_mesaj(int);
printf("Dati un numar natural mic: ");
scanf("%d", &n);
tipareste_mesaj(n);
}
void tipareste_mesaj(k)
{
int i;
printf("Iti urez:\n");
for (i = 0; i < k; ++i)
printf(" O zi buna ! \n");

Descrierea metodei "top-down"


Presupunem ca avem de citit civa ntregi si trebuie sa-i afim in ordine pe
coloane (in captul de sus al coloanelor trebuie sa scriem numele cmpului), sa
le afim suma lor pariala, minimul si maximul lor. Pentru scrierea unui
program C ce face acest lucru, vom utiliza proiectarea (descrierea) "top-down".

Astfel, descompunem problema in urmtoarele module:


1. Un antet pentru problema data;
2. Scrierea cmpurilor;
3. Citirea si scrierea lor pe coloane.

Invocare si apel prin valoare


O funcie este invocata prin scrierea numelui sau mpreuna cu lista sa de
argumente intre paranteze. De obicei, numrul si tipul acestor argumente se
"potriveste" cu parametrii din lista de parametri prezenti in definitia funciei.
Toate argumentele sunt apelate prin valoare ("call-by-value"). Asta inseamna ca
fiecare argument este evaluat si valoarea sa este folosita ca valoare pentru
parametrul formal corespunzator. De aceea, daca o variabila (argument) este
folosita la transmiterea unei valori, atunci valoarea ei nu se schimba.

Exemplu:

#include <>
main()
{
int n=3, suma, calculeaza_suma(int);
printf("%d\n", n);
/* se va scrie 3 */
suma = calculeaza_suma(n);
printf("%d\n", n);
/* se va scrie 3 */
printf("%d\n", suma);
/* se va scrie 6 */
}

int calculeaza_suma(int n) /* suma numerelor de la 1 la n */


{
int suma = 0;
for ( ; n > 0; --n) /* n se schimba aici, dar nu si in main() */
sum += n;
printf("%d\n", n);
/* se va scrie 0 */
return suma;
}

Sunt date tablourile


X={xi}, i=1n; Y={yi}, i=1n i valoarea w, n baza crora s
calculeze valorile lui v:

Listingul :
#include<stdio.h>
#include<conio.h>
#include<math.h>
int first(int x[],int y[],int n)
{
int i,v,*a,*b;
a=x;b=y;
for(i=0;i<n;i++)
v=pow(*(a+i),2)+pow(*(b+i),2)+*(a+i)**(b+i);
return v;
}
int second(int x[],int y[],int n)
{

int i,v,*a,*b,s1,s2;
a=x;b=y;s1=0;s2=0;
for(i=0;i<n;i++)
{
s1=s1+pow(*(a+i),2);
s2=s2+pow(*(b+i),2);
}
return s1*s2;
}
int third(int x[],int y[],int n)
{
int j,i,v,*a,*b,s;
a=x;b=y;v=x[1];
for(j=0;j<n;j++)
{
s=1;
for(i=0;i<j;i++)
s=s**(b+i);
v=v+*(a+i)+s;
}
return v;
}
main()
{
clrscr();
int i,j,n,x[50],y[50],v,w;
printf("Introduceti marimea masivelor:");
scanf("%d",&n);
printf("\nIntroduceti valorile masivului x:");
for(i=0;i<n;i++)
scanf("%d",&x[i]);
printf("\nIntroduceti valorile masivului y:");
for(i=0;i<n;i++)
scanf("%d",&y[i]);
printf("\nIntroduceti w:");
scanf("%d",&w);
if(w==1) v=first(x,y,n);
if(w==2) v=second(x,y,n);
if(w==3) v=third(x,y,n);
printf("\nRezultatul este: %d",v);
getch();}

Laboratorul 3

#include <stdio.h>
#include <conio.h>
int * generate_array(int n)
{
int x[100], i;
puts("\nValorile masivului A:");

for(i=0;i<n;i++){
x[i]=rand()%35;
printf("%d ", x[i]);
}
return x;
}
int main ()
{
int n, i=0, j=0, s=0;
int *a;
int a2[100];
n=rand()%98;

a=generate_array(n);
for(i=0;i<=n;i+=2){
if(a[i]!=a[i+1]){
a2[j]=a[i]*a[i+1];j++; }
}
for(i=0;i<n;i++)
s+=a[i];
a2[j-1]=s;
puts("\nValorile masivului nou:");
for(i=0;i<j;i++){
printf("%d ", a2[i]);
}
getch();
return 0;
}

Laboratorul 4

#include <stdio.h>
#include <stdlib.h>

int a[50][50], m,n,r[50][50];


void read_array(int n, int m)
{
int i,j;

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


{
printf("Dati elementele rindului %i\n",i);
for(j=0; j<n; j++)scanf("%i",&a[i][j]);
}
}

void array_of_coincidences()
{
int x=0,i,j,k;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
for(k=0; k<m; k++) if(a[k][i]==a[k][j])x++;
r[i][j]=x;
x=0;
}
}
int response1()
{
int i,j,max=1,p=1;
for(i=0; i<n; i++)
for(j=0; j<n; j++) if(r[i][j]>max)
{
max=r[i][j];
p=1;
}
else if (r[i][j]==max)p++;
return p;

int response2()
{
int i,j,s;
for(i=0; i<n; i++)
for(j=0; j<n; j++) if(r[i][j]==0) s++;
return s;
}
int main()
{ printf("Dati dimensiunile tabloului:");
scanf("%i%i",&m,&n);
read_array(n,m);
array_of_coincidences();
printf("\n Numarul de coloane ce au cele mai multe asemanari:
%i\n Numarul de coloane ce se deosebesc una de alta: %i",
response1()/2,response2()/2);
return 0;}

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