Documente Academic
Documente Profesional
Documente Cultură
Introducere.................................................................................................................................2
Descrierea aplicației:.................................................................................................................4
Sarcina 1................................................................................................................................4
Sarcina 2................................................................................................................................5
Sarcina a 3-a..........................................................................................................................7
Sarcina 4................................................................................................................................8
Sarcinile 5 și 6.......................................................................................................................9
Sarcina 7..............................................................................................................................10
Testarea programului...............................................................................................................16
Meniu...................................................................................................................................16
Afișare.................................................................................................................................16
Sarcina 1..............................................................................................................................16
Sarcina 2..............................................................................................................................17
Sarcina 3..............................................................................................................................17
Sarcina 4. ............................................................................................................................17
Sarcina 5/6...........................................................................................................................17
Sarcina 7..............................................................................................................................18
Sarcina 8. Problema.............................................................................................................18
Concluzie.................................................................................................................................19
Bibliografie..............................................................................................................................20
Introducere.
1
Enunțul sarcinii individuale:
11. Arhipelagul. Planul unui arhipelag are forma unei matrice binare A cu nm (n, m ≤ 50) zone
pătrate (vezi figura 1). Se defineşte o insulă a unei matrice A aşa un obiect ce este format din elemente cu
valoarea 1 care se învecinează pe linii, pe coloane sau pe diagonale.
2
P2i =6, P2j =8, introduse de la tastatură, şi fişierul de intrare Insule.in (vezi figura 2), fişierul de ieşire
Cale.out va avea formatul din figura 3.
Descrierea aplicației:
Datele despre matricea în studiu vor fi citite din fișierul text Insule.in , n fiind numărul
de linii, iar m – numărul de coloane. După ce datele sunt citite fișierul este închis, pentru a
nu suferi modificări nedorite pe parcursul execuției programului.
fstream f("Insule.in");
f>>n>>m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
f>>A[i][j];
f.close();
Sarcina 1.
Pentru elaborarea primei sarcini am elaborat funcția Insereaza( ), care primește ca
parametri adresele dimensiunilor matricei (pentru a putea fi modificate) și matricea A.
Această funcție ne dă posibilitatea sa alegem între înserarea unei linii sau a unei coloane,
3
după care trebuie să introducem de la tastatură n elemente pentru o coloană sau m elemente
pentru o linie nouă.
Sarcina 2.
Pentru sarcina a 2-a va fi folosită funcția Exclude( ), care primește ca parametri
adresele variabilelor n și m (pentru ca modificarile să fie vizibile în afara funcției) și matricea
însăși. La fel ne dă posibilitatea de a alege între excluderea unui rând sau a unei coloane,
4
după care va trebui sa dăm de la tastatură numărul de ordine al rândului sau a coloanei ce
urmează să fie exclusă.
5
Sarcina a 3-a va fi rezolvată cu ajutorul funcției Unitati( ), având ca parametri
dimensiunile și matricea. Această funcție ne dă posibilitatea să alegem între determinarea
numărului de unități ale unei linii sau ale unei coloane numărul de ordine fiind citit de la
tastatură.
6
Sarcina 4. Sortarea coloanelor după numărul de unități prin metoda numărării va fi
realizată cu ajutorul funcției Sort_Coloane( ). Această funcție va folosi 3 tablouri auxiliare,
și anume tabloul B[2][20] care va memora numărul de unități al fiecărei coloane din matricea
inițială și tablourile C[2][20] și D[20], necesare pentru sortare prin metoda numărării.
7
void Sort_Coloane(int n, int m, int A[][50])
{
int B[2][20],C[2][20], D[20], i,j;
for (j=1; j<=m; j++) B[0][j]=0;
for (j=1; j<=m; j++)
for (i=1; i<=n; i++)
if (A[i][j]==1) B[0][j]++;
for (j=1; j<=m; j++) B[1][j]=j;
// Sortarea prin numarare
// Pasul 1 fac o copie a vectorului B in vectorul C
for(j=1; j<=m; j++)
{ C[0][j]=B[0][j]; C[1][j]=B[1][j]; }
// Pas 2 crearea vectorului D
for (j=1; j<=m; j++) D[j]=0;
// determinam pentru fiecare element cate elemente sunt mai mici
for (i=1; i<=m; i++)
for (j=i+1; j<=m; j++)
if ( B[0][i] < B[0][j] ) D[j]++;
else D[i]++;
// Pasul 3 Se rescriu elementele lui B in ordine crescatoare
for (i=1; i<=m; i++)
{
B[0][D[i]+1]=C[0][i];
B[1][D[i]+1]=C[1][i];
}
cout<<"\nVectorul sortat (unitati): \n";
for (j=1; j<=m; j++) cout<<B[0][j]<<' ';
cout<<"\nVectorul sortat (pozitia initiala a coloanei): \n";
for (j=1; j<=m; j++) cout<<B[1][j]<<' ';
8
void Cauta(int i, int j, int B[][50], int &nr)
{
if (B[i][j]==1)
{
nr++;
B[i][j]=0;
Cauta(i-1,j-1,B,nr);
Cauta(i,j-1,B,nr);
Cauta(i+1,j-1,B,nr);
Cauta(i-1,j,B,nr);
Cauta(i+1,j,B,nr);
Cauta(i-1,j+1,B,nr);
Cauta(i,j+1,B,nr);
Cauta(i+1,j+1,B,nr);
}
else return;
}
9
Această funcție caută și înscrie într-o matrice auxiliară toate pătratele ce conțin pe diagonala
segundară zerouri, apoi caută și afișează pe ecran pătratul de arie maximă.
void Patrat(int n, int m, int A[][50])
{
int i,j,B[50][50], C[3][50], x=1;
for (i=1; i<=50; i++) C[2][i]=0;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
B[i][j]=A[i][j];
10
Sarcina 8. Ultima problemă.
Sarcina dată presupune gasirea celui mai scurt drum pentru traversarea a 2 orașe, după
următorul traseu: O1P1 (pe uscat), P1P2 (pe mare), P2O2 (pe uscat).
Această sarcină, fiind una de o complexitate ridicată, a necesitat eleborarea mai multor
subprograme.
Pentru a simplifica problema, am împărțit-o în 3 părți, fiecare parte reprezentând unul
din cele 3 trasee.
Funcția inside( ) va avea grijă ca în procesul de verificare a traseului sa nu se
părăsească limitile matricei.
int inside(int i, int j, int n, int m)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
Funcția afis( ), va rescrie primul traseu, iar funcția afis_2( ) va rescrie cel de al 2-lea și
al 3-lea traseu. Singura diferență dintre a 2-a funcție este că va rescrie începând cu al 2-lea
pas, pentru a nu apărea repetări ale pașilor din traseul trecut.
void afis(int pmin, int sol[20][3], void afis_2(int pmin, int sol[20][3],
int sol_2[100][3]) int sol_2[100][3])
{ {
for (int i=1;i<=pmin;i++) for (int i=2;i<=pmin;i++)
{ {
pasi++; pasi++;
sol_2[pasi][1]=sol[i][1]; sol_2[pasi][1]=sol[i][1];
sol_2[pasi][2]=sol[i][2]; sol_2[pasi][2]=sol[i][2];
} }
} }
11
Funcțiile back( ) și back_2( ) vor răspunde de gasirea traseelor propriu zise. Funcția
back cauta cele 2 trasee de pe uscat, iar back_2 – traseul de pe mare.
void back(int i,int j, int pas, int xi, int yi, int void back_2(int i,int j, int pas, int n, int m, int
n, int m, int A[][50]) A[][50])
{ {
int inou, jnou,k; int inou, jnou,k;
if(i==xi && j==yi) if(i==P2i && j==P2j)
alege(pas-1); alege(pas-1);
else else
for(k=0; k<=3; k++) for(k=0; k<=3; k++)
{ {
inou=i+di[k]; inou=i+di[k];
jnou=j+dj[k]; jnou=j+dj[k];
if(inside(inou,jnou,n,m) && if(inside(inou,jnou,n,m) &&
A[inou][jnou]==1 ) // ==0 A[inou][jnou]==0 ) // ==0
{ {
A[inou][jnou]=pas; A[inou][jnou]=pas;
x[pas][1]=inou; x[pas][1]=inou;
x[pas][2]=jnou; x[pas][2]=jnou;
back(inou,jnou,pas+1,xi,yi,n,m,A); back_2(inou,jnou,pas+1,n,m,A);
A[inou][jnou]=1; //=0 A[inou][jnou]=0; //=0
} }
} }
} }
scrie(pasi,sol_2);
}
12
Grafica. Crearea butoanelor. Biblioteca windows.h .
case WM_CREATE:
hwndLbl = CreateWindow(TEXT("STATIC"), TEXT("Meniu:"),
WS_VISIBLE | WS_CHILD | WS_BORDER, 70,10,60,20,
hwnd, (HMENU) ID_LABEL, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("1) Citire date din fisier"),
WS_VISIBLE | WS_CHILD, 50,50,150,25,
hwnd, (HMENU) 1, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("2) Afisare pe ecran"),
WS_VISIBLE | WS_CHILD, 50,80,150,25,
hwnd, (HMENU) 2, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("3) Inserare"),
WS_VISIBLE | WS_CHILD, 50,110,150,25,
hwnd, (HMENU) 3, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("4) Excludere"),
WS_VISIBLE | WS_CHILD, 50,140,150,25,
hwnd, (HMENU) 4, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("5) Nr. unitati"),
WS_VISIBLE | WS_CHILD, 50,170,150,25,
hwnd, (HMENU) 5, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("6) Sortare coloane"),
WS_VISIBLE | WS_CHILD, 270,50,160,25,
hwnd, (HMENU) 6, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("7) Nr. insule"),
WS_VISIBLE | WS_CHILD, 270,80,160,25,
hwnd, (HMENU) 7, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("8) Patrat arie maxima"),
WS_VISIBLE | WS_CHILD, 270,110,160,25,
hwnd, (HMENU) 8, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("9) Problema insule"),
WS_VISIBLE | WS_CHILD, 270,140,160,25,
hwnd, (HMENU) 9, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("Sterge ecran"),
WS_VISIBLE | WS_CHILD, 270,170,160,25,
hwnd, (HMENU) 10, NULL, NULL);
hwndcmd = CreateWindow(TEXT("BUTTON"), TEXT("EXIT!"),
WS_VISIBLE | WS_CHILD, 350,300,150,25,
hwnd, (HMENU) 99, NULL, NULL);
hwndedit = CreateWindow(TEXT("EDIT"), TEXT("Introduceti de la tastatura"),
WS_VISIBLE | WS_CHILD, 50,300,250,25,
hwnd, (HMENU) 100, NULL, NULL);
system("color 72");
break;
13
Butoanele. Atribuirea de acțiuni.
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 1:
{
MessageBox(hwnd, "Datele au fost citite", "Citire", MB_OK | MB_ICONINFORMATION);
fstream f("Insule.in");
f>>n>>m;
//PostQuitMessage (0);
break;
}
case 2:
MessageBox(hwnd, "Datele vor fi afisate", "Afisare", MB_OK | MB_ICONINFORMATION);
Afisare(n,m,A);
break;
case 3:
{
MessageBox(hwnd, "Datele vor fi inserate", "Insereaza", MB_OK | MB_ICONINFORMATION);
Insereaza(n,m,A);
ofstream h("Insule.in");
h<<n<<' '<<m<<endl;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
h<<A[i][j]<<' ';
h<<endl;
14
case 4:
{
Exclude(n,m,A);
ofstream h("Insule.in");
h<<n<<' '<<m<<endl;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
h<<A[i][j]<<' ';
h<<endl;
}
h.close();
MessageBox(hwnd, "Fisierul 'Insule.in' a fost modificat!", "INFO", MB_OK | MB_ICONINFORMATION);
break;
}
case 5:
Unitati(n,m,A);
break;
case 6:
Sort_Coloane(n,m,A);
break;
case 7:
Nr_Insule(n,m,A);
break;
case 8:
Patrat(n,m,A);
break;
case 9:
Ultima_problema(n,m,A);
MessageBox(hwnd, "Rezultatele au fost inscrise in fisierul Cale.out", "INFO", MB_OK |
MB_ICONINFORMATION);
break;
case 10:
MessageBox(hwnd, "Ecranul va fi curatit", "CLEAR", MB_OK | MB_ICONINFORMATION);
system("cls");
break;
case 99:
PostQuitMessage (0);
break;
}
15
Testarea programului
Meniu.
Afișare.
Sarcina 1.
16
Sarcina 2.
Sarcina 3.
Sarcina 4.
Sarcina 5/6
17
Sarcina 7.
Sarcina 8. Problema.
18
Concluzie
19
Bibliografie
20