Sunteți pe pagina 1din 70

Ionescu Rodica

EEddiittuurraa SSffnnttuull IIeerraarrhh N


Niiccoollaaee
22001100
IISSB
BN
N 997788--660066--88112299--5588--77

Lucrare publicat n Sala de Lectur a


Editurii Sfntul Ierarh Nicolae,
la adresa http://lectura.bibliotecadigitala.ro

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

De curnd, innd un curs opional de matematic distractiv cu elevi de


gimnaziu, am descoperit tema Ptrate magice. nc de la nceput am observat
c problema irurilor de numere ofer surprize nebnuite i m-am gndit s o
prezint elevilor, mai ales c avea legtur cu noiunile nvatate la orele de
matematic i ajuta la aprofundarea lor. Este in acelai timp altceva, o ieire
din banal, din ecuaiile i problemele zilnice, de care chiar i cadrele didactice se
plictisesc . Dei este o tem de matematic distractiv, aflarea unei singure soluii
este destul de complicat, motiv pentru care le-am prezentat elevilor cteva
metode ingenioase descoperite cu cteva secole in urma de savani precum:
Bachet de Meziriac, La Hire etc. Cu excepia ptratului magic de 3 care are o
singura soluie, celelalte au un numr mare de soluii, iar aflarea lor prin calcul
este practic imposibila. Aceti savani au oferit cteva metode care ocolesc
calculele, dar ofer mai puine soluii sau doar una. La Hire a clasificat ptratele
magice in mai multe tipuri si a elaborat cteva metode ingenioase, care ofer
pentru fiecare caz mai multe soluii, chiar daca nu toate. Prezentarea acestor
metode constituie pentru elevi un punct de plecare in studiul permutrilor,
combinrilor si al matricilor.
In prezent, datorita descoperirii calculatorului ca sprijin in munca omului,
si avnd la indemana tehnicile de programare moderne, mi s-a prut interesant sa
transpun aceste metode in programe pentru aflarea soluiilor. Rezultatele acestora
sunt salvate in fiiere text, ca apoi s poat fi utilizate sub forma de baza de date
pentru o aplicatie.

Jocul, de exemplu, este inspirat din aceasta tema i se bazeaz pe


cunoaterea proprietailor ptratelor magice prezentate la ore, constnd din cteva
reguli simple. Astfel, copiii sunt ndemnai s-i dezvolte abilitai 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 matematica (Cangurul, Cezar Ivnescu etc.) sau a
olimpiadelor scolare.

Prezentare Visual Basic

Capitolul I

NOIUNI TEORETICE

I.1. Prezentare Visual Basic


Visual Basic este unul dintre cele mai populare limbaje de programare
vizual existente la ora actual. Mediul Visual Basic ofer un set complet de
instrumente necesare crerii, intr-un mod simplu i rapid, de aplicaii pentru
Windows din diverse domenii: matematic, gestiunea bazelor de date, grafic,
multimedia, internet, etc.
Partea de Visual se refer la un set complet de metode i instrumente pe
care mediul le pune la dispoziia programatorilor astfel nct acestia s poat
proiect intr-un mod ct mai uor, scriind ct mai puin cod, interfee grafice
(GUI) ct mai complexe, specifice sistemului de operare Windows . Partea de
Basic se refer la limbajul BASIC din care a fost dezvoltat Visual Basic.Chiar
dac are o sintaxa relativ simpl i numeroase limite (nu pot fi folosite toate
funciile Windows, nu pot fi folosite majoritatea interfeelor standard COM, nu
pot fi implementate interfee standard COM, nu poate fi creat un singur program
executabil fiind necesar un program de construit kituri pentru a putea distribui
aplicaia creat, absena pointer-ilor i accesul destul de dificil la memorie, sunt
doar cteva) Visual Basic rmne un limbaj de programare deosebit de puternic
pentru numeroase aplicaii; mai ales c ncepnd cu versiunea 5.0 i-au fost
adugate o serie de caracteristici care l-au fcut, pe deplin, un limbaj orientat pe
obiecte. Visual Basic a devenit aproape la fel de structurat ca i C-ul , aproape la
fel de flexibil ca i Pascal-ul, aproape la fel de bun pentru aplicaiile tiinifice ca
i FORTRAN-ul, mai puternic n ce privete manipularea bazelor de date dect
Xbase-ul sau Fox-ul, i cu mici mbuntiri s-ar putea s devin la fel de orientat
pe obiecte ca Smalltalk.

Prezentare Visual Basic

I.1.1. Prezentarea mediului de programare Visual Basic (IDE)


Mediul de programare (IDE Integrated Development Environment) este
un ansamblu de meniuri, bare de instrumente si ferestre cu ajutorul crora
programatorul poate proiecta i crea aplicaii n Visual Basic.
Meniurile de context
Meniurile de context sun scurtturi ale celor mai frecvente aciuni. Pentru a
deschide un meniu de context executai click cu butonul dreapta la mouse-ului pe
obiectul pe care l folosii. Meniurile de context sunt n funcie de zona din IDE
pe care executai click.
Bara de instrumente (Toolbar)
Bara de instrumente (Toolbar) conine o serie de butoane cu iconie pe ele
care ofer un acces rapid la comenzile uzuale. n mod implicit la ncrcarea IDE
se afieaz bara de instrumente Standard, ns cu ajutorul comenzii Toolbars din
meniul View se pot aduga bare de instrumente i pentru editare, designe-ul
formelor, debug.
Cutia de instrumente (Toolbox)
Cutia de instrumente conine o serie de controale standard ct i
controalele ActiveX pe care le-ai adugat dumneavoastr , ce v vor ajuta la
proiectarea interfeelor grafice. Putei s adugai un nou toolbox selectnd
comanda Add tab din meniul de context.

Prezentare Visual Basic


Bara cu
meniuri

ToolBox
Formular

Fereastra de
proprietati

Fereastra formei (Form Window) i Fereastra codului (Code Window)


Fiecare form rezid intr-o fereastr de proiectare a formei. Folosii
fereastra de proiectare a formei pentru a aduga controale formei. Pentru fiecare
form se poate deschide o fereastr de cod (Code window). Aici vei scrie codul
aferent formei respective. Putei deschide fereastra de cod efectund dublu-click
pe form sau alegnd comanda Code din meniul View.
Fereastra v pune la dispoziie un procesor de texte foarte specializat, cu
numeroase faciliti ce v vor ajuta s scriei cod ntr-un mod ct mai uor.
Fereastra Project Explorer
Fereastra Project Explorer afieaz toate componentele proiectului curent
(forme, module, clase). Din meniul de context se pot aciona diferite comenzi de
gestionare a componentelor proiectului (asemntoare cu cele din meniul
Project).

Prezentare Visual Basic

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.

Putei aduga un control la o form executnd dublu click pe iconia


controlului din Toolbox. Aceast metod nu v ofer un control aa de
mare asupra controlului.

Prezentare Visual Basic

II.

Efectuai un click pe controlul dorit. Poziionai mouse-ul deasupra formei


i vei observa o schimbare a cursorului mouse-ului n form de cruce.
Plasai cursorul in locul unde dorii s fie colul stnga sus al controlului.
Deplasai mouse-ul innd apsat butonul stng pn cnd controlul are
dimensiunea dorit. Sub cursorul mouse-ului v aprea o caset galben ce
va indica dimensiunile (n pixeli) ale controlului.
Pentru tergerea unui control, selectai-l efectund clic cu moue-ul pe el i

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.

Prezentare Visual Basic

nelegerea metodelor proprietailor i evenimentelor


Formele i controalele Visual Basic sunt obiecte ce au propriile proprieti,
metode i evenimente. Proprietile sunt atribute pe care le posed obiectul i
care i descriu modul de apariie. Name, top, left, height, width, visible sunt doar
cteva din proprietile ce se ntlnesc la marea majoritate a controalelor.
Majoritatea proprietolor unui control (sau forme) sunt afiate n fereastra
Properties i pot fi setate (primi valori) n timpul proiectrii aplicaiei(designtime). O mic parte din proprieti sunt accesibile doar n timpul execuiei
programului(run-time).
Metodele stabilesc comportamentul acestor obiecte, indicnd ce pot face
ele efectiv. Metodele sunt de fapt nite proceduri, adic blocuri de cod, care
determin obiectul s fac un anumit lucru (ex: metoda Move ntlnit la
majoritatea controalelor determin o schimbare a poziiei controlului.)
Evenimentele definesc interaciunea cu utilizatorul. Evenimentele sunt
ceea ce se ntmpl cnd un obiect face ceva. Evenimentul este o aciune
recunoscut de ctre un obiect. Fiecare obiect are un set predefinit de evenimente
care i se pot ntmpla i pentru care dumneavoastr putei scrie cod care se va
executa n momentul producerii acelui eveniment. Pentru fiecare eveniment se
poate scrie o procedur, numit numeobiect_ evenimentcare se va executa n
momentul producerii acelui eveniment. n general vei scrie proceduri pentru
evenimentele pe care le considerai importante pentru aplicaie, nu vei scrie
Stabilind proprietile unui obiect i

proceduri pentru toate evenimentele.

scriind cod pentru a rspunde la evenimente particularizai obiectul astfel nct s


rspund la cerinele aplicaiei dumneavoastr.
I.1.3. Proiectarea unei forme
Formele constituie fundaia de la care se ncepe construirea unei interfee
n Visual Basic.

10

Prezentare Visual Basic

Ele constituie ferestrele prin intermediul crora utilizatorul va interaciona


cu aplicaia. Formele posed propriile proprieti, evenimente i metode cu
ajutorul crora le putei controla modul de afiare i comportamentul. Primul pas
n proiectarea unei forme este s-i stabilii proprietile. Acestea pot fi stabilite n
timpul proiectrii (design time) cu ajutorul ferestrei Properties window, sau n
timpul execuiei (run time) scriind cod.
Not : Timpul proiectrii (design time) este timpul n care lucrai la aplicaie n
mediul de programare. Timpul execuiei (run time) este timpul n care aplicaia
ruleaz pe calculator i se poate lucra cu ea.
Majoritatea

proprietilor

formei

influeneaz

modul de

afiare.

Proprietatea Caption stabilete care va fi titlul afiat n bara de titlu a formei;


proprietatea Icon stabilete iconia pentru form; proprietatea MaxButton i
MinButton stabilesc dac forma poate s fie maximizat sau minimizat.
Schimbnd proprietatea BorderStyle putei controla modul de redimensionare al
formei. Proprietile Height i Width stabilesc dimensiunile iniiale ale formei;
proprietile Left i Top stabilesc locaia formei fa de colul stnga sus al
ecranului; proprietatea WindowState stabilete modul n care se va afia forma la
nceput: minimizat, maxmizat sau normal; proprietatea Name stabilete un
identificator cu ajutorul cruia putei referi forma respectiv. n mod implicit VB
le numete Form1, Form2, etc. Este recomandat s schimbai aceste denumiri cu
unele mai familiare i mai uor de reinut. Cel mai bun mod de a v familiariza cu
proprietile este s experimentai. Schimbai pe rand diferite proprieti i
executai aplicaia ca s vedei efectul.
Ca orice obiect forma poate executa metode i poate rspunde la
evenimente. Evenimentul Resize al unei forme se declaneaz ori de cte ori
forma este redimensionat fie de utilizator, fie prin intermediul codului. Acest
eveniment al formei ofer posibilitatea de a executa anumite aciuni ca mutarea
sau redimensionarea controalelor de pe form n momentul n care aceasta i
schimb dimensiunile. Pentru a afia o form pe ecran utilizai metoda

11

Prezentare Visual Basic

Show.FrmForma.Show (frmForma reprezint numele formei) Pentru a nltura o


form de pe ecran folosii metoda Hide sau funcia UnloadfrmForma.Hide sau
Unload frmForma.
Utilizarea butoanelor de comand
Vei utiliza, de cele mai multe ori, butoanele de comand pentru a permite
utilizatorilor aplicaiei s-i dea o comand, s ndeplineasc o anumit sarcin.
Utilizatorii vor executa click pe buton sau l vor selecta n alt mod (apsnd tasta
Tab pn ajung la ele apoi tasta Enter), moment n care butonul va arta ca i
cum ar fi apsat. Cu ajutorul proprietii Caption putei afia text pe buton.
Cel mai frecvent eveniment ntlnit la acest control i pentru care vei scrie cel
mai mult cod este evenimentul Click. De cte ori utilizatorul va apsa butonul
acest eveniment se va produce i va determina executarea codului ce se afla scris
in procedura numit NumeButon_Click().
Utilizarea controalelor ce manipuleaz texte
Principalele contoale utilizate pentru manipularea textelor sunt etichet
(Label) i caset de text (TextBox). Eticheta este un control grafic folosit pentru
afiarea de text pe care utilizatorul nu l poate modifica. Textul ce va fi afiat se
stabilete prin intermediul proprietii Caption . Acesta poate fi stabilit din faza
de proiectare dar se poate modifica n timpul execuiei prin intermediul codului.
Spre deosebire de controlul etichet, controlul Caset de text este folosit
pentru a fia text furnizat de dumneavoastr din faza de proiectare, introdus de
utilizator la rulare sau asociat controlului prin program. Deci controlul poate fi
folosit i pentru ca aplicaia s preia diferite informaii de la utilizatori. Textul
care se va afia sau care va fi preluat se gestioneaz cu ajutorul proprietii Text.
Dac textul trebuie afiat pe mai multe linii proprietate MultiLine trebuie s aib
valoarea True. De asemenea cu ajutorul proprietii ScollBars se pot aduga bare
de defilare controlului.

12

Prezentare Visual Basic

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

Prezentare Visual Basic

controalelor, modulelor, formelor i claselor nu pot fi mai lungi de 40


caractere;
- nu trebuie s existe doi identificatori identici cu acelai scop;
- exist o serie de identificatori standard, definii de Visual Basic. O
redeclarare a lor va duce la nerecunoaterea sensurilor iniiale;
- nu pot fi identificatori cuvintele cheie ale limbajului. Cuvintele cheie sunt
identificatori cu semnificaie fixat, care nu pot fi folosii n alt context dect
cel precizat de semantica limbajului. Exemple: Dim, Private, Public, Array ,
For , Next, If, Then ,Else, End etc..
Comentarii, separatori, mprirea liniei
Comentariile sunt iruri de caractere care au n fa caracterul (`). Au rolul
de a face textul programului mai lizibil.
Exemple:
Aici ncepe programul
n general n Visual Basic putei scrie doar o singur declaraie pe o linie. Totui,
dac dorii, putei scrie mai multe declaraii pe mai o singur linie desprindu-le
cu ajutorul separatorului de instruciuni i declaraii care este caracterul (:) .
Exemplu:
Dim a as Integer : a=10
De asemenea pentru a spori lizibilitatea programelor dumneavoastr, dac
o declaraie este prea mare o putei scrie pe mai multe linii. Acest lucru se
realizeaz folosind caracterul continuator de linie ( _)( un spaiu urmat de o linie
jos).
Exemplu:
Private Declare Function GetVolumeInformation Lib _
kernel32 Alias GetVolumeInformationA _

14

Prezentare Visual Basic

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

Prezentare Visual Basic

Nu este necesar o declarare prealabil cu ajutorul cuvintelor cheie Dim, Private,


Public. n mod implicit Visual Basic le declar de tip Variant pe toate.
Tablouri
n Visual Basic sunt dou tipuri de tablouri: tablouri cu dimensiune fix i
tablouri dinamice.
Tablourile cu dimensiune fix sunt tablourile care au un numr fix de
componente. Acesta este declarat de la nceput astfel nct compilatorul aloc
suficient memorie pentru a putea reine toate elementele. Declararea unui tablou
cu dimensiune fix se poate face n dou moduri:
- prin specificarea numrului ultimului element
Dim|Public|Private NumeTablou(NrUltimulElement) As TipDat
- Exemplu: Dim aPuncte(5) As Integer
- Cnd declarai un tablou primul element este 0. Exist totui
posibilitatea s facei ca primul element s fie 1. Pentru aceasta inserai
declarai Option Base 1 n seciunea General a modulului n care declarai
tabloul.
Limbajul Visual Basic accept tablouri bi-, tri, i multi- dimensionale. Cea
mai bun cale de a vizualiza un tabel bidimensional este o matrice cu rnduri i
coloana. Exemple: Dim aCuloarePunctePlane(10,10) As Byte
Cnd adresai un element al unui tablou multidimensional trebuie s
specificai numrul de ordine al elementului pe fiecare dimensiune.
Exemple: aCuloarePunctePlane(3,6)=10
aCuloarePuncteSpaiu(15,49,3)>=20
Pentru gestionarea ct mai eficient a elementelor tablourilor sunt de mare
folos structurile repetitive.

16

Prezentare Visual Basic

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

Prezentare Visual Basic

Else bloc de instruciuni3 EndIf


Sintaxa: Select Case condiia
Case list_de_expresii1 bloc_de_instrucini1
Case list_de_expresii2 bloc_de_instruciuni2
Else Case bloc_de_instruciuniN
End Select
Fiecare list_de_expresii este o list format din mai multe variabile. Se
testeaz

condiia

funcie

de

valoarea

obinut

se

execut

blocul_de_instruciuni care este precedat de lista_de_expresii care conine


valoarea selectorului
Exemplu:Select Case sLunaAn
Case decembrie ,ianuarie, februarie sAnotimp=iarna
Case martie, aprilie, mai sAnotimp=primvara
Case iunie, iulie, august sAnotimp=vara
Else Case sAnotimp=toamnaEnd Select
Structura repetitiv
Aceast structur permite repetarea n anumite condiii a unei instruciuni
sau a unei secvene de instruciuni.Visual Basic suport dou tipuri de structuri
repetitive:
Structuri repetitive cu contor descrise de instruciunile For Next i
ForEachNext care execut acelai lucru de un numr stabilit de ori i
structuri repetitive cu condiie descrise de diferitele variante ale instruciunii
DoLoop ce ndeplinesc aceeai sarcin atta timp ct o condiie exist sau pn
cnd nu mai exist o condiie.
Structurile repetitive cu contor ncep cu instruciunea For i se termin cu
instruciunea Next.
Sintaxa :

For VariabilaContor = NumStart to NumSfrit [Step

VariabilaIncr]

18

Prezentare Visual Basic

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

Prezentarea tehnicii backtracking

I.2. Prezentarea tehnicii backtracking


Folosim aceasta tehnica atunci cnd nu dispunem de o alta metoda de
rezolvare a unei probleme iar problema respectiva ndeplinete simultan
condiiile:
-solutia poate fi pusa sub forma unui sir x1,x2,,xn (x1,x2,,xn pot fi la rndul lor
iruri)
-elementele irului aparin mulimilor A1,A2,.,An care sunt mulimi finite cu
elementele intr-o ordine foarte bine stabilita (exista si probleme n care aceste
mulimi coincid). Soluia pe care suntem tentai sa o adoptam cnd ntlnim o
astfel de problema este generarea produsului cartezian A1xA2..xAn si sa testam
fiecare element daca este soluie, dar ne vom lovi de faptul ca timpul de execuie
este att de mare nct nu se mai ajunge la nici o valoare practica. Exemplul cel
mai concludent l constituie problema care genereaz permutrile unei mulimi
finite A: vom genera 1,1,1,1 si vom constata ca nu am obinut o permutare,
lucru pe care l puteam observa chiar de la a doua cifra de 1 pe care am introduso n irul soluiilor, pentru ca nu era distincta fata de prima.
Rezulta din acest exemplu urmatorul principiu: construim solutia pas cu
pas si daca se constata ca pentru o valoare aleasa nu avem cum sa ajungem la
solutie, renuntam la acea valoare si reluam cautarea din punctul n care am ramas.
n cazul n care aplicatia pe care dorim sa o rexolvam cere doar o singura solutie
vom forta oprirea metodei dupa aflarea acesteia deoarece tehnica ofera aflarea
tuturor solutiilor.
Testarea elementelor x1, x2,. din irul soluiilor se face pana cnd nu a
mai rmas nici un element netestat n urmtorii pai:
-consideram ca am gsit elementele x1,x2,xk din irul soluiilor si se pune
problema aflrii elementului xk+1. Acest element se cuta n mulimea Ak+1
ncepnd cu primul element disponibil. Apar astfel doua posibilitati:

Prezentarea tehnicii backtracking

a) nu se gsete un astfel de element n aceasta mulime si de aceea se considera


generate n irul soluiilor doar elementele x1,x2,xk-1 si se cuta un alt
element xk n mulimea Ak dintre cele ramase netestate
b) se gsete elementul xk+1 , dar trebuie testat daca ndeplinete anumite
condiii. n cazul n care le ndeplinete se testeaz daca s-a ajuns la soluie
aprnd astfel doua posibilitati:
b.1) s-a ajuns la soluie, se tiprete si se cuta n continuare un alt element
din mulimea Ak+1 rmas netestat.
b.2) nu s-a ajuns la soluie si se reia algoritmul considernd generate
elementele x1,x2,..,xk+1 cutnd primul element xk+2 din mulimea Ak+2
In cazul n care elementul nu ndeplinete condiiile se considera generate
doar elementele x1,x2,xk si se cuta un alt element xk+1 ntre elementele
mulimii Ak+1 ramase netestate.
Daca vom privi irul soluiilor ca pe o stiva cu elementele x1,x2,,xn si
vom nota stiva ST aceasta poate arata astfel:
Xn

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

Prezentarea tehnicii backtracking

adevrat n cazul n care se gsete un succesor si valoarea fals cnd nu se gsete


succesor.
n cazul n care se gsete un succesor acesta trebuie testat daca
ndeplinete condiiile impuse de problema adic daca este valid . Acest lucru
este realizat de ctre procedura VALID care are ca parametrii transmii prin
valoare nivelul k pe care este gsit un succesor si irul creat pana n acel
moment, si ca parametru transmis prin referina o variabila booleana AS care are
valoarea adevrat n cazul n care succesorul gsit ndeplinete condiiile impuse
de fiecare aplicaie n parte si fals n caz contrar.
Dup validarea succesorului funcia SOLUTIE testeaz daca s-a ajuns sau
nu la soluia finala adic ultimul element este al n-lea si n caz afirmativ soluia
se tiprete cu ajutorul procedurii TIPAR care poate fi adaptata de fiecare
utilizator n parte n funcie de cum dorete sa afieze rezultatele.
Legarea intre ele a celor cinci funcii si proceduri prezentate anterior
formeaz de fapt tehnica backtacking:
K:=1;
Init(k,st);
While k>0
{
Do
{Succesor(k,st,as);
If as_valid(k,st,ev);
While ((!as) || (as && ev));
If as
If soluie(k)
tipar;
Else
{
K:=k+1;
Init(k,st);
}
Else
k=k-1;
}

22

Prezentarea tehnicii backtracking

I.2.1. Programul in C++ pentru realizarea permutarilor a n numere.


#include<iostream.h>
#include<conio.h>
int st[20], folosit[20],n,i,c,a[20][20],l,j,k;
void afisare()
{ int i,j,k,l;
c++;
for(i=1;i<=n;i++)
a[1][i]=st[i];
for(k=1;k<=n-1;k++)
{ 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];
}
}
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()
{clrscr();c=0;
cout<<" numarul de linii="; cin>>n;
for(i=1;i<=n;i++) folosit[i]=0;
bt(1);
cout<<"au fost "<<c<<" solutii."; getch();
}

I.2.2. Program in C++ pentru realizarea unei permutari de n (n par)


numere, grupate in perechi complementare si asezate in pozitii
corespondente.
//generarea unor permutari de la 1 la n si aranjarea
numerelor complementare in pozitii complementare
//perechi complementare 1 si n,2 si n-1,3 si n-2
//pozitii complementare: 1 cu n, 2 cu n-1, 3 cu n-2...
#include<iostream.h>
#include<conio.h>

23

Prezentarea tehnicii backtracking


int st[20], folosit[20],n,i,c,a[20],l,j,k;
void afisare()
{ int i,j,k,l;
c++;
for(i=1;i<=n/2;i++)
{ a[i]=st[i];
a[n+1-i]=n+1-st[i]; }
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
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()
{clrscr();c=0;
cout<<" numarul de linii="; cin>>n;
for(i=1;i<=n;i++)
folosit[i]=0;
bt(1);
cout<<"au fost "<<c<<" solutii."; getch();
}

24

PTRATE MAGICE

Capitolul II

PTRATE MAGICE
II.1. Istoric

Patratele magice au fost cunoscute nc din antichitate de ctre chinezi i


de ctre indieni. Acetia din urm le purtau asupra lor, atrnate de gt sau
ascunse in sn, ca amulete mpotriva bolilor, deochiului, calamitailor etc.
pitagoricienii, pentru a-si prezerva fora spirituala, nchinau ptrate magice
planetelor.
Merita a fi subliniat faptul ca in acea epoca nu se cunoteau dect vreo
cteva ptrate magice, att de puine, incat se puteau numra pe degete. Tocmai
raritatea lor le conferea pe atunci, caracterul ,, magic.
In Evul Mediu, ptratele magice au fost in mare cinste printre arabi, care
au sporit numrul lor cu inca vreo cteva combinaii. Cea dinti scriere care
constituie un studiu mai serios despre ptratele magice aparine clugrului
Emanoil Moscopol (secolul XIV-lea), care si-a dat seama ca pot exista foarte
multe combinaii de numere cu aceste proprietatea.
In era moderna s-au ocupat de ptratele magice numeroi savani, printre
care: in secolul al XVI-lea Cardan si Paracelsus, in secolul al XVII Bachet de
Mziriac, Fermat, La Hire, Kircher si Saveur, in secolul al XVIII-lea Euler si
Franklin, in secolul al XIX-lea Arnoux si Lucas. Fiecare din ei a adus o
contribuie la studiul problemei, azi definitiv si complet lmurita teoretic, dar
relativ puin exploatata practic si deocamdat lipsita de utilitate aplicativa.

II.2. Definiii i terminologie


1. Se numete ptrat magic un tablou (o matrice) alctuit din n2 numere (n
principiu diferite), dispuse pe n rnduri si n coloane, in aa fel nct suma

25

PTRATE MAGICE

celor n numere de pe fiecare rnd, de pe fiecare coloan i de pe fiecare


diagonal s fie aceeai.
2. Cele n2 numere, dispuse aa cum s-a artat mai sus se numesc elementele
ptratului magic. Pentru o mai buna vizibilitate se obinuiete, n
practic, s se aeze elementele ptratului magic n ptraele sau csue.
3. Suma constant a fiecrui rnd, a fiecrei coloane i fiecrei diagonale se
numete suma magica, notat Sm sau sm.
4. Diagonala de la stnga-sus la dreapta-jos se numete prima diagonala, iar
cealalt a doua diagonala.
5. Ptratul magic este denumit in funcie de numrul de elemente de pe
fiecare latura a sa; astfel, un ptrat magic cu 62=36 elemente, deci avnd
latura de 6 elemente lungime, se numete ptrat magic de 6.
6. Doua casute situate pe acelai rnd, sau pe aceeai coloana, sau pe
aceeai diagonala, la egala distanta de mijlocul rndului respectiv, al
coloanei respective sau al diagonalei respective, se numesc casute
corespondente, iar elementele (numerele) coninute de ele se numesc
elemente corespondente.
7. Ptratul magic in care n este par (adic a crui latura are un numr par de
elemente ) se numete ptrat ptrat magic par. Daca n este impar,
ptratul magic respectiv se numete ptrat magic impar. Ptratele magice
pare sunt de doua feluri: ptrate magice par pare, in care latura n are
forma n=4m, si ptratele magice impar pare, in care latura n are forma
n=4m+2.
8. Linia orizontala sau verticala care mparte un ptrat magic par in doua
jumtatea egale se numete mediana. Un ptrat magic par are o linie
mediana orizontala si o linie mediana verticala. In ptratele magice
impare, rndul sau coloana a cror axa este linie mediana se numesc rnd
median respectiv coloana mediana.

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.

II.3. Proprietile generale ale ptratelor magice


1. Un ptrat rmne magic dac se mrete sau se micoreaz cu acelai
numr fiecare element al sau, ceea ce este evident, pentru c dac mrim
sau micoram cu x fiecare element al unui ptrat magic de n, atunci pe
fiecare rnd, pe fiecare coloana si pe fiecare diagonala, suma magica
iniiala Sm va deveni Sm=Sm+n x, respectiv Sm=Sm-nx, deci va ramane
constanta.
2. Un ptrat magic rmne magic dac se inmulteste sau se mparte cu x
fiecare element al unui ptrat magic de n, atunci pe fiecare coloan si pe
ambele diagonale, suma magic iniial Sm va deveni Sm=x Sm, respectiv
Sm=Sm / x, deci va rmne constant.
3. Din aliniatele 1 si 2 de mai sus rezulta ca un ptrat magic ramane magic
daca se nlocuiete irul natural al primelor n2 numere (1n2) prin orice sir
de n2 numere consecutive, sau prin orice progresie aritmetic cu n2
termeni. Pentru comoditatea exprimrii, in prezentul capitol vom folosi, in

27

PTRATE MAGICE

general, irul natural al numerelor: 1n2. aadar, ditr-un ptrat magic de


baza se pot confeciona o infinitate de alte ptrate magice.
4. Daca se aduna doua cate doua elementele de acelai rang a doua ptrate
magice de aceeai mrime, se obine un alt ptrat magic, ceea ce este
evident, pentru ca atunci pe fiecare rnd, pe fiecare coloana si pe ambele
diagonale, suma magica a ptratului nou va fi Sm=Sm1+Sm2, deci va ramane
constanta. Daca cele doua ptrate magice de adunat nu sunt de aceeai
mrime, iar diferena n1-n2 este numr par, atunci ptratul magic mai mic
se nconjoar cu o bordura de casute, in care se pun zerouri, apoi se
efectueaz adunarea. Se nelege ca cele spuse in prezentul alineat cu
privire la adunarea a doua ptrate magice rmn valabile i pentru cazul
scderii unui ptrat magic din alt ptrat magic.
5. Un ptrat magic rmne magic dac se schimb ntre ele mai nti dou
coloane corespondente, apoi dou rnduri corespondente ( sau invers: mai
nti doua rnduri corespondente i apoi doua coloane corespondente),
ceea ce este evident, pentru ca schimbnd mai nti doua iruri ( rnduri
sau coloane) suma magica pe rnduri i pe coloane rmne neschimbata,
deranjndu-se numai suma magic de pe diagonale, iar apoi, schimbnd
ntre ele si celelalte dou iruri, elementele diagonale mutate de la locul lor
revin in diagonalele din care au fcut parte iniiala, restabilindu-se astfel
suma magica si pe diagonale.
6. Suma magica, in orice ptrat magic in care n2 elemente sunt termenii unei
progresii aritmetice, este Sm=n(n2+1)/2. in ptratele magice in care n=4m,
suma magica este Sm=2m(16m2+1). In ptratele magice impar pare, in care
n=4m+2, suma magica este Sm=32m3+48m2+26m+5.

28

PTRATE MAGICE

II.4. Metode pentru construirea patratelor magice


II.5. Ptrate impare
II.5.1. Metoda lui Bachet de Mziriac
Exist un singur ptrat magic de ordinul 3 (cu toate c prin rotaii i
simetrii pot fi obinute 8 astfel de ptrate):
2

4
3
8

fig. 1

Se deseneaz un ptrat cu latura n dorita, dar cu casute goale, apoi se


completeaz in exterior cu casutele auxiliare necesare pentru obinerea unui
ptrat aezat pe vrf. Aceste casute auxiliare exterioare fac parte din ptratele
care repeta in exterior ptratul de baza ( ca in fig.2,a)
In ptratul aezat pe vrf se nscriu, in ordinea lor crescnd, numerele care
fac parte din progresia aritmetic aleas, pe una din direciile aritmetice
diagonale. Ca exemplu, artam cum se efectueaz aceasta operaie intr-un ptrat
de 5 (fig.2)
Se las la locul lor numerele care au czut in interiorul ptratului de baza si
se

transfera

numerele

din

casutele

auxiliare

exterioare

csuele

corespunztoare ale ptratului de baz ( ca in fig. 2,b). va rezulta un ptrat magic


corect.
Aceast metod prezint avantajul ca este foarte comod, dar prezint
totodat i un dezavantaj: da o singura soluie propriu-zis, adica- daca se ine
seama de rsturnri (inversri ) i de rotiri numai 8 soluii distincte.

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

II.5.2. Programul in C++ pentru metoda Bachet de Mziriac


Acest program da o metoda de constructie a unui patrat magic impar
adaptata la conditiile de lucru ale calculatorului. Astfel, nu se construiesc csuele
exterioare ca la metoda manuala, numerele vor fi trecute direct dupa cum
urmeaza:
Se plaseaz 1 n centrul ultimei coloane;
Se merge n linie oblic, dreapta-jos, cu numrul urmtor; dac se iese din
ptrat prin partea dreapt, se merge n partea opus, n stnga liniei unde
trebuia depus numrul, iar dac se iese prin partea de jos a ptratului, se
merge n partea de sus a coloanei unde trebuia depus numrul;
Dup ce se completeaz un grup de n numere, se merge cu o csu spre
stnga, pe aceeai linie, pentru a se repeta apoi pasul 2 i a genera urmtorul
grup de n numere.
Se obine n final urmtorul ptrat magic:

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');
}

II.5.3. Metoda lui La Hire


Se recurge la doua progresii aritmetice:
(1)

1,2,3,4,.n

(2)

0,n,2n,3n,..(n-1)n

Daca se adun fiecare termen al progresiei (1) cu fiecare termen al


progresiei (2) se obin toi termenii progresiei
(3)

1,2,3,4,..n2.

Se deseneaz doua ptrate auxiliare de cate n2 casute ( de exemplu de 52


= 25 csute ).
Se nscriu n primul ptrat auxiliar termenii progresiei (1) astfel:
1.

in rndul 1 intr-o ordine oarecare,

32

PTRATE MAGICE

2.

apoi in rndul urmtor in aceeai ordine, dar ncepnd cu un numr

care in rndul 1 ocupa locul 3(n-1) si aa mai departe, adic ncepnd


fiecare rnd dup aceeai regula ca si rndul precedent ca si rndul 2 fa
de rndul 1.
In exemplul nostru (fig. 3,a ) fiecare rnd ncepe cu numrul care in
rndul precedent ocupa locul 3.(n-1) si aa mai departe, adic ncepnd
fiecare rnd dup aceeai regula ca i rndul 2 fata de rndul 1.
n cel de-al doilea ptrat se trec temenii progresiei (2) in primul rnd,
dar regula nceperii fiecrui rnd fata de rndul precedent sa fie diferit de
regula folosita in acelai scop in primul ptrat auxiliar. In exemplul nostru
(fig.3,b), fiecare rnd ncepe cu numrul care in rndul precedent ocupa locul
4. i acest al doilea ptrat auxiliar va fi magic, pentru aceleai considerente ca
si primul ptrat auxiliar.
Se adun doua cte dou, numerele care ocupa acelai loc in ambele
ptrate auxiliare. Va rezulta un ptrat magic ( fig. 3,c), pentru c, pe de o parte
nici unul din numerele primului ptrat auxiliar nu se adun de doua ori cu
acelai numr din al doilea ptrat auxiliar, iar pe de alta parte pentru ca daca
se aduna doua cate doua numerele care ocupa acelasi loc in doua ptrate
magice se obine tot un ptrat magic.

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

Aceasta metoda permite gsirea unui numr mare de ptrate magice,


anume: in primul ptrat auxiliar, termenii progresiei (1) pot fi aezai in rndul
1 in Pn feluri, iar termenii progresiei 2 pot fi aezai in rndul 1 al celui de-al
doilea ptrat auxiliar tot in Pn feluri, deci rezulta (Pn)2 combinaii , adic (n!)2
combinaii. In rndul 2, termenii pot fi aezai in primul ptrat auxiliar in (n-3)
feluri diferite, iar in al doilea ptrat auxiliar in

(n-4) feluri diferite, deci

rezulta in total (n-3)(n-4) combinaii.


Total general: (n!)2 (n-3)(n-4) ptrate magice distincte, iar daca se tine
seama de rsturnri si de rotiri: 8(n!)2(n-4)(n-3) ptrate magice diferite. Se
excepteaz ptratul magic de 3, care nu admite dect o singura soluie,
respectiv 8 soluii.
In cazul ptratului magic de 5, formula de mai sus d:
(n!)2(n-3)(n-4)=(5!)2.2.1 = 28800 soluii;
8(n!)2(n-3)(n-4) = 8 .(5!)2.2.1 = 230400 soluii.

34

PTRATE MAGICE

II.5.4. Programul in C++ pentru ptrate magice impare dupa metoda


lui La Hire.
Acest program presupune formarea a doua ptrate unul din numerele
1,2,3.n si cellalt din n,2n,.n2 . Prima linie a fiecaruia fiind alcatuita din o
anume permutare a numerelor date. Deci, pentru prima linie a fiecrui ptrat a
fost necesara cte o procedur backtracking. Aceste proceduri se apeleaz una pe
cealalt i astfel se obine un numr foarte mare de soluii.
Programul pentru patrate impare dupa metoda lui La Hire.
#include<iostream.h>
#include<conio.h>
int st[10],
folosit[10],n,i,a[10][10],l,j,k,val[10],b[10][10],sti[10],ii,fo
lositi[10],ci,nrlin;
unsigned long c;
char cont;
//procedura de creare a patratului intermediar
//format din numerele 0,n,2n,...n*n
void patrati()
{ int ii,ji,k,l,j,i;
for(ii=1;ii<=n;ii++)
b[1][ii]=val[sti[ii]];
// for(k=2;k<=n-1;k++)
k=3;
//reprezinta locul de unde incepe completarea celui de-al
doilea rand
{
c++;// reprezinta numarul solutiilor
//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)
b[l][j]=b[l-1][n];
else
b[l][j]=b[l-1][(j+k)%n];
}
}
// afisare patrat magic final
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<"| "<<b[i][j]+a[i][j]<<" ";
35

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.

II.6. Ptrate par pare


II.6.1. Metoda lui La Hire
Este similar cu cea arta pentru ptratele magice impare, cu deosebirea
c:
In primul ptrat auxiliar:
1. primul rnd se formeaz din termenii progresiei (1), la fel ca la ptratele
magice impare, cu condiia in plus ca termenii complementari ai progresiei
1 trebuie sa se gseasc in casute corespondente
2. rndul al doilea se formeaz prin inversarea (

dreapta stnga)

rndului nti. Rndurile urmtoare, pn la mediana orizontal, vor fi


identice cu rndurile 1 si 2 astfel:
37

PTRATE MAGICE

3. rndurile de ordin impar vor fi identice cu rndul 1,


4. iar cele de ordin par vor fi identice cu rndul 2.
5. De la mediana orizontala in jos, invers: rndurile de ordin impar vor fi
identice cu rndul 2 de sus, iar cele de ordin par vor fi identice cu rndul 1
de sus (fig. 4,a).
In la doilea ptrat auxiliar se nscriu in prima coloana ( din stnga )
termenii progresiei (2), avnd grija, tot aa, ca termenii complementari sa se
gseasc in casute corespondente. Se continua cu coloanele de la stnga la
dreapta, aa cum s-a procedat cu rndurile de sus in jos: coloana 2 este inversa
coloanei 1 (pe verticala), coloanele 3,5 etc. vor fi identice cu coloana 1,
coloanele 4,6 etc. vor fi identice cu coloana 2, pana la mediana verticala, iar in
dreapta medianei verticale invers: coloanele de rang impar vor fi identice cu
coloana 2, iar cele de rang par vor fi identice cu coloana 1 (fig. 4,b).
Adunnd doua cate dou numerele care ocupa acelai loc in ambele
ptrate auxiliare, se obine un ptrat magic. Ca exemplu dam un ptrat magic
de 4 construit cu ajutorul acestei metode (fig. 4,c)

12 0

12

12 12 0

b
14 4

12 6

11 5
2

15

10

16 c 13 3

fig. 4

Programul pentru patrate magice par pare.

38

PTRATE MAGICE

In cazul acestor patrate metoda consta ca si la patratele impare din


construirea a doua patrate, dar difera modul de formare a primei linii. Asfel prima
linie, respectiv prima coloana la cel de-al doilea patrat, este alcatuita tot dintr-o
permutare de n numere, dar acestea sunt mparite in perechi complementare si
aezate in csute corespondente. A fost necesara tot cte o procedura backtacking
de formare a primei linii pentru primul ptrat, respectiv coloane pentru cellalt.
II.6.2. Programul n C++ pentru ptratele par pare dupa metoda lui La
Hire

#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.

II.7. Ptrate impar pare


Se formeaz doua ptrate auxiliare, ca in cazul ptratelor par pare. Aceste
doua ptrate auxiliare nu sunt magice, dar au suma magica pe diagonale.
41

PTRATE MAGICE

Se nsumeaz cele doua ptrate auxiliare. Rezulta un ptrat care nu este


nici el magic, dar care are, de asemenea, suma magica pe diagonale.
Se lsa intacte elementele de pe diagonale si se schimba intre ele:
1. elementele corespondente din rndul 1 si coloana 1;
2. elementele mediane din rndul 2 si rndul ultim si din coloana 2 si
coloana ultima;
3. elementele extreme din unul dintre cele cele doua rnduri mediane si
din una dintre cele doua coloane mediane.
In loc de rndul 1 si coloana 1 se pot lua rndul ultim si coloana ultima,
iar in loc de rndul doi si coloana 2 si rndul si coloana ultime se pot lua un rnd
si o coloana oarecare, cu condiia sa nu fie modificate diagonalele.
Rezulta un ptrat magic. Ca exemplu (fig. 5) dam un ptrat de 6, in cele
cinci faze de lucru: cele doua ptrate auxiliare (fig. 5,a,b), ptratul care
nsumeaz cele doua ptrate auxiliare (fig. 5,c), ptratul intermediar (fig. 5,d) si
patratul magic final (fig. 5,e).

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

II.7.1. Programul n C++ pentru ptratele magice par impare.


Acest program are la baza noiunile prezentate la programul pentru
ptratele par pare, cu deosebirea c la programul rezultat doar diagonalele au
suma magica. Deci, mai sunt necesare schimbri i intre elemente. Acestea sunt
trecute in interiorul programului sub forma de comentarii.
Programul sursa:
43

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.

II.7.2. Crearea fiierelor text n C++


Programele anterioare dau soluiile direct la monitor, ins pentru aplicaia
urmatoare m-am gndit s ca rezultatele sa le salvez in mai multe fisiere text de
unde s fie preluate ca date de intrare. Pentru acest lucru au fost necesare cteva
modificri. Astfel:
am nlocuit fiierul antet iostrem.h cu fstream.h care l conine i pe primul

47

PTRATE MAGICE

am declarat noul fiier pm4.txt pe directorul C ca fiind un obiect de tipul


fstream i prin adugarea constantei out este pregatit pentru operaia de
scriere. fstream f("c:\\pm4.txt",ios::out);
funcia de scriere in fiier este f
in acest fiier numerele care alctuiesc un ptrat vor fi inregistrate ca un ir
de numere separate cu ,, deci fiecare soluie pe cte un rand
la sfritul liniei se introduce endl sau \n
Voi da ca exemplu urmatoarea secvena de program
#include<fstream.h>
#include<conio.h>
int st[20],
folosit[20],folositi[20],n,i,a[20][20],b[20][20],d[100],p,l,j,k
,nrlin,val[20],ii,sti[20];
char cont;
unsigned long c;
// afisarea rezultatelor
fstream f("c:\\pm4.txt",ios::out);
void afis_final()
{
c++;p=0;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
{ d[p]=a[i][j]+b[i][j];
p++;} }
for(p=0;p<n*n-1;p++)
f<<d[p]<<",";f<<d[n*n-1];
f<<"\n";
}

II.8. Ptrate magice cu borduri


Definiie. Se numete ptrat magic cu bordur sau cu borduri un ptrat
magic construit in aa fel nct, dac i se ndeprteaz de la periferie o bordur
alctuita din unul sau mai multe iruri de casute, ptratul rmas s fie si el magic.
O bordura alctuita dintr-un singur ir de casute bordura simpla, iar o bordura
alctuita din doua sau mai multe iruri de csute se numete bordura dubl, tripl
etc. sau multipl.
Metoda de construire a unui ptrat magic cu o bordura simpla este unic, in
sensul ca se aplic oricrui fel de ptrate (impare,impar pare, par pare). Metoda
48

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

suma a doi termeni complementari este (n+2)2+1


Construim un ptrat magic de n cu n2 dintre aceste numere, luate astfel:
n2/2 numere din irul (1), plus numerele lor complementare din irul (2).
Construirea se face dup una din metodele prezentate mai nainte.
Calculam suma magica sm a ptratului magic interior, suma magica Sm a
ptratului magic final si diferena Sm-sm.
Pentru a obine ptratul magic cutat, cu latura n+2, vom aduga fiecrui
rnd, fiecrei coloane si ambelor diagonale cate doua numere, a cror suma
sa fie egala cu diferena Sm-sm, adic doua numere complementare dintre
cele ramase in irurile (1) si (2). Vom completa deci casutele bordurii
nscriind pe rnd cate o pereche de numere in doua casute opuse (pornind
de preferina din colturi).
Ca exemplu fie un ptrat magic de 6, cu o bordura simpla, care nconjoar
un ptrat magic de 4.
Se considera irul
(1)

4................18

(2)

36

35

34

33..............19

Se aleg numerele: 1,2,3,..8 din primul sir si din al doilea


36,35,34,.29 , acestea fiind complementare conform punctului (a).
Din aceste numere se constrieste un nou ptrat magic de patru sau se ia
unul gata fcut care se modific dup cum urmeaz: (fig. 7,a)

49

PTRATE MAGICE

Se aduga fiecrui numr mai mare dect 8, 20 (fig. 7,b)


Se nconjoar ptratul magic auxiliar modificat, cu o bordur de csue, in
care se nscriu numerele nlocuite in ptratul magic auxiliar, cu o bordur de
csue, in care se nscriu numerele nlocuite in ptratul magic auxiliar iniial,
precum i celelalte numere care mai lipsesc din irul 136, avnd grija ca suma
celor doua numere adugate in casutele bordurii pe un rnd, pe o coloana sau pe
o diagonala sa fie egala cu 37, iar suma numerelor de pe rndurile i coloanele
noi s fie egala cu 111.(fig. 6,c)
14 4

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

II.9. Discuia ptratelor magice


Ptrat magic de 1 nu exista, sau daca se considera ca un numr oarecare,
el singur, poate fi considerat ca un caz particular al ptratului de n, pentru n = 1
atunci exista un singur ptrat magic de 1.
Ptrate de 2 exista , dar nici unul nu poate fi magic, dac cele patru numere
alctuitoare sunt diferite.

50

PTRATE MAGICE

Exista un singur ptrat magic de 3, care, rsturnat ( inversat ) si rotit,


reprezint 8 soluii.
Ptratul magic de 4 prezint numeroase variante. Acest ptrat a fost
analizat in mod amnunit in secolele XV XVII intr-un mare numr de studii
pariale asupra lui. La sfritul secolului al XVII lea a aprut un studiu
exhaustiv al lui Frenicle de Bessy: Table generale des Quatre (Tabel general al
ptratelor de patru) tiprit la Luvru, prin grija lui La Hire, in 1693, si retiprit in
volumul 5 din Memoires de l Academie des Sciences (Memoriile Academiei de
tiine). In acest studio Frenicle de Bessy da toate soluiile distincte posibile ala
ptratului de 4, in numr de 880, alctuite toate cu numerele 116. Cele 880
soluii, supuse rsturnrilor i rotirii, reprezint practic 880 . 2 . 4 = 7040 soluii
diferite!
Printre cele 7040 ptrate magice de patru se numra
si ptratul magic de 4 gravat de Albrecht Durer in alegoria
sa Melancolia. In acest ptrat magic, numerele 5 si 8

16 3

reprezint numrul de litere al numelui si prenumelui

10 11 8

15 14 1

autorului (Durer 5, Albrecht 8), iar numerele 15 si 14,


alturate in rndul de jos, reprezint data lucrrii: 1514.
O aplicaie a ptratului magic de 4 este urmtoarea

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

soluii)la ptratele de 4, este uor de imaginat cat de impetuos creste numrul


soluiilor pentru n>=5 si ct de dezarmant se complica posibilitile, combinaiile,
i deci i analiza.

II.10. Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

Acest joc are la baza patratele magice obtinute in urma executiei


programelor prezentate anterior. Rezultatele sunt depuse in cateva fisiere care
servesc ca date iniiale ale jocului. Jocul consta in afisarea unor patrate din care
lipsesc cateva numere, care sunt afisate in partea de sus intr-o ordine oarecare.
Jucatorul trebuie ca mai intai sa afle suma magica si apoi sa inlocuiasca casutele
goale cu numerele care satisfac cerintele problemei. Daca este nlocuit numrul
corect se acord un punctaj pentru stimularea jucatorului.
II.10.1. Interfaa
Este vorba despre o forma fixa
care cuprinde un meniu din care se intra
in jocul propriu zis prin deschiderea
meniului ,,Joc . Sub bara de meniuri cu
ajutorul intrumentelor din caseta toolbox:
shape, label a fost realizat fundalul
formei. Pentru partea central s-a folosit
o imagine introdus cu instrumentul
Image

Meniul a fost fcut prin deschiderea editorului de meniuri cu click dreapta


pe form i alegerea submeniului Menu Editor din meniul contextual.
52

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

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

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

Buton
Eticheta

Butoane de comanda (Command Button)


Sunt utilizate pentru declanarea unei aciuni sau
operaiuni. Pentru definirea unui buton:
Se plaseaz i se contureaz butonul pe
form;
Se definesc proprietile Name si Caption
Se stabilete culoarea de fundal, eventual
Se adaug cod pentru evenimentul Click
Pe formurile corespunzatoare celor patru nivele am
plasat o lista (array) de butoane de comanda astfel : am
creat primul buton la care am stabilit proprietaile de mai
sus, apoi folosind copy si paste le-am inserat si pe
celelalte rspunznd yes la intrebarea dac doresc sa introduc un array. In acest
fel butoanelor li se ataeaza un index care face ca referirea acestora in program s
se fac pentru toate innd cont de numrul de ordine. Acest index apare i in
fereastra Properties pentru fiecare. n frmniv1, frmniv2 i frmniv3 s-au inserat
doua liste (vectori) de butone :
prima lista este deasupra i afieaza la proprietatea Caption numerele care
lipsesc din ptratul de jos,

54

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

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

Butoanele care formeaz bordura trebuie s fie aezate n aa fel ca


indecii celor opuse s corespund. Asfel, colul stnga sus cu dreapta jos au
indecii 0 si 10, 1 de pe latura de sus cu 11 din dreptul lui de pe latura de jos
...etc. A fost necesar aceast aranjare pentru c soluia prevede ca in poziiile
opuse s fie numere complementare.
Pentru ieirea din nivel, pe fiecare form s-a plasat butonul cu denumirea
Stop, acesta nchide fereastra de lucru i d comanda in fereastra principal
frmpm.

55

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

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

,,Puncte i cealalt sub ea care arat numarul


de puncte pe care il realizeaz jucatorul. Pentru
fiecare eticheta se pot stabili in fereastra
Properties : numele, mrimea, culoarea..etc.
Toate aceste elemente ale aplicatiei sunt
afisate in fereastra Project explorer dupa cum se vede in figura alturat.
II.10.2. Programele sursa

Orice form are asociat o fereastr pentru scrierea codului. In aceasta


fereastr sunt trecute obiectele plasate pe form cu denumirile acestora. Astfel
pentru fiecare obiect se poate scrie o secvena de program care va determina
comportamentul acestuia la aciunea utilizatorului. Pentru fiecare obiect sunt
stabilite anumite evenimente cum ar fi: click, dubluclick, load, dragdrop,...etc.
Aceste evenimente fac ca programul sa funcioneze interactiv cu utilizatorul.
Pentru formul frmpm programul cod descrie: la evenimentul click asupra
submeniurilor se incarca formurile corespunztoare i formul principal este
dezactivat iar la click asupra submeniului Iesire jocul este descrcat din memorie.
Private Sub iesire_Click()Unload Me
End
End Sub
Private Sub nivel1_Click()
Load frmniv1
Frmniv1.Show
frmpm.Enabled = False
End Sub
56

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


Private Sub nivel2_Click()
Load frmniv2
frmniv2.Show
frmpm.Enabled = False
End Sub
Private Sub nivel3_Click()
Load frmniv3
frmniv3.Show
frmpm.Enabled = False
End Sub
Private Sub nivel4_Click()
Load frmniv4
frmniv4.Show
frmpm.Enabled = False
End Sub
Private Sub reguli_Click()
Load frm_ajutor
frm_ajutor.Show
frmpm.Enabled = False
End Sub

Frmniv1

In acest program de la inceput sunt declarate variabilele folosite: vectorii a


si b si r, i, j de tip intreg. La ncarcarea formului n partea Sub Form_Load( )
este deschis fiierul text pm4.txt i unde printr-un procedeu aleator se citete din
acesta un rnd care este preluat de vectorul a(15). De fapt, acest vector reprezint
o soluie a patratului de 4 care trebuie introdus in joc. Deasemenea

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

La click asupra command(index) val primete Caption.


57

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

Private Sub Command1_Click(Index As Integer)


If val = 0 Then
val = Command1(Index).Caption
Command1(Index).Caption = ""
End If
End Sub

In aceasta seciune la click la command2(index), anume csua goal din


ptrat, este introdus valoarea, dac s-a pus numrul
corect punctajul se mrete. La terminarea umplerii
ptratului juctorul primete un mesaj prin care i se
comunic modul cum a jucat. Au fost descrise toate
posibilitile prin instruciunea case select.
Private Sub Command2_Click(Index As Integer)
If val <> 0 Then
If Command2(Index).Caption = "" Then
Command2(Index).Caption = val
val = 0
mut = mut + 1
End If
If (Command2(Index).Caption = a(Index)) Then
punctaj.Caption = punctaj.Caption + 20
End If
End If
If mut = 4 Then
Select Case punctaj
Case 0
MsgBox "Ati gresit!. Mai studiati."
Case 20
MsgBox "Ati gasit doar o solutie"
Case 40
MsgBox "Ati gasit doar doua solutii"
Case 80
MsgBox "Ati reusit, FELICITARI !"
End Select
End If
End Sub
Private Sub Form_Load()
Open "c:\pm4.txt" For Input As #1
mut = 0
val = 0
For i = 0 To 15
b(i) = 0
Next
aleator = Int(Rnd * 60)
j = 1
58

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


Do While Not EOF(1)
Input #1, a(0), a(1), a(2), a(3), a(4), a(5), a(6), a(7), a(8),
a(9), a(10), a(11), a(12), a(13), a(14), a(15)
If (j = aleator) Then
i = 0
Do While i <= 3
r = i * i + 3
If (b(r) = 0) Then
b(r) = 1
Command1(i).Caption = a(r)
i = i + 1
End If
Loop
For i = 0 To 15
If (b(i) = 0) Then
Command2(i).Caption = a(i)
Else
Command2(i).Caption = ""
End If
Next
Exit Do
End If
j = j + 1
Loop
Close 1
End Sub

Frmniv2

Acest program este asemntor cu frmniv1, doar c este deschis fiierul


pm5.txt i sunt mai multe numere de nlocuit.
59

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

Dim c(25), d(25) As Integer


Dim i, n, timp, scor, val, mut As Integer
Private Sub cmdstop_Click()
Unload Me
frmpm.Show
frmpm.Enabled = True
End Sub
Private Sub cmd1_Click(Index As Integer)
If val = 0 Then
val = cmd1(Index).Caption
cmd1(Index).Caption = ""
End If
End Sub
Private Sub Command2_Click(Index As Integer)
If val <> 0 Then
If Command2(Index).Caption = "" Then
Command2(Index).Caption = val
val = 0
mut = mut + 1
End If
If (Command2(Index).Caption = c(Index)) Then
punctaj.Caption = punctaj.Caption + 20
End If
End If
If mut = 6 Then
Select Case punctaj
Case 0
MsgBox "Ati gresit!. Mai studiati."
Case 120
MsgBox "Ati reusit, FELICITARI !"
Case Else
MsgBox "Ati gasit doar cateva solutii, mai incercati"
End Select
End If
End Sub
Sub Form_Load()
Open "c:\pm5.txt" For Input As #2
mut = 0
val = 0
For i = 0 To 24
d(i) = 0
Next
aleator = Int(Rnd * 100)
inreg = 1
Do While Not EOF(2)
Input #2, c(0), c(1), c(2), c(3), c(4), c(5), c(6), c(7), c(8),
c(9), c(10), c(11), c(12), c(13), c(14), c(15), c(16), c(17),
c(18), c(19), c(20), c(21), c(22), c(23), c(24)
If (inreg = aleator) Then
i = 0
Do While i <= 5
60

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


r = Int(Rnd * 24)
If (d(r) = 0) Then
j = i
d(r) = 1
cmd1(j).Caption = c(r)
i = i + 1
End If
Loop
For i = 0 To 24
If (d(i) = 0) Then
Command2(i).Caption = c(i)
Else
Command2(i).Caption = ""
End If
Next
Exit Do
End If
inreg = inreg + 1
Loop
Close 2
End Sub

Frmniv3

Acest program deschide fiierul pm6.txt de unde sunt preluate valorile


pentru vectorul c(35) n acelai mod ca i la celelalte nivele. Gradul de dificultate
este mai mare dect la nivelele precedente prin numrul mai mare de numere care
sunt de nlocuit.
Dim c(35), d(35) As Integer
Dim i, n, mut, val As Integer
61

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


Private Sub cmdstop_Click()
Unload Me
frmpm.Show
frmpm.Enabled = True
End Sub
Private Sub Command1_Click(Index As Integer)
If val = 0 Then
val = Command1(Index).Caption
Command1(Index).Caption = ""
End If
End Sub
Private Sub Command2_Click(Index As Integer)
If val <> 0 Then
If Command2(Index).Caption = "" Then
Command2(Index).Caption = val
val = 0
mut = mut + 1
End If
If (Command2(Index).Caption = c(Index)) Then
punctaj.Caption = punctaj.Caption + 20
End If
End If
If mut = 10 Then
Select Case punctaj
Case 0
MsgBox "Ati gresit!. Mai studiati."
Case 20
MsgBox "Ati gasit doar o solutie"
Case 40
MsgBox "Ati gasit doar doua solutii"
Case 80
MsgBox "Ati reusit, FELICITARI !"
End Select
End If
End Sub
Private Sub Form_Load()
val = 0
Open "c:\pm6.txt" For Input As #3
mut = 0
For i = 0 To 35
d(i) = 0
Next
aleator = Int(Rnd * 50)
inreg = 1
Do While Not EOF(3)
Input #3, c(0), c(1), c(2), c(3), c(4), c(5), c(6), c(7), c(8),
c(9), c(10), c(11), c(12), c(13), c(14), c(15), c(16), c(17),
c(18), c(19), c(20), c(21), c(22), c(23), c(24), c(25), c(26),
c(27), c(28), c(29), c(30), c(31), c(32), c(33), c(34), c(35)
If (inreg = aleator) Then
i = 0

62

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


'copletarea randului de deasupra prin extragerea in mod aleator
a unor numere din sir
Do While i <= 9
r = Int(Rnd * 35)
If (d(r) = 0) Then
j = (i + 4) Mod 10
d(r) = 1
Command1(j).Caption = c(r)
i = i + 1
End If
Loop
' umplerea patratului cu numere cu exceptia numerelor extrase
care se inlocuiesc cu " "
For i = 0 To 35
If (d(i) = 0) Then
Command2(i).Caption = c(i)
Else
Command2(i).Caption = ""
End If
Next
Exit Do
End If
inreg = inreg + 1
Loop
Close 3
End Sub

Frmniv4

Dup cum a fost prezentat in seciunea de interfaa, la acest nivel sunt


create trei liste (array) de butoane. Este un nivel mai complicat in sensul ca
juctorul trebuie s-si dea seama s grupeze numerele in perechi complementare
si numerele dintr-o pereche s le aeze in poziii opuse n aa fel ca pe fiecare
linie (coloana) s se adauge aceeai sum i s rezulte n final suma magic. Ca i
la programele anterioare n seciunea de ncrcare a formului se fac iniializrile,
se incarc vectorul command1(i) cu valori, ptratul din mijloc este reprezentat de
lista de butoane command3(i) care primete valori din vectorul a(15). In acesta
conform regulii descrise la ptratele cu borduri, valorile mai mari dect 8 se
mresc cu 20, iar mrimile nlocuite vor fi trecute n rndul de deasupra.
Deasemenea acesta va fi completat cu numerele care mai lipsesc din irul 1 pn
la 36.
63

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC

In seciunea care corespunde punctajului sunt prevzute mai multe


variante:
Dac valoarea nu are in poziia opus nimic punctajul se mrete,
Dac o valoare are complementul deja depus i ea este aezat n alt loc
dect ar fi trebuit, punctajul nu se acorda,
Dac la umplerea unei linii sau coloane suma nu este magic, punctajul
nu se acord.
La terminarea tuturor mutrilor se afieaza prin MsgBox aprecierea asupra
modului de joc.
Dim a(16), b(19), val, i, j, k, var(19), mut, sum(3), scor(3)
As Integer
Dim gasit, depasit As Boolean
Private Sub cmdstop_Click()
Unload Me
frmpm.Show
frmpm.Enabled = True
End Sub
Private Sub Command1_Click(Index As Integer)
If val = 0 Then
val = Command1(Index).Caption
k = Index
Command1(Index).Caption = ""
End If
End Sub
Private Sub Command2_Click(Index As Integer)
If val <> 0 Then
If Command2(Index).Caption = "" Then
Command2(Index).Caption = val
val = 0
mut = mut + 1
var(Index) = b(k)
End If
Select Case Index
Case Is <= 5
sum(0) = sum(0) + var(Index)
scor(0) = scor(0) + 1
Case 5 To 10
sum(1) = sum(1) + var(Index)
scor(1) = scor(1) + 1
Case 10 To 15
sum(2) = sum(2) + var(Index)
scor(2) = scor(2) + 1
Case 15 To 19
sum(3) = sum(3) + var(Index)
64

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


scor(3) = scor(3) + 1
Case 0
sum(3) = sum(3) + var(Index)
scor(3) = scor(3) + 1
Case Else
MsgBox "nu efectueaza suma!"
End Select
For j = 0 To 3
If (sum(j) > 111 Or sum(j) < 111) And (scor(j) = 5) Then
depasit = True
End If
Next
For j = 0 To 19
If (b(k) + var(j)) = 37 Then
gasit = True
If ((j = Index + 10) Or (j = Index - 10)) And
(depasit = False) Then
punctaj.Caption = punctaj.Caption + 20
End If
End If
Next
If Index > 9 Then
j = Index - 10
Else
j = Index + 10
End If
If gasit = False Then
If (Command2(j).Caption = "") And (depasit = False) Then
punctaj.Caption = punctaj.Caption + 10
End If
Else
gasit = False
End If
End If
'afisare punctaj
If mut = 20 Then
Select Case punctaj
Case 0
MsgBox "Ati gresit!. Mai studiati."
Case 400
MsgBox "Ati reusit, FELICITARI !"
Case Else
MsgBox "Ati aflat doar cateva solutii."
End Select
End If
End Sub
Private Sub Form_Load()
a(0) = 13: a(1) = 3: a(2) = 2: a(3) = 16:
a(4) = 12: a(5) = 6: a(6) = 7: a(7) = 9:
a(8) = 8: a(9) = 10: a(10) = 11: a(11) = 5
a(12) = 1: a(13) = 15: a(14) = 14: a(15) = 4: val = 0
j = 0: k = 0:
65

Jocul PTRATE MAGICE, aplicatie in VISUAL BASIC


gasit = False:
depasit = False
For i = 0 To 3
sum(i) = 0
scor(i) = 0
Next
For i = 0 To 15
If a(i) > 8 Then
b(j) = a(i)
a(i) = a(i) + 20
j = j + 1
End If
Next
For j = 8 To 11
b(j) = 17 + (j - 8)
Next
For j = 12 To 19
b(j) = 37 - b(j - 12)
Next
For j = 0 To 19
Command1(j).Caption = b(j)
Next
For i = 0 To 15
Command3(i).Caption = a(i)
Next
End Sub
Frm_ajutor
Private Sub cmdrevenire_Click()
Unload Me
frmpm.Show
frmpm.Enabled = True
End Sub

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

Aplicatii in visual basic

GHEORGHE PAUN

Intre matematica si jocuri

H.R. RADIAN , T.J. RADIAN Recreatii matematice


L. DU, N.C. ISTRATE, A. ALEXANDRU, G. GORGHIU Programarea
calculatoarelor in limbajul C++
L. FNARU, I. BRAVA VISUAL BASIC Primii pai si urmatorii.
MARTIN GARDNER
MICROSOFT

Alte amuzamente matematice

VISUAL BASIC6.0 Ghidul programatorului.

R. CHERCIU, C. BLNESCU, D. GRIGORIU, S. PETRESCU, I.


IOSUPESCU, M. HOMORODEAN Informatica probleme propuse si
rezolvate.
RZVAN MUNTEANU

Visual basic-curs in format electronic

69