Sunteți pe pagina 1din 16

ALGORITMI SI STRUCTURI DE DATE

Adrian CARABINEANU
2
Contents
1 Subiecte pentru laborator 5
1.1 Sortarea prin insert ie si prin interclasare . . . . . . . . . . . . 5
1.2 Fractali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3
4 CONTENTS
List of Figures
1.1 Varianta a covorului lui Sierpinski . . . . . . . . . . . . . . . . 10
1.2 Fulgul lui Koch . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Varianta a fulgului lui Koch . . . . . . . . . . . . . . . . . . . 12
3
4 LIST OF FIGURES
Capitolul 1
Subiecte pentru laborator
1.1 Sortarea prin insert ie si prin interclasare
i) Sa se modice programul C + + de sortare a unui sir de n numere ntregi
prin insert ie impun and ca sortarea part iala sa se efectueze pornind de la
ultimul termen al sirului spre primul.
# include <iostream.h
void main(void)
//datele de intrare
int n; int i=0;
cout<<n=; cinn;
int* a; a = new int [n];
while(i<n) { cout<<a[<<i<<]=; cin*(a+i); i=i+1} ;
//procedura de calcul
for(int j=1;j<n;j++) { int key=*(a+n-j-1);
//insereaza a[n-j-1] in sirul sortat a[n-j,...,n-1]
i=1;
while((i<j+1)*(*(a+n-j-1+i)<key))
{ *(a+n-j-2+i)=*(a+n-j-1+i); i=i+1;}
*(a+n-j-2+i)=key;
}
//datele de iesire
for(j=0;j<n;j++) cout<<a[<<j<<]=<<*(a+j)<<;;
}
ii) Sa se scrie un program pentru sortarea unui sir folosind urmatoarea
5
6 CAPITOLUL 1. SUBIECTE PENTRU LABORATOR
metoda: se sorteaza independent prin insert ie prima respectiv a doua jumatate
a sirului si apoi se interclaseaza cele doua subsiruri.
# include <iostream.h
/************************/
void intecl(int p, int q, int m, int n, int *a)
{
int *b,i,j,k;
i=p,j=m+1,k=1;
b=new int[n];
while(i<=m && j<=q)
if(*(a+i)<=*(a+j))
{ *(b+k)= *(a+i);
i=i+1;k=k+1; ); }
else {
*(b+k)=*(a+j);
j=j+1;
k=k+1; }
if(i<=m)
for (j=i;j<=m;j++)
{ *(b+k)= *(a+j);
k=k+1; }
else
for(i=j;i<=q;i++)
{
*(b+k)=*(a+i);
k=k+1; }
k=1;
for(i=p;i<=q;i++)
{ *(a+i)=*(b+k);
k=k+1; } }
/**********************/
void main(void) ){
//datele de intrare
int n,j,m;
int i=0;
cout<<n=;
cinn;
int* a;
1.1. SORTAREA PRIN INSERTIE SI PRIN INTERCLASARE 7
a = new int [n];
while(i<n) [n];
{ cout<<a[<<i<<]=;
cin*(a+i);
i=i+1;
//se sorteaza prin insertie prima jumatate a sirului
for(j=1;j<n/2;j++)
{ int key=*(a+j);
//insereaza a[j] in sirul sortat a[0,...,j-1]
i=j-1;
while((i=0)*(*(a+i)key))
{ *(a+i+1)=*(a+i);
i=i-1; }
*(a+i+1)=key; );
}
//se sorteaza prin insertie a doua jumatate a sirului
for(j=1;j<(n-n/2);j++)
{ int key=*(a+n-j-1);
//insereaza a[n-j-1] in sirul sortat a[n-j,...,n-1]
i=1;
while((i<j+1)*(*(a+n-j-1+i)<key))
{ *(a+n-j-2+i)=*(a+n-j-1+i);
i=i+1; }
*(a+n-j-2+i)=key;
}
m=n/2-1;
//interclasarea
intecl(0, n-1, m, n, a);
//datele de iesire
for(j=0;j<n;j++)
cout<<a[<<j<<]=<<*(a+j)<<;; }
iii) Sa se scrie un program care citeste n cuvinte si le ordoneaza lexi-
cograc folosind algoritmul de sortare prin insert ie.
Pentru a ret ine cuvintele declaram un vector n care ecare componenta
ret ine un cuvant char cuvant[100][25]. Pentru a compara doua cuvinte
folosim funct ia strcmp (apelam pentru aceasta sierul <string.h) care
are forma generala int strcmp(const char *s1, const char *s2) si care
dupa ce compara doua siruri de caractere returneaza una din valorile
8 CAPITOLUL 1. SUBIECTE PENTRU LABORATOR
- < 0 daca s1 < s2;
- = 0 daca s1 = s2;
- > 0 daca s1 > s2.
Putem folosi si funct ia stricmp care are forma generala int stricmp(const
char *s1, const char *s2) si acelasi rol ca strcmp. Diferent a este ca nu
face distinct ie ntre literele mari si literele mici.
De asemenea mai trebuie folosita funct ia strcpy care are forma generala
char *strcpy(char *dest, const char *sursa) si are rolul de a copia sirul
de adresa sursa la adresa dest.
Urmeaza programul scris nC + +.
# include <iostream.h
#include <string.h
void main(void) {
int i,n,j;
char cuvant[100] [25],key[25];
//datele de intrare
cout<<Numarul de cuvinte (n) =; cinn;
i=0;
while(i<n)
{ cout<<cuvant[<<i<<]=;
cincuvant[i];
i=i+1; }
//procedura de calcul
for(j=1;j<n;j++)
{ strcpy(key,cuvant[j]);
//insereaza cuvant[j] in sirul sortat cuvant[0,...,j-1] ;
i=j-1;
while((i=0)*(strcmp(cuvant[i],key)0))
{ strcpy(cuvant[i+1],cuvant[i]);
i=i-1; }
strcpy(cuvant[i+1],key); [i]);
}
//datele de iesire
for(j=0;j<n;j++)
cout<<cuvant[<<j<<]=<<cuvant[j]<<;;
}
1.1. SORTAREA PRIN INSERTIE SI PRIN INTERCLASARE 9
iv) Sa se scrie un program care citeste n nume dintr-un sier, le or-
doneaza lexicograc folosind algoritmul de sortare prin insert ie si insereaza
apoi numele ordonate n sier.

Intr-un sier numele.dat vom insera n prima linie numarul de nume


ce urmeaza a citite iar n a doua linie numele (elemente ale vectorului
nume[100] )ce urmeaza a ordonate alfabetic. Prin instruct iunea FILE*fp
declaram un pointer la sier. Pentru a deschide/crea sierul folosim instruct iunea
fp=fopen(numele.dat, a+) unde a+ reprezinta modul de acces la
sier (citire si adaugare de date). Funct ia fscanf(fp,%d,&n) va citi
numarul de cuvinte ce urmeaza a ordonate iar funct ia fscanf(fp,%s,&nume[indice])
citeste numele corespunzator din sier. Pentru scrierea pe o coloana a listei
de nume ordonate folosim instruct iunea fprintf(fp,%s\n

, nume[indice]).
Urmeaza programul:
#include <iostream.h
#include <string.h
#include<stdio.h
void main()
{ int indice,j,n,i;
typedef char vect20[21];
vect20 nume[100],key;
FILE*fp;
fp=fopen(numele.dat, a+);
fscanf(fp,%d,&n,\n

);
indice=0;
do{
fscanf(fp,%s,&nume[indice]);
indice++;}
while(indice<n);
fclose(fp);
for(j=0;j<indice;j++)
cout<<nume[<<j<<]=<<nume[j]<<;;
cout<<n;
for(j=1;j<n;j++)
{ strcpy(key,nume[j]);
i=j-1;
while((i=0)*(strcmp(nume[i],key)0))
{ strcpy(nume[i+1],nume[i]);
i=i-1; }
10 CAPITOLUL 1. SUBIECTE PENTRU LABORATOR
strcpy(nume[i+1],key);
}
for(j=0;j<n;j++) key);
cout<<nume[<<j<<]=<<nume[j]<<;
fp=fopen(numele.dat,a+);
indice=0;
do{
fprintf(fp,%s\n

, , nume[indice]);
indice++; }
while(indice<n);
}
1.2 Fractali
i) Sa se modice programul de desenare a covorului lui Sierpinski, astfel nc at
sa e mai multe spat ii albe iar desenul sa e colorat n diverse nuant e de gri
(1.1).
Figura 1.1: Varianta a covorului lui Sierpinski
1.2. FRACTALI 11
function covor(i);
% functia covor(n) deseneaza a n-a iterat ie a covorului lui Sier-
pinski
%daca se apeleaza funct ia fara argument se considera implicit
5 iterat ii
switch nargin
case 0
i=5;
end
tic
M=0
%se creeaza recursiv o matrice cu elementele0 si 1
%indicand punctele covorului
for k=1:i
M=[M, M/2, ones(3(k-1));
M/3, ones(3(k-1)),M;
M/6,9*M/10,M/4];
end
% comenzile pentru reprezentarea graca
imagesc(M);
colormap(gray);
axis(equal);
axis o;
toc
ii) Sa se scrie un program de desenare a fulgului lui Koch (g. 1.2, 1.3).
Fulgul lui Koch se obt ine construind curbele lui Koch pe laturile
unui triunghi echilateral. Cel mai simplu este sa se creeze o curba
Koch iar celelalte doua sa se obt ina din prima prin transformari
geometrice (rotat ii, simetrii, translat ii).
Dam mai jos un program Matlab de creare a fulgului lui Koch.
Impunem ca procesul iterativ sa se termine atunci cand marimea
ecarui segment ce alcatuieste curba lui Koch scade sub o anumita
valoare.
function fulgkoch()
lungime=0.01;
r=sqrt(3)/6;
clf;
set(gca,FontSize,24);
12 CAPITOLUL 1. SUBIECTE PENTRU LABORATOR
Figura 1.2: Fulgul lui Koch
Figura 1.3: Varianta a fulgului lui Koch
1.2. FRACTALI 13
set(gcf,Color,[1,1,1]);
hold on;
skoch(0,1,0,0,lungime,r);
hold o;
axis equal;
axis tight;
axis o;
%
function skoch(xl,xr,yl,yr,lungime,r)
if (abs(xl-xr)<lungime)
plot([xl xr],[yl yr],b-,LineWidth,2);
hold on;
xxl=xl*cos(pi/3)-yl*sin(pi/3);
xxr=xr*cos(pi/3)-yr*sin(pi/3);
yyl=xl*sin(pi/3)+yl*cos(pi/3);
yyr=xr*sin(pi/3)+yr*cos(pi/3);
plot([xxl xxr],[-yyl -yyr],b-,LineWidth,2)
xxxl=xl*cos(pi/3)-yl*sin(pi/3);
xxxr=xr*cos(pi/3)-yr*sin(pi/3);
yyyl=-xl*sin(pi/3)-yl*cos(pi/3);
yyyr=-xr*sin(pi/3)-yr*cos(pi/3);
plot([-xxxl+1 -xxxr+1],[yyyl yyyr],b-,LineWidth,2)
end
return
zl=xl+sqrt(-1)*yl;
zr=xr+sqrt(-1)*yr;
z3=2*zl/3+zr/3;
z4=(zl+zr)/2+(zr-zl)*sqrt(-1)*r;
z5=zl/3+2*zr/3;
skoch(xl,real(z3), yl,imag(z3),lungime,r);
skoch(real(z3),real(z4), imag(z3),imag(z4),lungime,r);
skoch(real(z4),real(z5), imag(z4),imag(z5),lungime,r);
skoch(real(z5),real(zr), imag(z5),imag(zr),lungime,r);
return
Pentru varianta fulgului lui Koch, corpul instuct iunii if va
nlocuit cu
plot([xl xr],[yl yr],b-,LineWidth,2)
hold on;
14 CAPITOLUL 1. SUBIECTE PENTRU LABORATOR
xxl=xl*cos(pi/3)+yl*sin(pi/3);
xxr=xr*cos(pi/3)+yr*sin(pi/3);
yyl=xl*sin(pi/3)-yl*cos(pi/3);
yyr=xr*sin(pi/3)-yr*cos(pi/3);
plot([xxl xxr],[yyl yyr],b-,LineWidth,2)
xxxl=xl*cos(pi/3)+yl*sin(pi/3);
xxxr=xr*cos(pi/3)+yr*sin(pi/3);
yyyl=-xl*sin(pi/3)+yl*cos(pi/3);
yyyr=-xr*sin(pi/3)+yr*cos(pi/3);
plot([-xxxl+1 -xxxr+1],[-yyyl -yyyr],b-,LineWidth,2)
return

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