Sunteți pe pagina 1din 6

Ministеrul Еducаțiеi, Culturii și Cеrcеtării аl Rеpublicii Mоldоvа

Univеrsitаtеа Tеhnică а Mоldоvеi


Fаcultаtеа Cаlculаtоаrе, Infоrmаtică şi Micrоеlеctrоnică
Dеpаrtаmеntul Ingineria Software și Automatică

RAPORT

Lucrarea de laborator Nr.7-8


la disciplina Structuri de date și algoritmi

VARIANTA 5.1.3

A efectuat: st.gr.TI-192
Ciobanu Ecaterina
A verificat: asist.univ.
Cristina Josan

CHIŞINĂU – 2020
Tema: Metode și tehnici de programare 

Scopul lucrării: Studierea și identificarea problemele care se pot rezolva cu metodele: Divide
et Impera, inclusiv și algoritmi de căutare și sortare (MergeSort, QuickSort și căutarea
binară), Backtracking, Greedy, Programarea dinamică. Implementarea algoritmilor de rezolvare bazați pe
aceste metode. 

PARTEA TEORETICĂ

Divide et Impera este o metodă de programare bazată pe un principiu simplu:

 problema dată se descompune în două (sau mai multe) subprobleme (de același tip ca problema inițială,
dar de dimensiuni mai mici);
 se rezolvă independent fiecare subproblemă;
 se combină rezultatele obținute pentru subprobleme, obținând rezultatul problemei inițiale.

Subproblemele trebuie să fie de același tip cu problema inițială, ele urmând a fi rezolvate prin aceeași
tehnică.
Subproblemele în care se descompun problema dată trebuie să fie:

 de același tip cu problema dată;


 de dimensiuni mai mici (mai “ușoare”);
 independente (să nu se suprapună, prelucrează seturi de date distincte).

Curba lui Koch

Un ilustru matematician suedez,Niels Fabian Helge von Koch(1870-1924),a creat o constructie


matematica cunoscuta sub numele de "Curba lui Koch".Pentru a ne da seama cum arata aceasta
constructie,imaginati-va un triunghi echilateral,apoi adaugati pe fiecare latura un alt triunghi
echilateral.Orice parte a ei,marita,arata fix ca originalul.De fiecare data cand un nou triunghi este adaugat la
figura centrala, lungimea liniei creste insa aria interioara a curbei lui Koch ramane mai mica decat aria unui
cerc desenat in jurul triunghiului original. Pe scurt,este o linie de o lungime infinita ce inconjoara o zona
finita.

Eficiența algoritmului:

Din punct de vedere al timpului de execuţie, algoritmul pentru generarea fractalului ”fulgul
lui Koch” execută de 3 ori funcţia recursivă „koch_line” care, pentru fiecare iteraţie, se mai
apeleza de incă 4 ori, rezultând astfel 3*4 n , adică un ordin de complexitate exponenţial, cu
exponentul „n” => O(4 n ).
PARTEA PRACTICĂ

Problema 5.1.3. Curba lui Koch 

Listing-ul programului în C++:


#include <graphics.h>
#include <iostream>
#include <conio.h>
#include <math.h>
#include <dos.h>

using namespace std;

float pi=3.14;
struct punct{
double x, y;
};
int iteratii;
int l; //dimensiunea ferestrei
int dly = 2; //delay

punct punct_treime(punct A, punct B){


punct C;
C.x = A.x + (B.x - A.x)/3;
C.y = A.y + (B.y - A.y)/3;
return C;
}

punct punct_mij(punct A, punct B){


punct E;
E.x = A.x + (cos(pi/3) * (B.x - A.x) - sin(pi/3) * (B.y - A.y));
E.y = A.y + (sin(pi/3) * (B.x - A.x) + cos(pi/3) * (B.y - A.y));
return E;
}

void draw(punct A, punct B, punct C, punct D, punct E){


moveto(A.x, A.y);
lineto(B.x, B.y); delay(dly);
lineto(C.x, C.y); delay(dly);
lineto(D.x, D.y); delay(dly);
lineto(E.x, E.y);
}

void koch_line(punct A, punct E, int n=1){


punct B, C, D;
B = punct_treime(A, E);
D = punct_treime(E, A);
C = punct_mij(B, D);
if (n<iteratii) {
koch_line(A, B, n+1);
koch_line(B, C, n+1);
koch_line(C, D, n+1);
koch_line(D, E, n+1);
}
else draw(A, B, C, D, E);
}

void koch_snowflake(punct A, punct B, punct C){


koch_line(A, B);
koch_line(B, C);
koch_line(C, A);
}

int main()
{
int gd=DETECT, gm;
initgraph(&gd,&gm,NULL);

cout<<"Dati dimensiunea laturii:";


cin>>l;
cout<<"Introduceti numarul de iteratii:";
cin>>iteratii;

punct A, B, C;
A.x = getmaxx()/2-l/2; A.y = getmaxy()/2+l*sqrt(3)/6;
B.x = getmaxx()/2+l/2; B.y = A.y;
C = punct_mij(B, A);

koch_snowflake(A, B, C);

getch();
closegraph();
return 0;
}

Analiza programului:
Liniile 1-5 reprezintă o directivă de preprocesare pentru a include funcțiile limbajului
Liniile 10-12 constau din defineare unui struct punt care conține 2 câmpuri, coordonata x și y a punctului
Funcția punct_treime returneaza coordonatele punctului de pe segmentul AB situat la 1/3 de A
Funcția punct_mij returnează punctul care împreună cu AB formează un triunghi echilateral
Funcția draw desenează o liniie frântă care unește în ordine punctele ebținute
Linia 34 are funcția lineto care deseanează o linie de la un punt la altul
Funcția koch_line Imparte segmentul in 3 subsegmente generand al treilea punct(varful triunghiului cu
subsegmentul din mijloc ca baza)
Funcția koch_snowflake apeleaza functia de generat puncte pe fiecare din laturile unui triunghi initial
Linia 63 inițializează imaginea grafică
Linia 75 apelează funcția kock_snowflake
Linia 78 închide imaginea grafică
Rezultatele obținute:

CONCLUZIE
Lucrarea de laborator nr.7 este o inițiativă de a acumula deprinderi de a lucra cu metodele de
programare, în cazul sarcinii mele cu metoda Divide et Impera. Sarcina lucrării a fost de a desena fractalul
lui Koch. Pentru a realiza sarcina am învățat tehnicile de lucru cu biblioteca grafică și am învățat a folosi
funcții ale bibliotecii precum line, linto, moveto, de a inițializa și de a închide o fereastră grafică. În uram
rulării codului pot afirma că programul lucrează corect și desenează corect conturul Fulgului lui Kock.

BIBLIOGRAFIE

1. Indicațiile metodice
2. https://sites.google.com/site/andresoiumocanu/curba-lui-koch
3. Programare în limbajul C/C++. Metode și tehnici de programre. Îndrumar de laborator, Josan
Cristina, Chișinău 2020
4. Code::Blocks Manual, S. Prasad, F. Aibara, Department of Computer Science and EngineeringIndian
Institute of Technology - BombayMumbai - 400076.August 5, 2014

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