online: 7; azi: 756; total: 52762 Manual clasa a xi a - Tehnici de programare - Divide et impera

Manual clasa a Xi a

Tehnici de programare

Divide et impera

Desenaţi praful lui Cantor, care este generat astfel: un segment de lungimea L, care este paralel cu axa Ox , este împărțit în cinci segmente egale, din care se elimină segmentul din mijoc — şi se repetă acest proces de n ori pentru fiecare segment rămas.
Pentru a desena praful lui Cantor, putem utiliza o funcție recursivă în combinație cu biblioteca grafică SDL. Mai întâi, trebuie să instalezi SDL2 pentru a putea compila și rula codul. Poți găsi instrucțiuni de instalare pentru diferite platforme aici: https://wiki.libsdl.org/Installation .
Iată un exemplu de program care desenează praful lui Cantor cu SDL:
# include < iostream >
# include < SDL.h >
const int SCREEN_WIDTH = 800 ;
const int SCREEN_HEIGHT = 600 ;
SDL_Window * window = nullptr ;
SDL_Renderer * renderer = nullptr ;
void drawCantorDust ( double x, double y, double length , int depth ) {
if ( depth <= 0 ) {
return ;
}
SDL_Rect rect = { static_cast < int >(x), static_cast < int >(y), static_cast < int >( length ), 3 };
SDL_RenderFillRect ( renderer , &rect);
double newLength = length / 3 ;
double newY = y + 30 ;
drawCantorDust (x, newY , newLength , depth - 1 );
drawCantorDust (x + 2 * newLength , newY , newLength , depth - 1 );
}
int main ( int argc , char * argv []) {
if ( SDL_Init (SDL_INIT_VIDEO) < 0 ) {
std :: cerr << "SDL could not initialize ! SDL_Error : " << SDL_GetError () << std :: endl ;
return 1 ;
}
window = SDL_CreateWindow ( "Cantor Dust " , SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if ( window == nullptr ) {
std :: cerr << " Window could not be created ! SDL_Error : " << SDL_GetError () << std :: endl ;
return 1 ;
}
renderer = SDL_CreateRenderer ( window , -1 , SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if ( renderer == nullptr ) {
std :: cerr << " Renderer could not be created ! SDL_Error : " << SDL_GetError () << std :: endl ;
return 1 ;
}
bool quit = false ;
SDL_Event e;
while (! quit ) {
while ( SDL_PollEvent (&e) != 0 ) {
if ( e.type == SDL_QUIT) {
quit = true ;
}
}
SDL_SetRenderDrawColor ( renderer , 255 , 255 , 255 , 255 );
SDL_RenderClear ( renderer );
SDL_SetRenderDrawColor ( renderer , 0 , 0 , 0 , 255 );
drawCantorDust ( 10 , 10 , SCREEN_WIDTH - 20 , 6 );
SDL_RenderPresent ( renderer );
}
SDL_DestroyRenderer ( renderer );
SDL_DestroyWindow ( window );
SDL_Quit ();
return 0 ;
}
Acest program desenează praful lui Cantor utilizând o funcție recursivă drawCantorDust . Funcția acceptă coordonatele x și y ale segmentului curent, lungimea segmentului și adâncimea maximă a recursiunii.
Apoi, funcția desenează un dreptunghi și elimină segmentul din mijloc, după care continuă să deseneze recursiv praful lui Cantor pentru segmentele rămase. Programul se încheie atunci când utilizatorul închide fereastra.
Asigură-te că ai instalat SDL2
P utem crea o soluție folosind biblioteca graphics.h , care face parte din pachetul BGI ( Borland Graphics Interface ) pentru C++. Acesta este un exemplu de program care desenează praful lui Cantor folosind graphics.h :
# include < iostream >
# include < graphics.h >
const int SCREEN_WIDTH = 800 ;
const int SCREEN_HEIGHT = 600 ;
void drawCantorDust ( int x, int y, int length , int depth ) {
if ( depth <= 0 ) {
return ;
}
line (x, y, x + length , y);
int newLength = length / 3 ;
int newY = y + 30 ;
drawCantorDust (x, newY , newLength , depth - 1 );
drawCantorDust (x + 2 * newLength , newY , newLength , depth - 1 );
}
int main () {
int gd = DETECT, gm ;
initgraph (& gd , & gm , "" );
drawCantorDust ( 10 , 10 , SCREEN_WIDTH - 20 , 6 );
getch ();
closegraph ();
return 0 ;
}

Acest program desenează praful lui Cantor utilizând o funcție recursivă drawCantorDust . Funcția acceptă coordonatele x și y ale segmentului curent, lungimea segmentului și adâncimea maximă a recursiunii.
Pentru a rula acest cod, va trebui să ai instalat BGI ( Borland Graphics Interface ) pentru C++ și să configurezi mediul tău de dezvoltare pentru a utiliza această bibliotecă. Poți găsi o implementare a graphics.h pentru compilatoarele moderne precum GCC și MinGW aici: https://github.com/stbrumme/bgi