Documente Academic
Documente Profesional
Documente Cultură
Raport
la sisteme de date si algoritmi
Ion
Octombrina
Chisinău, 2012
Cuprins:
1. Introducere
2. Sarcină
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.
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:
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
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
7. Concluzie
În urma efectuării acestui program:
8. Bibliografie