Sunteți pe pagina 1din 8

Ministerul Educatiei Republicii Moldova

Universitatea Tehnică a Moldovei


Calculatoare, Informatică si Microelectronică

Raport
la sisteme de date si algoritmi

Tema: Tehnici de programare în C/C++


Lucrare de laborator nr.04

a efectuat: studentul gr.AI-111 Timbalari

Ion

a verificat: lector-asistent Moraru

Octombrina
Chisinău, 2012
Cuprins:

1. Introducere

2. Sarcină

3. Schema logică a programului(schema-bloc)

4. Listing-ul programului

5. Descrierea programului

6. Rezultatele obtinute

7. Concluzie

8. Bibliografie
1. Introducere
În rezolvarea unei probleme cu calculatorul este importanta definirea strategiei de rezolvare a problemei si
definirea optima a algoritmului. Exista cateva metode speciale de elaborare a algoritmilor. Alegerea uneia sau
alteia fiind facuta in concordanta cu specificul problemei de rezolvat si cu eficienta algoritmului. Fiecare
algoritm are un context in care este folosit. Metodele (strategiele, tehnicile de rezolvare) care vor fi luate in
discutie sunt: metoda Backtracking , metoda "Greedy", metoda "divide et impera", metoda programarii
dinamice si metoda Branch and Bound.

Studiul algoritmilor cuprinde mai multe aspecte:

i) Elaborarea algoritmilor. Actul de creare a unui algoritm este o arta care nu va putea fi niciodata pe
deplin automatizata. Este in fond vorba de mecanismul universal al creativităţii umane, care produce noul
printr-o sinteza extrem de complexa de tipul:

tehnici de elaborare (strategie, reguli) + creativitate (cunoştinţe, intuitie) = soluţie eficientă.

Un obiectiv major al acestei compartiment este de a prezenta diverse tehnici fundamentale de elaborare a
algoritmilor. Utilizand aceste tehnici, acumuland si o anumita experienta, veti fi capabili sa concepeti algoritmi
eficienti.

ii) Exprimarea algoritmilor. Forma pe care o ia un algoritm intr-un program trebuie sa fie clara si
concisa, ceea ce implica utilizarea unui anumit stil de programare. Acest stil nu este in mod obligatoriu legat de
un anumit limbaj de programare, ci, mai curand, de tipul limbajului si de modul de abordare. Astfel, incepand
cu anii ‘80, standardul unanim acceptat este cel de programare structurata. In prezent, se impune standardul
programarii orientate pe obiect.

iii) Validarea algoritmilor. Un algoritm, dupa elaborare, nu trebuie in mod necesar sa fie programat pentru
a demonstra ca functioneaza corect in orice situatie. El poate fi scris initial intr-o forma precisa oarecare. In
aceasta forma, algoritmul va fi validat, pentru a ne asigura ca algoritmul este corect, independent de limbajul in
care va fi apoi programat.

iv) Analiza algoritmilor. Pentru a putea decide care dintre algoritmii ce rezolva aceeasi problema este mai
bun, este nevoie sa definim un criteriu de apreciere a valorii unui algoritm. In general, acest criteriu se refera la
timpul de calcul si la memoria necesara unui algoritm. Vom analiza din acest punct de vedere toti algoritmii
prezentati.

v) Testarea programelor. Aceasta consta din doua faze: depanare (debugging) si trasare (profiling).
Depanarea este procesul executarii unui program pe date de test si corectarea eventualelor erori. Dupa cum
afirma insa E. W. Dijkstra, prin depanare putem evidentia prezenta erorilor, dar nu si absenta lor. O
demonstrare a faptului ca un program este corect este mai valoroasa decat o mie de teste, deoarece garanteaza
ca programul va functiona corect in orice situatie. Trasarea este procesul executarii unui program corect pe
diferite date de test, pentru a-i determina timpul de calcul si memoria necesara. Rezultatele obtinute pot fi apoi
comparate cu analiza anterioara a algoritmului. Aceasta enumerare serveste fixarii cadrului general pentru
problemele abordate in carte: ne vom concentra pe domeniile i), ii) si iv).

2. Sarcină

Dându-se n şi p numere naturale (n³ p), se cere să se genereze toate submulţimile cu p elemente ale
mulţimii { 1,...,n} .
3. Schema logică a programului(schema-bloc)
fun_read_f(char*s,long*n,long*m) init

fopen(s1,”r”) s=

fscanf(pf,n,m)
fun_read(s,n,m)

fn
*c= fun_komb(*n,*m)

int fun_com()

*c

w=

*c

w!=d&
&w!=n
fun_com

w!=n
return
fun_com() fn

return 1 return 0

long fun_komb(long*n,long*m)

n>=m&
&m>=0

return 0

return fun_komb(n,m-1)* return 1


FILE *pf=fopen("fis.txt","r"); fscanf(pf,"Îd
Îd",&n,&p); fclose(pf);
}
1. algoritmul int posibil(int k)
backtracking {
if (k>1)
#include <stdio.h>
if (x[kţ<=x[k-1]) return 0;
#include <conio.h>
return 1;
#include
}
<iostream.h> int n,
p, x[20], sol=0; void void scrie(void)
citire(void) {
{ sol++;
cout<<"\n";
for(int i=1; i<=p; i++) 4. Listingul programului
cout<<x[i]<<"\ ";
}
void back(int k)
{
for(int l=1; l<=n; l++)
{
x[k]=l;
if(posibil(k))
if(k
==
p)
scri
e();
else
back(k
+1);
}
}
void main(void)
{ cit
ire()
;
clrs
cr();
bac
k(1)
;
cout<<endl<<"sunt "<<sol<<" combinari";
getch();
}

2. algoritmul recursiv
#include<stdio.h>
#include<conio.h>
#include<string.h>
void fun_read_f(char *s1, long *n1, long *m1)
{
FILE *pf=fopen(s1,"r");
fscanf(pf,"%li %li",n1,m1);
fclose(pf);
}
long fun_komb(long n1, long m1)
{
if(m1>=0&&n1>=m1)
if(m1)
return fun_komb(n1,m1-1)*(n1-m1+1)/m1;
else
return 1;
else
{
puts("!!! EROARE... combinarile nu pot fi kalkulate...\n");
return 0;
}
}
int fun_com()
{
char *w;
printf(">>> doritsi sa mai generatsi o kombinare? <D>a <N>u :");
scanf("%s",w);
if(strncmpi(w,"d",1)&&strncmpi(w,"n",1))
{
puts("!!! EROARE... Atsi introdus optsiune greshita...\n*** ATENTSIE... alegetsi din varaintele propuse...");
return(fun_com());
} else
if(strncmpi(w,"n",1))
return 1;
else
return 0;
}
main()
{
do
{
char *s;
printf(">>> da numele fishierului spre deskidere de tipul<nume_file.extensie>: ");
scanf("%s",s);
long *n,*m,*c;
fun_read_f(s,n,m);
*c=fun_komb(*n,*m);
if(*c)
printf("### numarul de kombinari: %li\n",*c);
}
while(fun_com());
}
5. Descrierea programului

1) #include<*.h> – includerea bibliotecilor necesare.


2) void main(){} – func i a principală.
3) fun_read_f(s,n,m){} – funcţia care preia valorile combinărilor n cîte m din fişierul sursă cu numele s.
4) int fun_komb(n1,m1){} – funcţie recursivă care returnează valaorea combinarilor din m cîte n
elemente.
5) int fun_com(){} – funcţia care returnează valoarea 1 daca raspunsul este DA şi 0 în caz contrar.
6) clrscr() - cura ă memoria vizuală înaite de executarea programului.
7) getch() - men i ne memoria vizuală pînă la tastarea butonului ENTER.
6. Rezultatele ob inute

7. Concluzie
În urma efectuării acestui program:

ü am sistematizat cunoștin ele despre structura unui program


ü am sistematizat cunoștin ele despre instruc i unile ciclice
ü am sistematizat cunoştinţele despre funcţiile recursive
ü am sistematizat cunoştinţele despre metodelel de programare
ü am sistematizat cunoștin ele despre instruc i unile ramificate
ü am sistematizat cunoștin ele despre func i ile vide
ü am sistematizat cunoștin ele despre func i ile definite
ü am sistematizat apelarea unei func i i în altă func i e
ü am sistematizat folosirea varaibilelor globale
ü am sistematiza folosirea pointerilor în calitate de parametri functie

8. Bibliografie

1) ”Programare - Ini ializare în limbajele C și C++” de Sergiu G. Istrat