Documente Academic
Documente Profesional
Documente Cultură
Referent tinific,
S.L.DRD. ing. LUMINIA
DU
INTRODUCERE .................................................................................................3
Capitolul I NOIUNI TEORETICE ....................................................................5
I.1. Prezentare Visual Basic .............................................................................. 5
I.1.1. Prezentarea mediului de programare Visual Basic (IDE)...................... 6
I.1.2. Proiectarea interfeelor grafice n Visual Basic.....................................8
I.1.3. Proiectarea unei forme ....................................................................... 10
I.2. Prezentarea tehnicii backtracking ............................................................. 20
I.2.1. Programul in C++ pentru realizarea permutarilor a n numere. ............ 23
I.2.2. Program in C++ pentru realizarea unei permutari de n (n par) numere,
grupate in perechi complementare si asezate in pozitii corespondente......... 23
Capitolul II PTRATE MAGICE...................................................................... 25
II.1. Istoric...................................................................................................... 25
II.2. Definiii si terminologie .......................................................................... 25
II.3. Proprietile generale ale ptratelor magice............................................. 27
II.4. Metode pentru construirea patratelor magice........................................... 29
II.5. Ptrate impare ......................................................................................... 29
II.5.1. Metoda lui Bachet de Mziriac ......................................................... 29
II.5.2. Programul in C++ pentru metoda Bachet de Mziriac....................... 30
II.5.3. Metoda lui La Hire............................................................................ 32
II.5.4. Programul in C++ pentru ptrate magice impare dupa metoda lui La
Hire. ............................................................................................................ 35
II.6. Ptrate par pare ....................................................................................... 37
II.6.1. Metoda lui La Hire............................................................................ 37
II.6.2. Programul n C++ pentru ptratele par pare dupa metoda lui La Hire39
II.7. Ptrate impar pare ................................................................................... 41
II.7.1. Programul n C++ pentru ptratele magice par impare. ..................... 43
II.7.2. Crearea fiierelor text n C++............................................................ 47
II.8. Ptrate magice cu borduri........................................................................ 48
II.9. Discuia ptratelor magice....................................................................... 50
II.10. Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC .................... 52
II.10.1. Interfaa .......................................................................................... 52
II.10.2. Programele sursa............................................................................. 56
Concluzii ........................................................................................................ 67
Indice alfabetic ............................................................................................... 68
BIBLIOGRAFIE ............................................................................................ 69
Capitolul I
NOIUNI TEORETICE
ToolBox
Formular
Fereastra de
proprietati
Fereastra Properties
Fereastra Properties afieaz proprietile controlului sau formei selectate,
ce pot fi setate n timpul proiectrii programului.
Fereastra Form Layout
Fereastra Form Layout ajut la poziionarea formei pe ecran utiliznd o
mic reprezentare a ecranului.
I.1.2. Proiectarea interfeelor grafice n Visual Basic
Primul pas n crearea unei aplicaii vizuale n Visual Basic este s
proiectai interfaa grafic prin intermediul creia utilizatorul va interaciona cu
aplicaia. Interfeele grafice fac ca programele Windows sa fie att de uor de
folosit de o gam larg de utilizatori. Proiectarea unei interfee ct mai simple i
ct mai atractive constituie un atu important pentru un program Windows.
Ce sunt formele i controalele ?
Forma constituie fundaia de la care se pleac n proiectarea interfeei. Cu
ajutorul lor vei construi ferestre i casete de dialog. Forma este locul unde vei
insera controale cu care utilizatorii interacioneaz n timp ce folosesc aplicaia.
Controalele sunt acele lucruri care le permit utilizatorilor care folosesc programul
s fac diferite lucruri: s introduc un text, s apese un buton, s valideze o
opiune, s vad coninutul unui fiier din interiorul aplicaiei etc.
Adugarea i tergerea controalelor
Adugarea controalelor se poate realiza n dou moduri :
I.
II.
apoi apsa-i tasta Delete sau alegei comanda Delete din meniul de context
Mutarea redimensionarea i blocarea controalelor
Pentru a muta un control n cadrul formei selectai-l i innd mouse-ul
apsat pe el, tragei de el pn ajunge n poziia dorit.
Pentru a schima dimensiunile unui control poziionai-v cu mouse-ul pe
una din laturi i n momentul n care cursorul mouse-ului s-a transformat ntr-o
sgeat deplasai mouse-ul mn cnd controlul are dimensiunea dorit.
n poziionarea i dimensionarea controalelor v pot fi de un real folos comenzile
din meniul Format. Dac dorii o aliniere a mai multor controale, selectai
controalele pe care dorii s le aliniai i alegei una dintre comenzile Align
(alinire le stnga ,la dreapta ,n centru, n partea de sus, n partea de jos, la mijloc
relativ la marginile formei. Alinierea se face n funcie de ultimul control selectat
care este marcat diferit de celelalte; selectarea mai multor controlale se face
innd apsat tasta Ctrl i efectund clic cu mouse-ul pe controalele dorite. O
dat poziionate n cadrul formei, controalele pot fi blocate n poziia n care au
fost puse pentru a se evita o eventual deplasare a lor din greeal. Pentru aceasta
selectai comanda Lock Controls din meniul Format. Pentru deblocare selectai
aceeai comand.
10
proprietilor
formei
influeneaz
modul de
afiare.
11
12
Scrierea codului
O aplicaie nu este altceva dect o serie de instruciuni care i spun
computerului cum s ndeplineasc o anumit sarcin. Astfel, pentru fiecare
form pe care ai adugat-o la aplicaie exist un modul al formei (un fiier cu
extensia .frm) unde putei scrie cod ce i va determina modul de comportare.
Modulele formelor constituie baza majoritii aplicaiilor create n Visual Basic.
Ele conin declaraii de variabile, constante, tipuri definite de utilizator,
enumerri, proceduri ce gestioneaz evenimentele, proceduri i funcii globale
sau locale.
Setul de caractere
Aceste cuvinte sunt entiti formate din caractere. n cazul limbajului
Visual Basic se pot folosi urmtoarele caractere (pe care le putei vedea i pe
tastatura calculatorului): - literele mari i mici ale alfabetului limbii romne: A-Z,
a-z; inclusiv caracterele specifice limbii romne:,,,,;
- Cifrele sistemului de numerotaie zecimal:0-9;
- Caractere speciale: + - / ^ () [] {}. , ; :_ ! # % & $ etc.;
- Caracterele speciale perechi: <=, >=, := <>;
- Separatorii: spaiu, tab i caracteru Enter.
Identificatori
Un identificator este numele unui element dintr-un program, fie el
variabil, constant, tip definit de utilizator, enumerare, procedur, funcie,
obiect, metod, proprietate, control, form modul sau chiar proiectul nsui. Un
proiect Visual Basic poate s conin maxim 32000 identificatori. Un
identificator trebuie s respecte urtoarele reguli:
- s nceap cu o liter;
- s nu conin n interior unul din caracterele: . %!$&#@;
- numele variabilelor nu pot fi mai lungi de 255 caractere iar cele ale
13
14
Tipuri de date
Tipul unei date definete mulimea de valori pe care le poate conine o
variabil i mulimea de operaii care pot fi efectuate cu elementele mulimii
respective. n funcie de tipul de dat pe care-l stocheaz o anumit variabil
compilatorul aloc o zon mai mare sau mai mic de memorie pentru a fi
reprezentat.
Cu fiecare tip de dat sunt permise o serie de operaii. Astfel:
- operaiile care se pot face cu valorile unui tip ntreg sunt: adunarea (+),
scderea(-), nmulirea(*), mprirea ntreag (\) a \ b returneaz ctul mpririi
lui a cu b, mprirea real(/), restul mpririi ntregi (mod); ridicarea la putere
(^) de asemenea sunt permise operaiile relaionale: mai mic sau egal (<=); mai
mic (<); egal (=); mai mare(>); mai mare sau egal (>=);Rezultatul unor astfel de
operaii este de tip boolean, avnd valorile True sau False.
- valorile logice, booleane (True i False) suport urmtoarele operaii logice:
negarea logic (Not); i logic (And); sau logic (Or); sau exclusiv logic (Xor);
echivalena logic (Eqv); implicaia logic (Imp);
Variabile
Din punct de vedere al utilizrii variabilelor Visual Basic poate fi
considerat un limbaj cu 2 feluri de variabile: cu tip i fr tip. Folosirea
variantelor fr tip de date (prin utilizarea tipului implici Variant) a devenit
deosebit de important. Tipul Variant conine nu numai variabila dar i informaii
despre variabil.
A declara o variabil nsemn s-i spui programului nainte despre ea astfel
nct programul s tie ct memorie s-i aloce i unde. Declararea unei variabile
se face astfel:
[Public| Private] Dim NumeVariabil as TipVaribil
Declararea variabilelor se poate face n dou moduri : implicit sau explicit.
n modul implicit o variabil este considerat declarat la prima ei folosire.
15
16
Structuri de control
Structurile de control sunt formate din instruciuni. Acestea descriu partea
algoritmic a unui program. Ele pot fi prefixate de etichete pentru a putea fi
referite n instruciunea de salt necondiionat Goto.
Structura liniar
Structura liniar este format din dou instruciuni: instruciunea de
atribuire i instruciunea de apel procedur.
Instruciunea cea mai important i cea mai frecvent a limbajului este
instruciunea de atribuire, avnd forma:
variabil = expresie sau
Set variabil = obiect sau
Nume_de_funcie = expresie
Instruciunea specific faptul c unei variabile sau unei funcii i este
atribuit o nou valoare, care este specificat printr-o expresie sau printr-un
obiect. O expresie este o construcie care desemneaz forma de reprezentare a
unei formule pentru calculul valorii unui obiect oarecare. O expresie const dintro secven format din operanzi (variabile, constante, etc.) i operatori (simboluri
operaionale).
Structura alternativ
Structura alternativ este descris cu ajutorul instruciunilor If Then,
If Then Else i
Select Case.
Exemplu: If iNota<5 Then MsgBox Elev corigent EndIf
Instruciunea de ramificare simpl IfThenElse are urmtoarea sintax:
If condiia1 Then bloc de instruciuni1
Else
If condiia2 Then. Bloc de instruciuni2
17
condiia
funcie
de
valoarea
obinut
se
execut
VariabilaIncr]
18
bloc_de-instruciuni
[Exit For]
bloc_de_instruciuni
Next [VaiabilaContor]
VariabilaContor este o variabil ntreag pe care structura o folosete
pentru a contoriza numrul de repetri efectuate. NumStart i NumSfrit sunt
dou variabile reale care stabilesc valoarea iniial ce o va lua VariabilaContor i,
respectiv, valoarea final. VariabilaContor stabilete cu ce valoare se
incrementeaz sau decrementeaz VariabilaContor la fiecare repetare. n mod
implicit valoarea este 1. Instruciunea Exit For este folosit pentru ca excuia
programului s prseasc structura repetitiv chiar dac VariabilaContor nu a
ajuns s ia valoarea NumSfrit
Instruciunile DoLoop sunt folosite pentru execuia unui bloc de
instruciuni de un numr de necunoscut de ori. Exist mai multe variante ale
instruciuni DoLoop dar fiecare evalueaz o anumit condiie. Condiia este o
expresie care este evaluat ca fiind fals (zero) sau adevrat (diferit de zero).
Instruciunea Do While Loop are sintaxa:
Do While condiie
bloc_de_instruciuni
[Exit Do]
bloc_de_instruciuni
Loop
O alt variant a instruciunii DoLoop este urmtoarea:
Do Until condiie
bloc_de_instruciuni
[Exit Do] bloc_de_instrciuni
Loop
Aceast instruciune se aseamn cu cea prezentat anterior cu diferena c
blocul de instruciuni se repet pn cnd condiia devine adevrat (adic atta
timp ct condiia este fals).
19
X1
Fiecare nivel al stivei trebuie iniializat pentru a alege n ordine elementele
mulimii. Iniializarea se va face cu o valoare aflata naintea tuturor valorilor
posibile din mulime. Vom utiliza pentru aceasta o procedura de iniializare
denumita INIT care are parametrul transmis prin valoare nivelul k care trebuie
iniializat si parametrul transmis prin referina stiva ST de tip sir care este
returnata n programul principal.
Cutarea urmtorului element al mulimii Ak se face cu ajutorul procedurii
SUCCESOR care are ca parametrii transmii prin valoare nivelul k al stivei pe
care se cuta urmtorul element si irul soluiilor gsite pana n acel moment, si
ca parametrul transmis prin referina o variabila booleana AS care are valoarea
21
22
23
24
PTRATE MAGICE
Capitolul II
PTRATE MAGICE
II.1. Istoric
25
PTRATE MAGICE
26
PTRATE MAGICE
9. Liniile mediane ale unui ptrat magic par mpart ptratul in 4 sferturi ( tot
in forma ptrata ), numerotate astfel: stnga sus 1, stnga jos 3, dreapta
sus 2, dreapta jos 4. In ptratele impare, rndul median si coloana
mediana izoleaz patru ptrate mai mici ( pare ), numite prin analogie ( in
mod impropriu ) tot sferturi si numerotate la fel.
10. Doua elemente situate la egala distanta de centrul ptratului magic, unul
in sfertul 1 si celalalt in sfertul 4 sau unul in sfertul 2 si celalalt in sfertul
3, se numesc simetrice. De asemenea, doua elemente ale unui ptrat
magic impar, situate la egal distan de centrul ptratului magic se
numesc tot simetrice (ele fiind in acelai timp si corespondente).
Elementele simetrice de pe diagonalele oricrui ptrat magic sunt n
acelai timp si elemente corespondente.
27
PTRATE MAGICE
28
PTRATE MAGICE
4
3
8
fig. 1
transfera
numerele
din
casutele
auxiliare
exterioare
csuele
29
PTRATE MAGICE
1
6
11
16
21
2
7
12
17
22
3
8
13
18
23
11
c 24 7
4
14
19
24
10
20 3
12 25 8
17 5
13 21 9
10 18 1
15
16
23 6
14 22
19 2
20
15
25
a
fig. 2
11 10 4
23 17
18 12 6
25 19 13 7
Despre program:
Programul permite 2 tipuri de afiare a ptratului
magic:
30
24
1
21 20 14 8
22 16 15
PTRATE MAGICE
1. Direct
programul afieaz ptratul chiar dac nu o s ncap pe ecran
2. Pas cu pas
dup fiecare numr afiat trebuie apsat o tast
se vor afia numai ptratele cu n<15. Pentru n>15 afiarea se va face
numai n mod Direct
Aceasta metoda are dezavantajul ca da o singura solutie pentru acest tip de
patrate.
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include<dos.h >
unsigned char m[200][200];
int n;
void af(){ for (int i=1;i<=n;i++)
for
(int
j=1;j<=n;j++)
printf("%3d%c",m[i][j],j==n?'\n':' ');
}
void mod_1(){ int i=n/2+1,j=1; for (int nr=1;nr<=n*n;nr++)
{
if (nr%n==1) {if (!(--j)) j=n;}
else {if (++i==n+1) i=1;
if (++j==n+1) j=1;
}
m[i][j]=(unsigned char)nr;
}
af();
}
void mod_2()
{
if (n>17) {
printf("Nu pot afisa pas cu pas patrate cu n>17.Il
afisez normal...\n");
mod_1();
return;
}
int poz=wherey()-1;
int i=n/2+1,j=1;
for (int nr=1;nr<=n*n;nr++)
{
if (nr%n==1) {if (!(--j)) j=n;}
else {if (++i==n+1) i=1;
if (++j==n+1) j=1;
}
31
PTRATE MAGICE
gotoxy(j*4,poz+i);
printf("%3d ",nr);
getch();
}
gotoxy(1,poz+n);
}
void main(void)
{
char c;
do{
clrscr();
printf("N=");scanf("%d",&n);fflush(stdin);
if (n%2) {
puts("1. Direct 2. Pas cu pas");
printf("Alegeti modul de afisare al patratului
(1/2):");
unsigned char k;
scanf("%u",&k);
if (k==1) mod_1();
else mod_2();
printf("\nAcesta este patratul magic de ordin
%d.",n);
printf("\nNumarul magic este %d.",n*(n*n+1)/2);
}
else printf("Ati introdus un numar par...");
printf("\nContinuati? (d/n) ");c=getch();
}while (c!='n');
}
1,2,3,4,.n
(2)
0,n,2n,3n,..(n-1)n
1,2,3,4,..n2.
32
PTRATE MAGICE
2.
33
PTRATE MAGICE
10 20 15 0
20 15 0
15 0
13 21 17 4
10
10 20 15
5
10
10 20 15 0
10 20
b
2
15 23 16
25 18 1
6
14
12 24 20 3
19 5
11 22
c
fig. 3
34
PTRATE MAGICE
PTRATE MAGICE
cout<<" |"<<endl;
nrlin=nrlin+1;
if(nrlin%40==0)
{cout<<"apasa enter";getch();clrscr();nrlin=0;}
}
cout<<"
"<<endl;
}
void bti(int ii)
{ int ji;
if (ii>n) patrati();
else for(ji=1;ji<=n;ji++)
if(!folositi[ji])
{ sti[ii]=ji; folositi[ji]=1;
bti(ii+1);folositi[ji]=0; }
}
void afisare()
{ int i,j,k,l;
for(i=1;i<=n;i++)
{ a[1][i]=st[i]; }
// for(k=2;k<=n-1;k++)
k=2 ;
{
//se formeaza patratul prin permutari circulare ale primei
linii
for(l=2;l<=n;l++)
{for(j=1;j<=n;j++)
if((j+k)%n==0)
a[l][j]=a[l-1][n];
else
a[l][j]=a[l-1][(j+k)%n];}
//se apeleaza a doua stiva sti
for(ii=1;ii<=n;ii++) folositi[ii]=0;
// cout<<"construirea patratelor cu 0,n,2n...(n1)*n"<<endl;
bti(1);
//se afiseaza patratul rezultat
// for(i=1;i<=n;i++)
//
{
//
for(j=1;j<=n;j++)
//
cout<<a[i][j]<<" ";
//
cout<<endl;}
}
}
void bt(int i)
{ int j;
if (i>n) afisare();
else for(j=1;j<=n;j++)
if(!folosit[j])
{ st[i]=j; folosit[j]=1; bt(i+1);folosit[j]=0;
}
}
void main()
36
PTRATE MAGICE
{
do {
clrscr();c=0;nrlin=0;
cout<<"Introduceti un numar impar "<<endl;
cout<<" Numarul de casute="; cin>>n;
if(n%2==1&&n>3)
{for(i=1;i<=n;i++)
val[i]=(i-1)*n;
for(i=1;i<=n;i++) folosit[i]=0;
bt(1);
cout<<"au fost "<<c<<" solutii."; getch();}
else
cout<<"Ati introdus un numar nepotrivit"<<endl;
cout <<("Continuati? (d/n) "); cont=getch();
}while(cont!='n');
}
Concluzii :
Acest program ofera multe solutii, dupa cum urmeaza:
ptratul de 5 are 28.800
ptratul de 7 are 25.401.600,
nsa numrul total de soluii este cu mult mai mare.
dreapta stnga)
PTRATE MAGICE
12 0
12
12 12 0
b
14 4
12 6
11 5
2
15
10
16 c 13 3
fig. 4
38
PTRATE MAGICE
#include<iostream.h>
#include<conio.h>
int st[20],
folosit[20],folositi[20],n,i,a[20][20],b[20][20],l,j,k,nrlin,va
l[20],ii,sti[20];
char cont;
unsigned long c;
// afisarea rezultatelor
void afis_final()
{
c++;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<"| "<<a[i][j]+b[i][j]<<" ";
cout<<" |"<<endl;
nrlin++;
if(nrlin%30==0)
{cout<<" apasa enter";getch();clrscr();}
}
cout<<"
"<<endl;
}
//formarea patratului intermediar, prima linie un bkt cu
numerele 0,n,2n,...n*n
//celelalte linii sunt formate din prima dupa metoda lui
La Hire
void patrint()
{ int ii,ji,k,l,j,i;
for(ii=1;ii<=n/2;ii++)
{ b[ii][1]=val[sti[ii]];
b[n+1-ii][1]=val[n+1-sti[ii]]; }
for(ii=1;ii<=n;ii++)
b[ii][2]=b[n+1-ii][1];
for(j=3;j<n/2;j+=2)
for(i=1;i<=n;i++)
39
PTRATE MAGICE
b[i][j]=b[i][1];
for(j=4;j<=n/2;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][2];
for(j=n/2+1;j<n;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][2];
for(j=n/2+2;j<=n;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][1];
//afisare patrat format din 0,n,2n.....
//for(i=1;i<=n;i++)
//
{ for(j=1;j<=n;j++)
//
cout<<b[i][j]<<" ";
// cout<<endl;}
// cout<<"
"<<endl;
afis_final();
}
void bti(int ii)
{ int ji;
if(ii>n/2) patrint();
else
for(ji=1;ji<=n;ji++)
if(!(folositi[ji]&&folositi[n+1-ji]))
{
sti[ii]=ji;folositi[ji]=1;folositi[n+1ji]=1;bti(ii+1);folositi[ji]=0;folositi[n+1-ji]=0;}
}
void afisare()
{ int i,j,k,l;
for(i=1;i<=n/2;i++)
{ a[1][i]=st[i];
a[1][n+1-i]=n+1-st[i]; }
//aplicarea metodei lui La Hire de formare a patratului cu
numerele 1,2,..n
for(i=1;i<=n;i++)
a[2][i]=a[1][n+1-i];
for(j=3;j<n/2;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[1][i];
for(j=4;j<=n/2;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[2][i];
for(j=n/2+1;j<n;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[2][i];
for(j=n/2+2;j<=n;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[1][i];
//afisarea patratului format din 1,2,3...n
// for(j=1;j<=n;j++)
40
PTRATE MAGICE
//
{
//
for(i=1;i<=n;i++)
//
cout<<a[j][i]<<" ";
// cout<<endl;}
// cout<<"
"<<endl;
//apelarea stivei a doua pentru formarea patratului cu
numerele 0,n,2n...(n-1)n
for(ii=1;ii<=n;ii++) folositi[ii]=0;
bti(1);
}
void bt(int i)
{ int j;
if (i>n/2) afisare();
else for(j=1;j<=n;j++)
if(!(folosit[j]&&folosit[n+1-j]))
{
st[i]=j;
folosit[j]=1;folosit[n+1-j]=1;
bt(i+1);folosit[j]=0;folosit[n+1-j]=0; }
}
void main()
{
do{
clrscr();c=0;
cout<<"Introduceti
un
numar
par
par
(multiplu
de
4)"<<endl;
cout<<" Dati numarul de casute="; cin>>n;
if(n%4==0)
{
for(i=1;i<=n;i++)
{ folosit[i]=0;
val[i]=(i-1)*n;}
bt(1);
cout<<"au fost "<<c<<" solutii.";getch();}
else
cout<<"Ati introdus un numar nepotrivit"<<endl;
cout <<("Continuati? (d/n) "); cont=getch();
}while(cont!='n');
}
Concluzii :
In urma executiei programului s-a obinut un numar destul de mare de
solutii, dar nu pe toate. Astfel pentru:
n=4 au rezultat 64 solutii
n=8 au rezultat 147.456 solutii.
PTRATE MAGICE
42
PTRATE MAGICE
5
24 6
12 18 12 12 18 12
18 12 18 18 12 18
30 0
24 24 6
30 0
30 0
30 30 0
24 6
24
30
24 6
b
29 12
27 28
26
36
31
17 24 15 16 19 14
23 18 21 22 13 20
32
11 30
34 33
9
35
10 25
c
29 7
28 27 12 26
29 7
28
12 26
32 31
32 31
36
36
23 18 15 16 19 14
23 18 15 16 19 20
17 24 21 22 13 20
14 24 21 22 13 17
34 33
11 30 10
d
35
35
25
11 30 10 27 25
fig. 5
34 33
PTRATE MAGICE
#include<iostream.h>
#include<conio.h>
int st[20],
folosit[20],folositi[20],n,i,a[20][20],b[20][20],c[20][20],aux,
l,j,k,nrlin,val[20],ii,sti[20];
char cont;
unsigned long d;
//afisarea rezultatelor
void afis_final()
{
d++;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
c[i][j]=a[i][j]+b[i][j];}
//schimbarea elementelor corespondente din randul 1 si
coloana 1 cu exceptia diagonalelor
for (i=2;i<=n/2;i++)
{
aux=c[1][i];
c[1][i]=c[1][n-i+1];
c[1][n-i+1]=aux;
aux=c[i][1];
c[i][1]=c[n-i+1][1];
c[n-i+1][1]=aux;}
//schibarea intre ele a elementelor mediane din randul 2
si ultimul
//schibarea intre ele a elementelor mediane din coloana 2
si ultima
aux=c[2][n/2];
c[2][n/2]=c[2][n/2+1];
c[2][n/2+1]=aux;
aux=c[n][n/2];
c[n][n/2]=c[n][n/2+1];
c[n][n/2+1]=aux;
//schibarea intre ele a elementelor mediane din coloana 2
si ultima
aux=c[n/2][2];
c[n/2][2]=c[n/2+1][2];
c[n/2+1][2]=aux;
aux=c[n/2][n];
c[n/2][n]=c[n/2+1][n];
c[n/2+1][n]=aux;
//inversarea elementelor extreme din unul din cele doua
randuri mediane
//inversarea elementelor extreme din una din cele doua
coloane mediane
aux=c[n/2][1];
c[n/2][1]=c[n/2][n];
c[n/2][n]=aux;
//inversarea elementelor extreme din una din cele doua
coloane mediane
aux=c[1][n/2];
c[1][n/2]=c[n][n/2];
44
PTRATE MAGICE
c[n][n/2]=aux;
//afisarea patratului magic par impar
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<"| "<<c[i][j]<<" ";
cout<<" |"<<endl;
nrlin++;
if(nrlin%40==0)
{cout<<" apasa enter";getch();clrscr();nrlin=0;}
}
cout<<"
"<<endl;
}
// functia de formare a patratului intermediar
// prima coloana este formata cu numerele 0,n,2n....n*n
// se formeaza perechi complementare care sunt asezate in
casute corespondente
void patrint()
{ int ii,ji,k,l,j,i;
// formarea primeicoloane
for(ii=1;ii<=n/2;ii++)
{ b[ii][1]=val[sti[ii]];
b[n+1-ii][1]=val[n+1-sti[ii]]; }
// formarea coloanei a doua din inversarea ordinii
termenilor primei coloane
for(ii=1;ii<=n;ii++)
b[ii][2]=b[n+1-ii][1];
// formarea restului coloanelor conform etapelor metodei
lui La Hire
for(j=3;j<=n/2;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][1];
for(j=4;j<n/2;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][2];
for(j=n/2+1;j<=n;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][1];
for(j=n/2+2;j<n;j+=2)
for(i=1;i<=n;i++)
b[i][j]=b[i][2];
//afisare patrat format din 0,n,2n.....
//for(i=1;i<=n;i++)
//
{ for(j=1;j<=n;j++)
//
cout<<b[i][j]<<" ";
//
cout<<endl;}
//
cout<<"
"<<endl;
45
PTRATE MAGICE
afis_final();
}
void bti(int ii)
{ int ji;
if(ii>n/2) patrint();
else
for(ji=1;ji<=n;ji++)
if(!(folositi[ji]&&folositi[n+1-ji]))
{
sti[ii]=ji;folositi[ji]=1;folositi[n+1ji]=1;bti(ii+1);folositi[ji]=0;folositi[n+1-ji]=0;}
}
void afisare()
{ int i,j,k,l;
//formarea primului rand al patratului magic din numerele
1,2,...n
//se formeaza perechi complementare care se aseaza in
casute corespondente
for(i=1;i<=n/2;i++)
{a[1][i]=st[i];
a[1][n+1-i]=n+1-st[i]; }
//aplicarea metodei lui La Hire de formare a patratului cu
numerele 1,2,..n
for(i=1;i<=n;i++)
a[2][i]=a[1][n+1-i];
for(j=3;j<=n/2;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[1][i];
for(j=4;j<n/2;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[2][i];
for(j=n/2+1;j<=n;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[1][i];
for(j=n/2+2;j<n;j+=2)
for(i=1;i<=n;i++)
a[j][i]=a[2][i];
//afisarea patratului format din 1,2,3...n
// for(j=1;j<=n;j++)
//
{
//
for(i=1;i<=n;i++)
//
cout<<a[j][i]<<" ";
// cout<<endl;}
// cout<<"
"<<endl;
//apelarea stivei a doua pentru formarea patratului cu
numerele 0,n,2n...(n-1)n
for(ii=1;ii<=n;ii++) folositi[ii]=0;
//apelare procedura bkt pentru patratul intermediar
bti(1);
}
void bt(int i)
{ int j;
46
PTRATE MAGICE
if (i>n/2) afisare();
else for(j=1;j<=n;j++)
if(!(folosit[j]&&folosit[n+1-j]))
{
st[i]=j;
folosit[j]=1;folosit[n+1-j]=1;
bt(i+1);folosit[j]=0;folosit[n+1-j]=0; }
}
void main()
{
do{
clrscr();
d=0;
cout<<"Introduceti un numar par impar (da restul 2 daca
este impartit la 4)"<<endl;
cout<<"Dati numarul de casute="; cin>>n;
if( n%4==2&& n>2)
{nrlin=1;
for(i=1;i<=n;i++)
{ folosit[i]=0;
val[i]=(i-1)*n;}
// apelare bkt pentru formarea primului rand al
patratului cu nr 1,2,3....n
bt(1);
cout<<"au fost "<<d<<" solutii.";getch();}
else
cout<<"Ati introdus un numar nepotrivit"<<endl;
cout <<("Continuati? (d/n) "); cont=getch();
}while(cont!='n');
}
Concluzii :
In urma executiei programului s-a obtinut un numar destul de mare de
solutii, chiar daca nu toate. Astfel pentru:
n=6 au rezultat 2.304 solutii
n=10 au rezultat 14.745.600 solutii.
47
PTRATE MAGICE
PTRATE MAGICE
d chiar mai multe soluii dect metoda lui La Hire. Sa presupunem ca dorim sa
construim un ptrat magic cu o bordura simpla, avnd latura n+2, si coninnd in
interior un ptrat magic cu latura n. vom proceda astfel:
a) Dispunem irul natural al numerelor de la 1 pana la (n+2)2 pe doua
rnduri, in aa fel incat termenii complementari sa se afle pe aceleai
coloane:
(1)
(2) (n+2)2
..(n+2)2/2
(n+2)2-1
(n+2)2-2
.(n+2)2/2+1
4................18
(2)
36
35
34
33..............19
49
PTRATE MAGICE
12 6
31 5
11 5
2
15
34 4
10
16 13 3
35
29 32 6
8
30
36 33 3
b
19 27
26 12 13 14
22 34
21
29 32
17 31
30 20
36 33
35 15
16
28
23 10 11 25 24 18
c
fig. 6
50
PTRATE MAGICE
16 3
10 11 8
15 14 1
13
12
fig. 7
problema:
Sa se aeze dup un ptrat figurile (rigi, dame, valei si aii) unui joc de
carti, in aa fel incat pe fiecare rnd, pe fiecare coloana si pe fiecare diagonala sa
nu se intalneasca doua carti de aceeai valoare, nici de aceeai culoare (,,culori,
la cartile de joc, sunt patru: trefla, caro, cupa, pica). Problema se rezolva cu doua
ptrate auxiliare, identificnd valorile cu termenii progresiei 1..4 si culorile cu
termenii progresiei 0,4,8,12.
Ptratele magice cu n>=5 nu au fost analizate separat in mod att de
minuios ca ptratele de 4, ceea ce este explicabil: dac de la 1 soluie ( respectiv
8 soluii) la ptratele magice de 3 se ajunge la 880 soluii (respectiv 7040
51
PTRATE MAGICE
Cu acest editor am stabilit cele doua meniuri principale: Joc si Ajutor care
la rndul lor conin cteva submeniuri dup cum se
poate observa in figur.
Pentru fiecare submeniu am folosit cte un
form, care constituie fundaia in proiectarea
interfetei. Un form poate fi particularizat prin
intermediul ferestrei Properties. Astfel se poate
stabili :
Numele la (name) : frmniv1
Dimensiunile : Height si Width
culoarea de fundal de la : Backcolor
asezarea fata de ferastra principala a jocului
de la : StartUpPozition
numele din bara de titlu la :Caption
In mod asemanator au fost create si celelalte forme : frmniv2, frmniv3,
frmniv4 si frm_ajutor. Pe acestea au fost inserate obiecte ca : butoane de
comanda( Command button), etichete (Label).
53
Buton
Eticheta
54
a doua list este cea care reprezint ptratul i afieaza la Caption soluiile
sau caracterul spaiu n locul numerelor care lipsesc.
Cind se produce evenimentul click intr-un buton din prima lista este
extras valoarea afiata la Caption n variabila val i dac se produce evenimentul
click ntr-un loc liber din a doua list valoarea va fi introdus aici.
In formul frmniv4 au fost necesare 3 liste (vectori) de butoane astfel :
Prima pentru cele doua rnduri cu numerele care trebuie mutate,
A doua cu butoanele care formeaza bordura n care se vor introduce
numerele de sus.
A treia ptratul din mijloc
55
Etichete ( Label)
Conin texte (titluri) care se afieaza pe form in poziii bine precizate.
Textul afiat de o etichet (valoarea proprietatii Caption) se poate modifica pe
parcursul execuiei aplicaiei, conform cerinelor, dar numai prin codul sursa.
Pe formurile celor patru nivele am plasat
dou
etichete
prima
care
afieaz
textul
Frmniv1
este
completat irul de butoane de deasupra prin extragerea unor numere din vectorul
a. Pentru ca din greeal, numerele extrase s nu fie trecute in ptrat se folosete
vectorul b care este iniializat cu 0, i b(i) se schimb cu 1 atunci cnd a(i) este
extras. Astfel, ptratul reprezentat de command2(index) primete valorile a(i)
dac b(i)=0 i dac b(i)=1.
Dim a(15), b(15), r, i, j As Integer
Dim val, mut As Integer
Private Sub cmdstop_Click()
Unload Me
frmpm.Show
frmpm.Enabled = True
End Sub
Frmniv2
Frmniv3
62
Frmniv4
Frm_ajutor
Pe acest form sunt afiate regulile de
joc. Codul corespunztor este doar
pentru butonul Revenire in joc.
Private Sub
cmdrevenire_Click()
Unload Me
frmpm.Show
frmpm.Enabled = True
End Sub
66
Concluzii
Prin aceast lucrare s-a demonstrat inc o dat c descoperirea
calculatorului este un sprijin substanial i nu poate fi nlocuit n situaii care i-ar
lua omului poate ani de zile pentru a le gsi rezolvarea. Dei la problema
ptratelor magice s-au gsit cateva metode de rezolvare chiar de acum cteva sute
de ani, tot nu li s-a gsit o utilitate practic. Totui aceast tem poate fi predat
la coal n orele de opional putnd fi un punct de plecare pentru copiii pasionai
de matematic n cunoaterea i folosirea noiunilor de combinatoric. Jocul
realizat poate fi folosit ca un ajutor la aceste ore avnd totodat i avantajul
utilizarii calculatorului n acelai timp. Cum specificul copilriei este jocul, copiii
sunt ndemnai s-i dezvolte abiliti de calcul mintal, s-i testeze i
aprofundeze baza teoretic, s-i dezvolte spiritul de observaie. Totodat acest
joc poate constitui o baza de pregtire pentru concursurile de matematic
(Cangurul, Cezar Ivnescu etc.) sau a olimpiadelor colare.
67
Indice alfabetic
BACHET DE MZIRIAC,Claude-Gaspard (1581-1638).
Scriitor poliglot (a scris in franceza, latina si italiana) si matematician
francez A fost admis membru al Academiei Franceze (1634), desi absent.
CARDANO, Gerolamo (1501-1576) (cunoscut sub numele de CARDAN)
Matematician, medic si filozof italian
FRANKLIN, Benjmin (1706-1790
Om politic, filosof, fizician si matematiciam american
EULER, Leonhard (1707-1783)
Matematician si fizician elvetian
MOSCOPOL (inceputul sec XIV)
Calugar si filozof bizantin.
FRMAT, Pierre de (1601-1665)
Matematician francez.
LA HIRE, Philipe de (1640-1718)
Astronom si matematician francez. Spirit enciclopedic. Profesor de
matematici la Collge de France. In geometrie a fost continuatorul lui Descartes.
A expus proprietatile diviziunilor armonice si ale relatiilor de involutie. A pus la
punct teoria polilor si polarelor. A dezvoltata teoria angrenajelor epicicloidale. A
fost unul din intemeietorii Academiei regale de arhitectura.
PARACELSUS (1493-1541)
Alchimist si medic elvetian.
68
BIBLIOGRAFIE
BOGDAN PTRU
GHEORGHE PAUN
69