Culegere Probleme de Informatica

Embed Size (px)

Citation preview

  • Culegere probleme de informatica

    Cuprins

    CUPRINS ................................................................................................................................................ 1

    INTRODUCERE .................................................................................................................................... 2

    CE ANSE AM S DEVIN UN BUN PROGRAMATOR ? ............................................................... 3

    LEGILE SUCCESULUI DURABIL (GHIDUL STUDENTULUI NDRTNIC) ......................... 6

    PROBLEME DE JUDECAT .............................................................................................................. 8

    PROBLEME DE PERSPICACITATE ............................................................................................................. 8

    PROBLEME CU CHIBRITURI .................................................................................................................... 9

    PROBLEME DE LOGIC I JUDECAT .................................................................................................... 10

    PROBLEME DE LOGIC I JUDECAT CU "TENT INFORMATIC" ......................................................... 12

    NOIUNI FUNDAMENTALE DE PROGRAMARE ....................................................................... 15

    1.CELE TREI ETAPE ALE REZOLVRII UNEI PROBLEME CU AJUTORUL CALCULATORULUI ..................... 15

    2.CUM SE STABILETE CORECTITUDINEA I EFICIENA SOLUIONRII ? .............................................. 15

    3. NOIUNILE FUNDAMENTALE ALE PROGRAMRII: ALGORITM, LIMBAJE DE DESCRIERE A

    ALGORITMILOR, PROGRAM, LIMBAJE DE PROGRAMARE ...................................................................... 16

    3.1. Algoritmul ............................................................................................................................... 16

    3.2. Descrierea algoritmilor ........................................................................................................... 17

    3.3 Programul ................................................................................................................................ 18

    4. SECRETUL NVRII RAPIDE A PROGRAMRII ................................................................................ 19

    NOIUNI PRIMARE DE PROGRAMARE N PASCAL I C ....................................................... 20

    EXEMPLE DE PROBLEME REZOLVATE ................................................................................................... 21

    METODA PRACTIC DE NVARE CE GARANTEAZ REZULTATE IMEDIATE ......... 26

    PROBLEME SELECIONATE - ENUNURI ................................................................................ 26

    PROBLEME PROPUSE SPRE REZOLVARE (PROBLEME DE ANTRENAMENT) ............................................. 26

    PROBLEME DE EXAMEN ....................................................................................................................... 28

    PROBLEME DIFICILE............................................................................................................................. 30

    PROBLEME NESOLUIONATE NC ....................................................................................................... 32

    PROBLEME INSOLVABILE ALGORITMIC ................................................................................................ 35

    NOIUNI APROFUNDATE DE PROGRAMARE .......................................................................... 37

    METODE I STRATEGII DE PROIECTARE A ALGORITMILOR (ALIAS TEHNICI DE PROGRAMARE).............. 37

    BACKTRACKING. ................................................................................................................................. 39

    GREEDY. ............................................................................................................................................. 42

    PROGRAMAREA DINAMIC. ................................................................................................................. 42

    BRANCH & BOUND. ............................................................................................................................. 43

    RECURSIVITATEA ................................................................................................................................ 44

    PROBLEME REZOLVATE I EXERCIII DE PROGRAMARE................................................ 49

    PROBLEME ELEMENTARE. EXERCIII DE PROGRAMARE ....................................................................... 49

    PROBLEME CE NECESIT BACK-TRACKING .......................................................................................... 66

    PROBLEME CU SOLUIE SURPRINZTOARE .......................................................................................... 70

    ELEMENTE DE PROGRAMARE A PC - URILOR ....................................................................................... 75

    CURIOZITI I TRUCURI DE PROGRAMARE ......................................................................................... 91

    CONFRUNTARE DE OPINII: INFORMATIC VERSUS MATEMATIC ............................... 93

    BIBLIOGRAFIE, ADRESE I LOCAII DE INTERES PE INTERNET ..................................... 95

  • 2

    Introducere

    Exist multe culegeri de probleme de informatic ce permit nvarea i perfecionarea n programare. Prin aceast culegere am ncercat nu doar s sporim aceast mulime cu nc una ci s oferim un punct de vedere nou, original i incitant. Originalitatea nu este dat de enunurile problemelor sau de rezolvrile oferite, ci de ideile i sfaturile cu caracter mobilizator pe care le oferim, precum i de faptul c am introdus cteva capitole cu coninut mai puin obinuit ntr-o culegere de probleme de programare.

    Ni s-a prut mai important ca n aceste vremuri, caracterizate prin cuvintele "m simt ntr-o permanent criz de timp", s oferim ct mai mult din experiena noastr direct, att cea de programator ct i cea de profesor de programare. Dei nu credem c exist metode perfecte de predare sau de nvare a programrii, totui sperm c prin asimilarea informaiilor originale oferite eficiena procesului de nvare a programrii n limbajele C i Pascal va crete. Este important ca informaiile suplimentare s fie asimilate gradat i numai n limita "suportabilitii" fiecruia. De aceea, n paginile ce urmeaz vei gsi i o serie de informaii i sfaturi ce sintetizeaz experiena didactic acumulat ca profesor de informatic i urmndu-le v asigurm c vei obine succesul n programare.

    n primele capitole a fost pus un accent important pe motivarea iniial a celor ce doresc s nvee programare. n capitolul "Ce anse am s devin un bun programator" snt chiar prezentate cu sinceritate nzestrrile necesare unui bun programator. Tot astfel se explic motivul introducerii unui capitol ce conine probleme de judecat. Rezolvarea acestora pot fi considerate nu doar ca un excelent antrenament al minii ci i ca o bun ocazie de a aprinde pasiunea pentru informatic i de a ntri motivaia programatorilor nceptori. Asta nu nseamn c aceast culegere nu le este util i celor care au dobndit deja suficiente cunotine de programare. Am introdus n ea cteva capitole ce conin informaii mai puin cunoscute. Unul cuprinde o list de probleme deosebite, unele foarte dificile, altele crora nu li se cunoate nc o soluie i altele pentru care exist demonstraie riguroas c nu pot fi rezolvate cu ajutorul calculatorului. Alt capitol cuprinde exemple de programare a PC-urilor: lucrul cu tastatura, mouse-ul,

    accesul direct la memoria ecran, etc. Iar unele capitole ca Noiuni aprofundate de programare, Probleme cu soluie surprinztoare sau Curioziti i trucuri de programare le snt n ntregime destinate celor care au depit stadiul de nceptor. Probabil c aceste informaii constituie o provocare destul de substanial chiar i pentru cei avansai n ale programrii. n concluzie, scopul acestei culegeri nu este doar de a contribui la formarea i specializarea programatorilor sau pentru aprofundarea tehnicilor de programare, ct mai ales de a le oferi o baz, o motivaie i o iniiere celor care doresc s fac primii pai n domeniul programrii. Iar acelor mptimii ai programrii care se simt deja plictisii, stui sau plafonai le promitem c parcurgnd aceast culegere vor aprofunda cunotinele pe care i le-au nsuit deja i, dac vor avea curajul de "a se lua de piept" cu unele din problemele nesoluionate nc, li se va reaprinde cu siguran focul pasiunii pentru programare.

    nceptorilor le urm Bun venit n programare i tuturor Mult succes !

  • 3

    Ce anse am s devin un bun programator ?

    Aceast ntrebare apare deseori n discuiile sincere dintre profesori i studenii lor descurajai de ntrzierea apariiei unor rezultate care s certifice buna lor calitate ca programatori. Vom ncerca n rndurile ce urmeaz s rspundem ct mai clar la aceast ntrebare oferind, n plus, o perspectiv prosptat asupra acestui subiect, prin luarea n considerare a unei serii de factori mai puin utilizai n procesul didactic contemporan.

    Mai nti s vedem ce s-ar putea nelege prin sigtagma bun programator, insisitnd n continuare doar pe aprofundarea adjectivului bun, fr a mai defini sau detalia ce se nelege printr-un programator. Vom cita cuvintele recente ale lui Timoty Budd ( profesor la Oregon State University )

    care d urmtoarea definiie: Un bun programator trebuie s fie nzestrat cu tehnic, experien, capacitate de abstractizare, logic, inteligen, creativitate i talent. ntru-totul de acord cu aceast definiie vom trece n cele ce urmeaz la explicitarea fiecrei caliti.

    nainte vom deduce urmtoarea consecin imediat - deosebit de important - ce rezult din definiia de mai sus: cele apte caliti trebuie s fie prezente toate pentru a se obine calificativul de bun programator. Deci, prin lipsa sau prin prezena atrofiat a uneia , sau a mai multe din ingredientele reetei de mai sus, acest calificativ nu mai poate fi atins.

    1. Tehnica este desigur o calitate ce poate fi, i este, dobndit doar prin aplicarea asidu (conform proverbului: exerciiul l face pe maestru) n activitatea concret de programare a tehnicilor de programare nvate i asimilate de ctre programator n timpul formrii sale profesionale. Nu este exclus aici posibilitatea obinerii tehnicii de programare nafara unui cadru specializat (ntr-o facultate de profil ), ci chiar exist posibilitatea obinerii ei prin studiu individual i formaie proprie (autodidact ).

    2. Experiena este perechea geamn a calitii de mai nainte, fr ns a se exclude una pe cealalt. Nu vom mai repeta cum i n ce condiii poate fi ea obinut ci vom deduce urmtoarea consecina imediat : nici un programator nceptor nu poate fi numit bun programator ntruct el nu a avut cnd (adic timpul necesar ) s dobndeasc ambele caliti. Este binecunoscut faptul c o rubric important ce se cere completat la angajare sau la schimbarea locului de munc este experiena de programare n ani. Se consider n general c experiena apare abia dup minimum doi ani de programare. Acest fapt nu trebuie privit ca o descurajare pentru cei mai tineri

    programatori ci mai degrab ca pe un motiv de ambiionare i ca o invitaie la rapid autoperfecionare.

    3. Abstractizarea este o trstur a intelectului uman i constituie un dat al oricrui om normal, dar din pcate(!) este o nsuire prea puin dezvoltat i prea puin folosit de oamenii obinuii. Ea const din capacitatea de a extrage din context, de a vedea dincolo de suprafaa imediat i de a putea sesiza structura scheletul ce susine ntreaga reea de detalii ale unei probleme generale. Pentru a fi un bun programator acest calitate trebuie s fie net amplificat fa de normal ntruct st la baza oricrui proces de analiz i modelare a problemelor, ct i la baza procesului de proiectare a soluiilor generale. Absena sau mai exact atrofierea acestei capaciti se constat practic la studeni prin incapacitatea de a nelege sau de a asimila explicaii, demonstraii sau modele abstracte ( simplu spus, o acut i permanent lips de chef atunci cnd snt atinse anumite subiecte ce nu mai au contact direct cu realitatea concret, imediat adic subiecte abstracte ). Metoda pentru a recpta sau a amplifica aceast capacitate este de a face ct mai des uz de ea, adic de a o exersa mereu (conform zicalei funcia creeaz organul) ntr-un domeniu particular, susinut de o motivaie personal puternic. Altfel spus, capacitatea noastr de abstractizare se va amplifica dac vom ncerca gsirea de soluii la problemele dintr-unul din domeniile noastre preferate, pentru c rezolvarea acestora va fi automotivat, fcut cu chef i va prezenta o doz sporit de atractivitate.

    4. Logica este o alt calitate intrinsec a oricrui intelect sntos. Ea este absolut necesar att pentru a putea folosi mecanismele mentale de deducie i inducie logic, ct i pentru a putea nelege uor, dar n acelai timp corect, cursul firul rou al unei demonstraii sau al unui raionament ntins pe mai multe pagini. Asemenea tuturor calitilor intrinseci existente n stare potenial, antrenarea i amplificarea acesteia se face prin exerciiu repetat, prin folosirea ei n mod curent.Din pcate, doar prin rezolvarea de integrame nu se ajunge la amplificarea logicii

    5. Inteligena este una din cele mai de pre caliti intrinseci ale intelectului uman. n cteva cuvinte, fr a avea pretenia de a da prin acestea o definiie, prin inteligen nelegem capacitatea de a face (de a stabili) conexiuni sau legturi noi i folositoare (din latinescul inter-legere) ntre idei, cunotine sau informaii aparent fr legtur. Fa de logic, pe care o considerm ca fiind o

  • 4

    calitate bazal, inteligena este o calitate ce se ntinde pe verticala intelectului i are n plus trstura de a fi mult mai dinamic i mai mobil (chiar fulgertor de rapid) n aciune. Pentru cultivarea, amplificarea i cizelarea acestei caliti este nevoie de punerea ei la lucru ct mai des i pe durate tot mai mari de timp. Insatisfacia obinerii unor rezultate rapide sau chiar imediate este un obstacol ce poate fi depit relativ uor prin antrenarea inteligenei pe un teren cunoscut i accesibil, adic n domeniul preferat de interes. n acest fel exist sigurana de a fi susinut de atracia sporit pentru acel domeniu particular ceea ce va conduce prin efort perseverent (dar susinut de aceast dat cu pasiune !) la apariia rezultatelor ateptate i, implicit, a satisfaciei.

    6. Creativitatea este o calitate intrinsec nu numai intelectului uman ci nsi vieii n general. Ea const, n ultim instan, n capacitatea de a face (de a produce) ceva cu adevrat nou i original. De aceea am putea afirma c toate organismele vii, prin capacitatea lor de a se opune entropiei, creeaz mereu ordine din dezordine aducnd n acest fel ceva nou, neateptat. Ceea ce se ateapt ns de la un bun programator nu este doar acest tip de creativitate (gen: adaptare incontient i instinctiv) ci o creativitate contient, responsabil, reflectat n adaptarea soluiilor existente sau chiar inventarea altora noi. n acest sens trebuie s menionm c exist o legtur strns, dovedit i verificat n practic (chiar dac pare oarecum inexplicabil la prima vedere), ntre creativitate inteligen fluid curiozitate sublimarea impulsurilor erotice - umor i poft de via. Cultivarea i amplificarea controlat a oricrora dintre aceste patru trsturi va conduce n mod automat la amplificarea i dinamizarea creativitii intelectuale.

    7. Talentul este singura calitate ce nu poate fi cultivat i amplificat. n accepiunea sa obinuit, prin talent se nelege o sum de nzestrri native sau o predispoziie personal pentru un anumit domeniu. Existena talentului este perceput de cel n cauz ca uurin abilitate - dexteritate de a nva, asimila i aplica toate cunotinele domeniului respectiv, abilitate ce este simit de cel "talentat" ca un fel de ceva n plus n comparaie cu capacitile celor din jur. Din pcate, n accepiunea comun se crede c talentul este calitatea suficient care permite oricui atingerea cu siguran a calificativului bun programator, concepie este infirmat de orice programator cu experien. Asta nu nseamn c lipsa talentului n programare este permis pentru atingerea acestui nivel, ns efortul, tenacitatea i rbdarea existente n cantiti mult sporite ntr-o asemenea situaie de ne-nzestrare cu talent vor permite o apropiere sigur de acest calificativ. Din pcate, lipsa talentului va aprea la nceput sub forma unei insatisfacii interioare i ca o impresie acut c lipsesc rezultatele. Reamintim c nsi cuvntul facultate are la origine sensul de capacitate, potenialitate, nzestrare. Deci, normal ar fi ca alegerea unui student pentru frecventarea cursurilor unei Faculti s fi fost fcut innd cont de aptitudinile i abilitile celui n cauz, descoperite n prelabil, adic s se dovedeasc talentat pentru domeniul ales. Acest lucru este cu att mai important n cazul optrii pentru nvarea programrii, cunoscut fiind ca o specializare complex i solicitant.

    Relund n sintez ideile prezentate, putem spune c:

    Pentru a fi un bun programator trebuie s fie prezente urmtorele apte caliti ntr-o form activ, dinamic: tehnic, experien, capacitate de abstractizare, logic, inteligen, creativitate i talent.

    Dintre toate cele apte caliti necesare programrii de nalt calitate, numai una talentul - nu este inerent unui intelect sntos. De altfel, prezena talentului nu este absolut necesar pentru a deveni programator, dar n timp ce absena lui ngreuneaz apropierea de calificativul bun programator, prezena lui i amplificarea celorlalte caliti este o garanie a succesului, ce va fi cu siguran obinut, ns nu fr efort, rbdare i perseveren !

    Toate celelalte ase caliti excluznd talentul, prezente fiind ntr-o form potenial, trebuiesc doar cultivate i amplificate. Am prezentat mai sus n detaliu modul de amplificare a fiecreia.

    Cheia secret ce conduce cu siguran la declanarea procesului de dinamizare i amplificare a fiecreia din cele ase caliti inerente este de a avea mereu o motivaie puternic (de a nva cu chef sau cu tragere de inim !). Acest fapt este posibil dac se ine cont de necesitatea adaptrii efortului la domeniul preferat al celui n cauz. La modul concret, este necesar ca toate aplicaiile, problemele, exerciiile, ntrebrile, curiozitile, inovaiile, descoperirile, spturile, etc., s fie fcute sau s fie alese, la nceput, din domeniul preferat (hobby-ul), chiar dac acesta nu are la prima vedere legtur cu programarea. Scopul ce se atinge cu siguran n acest mod n aceast prim faz este acela de a pune la lucru inteligena, creativitatea, logica, etc., ceea ce va conduce cu siguran la trezirea i amplificarea rapid a acestor caliti. Acest fapt va permite apoi trecerea la o a doua faz n care, pe baza acumulrilor calitative obinute, se poate trece la programarea propriu-zise narmat cu fore proaspete.

  • 5

    ncheiem rspunznd ntr-o singur fraz ntrebrii din titlu Ce anse am s devin un bun programator ? :

    dac m simt nzestrat cu talent pentru programare (adic nu m simt inconfortabil la acest subiect) atunci, mobilizndu-mi voina (motivaia) i amplificndu-mi capacitatea de abstractizare, logica, inteligena i creativitatea (ce exist n mine ntr-o form potenial), prin practic de programare voi acumula n timp tehnica i experiena necesare pentru a deveni cu siguran un bun programator , ns nu fr efort, rbdare i perseveren.

  • 6

    Legile succesului durabil (Ghidul studentului ndrtnic)

    Cunoate-i Regulile de aur ale studentului mecher ? Dac nu, le putei fi afla la o bere, de la mecher la mecher. Noi le vom numi "Anti-legile succesului durabil" i vi le prezentm n continuare doar pentru a putea observa cum fiecare din aceste "legi" este o rsturnare (pervertire) a adevratelor legi ale succesului.

    1. Cel mai important este s termini facultatea i s te vezi cu diploma n mn. Ce conteaz cum ? Cine mai tie dup-aia ?

    2. De ce s-nvei ? i aa majoritatea materiilor snt tembele i n-o s-i foloseasc niciodat n via. materiile tembele trebuie s fie predate numai pentru ca s ctige i profii o pine.

    3. Pune-te bine cu profesorii pn treci examenul. Stai cu ei la o igar n pauz. Las-i pe ei s vorbeasc. Tu pref-te c eti interesat

    4. Ai trecut examenul ? Da ? Atunci restul nu mai conteaz. 5. Nu conteaz dac ai nvat, ce tii sau ct tii. Important este s ai baft la examen, s ai mn

    bun sau s mergi "bine pregtit" La puini profi nu se poate copia ! 6. Snt examene la care, se tie bine, toat lumea copiaz. Trebuie s fi nebun s-nvei la ele ! 7. Notele bune snt numai pentru piloi i tocilari.

    Acestor studeni le snt ns complet necunoscute Legile succesului durabil. Ele ar putea fi intuite doar de acei puini care s-au format i s-au educat n spiritul ideilor ce urmeaz s le explicm n continuare. Aceste legi ne nva c bazele succesului durabil se pun nc din timpul colii i mai ales din timpul facultii. i ne mai nva c succesul astfel "start-at" este destinat s dureze o via ntreag.

    1. Cel mai important n facultate este s-i faci o carte de vizit, nu-i suficient s vnezi doar diploma. Dac vei fi apreciat i vei ajunge s fii considerat capabil sau chiar bun de cadrele didactice "cu greutate", vei ajunge s fi cunoscut i bine cotat dup absolvire i-i vei gsi un loc bun de munc. ntotdeauna a fost i va fi nevoie de oameni capabili "pe piaa muncii", nu de liceniai "piloi", tolomaci sau papagali.

    2. Cel mai important lucru n coal este c nvei cum s nvei. Cnd vrei s te recreezi rezolvnd integrame nu prea conteaz ce din ce domeniu i le-ai ales. Important pentru tine nu este cum, ci faptul c te destinzi. Tot astfel, n facultate important este nu neaprat ce nvei, ci c nvei! Multe cunotine le vei uita n primii ani dup absolvire, mai ales cele pe care i le-ai nsuit ntr-o stare de sforare i ncrncenare, fr plcere. Cel mai important este s nvei de plcere cci numai aa vei nva cum s nvei. Iar aceasta nu se mai poate uita! i nu vei mai uita nicicnd c ai resursele i puterea s treci prin fore proprii examenele cele mai grele.

    3. Succesul n via se bazeaz pe relaii umane echilibrate. (Acest fapt era cunoscut i pe vremea regimului partidului comunist romn P.C.R. ns datorit imoralitii generalizate a societii el a fost aplicat pe invers: astfel, a apela de P.C.R. nsemna atunci s apelezi la Pile, Cunotine i Relaii.) Deci, cel mai important lucru n coal este s nvei arta de a stabilii relaii umane prietenoase i de ncredere reciproc. Ceea ce va conta cel mai mult, peste ani, este c ai stabilit n timpul colii multe prietenii durabile i de ncredere care te vor mbogii astfel pentru toat viaa. n plus, nu uita: i profesorii snt oameni. Au i ei nevoie de prieteni.

    4. Colegii snt martori i devin cei mai exigeni judectori ai trsturilor tale de caracter. Examenul, indiferent de materie sau disciplin, cu emoiile i peripeiile lui este n sine o lecie complet. Nu conteaz att dac l-ai luat sau dac l-ai picat, ci conteaz cum! Conteaz ce fel de om eti n astfel de situaii, cnd tocmai i construieti cartea de vizit sau blazonul. Nu uita c nu te afli doar n faa profesorilor ci eti tot timpul nconjurat de colegii care te judec, chiar dac ie nu-i spun. Pentru c aa cum te compori acum n examen, aa te vei comporta toat viaa.

    5. Examenele grele snt cele care i pot forma un caracter puternic. Ceea ce este important n examen, ca i n situaiile de via, este ncrederea n reuit i stpnirea de sine chiar dac n-ai nvat toat materia. Dac ai nvat destul ca s te simi stpn pe tine atunci ai trecut examenul ! Chiar acesta a fost rostul lui, ce dac i-a dat not mic! Crezi c, dup ce vei trece examenul, peste zece ani i vei mai aminti cu ce not ?

    6. Cei cu un caracter slab i vicios se vor da la un moment dat n vileag. Cei care copiaz nu-i dau seama c ei i infecteaz caracterul. i nici ct de grave snt consecinele infectrii cu microbul ctigului imediat obinut prin furt. Oare se vor mai putea debarasa vreodat de acest viciu tentant ? Dar de cunoscutele "efecte secundare": sentimentul de nesiguran fr o fiuic n buzunar, atracia irezistibil pentru aruncarea privirii mprejur, prerea de ru c Ce prost snt,

  • 7

    puteam s copiez tot !, etc. cnd vor mai scpa ? Cei care se obinuiesc s copieze, att ct vor tri, vor fi jumtate om-jumtate fiuic. Ca n vechile bancuri cu miliieni

    7. Oricine este acum apt s nvee i s-i nsueasc pentru ntreaga sa via Legea efortului. Pe profesori i impresioneaz cel mai tare efortul depus i-l vor aprecia cu note maxime. Ei supra-noteaz pe cei care vor, snt bine intenionai, dar nc nu pot. Profesorii cunosc adevrul exprimat n Legea omului de geniu (legea lui Einstein): Geniul este compus 99% din transpiraie i 1% din inspiraie. Profesorii adevrai se strduiesc s noteze mai ales calitatea uman i profesional a studentului. Reinei: dac studentul a fost prietenos, activ i deschis n timpul anului colar i a depus un efort constant pentru a se perfeciona, fapt ce nu a scpat ochiului atent al profesorului, examenul devine n final pentru el o formalitate

    Multe vorbe i preri pot fi auzite pe aceast tem n familie, n pauze la coal sau la barul preferat. Ct snt ele de adevrate ? S-ar putea da oare o definiie precis pentru succesul n via ?

    Noi nu cunoatem o astfel de definiie, tim doar c exist o multitudine de preri i opinii, unele profund contradictorii. Este ns de bun sim s credem c se poate numi de succes acea via care este plin de satisfacii, bucurii i visuri mplinite. Acea via care s-i merite din plin exclamaia: Asta da, via ! ?

    Regula de aur a succesului durabil este: nva s-i construieti singur viaa. i apoi, dac ai nvat, apuc-te fr ntrziere s-i faci viaa fericit.

    Studenia, prin entuziasmul, optimismul i idealismul ei, este o perioad optim pentru a nva cum s-i faci o via de succes ! Atenie, muli i-au dat seama prea trziu c studenia a fost pentru ei n multe privine ultimul tren

  • 8

    Probleme de judecat

    Oferim n cele ce urmeaz o selecie de probleme ce nu necesit cunotine de matematic avansate (doar nivelul gimnazial) dar care pun la ncercare capacitatea de judecat, inspiraia i creativitatea gndirii. Rezolvarea acestor probleme constituie un bun antrenament pentru creterea capacitii de gndire creativ precum i a fluiditii gndirii. Credem c nu degeaba aceste dou trsturi snt considerate cele mai importante semne ale tinereii minii. Problemele, selectate din multiple surse, nu au putut fi grupate n ordinea dificultii mai ales datorit diversitii i varietii lor. Ele au fost doar separate n cteva categorii a cror nume vrea s sugereze un anumit mod de gndire pe care l-am folosit i noi n rezolvarea lor. Cele cu un grad mai mare de dificultate au fost marcate cu un semn (sau mai multe semne) de exclamare.

    Criteriul principal pe baza cruia s-a fcut aceast selecie a fost urmtorul: fiecare problem cere n rezolvarea ei un minimum de inventivitate i creativitate. Majoritatea problemelor te pun

    "fa n fa cu imposibilul", aa c rezolvarea fiecrei probleme necesit depirea unor "limitri ale gndirii" plus un minimum de originalitate n gndire. Tocmai de aceea, pentru rezolvarea lor este nevoie de efort, putere de concentrare i perseveren. Zis ntr-un singur cuvnt: este necesar i un strop de pasiune.

    Considerm c eforturile consecvente ale celor care vor rezolva aceste probleme vor fi din plin rspltite prin plcerea "minii biruitoare" i prin amplificarea calitilor urmtoare: capacitate sporit de efort intelectual, putere de concentrare mrit i prospeime n gndire.

    V dorim mult succes !

    Probleme de perspicacitate

    1. tiind c o sticl cu dop cost 1500 lei i c o sticl fr dop cost 1000 lei, ct cost un dop ?

    2. tiind c un ou cost 1000 lei plus o jumtate de ou, ct cost un ou ?

    3. Ce numr lipsete alturi de ultima figur:

    3 4 2 ?

    4. Lui Popescu nici prin gnd nu-i trecea s foloseasc toate mijloacele pe care le avea la ndemn ca s lupte mpotriva adversarilor tendinei contra neintroducerii micrii anti-fumat. Care este poziia lui Popescu: este pentru sau contra fumatului ?

    5. mprirea "imposibil". S se mpart numrul 12 n dou pri astfel nct fiecare parte s fie 7.

    6. 9 puncte. S se secioneze toate cele 9 mici discuri cu o linie frnt nentrerupt (fr a ridica creionul de pe hrtie) compus din 4 segmente. (!) Dar din trei segmente, este posibil ?

    7. Trei cutii. n trei cutii identice snt nchise trei perechi de fructe: fie o pereche de mere, fie o pereche de pere, fie o pereche format dintr-un mr i o par. Pe cele trei cutii snt lipite trei etichete: "dou mere", "dou pere" i, respectiv, "un mr i o par". tiind c nici una din etichete nu corespunde cu coninutul cuitei nchise pe care se afl, s se afle care este numrul minim de extrageri a cte un fruct pentru a se stabili coninutul fiecrei cutii.

    8. n ce direcie merge autobuzul din desenul alturat ?

  • 9

    9. (!) ntreruptoarele. Pe peretele alturat uei ncuiate de la intrarea unei ncperi, se afl trei ntreruptoare ce corespund cu cele trei becuri de pe plafonul ncperii n care nu putem intra. Acionnd oricare din ntreruptoare, dunga de lumin care apare pe sub u ne asigur c niciunul din cele trei becuri nu este ars. Cum putem afla, fr a ptrunde n ncpere, care ntreruptor corespunde cu care bec ?

    10. (!!) Cine mut ultimul ctig. Doi juctori dispun de o mas de joc de form circular sau ptrat i de un numr mare de monezi identice. Ei mut plasnd pe masa de joc n spaiul neocupat, fr suprapunere, cte o moned alternativ pn cnd unul dintre juctori, care pierde n acest caz, nu mai poate plasa nicieri o moned. S se arate c primul juctor are o strategie sigur de ctig.

    11. (!!!) Iepurele i robotul-vntor. ntr-o incint nchis (un gen de aren) se afl un iepura i un robot-vntor nzestrat cu cleti, mijloc de deplasare, calculator de proces i ochi electronici. tiind c viteza de deplasare a robotului-vntor este constant i de zeci de ori mai mare dect a iepuraului, ce anse mai are iepuraul de a scpa ?

    12. Cntarul defect. Avnd la dispoziie un cntar gradat defect care greete constant cu aceeai valoare (cantitate necunoscut de grame), putem s cntrim ceva determinndu-i corect greutatea ?

    13. Jocul dubleilor (inventat de Carroll Lewis). tiind c trecerea de la un cuvnt cu sens la altul cu sens este permis doar prin modificarea unei singure litere odat (de exemplu: UNU UNI ANI ARI GRI GOI DOI ) se cere: Dovedii c IARBA este VERDE i c MAIMUA a condus la OMENIRE, facei din UNU DOI, schimbai ROZ-ul n ALB, punei ROUGE pe OBRAZ i facei s fie VARA FRIG.

    14. mpturirea celor 8 ptrate. mpturii iniial n opt o foaie dreptunghiular dup care desfacei-o i nsemnai fiecare din cele opt zone dreptunghiulare obinute (marcate de pliurile de ndoire) cu o cifr de la 1 la 8. Putei mpturi foaia astfel obinut reducnd-o de opt ori (la un singur dreptunghi sau ptrat) astfel nct trecnd cu un ac prin cele opt pliuri suprapuse acesta s le perforeze exact n ordinea 1, 2, 3, , 8 ? ncercai aceste dou configuraii:

    1 8 7 4

    2 3 6 5

    1 8 2 7

    4 5 3 6

    15. Problem pentru cei puternici. ncercai s mpturii de 8 ori, pur i simplu, o coal de hrtie (de fiecare dat linia de ndoire este "n cruce" peste cea dinainte). Este posibil ? (!)Determinai ce dimensiuni ar trebui s aib foaia la nceput pentru a putea fi mpturit de 8 ori.

    16. Este posibil ca un cal s treac prin toate cele 64 de ptrele ale unei table de ah, ncepnd dintr-un col i terminnd n colul diagonal opus ?

    17. ntr-un atelier exist 10 ldie ce conin fiecare piese cu greutatea de 100 grame, cu excepia uneia din ldie ce conine piese avnd grutatea de 90 grame. Putei preciza care este ldia cu pricina, folosind un cntar doar pentru o singur dat ?

    Probleme cu chibrituri

    1. (!) Eliminnd un singur b de chibrit ceea ce rmne n faa ochilor este un elipsoid!

  • 10

    2. (!) 9 bee. S se aeze 9 bee de chibrit astfel nct ele s se ntlnesc la vrf tot cte trei n ase vrfuri distincte.

    3. De la 4 la 3. n figura ce conine 4 ptrate, mutnd 4 bee s se obin o figur ce conine doar 3 ptrate.

    4. 6 = 2 ? Mutnd doar un singur b de chibrit s se restabileasc egalitatea:

    5. Problema ariilor ntregi. Putei aeza 12 chibrituri astfel nct ele s formeze contururile unor poligoane ce au aria ntreag egal cu 5, (!!) 4, 3, 2, (!!!) 1 ? Se subnelege c un chibrit poate fi asimilat cu un segment de lungime 1 i c nu exist nici o dificultate de a forma "din ochi" unghiuri drepte.

    Probleme de logic i judecat

    1. Substituirea literelor. Subtituii literele cu cifre astfel nct urmtoarele adunri s fie corecte: GERALD + DONALD = ROBERT ; FORTY + TEN + TEN = SIXTY ; BALON + OVAL =

    RUGBY.

    2. Test de angajare la Microsoft. Patru excursioniti ajung pe malul unui ru pe care doresc s-l traverseze. ntruct s-a noptat i ei dispun doar de o singur lantern, ei pot s treac rul cel mult cte doi laolalt. tiind c, datorit diferenelor de vrst i datorit oboselii, ei ar avea individual nevoie pentru a traversa rul de 1, 2, 8 i 10 minute, se cere s se decid dac este posibil traversarea rului n aceste conditii n doar 17 minute ?

    3. (!) Imposibil. S se taie toate cele 16 segmente ale figurii urmtoare cu o singur linie curb continu i care nu se intersecteaz cu ea nsi.

    4. (!) Problema "ochilor albatri". Sntem martorii urmtorului dialog ntre dou persoane X i Y. > Putei afla care este vrsta celor trei copii ?

    5. Problema clugrului budhist. ntr-o diminea, exact la rsritul soarelui, un clugr budhist pornete de la templul de la baza muntelui pentru a ajunge la templul din vrful muntelui exact la apusul soarelui, unde el se roag toat noaptea. A doua zi el pornete din vrf pe aceei crare, tot la rsritul soarelui, pentru a ajunge la templul de la baza muntelui exact la apusul soarelui. S se arate c a existat un loc pe traseu n care clugrul s-a aflat n ambele zile exact la aceai or.

    6. Vinul n ap i apa n vin. Dintr-o sticl ce conine un litru de ap este luat un pahar (un decilitru) ce este turnat pest un litru de vin. Vinul cu apa se amestec bine dup care se ia cu acelai pahar o

  • 11

    cantitate egal de "vin cu ap" ce se toarn napoi peste apa din sticl. Avem acum mai mult ap n vin dect vin n ap, sau invers ?

    7. (!!!!) Cuiele n echilibru. Avem la dispoziie 7 cuie normale, cu capul obinuit. nfigem unul vertical n podea (sau ntr-o plac de lemn). Se cere s se aeze cele 6 cuie rmase n echilibru stabil pe capul cuiului vertical, fr ca niciunul din cele ase cuie s ating podeaua.

    8. (!!) igrile tangente. Este posibil s aezm pe mas ase igri astfel nct fiecare s se ating cu fiecare (oricare dou s fie tangente) ? (!!!) Dar apte igri ?

    9. (!) Problema celor 12 nelepi (n variant modern). Managerul unei mari companii dorete s pun la ncercare inteligena i puterea de judecat a celor 12 membrii ai consiliului su de conducere. Lund 12 cri de joc, unele de pic i altele de caro, el le aeaz cte una pe fruntea fiecrui consilier astfel nct fiecare s poat vedea crile de pe frunile celorlali dar nu i pe a sa. Managerul le cere celor care consider c au pe frunte o carte de caro (diamond) s fac un pas n fa, altfel ei nu vor mai putea face parte din consiliu. Dup ce i repet cererea de apte ori, timp n care niciunul din cei 12 consilieri nu face nici o micare (ci doar se privesc unii pe alii), toi consilierii care au ntr-adevr pe frunte o carte de caro ies deodat n fa. Putei deduce ci au ieit i cum i-au dat ei seama ce carte este aezat pe fruntea lor ?

    10. Pianjenul i musca. Pe peretele lateral al unei hale cu dimensiunile de 40 x 12 x12 metri, pe linia median a peretelui lateral i exact la 1 metru de tavan, se afl un pianjen. Pe peretele lateral opus, tot pe linia median i exact la 1 metru de podea, se afl o musc amorit. Care este distana cea mai scurt pe care pianjenul o are de parcurs de-a lungul pereilor pentru a se nfrupta din musc ?

    11. Rifi i Ruf. Cei doi iubii Rifi i Ruf, din nordica ar Ufu-Rufu, locuiesc n sate diferite aflate la distana de 20 km unul de altul. n fiecare diminea ei pornesc exact deodat (la rsrit) unul spre cellalt spre a se ntlni i a se sruta confrom obiceiului nordic: nas n nas. ntr-o diminea o musc rtcit pornete exact la rsritul soarelui de pe nasul lui Rifi direct spre nasul lui Ruf, care o alung trimind-o din nou spre nasul lui Rifi, .a.m.d. ..., pn cnd ea sfrete tragic n momentul "srutului" celor doi. tiind c Rifi se deplaseaz cu 4 km/or, Ruf cu 6 km/or iar musca zboar cu 10 km/or, se cere s se afle ce distan a parcurs musca n zbor de la rsrit i pn n momentul tragicului ei sfrit.

    12. O anti-problem de ah. n urmtoarea configuraie a pieselor pe o tabl de ah se cere s nu dai mat dintr-o mutare ! (Albul atac de jos n sus. Legenda: P-pion, N-nebun, R-rege, T-turn, C-cal. Alturat fiecrei piese este scris culoarea sa, alb-a sau negru-n.)

    N

    Na

    R

    Ra

    T

    Ta

    T

    Tn

    N

    Na

    T

    Ta

    N

    Nn

    P

    Pn

    P

    Pn

    P

    Pa

    R

    Rn

    P

    Pa

    P

    Pn

    P

    Pa

    P

    Pn

    P

    Pa

    P

    Pa

    P

    Pa

    C

    Ca

    C

    Ca

    13. Bronx contra Brooklyn. Un tnr, ce locuiete n Manhattan n imediata apropiere a unei staii de metrou, are dou prietene, una n Brooklyn i cealalt n Bronx. Pentru a o vizita pe cea din Brooklyn el ia metroul ce merge spre partea de jos a oraului, n timp ce, pentru a o vizita pe cea

  • 12

    din Bronx, el ia din acelai loc metroul care merge n direcie opus. Metrourile spre Brooklyn i spre Bronx intr n staie cu aceei frecven: din 10 n 10 minute fiecare. Dar, dei el coboar n staia de metrou n fiecare smbt la ntmplare i ia primul metrou care vine (nedorind s "favorizeze" pe nici una din prietenele sale), el a constatat c, n medie, el merge n Brooklyn de 9 ori din 10. Putei gsi o explicaie logic a fenomenul ?

    14. (!!) Problema celor 12 bile. n faa noastr se afl 12 bile identice ca form, vopsite la fel, dar una este cu siguran fals, ea fiind fie mai grea, fie mai uoar, fiind fcut dintr-un alt material. Avem la dispoziie o balan i se cere s determinm doar prin 3 cntriri care din cele 12 bile este fals preciznd i cum este ea: mai grea sau mai uoar. (!!!) Mai mult, putei determina care este numrul maxim de bile din care prin 4 cntriri cu balana se poate afla exact bila fals i cum este ea ?

    15. (!) Problema celor 2 perechi de mnui. Aflat ntr-o situaie ce implic intervenia de urgen, un medic chirurg constat c are la dispoziie doar 2 perechi de mnui sterile dei el trebuie s intervin rapid i s opereze succesiv 3 bolnavi. Este posibil ca cele trei operaii de urgen s se desfoare n condiii de protecie normale cu numai cele 2 perechi de mnui ? (Sngele fiecruia din cei 3 pacieni, precum i mna doctorului nu trebuie s conduc la un contact infecios.)

    16. (!!) Problema frnghiei prea scurte. O persoan ce are asupra ei doar un briceag i o frnghie lung de 30 metri se afl pe marginea unei stnci, privind n jos la peretele vertical de 40 metri aflat sub ea. Frnghia poate fi legat doar n vrf sau la jumtatea peretelui (la o nlime de 20 metri de sol) unde se afl o mic platform de sprijin. Cum este posibil ca persoana aflat n aceast situaie s ajung teafr jos cobornd numai pe frnghie, fr a fi nevoit s sar deloc punndu-se astfel n pericol ?

    17. Problema lumnrilor neomogene. Avem la dispoziie chibrite i dou lumnri care pot arde exact 60 minute fiecare ns, ele fiind neomogene, nu vor arde cu o vitez constant. Cum putem msura precis o durat de 45 minute ?

    18. (!!) O jumtate de litru. Avem n faa noastr un vas cilindric cu capacitatea de 1 litru, plin ochi cu ap. Se cere s msurm cu ajutorul lui litru de ap, fr a ne ajuta de nimic altceva dect de minile noastre.

    19. (!) S vezi i s nu crezi. Privii urmtoarele dou figuri: prin reaezarea decupajelor interioare ale primeia se obine din nou aceeai figur dar avnd un ptrel lips ! Cum explicai "minunea" ?

    Probleme de logic i judecat cu "tent informatic"

    1. (!!!) Decriptarea scrierii ncifrate. Se dau urmtoarele numere mpreun cu denumirile lor cifrate:

    5 nabivogedu

    6 nagevogedu

    10 nabivobinaduvogedu

    15 nabivonagevogedunaduvogedu

    20 nabivogenagevogenaduvogedu

    25 nabivonabivobinagevogedunagevogenaduvogedu

    30 nabivodunanabivobiduvogedu

    50 nabivonabivonabivogedunagevogenaduvogedunanabivobiduvogedu

    60 nabivonagevogedunagevogenanabivobiduvogedu

    90 nabivonaduvogedunagevodunanabivobiduvogedu

  • 13

    100 nabivonabivobinagevogenaduvogedunagevodunanabivobiduvogedu

  • 14

    Care este regula de ncifrare? Ce numere reprezint urmtoarele coduri cifrate: nagevonagevogedunanabivobiduvogedu;

    nagevonaduvogedunanabivobiduvogedu;

    naduvogenanabivobiduvogedu;

    nanabivogeduvogedu;

    nabivonabivonaduvogedunagevonagevogedunanabivobiduvogedu;

    nanagevobiduvogedu?

    ncifrai numerele 256 i 1024 prin acest metod.

    2. (!!!) Altfel de codificare binar a numerelor. Descoperii metoda de codificare binar a numerelor folosit n continuare:

    1 1 20 101010

    2 10 25 1000101

    3 11 30 1010001

    5 110 40 10001001

    10 1110 50 10100100

    15 10010 60 100001000

    Putei spune ce numere snt codificate prin 100, 101, 1000, 1111, 10000 i 11111 ? Putei codifica numerele 70, 80, 90, 100, 120, 150 i 1000 ?

    3. (!!!) Problema dialogului perplex. Exist dou numere m i n din intervalul [2..99] i dou persoane P i S astfel nct persoana P tie produsul lor, iar S tie suma lor. tiind c ntre P i S a avut loc urmtorul dialog: "Nu tiu numerele" spune P. "tiam ca nu tii" rspunde S, "nici eu nu tiu." "Acuma tiu !" zice P strlucind de bucurie. "Acum tiu i eu" optete satisfcut S.

    s se determine toate perechile de numere m i n ce "satisfac" acest dialog (snt soluii ale problemei).

    4. (!!!!) mpturirea celor 8 ptrate. mpturii iniial n opt o foaie dreptunghiular dup care desfacei-o i nsemnai fiecare ptrel obinut cu o cifr de la 1 la 8. Proiectai un algoritm i realizai un program care, primind configuraia (numerotarea) celor 8 ptrele, s poat decide dac se poate mpturi foaia astfel obinut reducnd-o de opt ori (la un singur ptrat) astfel nct trecnd cu un ac prin cele opt foi suprapuse acesta s le perforeze exact n ordinea 1, 2, 3, , 8.

    5. (!!!!) Problema fetelor de la pension. Problema a aprut pe vremea cnd fetele nvau la pension fr ca prin prezena lor bieii s le tulbure educaia. Pedagoaga fetelor unui pension de 15 fete a hotart ca n fiecare dupa-amiaz, la ora de plimbare, fetele s se plimbe n cinci grupuri de cte trei. Se cere s se stabileasc o programare a plimbrilor pe durata unei sptmni (apte zile) astfel nct fiecare fat s ajung s se plimbe numai o singur dat cu oricare din celelalte paisprezece (oricare dou fete s nu se plimbe de dou ori mpreun n decursul unei sptmni).

  • 15

    Noiuni fundamentale de programare

    Programarea este disciplina informatic ce are ca scop realizarea de programe care s constituie soluiile oferite cu ajutorul calculatorului unor probleme concrete. Programatorii snt acele persoane capabile s implementeze ntr-un limbaj de programare metoda sau algoritmul propus ca soluie respectivei probleme, ce se preteaz a fi soluionat cu ajutorul calculatorului. Dup nivelul de implicare n efortul de rezolvare a problemelor specialitii n programare pot fi mprii n diverse categorii: analiti, analiti-programatori, ingineri-programatori, simpli programatori, etc. Cu toii au ns n comun faptul c fiecare trebuie s cunoasc ct mai bine programare i s fie capabil, nu doar s citeasc, ci chiar s scrie codul surs, adic programul propriu-zis. Din acest punct de vedere cunotinele de programare snt considerate ABC-ul informaticii i snt indispensabile oricrui profesionist n domeniu.

    1.Cele trei etape ale rezolvrii unei probleme cu ajutorul calculatorului

    n rezolvarea sa cu ajutorul calculatorului orice problem trece prin trei etape obligatorii: Analiza problemei, Proiectarea algoritmului de soluionare i Implementarea algoritmului ntr-un program pe calculator. n ultima etap, sub acelai nume, au fost incluse n plus dou subetape cunoscute sub numele de Testarea i ntreinerea programului. Aceste subetape nu lipsesc din ciclul de via a oricrui produs-program ce se respect dar , pentru simplificare, n continuare ne vom referi doar la primele trei mari etape.

    Dac etapa implementrii algoritmului ntr-un program executabil este o etap exclusiv practic, realizat n faa calculatorului, celelalte dou etape au un pronunat caracter teoretic. n consecin, primele dou etape snt caracterizate de un anumit grad de abstractizare. Din punct de vedere practic ns, i n ultim instan, criteriul decisiv ce confer succesul rezolvrii problemei este dat de calitatea implementrii propriuzise. Mai exact, succesul soluionrii este dat de performanele programului: utilitate, vitez de execuie, fiabilitate, posibiliti de dezvoltare ulterioare, lizibilitate, etc. Cu toate acestea este imatur i neprofesional strategia programatorilor nceptori care, neglijnd primele dou etape, sar direct la a treia fugind de analiz i de componenta abstract a efortului de soluionare. Ei se justific cu toii prin expresii puerile de genul: Eu nu vreau s mai pierd vremea cu teoria, am s fac programul cum tiu eu. Ct vreme nu va face altcineva altul mai bun dect al meu, nu am de ce s-mi mai bat capul !.

    2.Cum se stabilete corectitudinea i eficiena soluionrii ?

    Este adevrat c ultima etap n rezolvarea unei probleme implementarea este decisiv i doveditoare, dar primele dou etape au o importan capital. Ele snt singurele ce pot oferi rspunsuri corecte la urmtoarele ntrebri dificile: Avem certitudinea c soluia gsit este corect ? Avem certitudinea c problema este complet rezolvat ? Ct de eficient este soluia gsit ? Ct de departe este soluia aleas de o soluie optim ? S menionm n plus c literatura informatic de specialitate conine un numr impresionant de probleme capcan pentru nceptori, i nu numai pentru ei. Ele provin majoritatea din realitatea imediat dar pentru fiecare dintre ele nu se cunosc soluii eficiente. De exemplu, este dovedit teoretic c problema, aparent banal pentru un calculator, a proiectrii Orarului optim ntr-o instituie de nvmnt (coal, liceu, facultate) este o problem intratabil la ora actual (toate programele care s-au realizat pn acum nu ofer dect soluii aproximative fr a putea spune ct de aproape sau de departe este soluia optim de orar).

    Ci dintre programatorii nceptori n-ar fi surprini s afle c problema att de simpl (ca enun), a crei soluionare tocmai au abandonat-o, este de fapt o problem dovedit teoretic ca fiind intratabil sau chiar insolvabil algoritmic ? Partea proast a lucrurilor este c, aa cum ciupercile otrvite nu pot fi cu uurin deosebite de cele comestibile, tot astfel problemele netratabile pot fi cu uurin confundate cu nite probleme uoare la o privire rapid i lipsit de experien. Dac ar fi s sintetizm n cte un cuvnt efortul asupra cruia se concentreaz fiecare din cele trei etape analiza, proiectarea i implementarea cele trei cuvinte ar fi: corectitudine, eficien i impecabilitate. Etapa de analiz este singura care permite dovedirea cu argumente riguroase a

  • 16

    corectitudinii soluiei, iar etapa de proiectare este singura care poate oferi argumente precise n favoarea eficienei soluiei propuse. n general problemele concrete din informatic au n forma lor iniial sau n enun o caracteristic pragmatic, fiind foarte ancorate n realitatea imediat. Totui ele conin n formularea lor iniial un grad mare de eterogenitate, diversitate i lips de rigoare. Fiecare dintre aceste defecte este un obstacol major pentru demonstrarea corectitudinii soluiei. Rolul esenial al etapei de analiz este acela de a transfera problema de pe nisipurile mictoare ale realitii imediate de unde ea provine ntr-un plan abstract, adic de a o modela. Acest univers paralel abstract este dotat cu mai mult rigoare i disciplin intern, avnd legi precise, i poate oferi instrumentele logice i formale necesare pentru demonstrarea riguroas a corectitudinii soluiei problemei. Planul abstract n care snt transportate toate problemele de informatic este planul sau universul obiectelor matematice iar corespondentul problemei n acest plan va fi modelul matematic abstract asociat problemei. Demonstrarea corectitudinii proprietilor ce leag obiectele universului matematic a fost i este sarcina matematicienilor. Celui ce analizeaz problema din punct de vedere informatic i revine sarcina (nu tocmai uoar) de a dovedi printr-o demonstraie constructiv c exist o coresponden precis (o bijecie !) ntre prile componente ale problemei reale, dezasamblat n timpul analizei, i prile componente ale modelului abstract asociat. Odat descoperit, formulat precis i dovedit, aceast perfect oglindire a problemei reale n planul obiectelor matematice ofer certitudinea c toate proprietile i legturile ce exist ntre subansamblele modelului abstract se vor regsii precis (prin reflectare) ntre prile interne ale problemei reale, i invers. Atunci, soluiei abstracte descoperite cu ajutorul modelului matematic abstract i va corespunde o soluie real concretizat printr-un algoritm ce poate fi implementat ntr-un program executabil. Aceasta este calea general de rezolvare a problemelor i oricine poate verifica acest fapt. De exemplu, ca i exerciiu, ncercai s demonstrai corectitudinea (adic s se aduc argumente precise, clare i convingtoare n favoarea corectitudinii) metodei de extragere a radicalului nvat nc din coala primar (cu grupare cifrelor numrului n grupuri cte dou, etc) sau a algoritmului lui Euclid de determinare a celui mai mare divizor comun a dou numere prin mpriri ntregi repetate. Desigur nu pot fi acceptate argumente copilreti de forma: Algoritmul este corect pentru c aa l-am nvat! sau Este corect pentru c aa face toat lumea ! din moment ce nu se ofer o argumentaie matematic riguroas. Ideea central a etapei a doua proiectarea unui algoritm de soluionare eficient poate fi formulat astfel: din studiul proprietilor i limitelor modelului matematic abstract asociat problemei se deduc limitele inferioare ale complexitii minimale (efortului minimal obligatoriu) inerente oricrui algoritm ce va soluiona problema n cauz. Complexitatea intern a modelului abstract i complexitatea soluiei abstracte se va reflecta imediat asupra complexitii reale a algoritmului, adic asupra eficienei de soluionare a problemei. Acest fapt permite prognosticarea nc din aceast faz faza de proiectare a algoritmului de soluionare a eficienei practice, msurabil ca durat de execuie, a programului.

    3. Noiunile fundamentale ale programrii: algoritm, limbaje de descriere a algoritmilor, program, limbaje de programare

    3.1. Algoritmul

    Se tie c la baza oricrui program st un algoritm (care, uneori, este numit metod de rezolvare). Noiunea de algoritm este o noiune fundamental n informatic i nelegerea ei, alturi de nelegerea modului de funcionare a unui calculator, permite nelegerea noiunii de program executabil. Vom oferi n continuare o definiie unanim acceptat pentru noiunea de algoritm:

    Definiie. Prin algoritm se nelege o mulime finit de operaii (instruciuni) elementare care executate ntr-o ordine bine stabilit (determinat), pornind de la un set de date de intrare dintr-un domeniu de valori posibile (valide), produce n timp finit un set de date de ieire (rezultate).

    Cele trei caracteristici eseniale ale unui algoritm snt:

    1. Determinismul dat de faptul c ordinea de execuie a instruciunilor algoritmului este bine precizat (strict determinat).

  • 17

    Acest fapt d una din calitile de baz a calculatorului: el va face ntotdeauna ceea ce i s-a cerut (prin program) s fac, el nu va avea iniiative sau opiuni proprii, el nu-i permite s greeasc nici mcar odat, el nu se va plictisi ci va duce programul la acelai sfrit indiferent de cte ori i se va cere s repete acest lucru. Nu aceeai situaie se ntmpl cu fiinele umane (Errare humanum est). Oamenii pot avea n situaii determinate un comportament non-deterministic (surprinztor). Acesta este motivul pentru care numeroi utilizatori de calculatoare (de exemplu contabilii), datorit fenomenului de personificare a calculatorului (confundarea aciunilor i dialogului simulat de programul ce ruleaz pe calculator cu reaciile unei personaliti vii), nu recunosc perfectul determinism ce st la baza executrii oricrui program pe calculator. Exprimndu-se prin propoziii de felul: De trei ori i-am dat s fac calculele i de fiecare dat mi-a scos aceleai valori aiurea! ei i trdeaz propria viziune personificatoare asupra unui fenomen determinist.

    2. Universalitatea dat de faptul c, privind algoritmul ca pe o metod automat (mecanic) de rezolvare, aceast metod are un caracter general-universal. Algoritmul nu ofer o soluie punctual, pentru un singur set de date de intrare, ci ofer soluie pentru o mulime foarte larg (de cele mai multe ori infinit) de date de intrare valide. Aceasta este trstura de baz care explic deosebita utilitate a calculatoarelor i datorit acestei trsturi sntem siguri c investiia financiar fcut prin cumprarea unui calculator i a produsului-soft necesar va putea fi cu siguran amortizat. Cheltuiala se face o singur dat n timp ce programul pe calculator va putea fi executat rapid i economicos de un numr orict de mare de ori, pe date diferite ! De exemplu, metoda (algoritmul) de rezolvare nvat la liceu a ecuaiilor de gradul doi:

    ax2+bx+c=0, se aplic cu succes pentru o mulime infinit de date de intrare: (a,b,c)\{0}xx.

    3. Finitudinea pentru fiecare intrare valid orice algoritm trebuie s conduc n timp finit (dup un numr finit de pai) la un rezultat. Aceast caracteristic este analog proprietii de convergen a unor metode din matematic: trebuie s avem garania, dinainte de a aplica metoda (algoritmul), c metoda se termin cu succes (ea converge ctre soluie). S observm i diferena: n timp ce metoda matematic este corect chiar dac ea converge ctre soluie doar la infinit (!), un algoritm trebuie s ntoarc rezultatul dup un numr finit de pai. S observm deasemenea c, acolo unde matematica nu ofer dovada, algoritmul nu va fi capabil s o ofere nici el. De exemplu, nu este greu de scris un algoritm care s verifice corectitudinea Conjecturii lui Goldbach: Orice numr par se scrie ca sum de dou numere prime, dar, dei programul rezultat poate fi lsat s ruleze pn la valori extrem de mari, fr s apar nici un contra-exemplu, totui conjectura nu poate fi astfel infirmat (dar nici afirmat!).

    3.2. Descrierea algoritmilor

    Dou dintre metodele clasice de descriere a algoritmilor snt denumite Schemele logice i Pseudo-Codul. Ambele metode de descriere conin doar patru operaii (instruciuni) elementare care au fiecare un corespondent att schem logic ct i n pseudo-cod.

    n cele ce urmeaz vom nira doar varianta oferit de pseudo-cod ntruct folosirea schemelor logice s-a redus drastic n ultimii ani. Schemele logice mai pot fi ntlnite sub numele de diagrame de proces n anumite cri de specialitate inginereti. Avantajul descrierii algoritmilor prin scheme logice este dat de libertatea total de nlnuire a operaiilor (practic, sgeata care descrie ordinea de execuie, pleac de la o operaie i poate fi trasat nspre orice alt operaie). Este demonstrat matematic riguros c descrierea prin pseudo-cod, dei pare mult mai restrictiv (operaiile nu pot fi nlnuite oricum, ci trebuie executate n ordinea citirii: de sus n jos i de la stnga la dreapta), este totui perfect echivalent. Deci, este dovedit c plusul de ordine, rigoare i simplitate pe care l ofer descrierea prin pseudo-cod nu ngrdete prin nimic libertatea programrii. Totui, programele scrise n limbajele de asamblare, care snt mult mai compacte i au dimensiunile mult reduse, nu ar putea fi descrise altfel dect prin scheme logice.

    1. Atribuirea var:=expresie;

    2. Intrare/Ieire Citete var1, var2, var3, ; Scrie var1, var2, var3, ; sau Scrie expresia1, expresia2, expresia3,;

    3. Condiionala - Dac atunci instruciune1 [altfel instruciune2];

  • 18

    4. Ciclurile Exist (din motive de uurin a descrierii algoritmilor) trei tipuri de instruciuni de ciclare. Ele snt echivalente ntre ele, oricare variant de descriere putnd fi folosit n locul celorlalte dou, cu modificri sau adugiri minimale:

    Repet instruciune1, instruciune2, pn cnd ;

    Ct timp execut instruciune;

    Pentru var_contor:=val_iniial pn la val_final execut instruciune;

    n cazul ciclurilor, grupul instruciunilor ce se repet se numete corpul ciclului iar condiia logic care (asemenea semaforului de circulaie) permite sau nu reluarea execuiei ciclului este denumit condiia de ciclare sau condiia de scurt-circuitare (dup caz). Observm c ciclul de tipul Repet are condiia de repetare la sfrit ceea ce are ca i consecin faptul c corpul ciclului se execut cel puin odat, n mod obligatoriu, nainte de verificarea condiiei logice. Nu acelai lucru se ntmpl n cazul ciclului de tipul Ct timp, cnd este posibil ca instruciunea compus din corpul ciclului s nu poat fi executat nici mcar odat. n plus, s mai observm c ciclul de tipul Pentru pn la conine (n mod ascuns) o instruciune de incrementare a variabilei contor.

    n limba englez, cea pe care se bazeaz toate limbajele actuale de programare acestor instruciuni, exprimate n limba romn, le corespund respectiv: 2. Read, Write; 3. If-Then-Else; 4. Repeat-Until, Do-While, For. S observm c, mai ales pentru un vorbitor de limb englez, programele scrise ntr-un limbaj de programare ce cuprinde aceste instruciuni este foarte uor de citit i de neles, el fiind foarte apropiat de scrierea natural. Limbajele de programare care snt relativ apropiate de limbajele naturale snt denumite limbaje de nivel nalt (high-level), de exemplu limbajul Pascal, spre deosebire de limbajele de programare mai apropiate de codurile numerice ale

    instruciunilor microprocesorului. Acestea din urm se numesc limbaje de nivel sczut (low-level), de exemplu limbajul de asamblare. Limbajul de programare C are un statut mai special el putnd fi privit, datorit structurii sale, ca fcnd parte din ambele categorii.

    Peste tot unde n pseudo-cod apare cuvntul instruciune el poate fi nlocuit cu oricare din cele patru instruciuni elementare. Aceast substituire poart numele de imbricare (de la englezescul brick-crmid). Prin instruciune se va nelege atunci, fie o singur instruciune simpl (una din cele patru), fie o instruciune compus. Instruciunea compus este format dintr-un grup de instruciuni delimitate i grupate n mod precis (ntre acolade { } n C sau ntre begin i end n Pascal).

    Spre deosebire de pseudo-cod care permite doar structurile noi formate prin imbricarea

    repetat a celor patru instruciuni (crmizi) n modul precizat, schemele logice permit structurarea n orice succesiune a celor patru instruciuni elementare, ordinea lor de execuie fiind dat de sensul sgeilor. Repetm c dei, aparent, pseudo-codul limiteaz libertatea de descriere doar la structurile prezentate, o teorem fundamental pentru programare afirm c puterea de descriere a pseudo-limbajului este aceeai cu cea a schemelor logice.

    Forma de programare care se bazeaz doar pe cele patru structuri se numete programare structurat (spre deosebire de programarea nestructurat bazat pe descrierea prin scheme logice). Teorema de echivalen a puterii de descriere prin pseudo-cod cu puterea de descriere prin schem logic afirm c programarea structurat (aparent limitat de cele patru structuri) este echivalent cu programarea nestructurat (liber de structuri impuse). Evident, prin ordinea, lizibilitatea i fiabilitatea oferit de cele patru structuri elementare (i asta fr a ngrdi libertatea de exprimare) programarea structurat este net avantajoas. n fapt, limbajele de programare nestructurat (Fortran, Basic) au fost de mult scoase din uz, ele (limbajele de asamblare) snt necesare a fi folosite n continuare doar n programarea de sistem i n programarea industrial (n automatizri).

    3.3 Programul

    Prin program se nelege un ir de instruciuni-main care snt rezultatul compilrii algoritmului proiectat spre rezolvarea problemei dorite ce a fost descris ntr-un limbaj de programare (ca i cod surs).

    Etapele realizrii unui program snt: Editarea codului surs, etap ce se realizeaz cu ajutorul unui program editor de texte rezultatul

    fiind un fiier Pascal sau C, cu extensia .pas sau .c (.cpp)

  • 19

    Compilarea, etapa de traducere din limbajul de programare Pascal sau C n limbajul intern al micro-procesorului, i este realizat cu ajutorul programului compilator Pascal sau C i are ca rezultat un fiier obiect, cu extensia .obj (n limbajul C) sau .exe (n limbajul Pascal)

    Link-editarea, etap la care se adaug modului obiect rezultat la compilare diferite module coninnd subprograme i rutine de bibliotec, rezultnd un fiier executabil (aceast etap este comasat n Turbo Pascal sau Borland Pascal cu etapa de compilare), cu extensia .exe

    Execuia (Run), etapa de lansare n execuie propriu-zis a programului obinut, lansare realizat de interpretorul de comenzi al sistemului de operare (command.com pentru sistemele DOS+Windows)

    Observm c aceste patru (sau trei, pentru Turbo Pascal) etape snt complet independente n timp unele de altele i necesit utilizarea a patru programe ajuttoare: Editor de texte, Compilator Pascal sau C, Link-editor i Interpretorul de comenzi al S.O. n cazul mediilor de programare integrate (Turbo sau Borland) comandarea acestor patru programe ajuttoare precum i depanarea erorilor de execuie este mult facilitat.

    Deasemenea, merit subliniat faptul c n timp ce fiierul text Pascal sau C, ce conine codul surs, poate fi transportat pe orice main (calculator) indiferent de micro-procesorul acesteia urmnd a fi compilat "la faa locului", n cazul fiierului obiect acesta nu mai poate fi folosit dect pe maina (calculatorul) pentru care a fost creat (datorit instruciunilor specifice micro-procesorului din care este compus). Deci, pe calculatoare diferite (avnd micro-procesoare diferite) vom avea nevoie de compilatoare Pascal sau C diferite.

    n plus, s remarcm faptul c fiierele obiect rezultate n urma compilrii pot fi link-editate (cu grij !) mpreun chiar dac provin din limbaje de programare diferite. Astfel, un program rezultat (un fiier .exe sau .com) poate fi compus din module obiect care provin din surse diferite (fiiere Pascal, C, asamblare, etc.).

    4. Secretul nvrii rapide a programrii

    Exist posibilitatea nvrii rapide a programrii ? Desigur. Experiena predrii i nvrii programrii ne-a dovedit c exist metode diferite de nvare a programrii, mai rapide sau mai lente, mai temeinice sau mai superficiale. Din moment ce se dorete nvarea rapid a programrii nseamn c, pentru cel ce dorete aceasta, problemele ce i ateapt rezolvarea cu ajutorul calculatorului snt importante sau stringente. Am putea chiar presupune c soluionarea lor rapid este un deziderat mai important dect nvarea programrii. Tocmai de aceea, fiind contieni de acest fapt, vom prezenta n continuare una din cele mai rapide metode de nvare a programrii. S observm mai nti c pentru nvarea unei limbi strine este necesar comunicarea i vorbirea intens a acelei limbi. Cu toii am putut constata c dac exist o motivaie sau nevoie puternic de a comunica n acea limb, cel puin pentru o perioad de timp, procesul de nvare a ei este foarte rapid. De exemplu, dac ne aflm ntr-o ar strin sau dac dorim apropierea de o persoan strin (mai ales dac este atrgtoare i de sex opus) categoric vom constata c am nvat mult mai iute limba respectiv. i aceasta datorit faptului c efortul de nvare a fost mascat n spatele efortului (intens motivat!) de a comunica i de a ne face cunoscute inteniile i gndurile. La fel, pentru nvarea rapid i cu uurin a programrii efortul trebuie ndreptat, nu spre silabisirea limbajului de programare, ci spre rezolvarea de probleme i spre scrierea direct a programelor de soluionare a acestora. Concentrndu-ne asupra problemelor ce le soluionm nici nu vom observa cnd i n ce fel am nvat s scriem programe. La urma urmei, programarea este doar un instrument, doar o unealt de scris, i nu un scop n sine. Dac vrei iute s nvei s scrii, conteaz cum sau n ce mn ii stiloul ? Nu trebuie deloc neglijat i un al doilea "factor secret". Aa cum meseria nu se nva, ci se fur, tot astfel programarea se poate nva mult mai uor apelnd la ajutorul unui profesor sau a unui specialist. Acesta, prin experiena i cunotinele sale de specialitate ne poate ajuta s pim alturi de el pe crri bttorite i ntr-un ritm susinut.

    n concluzie, ntr-o descriere plastic i metaforic, metoda secret cea mai rapid de ascensiune n programare este metoda privirii concentrate spre vrf, cu ghidul alturi i pe crri bttorite.

  • 20

    Noiuni primare de programare n Pascal i C

    n spiritul celor spuse mai sus, vom introduce acum "ntr-un ritm alert", prin exemple concrete, noiunile elementare de programare n limbajele Pascal i C (n paralel). Vom pleca de la prezentarea structurii generale a unui program iar apoi vom trece la prezentarea celor patru structuri-

    instruciuni elementare coninute n psedo-limbajul de descriere a algoritmilor. Vom avea n plus grij de a precede descrierea fiecrei structuri elementare de liniile de declarare a tipului variabilelor implicate. Peste tot vor apare linii de comentariu (ignorate de compilator). n limbajul Pascal comentariile snt cuprinse ntre acolade {comentariu}, pe cnd n C ele snt cuprinde ntre construcia de tipul /* comentariu*/ sau apar la sfritul liniei precedate de dou slash-uri //comentariu.

    Structura unui program

    Program Nume_de_Program; {aceast linie poate s lipseasc} { Zona de declaraii constante, variabile, proceduri i funcii } BEGIN

    { Corpul programului format din instruciuni terminate cu punct-vigul ; Corpul programului poate fi privit ca o instruciune compus } END.

    (Orice se va scrie dup punct va fi ignorat de ctre compilator)

    // linii de incluziuni de fiiere header

    // declaraii de variabile i funcii externe (globale)

    void main(void){

    // declaraii de variabile locale

    // corpul programului format din instruciuni terminate cu punct-vigul ; }

    Exemplu :

    Program Un_Simplu_Test;

    Const e=2.68;

    Var x:real;

    BEGIN

    x:=1./2+e*(1+e);

    Writeln(Rezultatul este:,x); END.

    Exemplu :

    #include

    int e=2.68;

    float x;

    void main(void){

    x=1./2+e*(1+e);

    printf(Rezultatul este %f:,x); }

    Atribuirea : var:=expresie;

    Var i,j:integer;perimetrul:real;

    .. j:=2000 div 15; { mprire ntreag obligatorie } i:=i+(j-1)*Sqr(2*j+1); { Sqr (Square) funcia de ridicare la ptrat } perimetrul:=2*PI*i; { PI constant real implicit }

    #include // declar constanta M_PI int i,j; float perimetrul;

    .. j=2000 / 15; // mprire ntreag implicit !! i+=(j-1)* (2*j+1)*(2*j+1); // n C avem operatorul // de adunare + nainte de egal = ; funcia putere n // C este pow(x,y)

    perimetrul=2*M_PI*i;

    Intrare/Ieire : Citete var1, var2, var3, ; Scrie var1, var2, var3, ;

    Sau

    Scrie expresia1, expresia2, expresia3,;

    Var i,j:integer;perimetrul:real;

    .. Readln(i,j); { citirea variabilelor i i j } Perimetrul:=2*PI*i;

    Writeln(Raza=,i:4, Perimetrul=,perimetrul:6:2, Aria=, PI*Sqr(i):6:2); { perimetrul si aria fiind valori reale, se afiseaza cu

    descriptorul de format de afisare :6:2 pe 6 poziii de ecran cu rotunjit la 2 zecimale }

    #include // declar constanta M_PI int i,j; float perimetrul;

    .. scanf(%i %i,&i,&j); // %i %i este descriptorul de format de citire, & este operatorul de adresare

    perimetrul=2*M_PI *i;

    printf(Raza=%4i Perimetrul= %6.2f Aria= %6.2f,i,perimetrul,M_PI*i*i); // %6.2f descriptorul de format de afisare a unei valori

    reale(flotante) pe 6 poziii rotunjit la 2 zecimale

  • 21

    Condiionala : Dac atunci instruciune1 [altfel instruciune2];

    Var i,j,suma:integer;

    .. If i

  • 22

    End

    else Begin

    Writeln('z1=(',-b/(2*a):6:2, , , -sqrt(-delta))/(2*a):6:2, )); Writeln('z2=(', -b/(2*a):6:2, , , sqrt(-delta))/(2*a):6:2, )); End

    Readln;

    END.

    // versiunea C

    #include

    #include

    float a,b,c; // coeficientii ecuatiei de gradul II

    float delta;

    void main(){

    printf("Introd.coefic.ecuatiei a b c:");scanf("%f %f %f",&a,&b,&c);

    delta=b*b-4*a*c;

    if (delta>=0) {

    printf("Sol.reale: x1=%6.2f, x2=%6.2f",(-b+sqrt(delta))/2./a,(-b-sqrt(delta))/2./a);

    } else {

    printf("Sol.complexe: x1=(%6.2f,%6.2f), x2=(%6.2f,%6.2f)",-b/2./a,sqrt(-delta)/2./a,-b/2/a,-sqrt(-

    delta)/2./a);

    }

    }

    2. S se determine dac trei numere a,b,c reale pot reprezenta laturile unui triunghi. Dac da, s se caculeze perimetrul i aria sa.

    Descrierea algoritmului:

    - condiia necesar pentru ca trei numere s poat fi lungimile laturilor unui triunghi este ca cele trei numere s fie pozitive (condiie implicit) i suma a oricror dou dintre ele s fie mai mare dect cel de-al treilea numr - dup condiia este ndeplinit vom calcula perimetrul i aria triunghiului folosind formula lui Heron s=sqrt(p(p-a)(p-b)(p-c)) unde p=(a+b+c)/2.

    Program Laturile_Unui_Triunghi; { Pascal }

    Var a,b,c,s,p:real;

    function laturi_ok:boolean;

    begin

    laturi_ok:= (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a) ;

    end;

    BEGIN

    write('introduceti laturile');readln(a,b,c);

    IF laturi_ok then

    begin

    p:=(a+b+c)/2;

    s:=sqrt(p*(p-a)*(p-b)*(p-c));

    writeln('Aria=',s:5:2);

    writeln(Perimetrul=,2*p:5:2); end

    else writeln('Nu formeaza triunghi');

    readln;

    END.

    // versiunea C

  • 23

    #include

    #include

    float a,b,c,s,p;

    int validare_laturi(float a,float b,float c){

    return( (a>0)&&(b>0)&&(c>0)&&(a+b>c)&&(b+c>a)&&(a+c>b));

    }

    void main(void){

    printf(Introd.laturile a b c:);scanf(%f %f %f,&a,&b,&c); if (validare_laturi(a,b,c)){

    p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));

    printf(Aria=%6.2f, Perimetrul=%6.2f,s,2*p); }

    }

    3. Se citete n ntreg. S se determine suma primelor n numere naturale.

    Descrierea algoritmului:

    - vom oferi varianta n care suma primelor n numere naturale va fi calculata cu una dintre instructiunile repetitive cunoscute(for,while ,repeat) fr a apela la formula matematic cunoscut S(n)=n*(n+1)/2

    Program Suma_n; { Pascal }

    Var n,s,i:word;

    BEGIN

    Writeln(Introduceti limita n=);Readln(n); s:=0;

    For i:=1 to n do s:=s+i;

    Writeln(s=,s); Readln;

    END.

    // versiunea C

    #include

    int n,s;

    void main(void){

    printf(Introd. n:); scanf(%i,&n); for(;n>0;n--)s+=n;

    printf(S(n)=%i,s); }

    4. Se citete valoarea ntreag p. S se determine daca p este numr prim.

    Descrierea algoritmului:

    - un numr p este prim dac nu are nici un divizor nafar de 1 i p cu ajutorul unei variabile contor d

    vom parcurge toate valorile intervalului [2.. p]; acest interval este suficient pentru depistarea unui

    divizor, cci: d1 | p p = d1*d2 (unde d1 < d2) d1 d1*d2 = p iar d2 d1*d2 = p

    Program Nr_prim; { Pascal }

    Var p,i:word;

    prim:boolean;

    BEGIN

    write('p=');readln(p);

    prim:=true;

  • 24

    for i:=2 to trunc(sqrt(p)) do

    if n mod i=0 then prim:=false;

    prim:=true;

    if prim then

    write(p,' este nr prim')

    else

    write(p,' nu e nr prim');

    END.

    // versiunea C (optimizat !)

    #include

    #include

    int p,i,prim;

    void main(void){

    printf(Introd. p:); scanf(%i,&p); for(i=3, prim=p % 2; (i

  • 25

    printf("Vocale:%i, Consoane:%i, Alte car.:%i", vocale, consoane, i-vocale-consoane);

    }

  • 26

    Metoda practic de nvare ce garanteaz rezultate imediate

    Dac cele spuse mai sus cu privire la secretul nvrii rapide a programrii, acum nu ne mai rmne dect s ncepem s aplicm practic ideile prezentate. Pentru aceasta, avem la dispoziie urmtoarea metod care garanteaz cu siguran rezultate. Iat-o, pe pai:

    1. se citete i se nelege ct mai bine exemplul de problem rezolvat (se poate ncepe chiar cu primul exemplu de mai sus)

    2. se acoper (se ascunde) soluia i se ncearc reproducerea ei din memorie (reinventarea soluiei) pe calculator

    3. numai n cazuri excepionale se poate apela (se poate trage cu ochiul) la soluie

    Oricare dintre noi poate recunoate aici metoda pe care o aplic copiii din primele clase primare: metoda trasului cu ochiul la rezultatul aflat la spatele manualului sau al culegerii de probleme. Din

    moment ce metoda este verificat i garantat (am folosit-o i noi cndva), de ce ne-ar fi ruine s-o aplicm acum din nou ? Iat n continuare o list de probleme de "antrenament" care au majoritea rezolvarea ntr-unul din capitolele urmtoare. Este numai bine pentru a ncepe s aplicm metoda oferit chiar acum !

    Probleme selecionate - Enunuri

    Probleme propuse spre rezolvare (probleme de antrenament)

    1. Se citesc a, b, c trei variabile reale. S se afieze maximul i minimul celor trei numere. S se afieze cele trei numere n ordine cresctoare. S se determine dac cele trei numere pot reprezenta laturile unui triunghi. Dac da, s se

    determine dac triunghiul respectiv este isoscel, echilateral sau oarecare. S se determine dac cele trei numere pot reprezenta laturile unui triunghi. Dac da, s se

    determine mrimile unghiurilor sale i dac este ascuit-unghic sau obtuz-unghic. S se afieze media aritmetic, geometric i hiperbolic a celor trei valori.

    2. Se citete n o valoare ntreag pozitiv. S se determine dac n este divizibil cu 3 dar nu este divizibil cu 11. S se determine dac n este ptrat sau cub perfect. S se afieze primele n ptrate perfecte. S se determine numrul cuburilor perfecte mai mici dect n. S se gseasc primul numr prim mai mare dect n. S se afieze primele n numere prime: 2, 3, 5, 7,, pn. S se determine toate numerele de 4 cifre divizibile cu n. S se determine suma cifrelor lui n. S se afieze rsturnatul lui n. (Ex: n=1993 => n_rsturnat =3991). S se afieze urmtorul triunghi de numere:

    1

    1 2

    1 2 3

    .. 1 2 3 n

    3. Se citesc m, n dou variabile ntregi pozitive. S se determine toate ptratele perfecte cuprinse ntre m i n, inclusiv. S se determine toate numerele prime cuprinse ntre m i n. S se determine toate numerele de 4 cifre care se divid att cu n ct i cu m. S se determine c.m.m.d.c. al celor dou numere folosind algoritmul lui Euclid.

  • 27

    4. S se calculeze u20 , u30 , u50 ai irului cu formula recursiv un=1/12un-1+1/2un-2 pentru n>=2 i u0=1, u1=1/2.

    5. Se citete n gradul unui polinom i irul an, an-1, , a1, a0 coeficienilor unui polinom P. Se citete x, s se determine P(x). Se citesc x i y, s se determine dac polinomul P schimb de semn de la x la y. Se citete a, s se determine restul mpririi lui P la x-a.

    6. Se citesc m, n gradele a dou polinoame P i Q, i coeficienii acestora. S se determine polinomul produs R=PxQ.

    7. Se citete o propoziie (ir de caractere) terminat cu punct. S se determine cte vocale i cte consoane conine propoziia. S se afieze propoziia n ordine invers i cu literele inversate (mari cu mici). S se afieze fiecare cuvnt din propoziie pe cte o linie separat. S se afieze propoziia rezultat prin inserarea n spatele fiecrei vocale v a irului pv

    (vorbirea gineasc).

    8. Se citete m, n dimensiunea unei matrici A=(ai,j)mxn de valori reale. Se citesc l, c. S se afieze matricea obinut prin eliminarea liniei l i a coloanei c. Se citete n ntreg pozitiv, s se afieze matricea obinut prin permutarea circular a liniilor

    matricii cu n poziii. S se determine suma elementelor pe fiecare linie i coloan. S se determine numrul elementelor pozitive i negative din matrice. S se determine linia i coloana n care se afl valoarea maxim din matrice. S se determine linia care are suma elementelor maxim.

    9. Se citesc m, n, p i apoi se citesc dou matrici A=(ai,j)mxn i B=(bj,k)nxp.S se determine matricea produs C=AxB.

    10. Se citete un fiier ce conine mai multe linii de text. S se afieze linia care are lungime minim. S se afieze liniile care conin un anumit cuvnt citit n prealabil. S se creeze un fiier care are acelai coninut dar n ordine invers.

  • 28

    Probleme de examen

    1. Se citete x o valoarea real. S se determine radical(x) cu 5 zecimale exacte pe baza irului convergent xn=1/2 (xn-1+x / xn-1) cu x0>0 arbitrar ales.

    2. Se citete x o valoarea real i k un numr natural. S se determine radical de ordinul k din x cu 5 zecimale exacte pe baza irului convergent xn=1/k ( (k-1) xn-1+x / xn-1

    k-1) cu x0>0 arbitrar ales.

    3. S se determine c.m.m.m.c. a dou numere m, n citite. 4. Se citete n, s se determine toate perechile (x, y) care au cmmmc(x,y)=n. 5. Se citesc a, b, c ntregi pozitive, s se determine toate perechile ntregi (x, y) care conduc la

    egalitatea c=ax+by.

    6. Se citete n o valoare ntreag pozitiv. S se determine toate descompunerile n diferen de ptrate a lui n.

    7. S se determine toate tripletele (i, j, k) de numere naturale ce verific relaia i2+j2+k2=n unde n se citete.

    8. Se citete n, s se afieze toate numerele pitagoreice mai mici sau egale cu n. 9. Se citete n, s se determine toate numerele perfecte mai mici dect n. (Un numr este perfect dac

    este egal cu suma divizorilor si, ex. 6=1+2+3.) 10. Se citete n, s se afieze toate numerele de n cifre, formate numai cu cifrele 1 i 2 i care se divid

    cu 2n.

    11. Se citete n, s se afieze toate numerele de n cifre care adunate cu rsturnatul lor dau un ptrat perfect.

    12. Se citete n ntreg pozitiv, s se afieze n transcris n baza 2. 13. Se citete n ntreg pozitiv scris n baza 2, s se afieze n transcris n baza 10. 14. Se citete n ntreg pozitiv, s se afieze n n transcripia roman. (Ex: 1993=MCMXCIII , unde

    M=1000, D=500, C=100, L=50, X=10, V=5, I=1.)

    15. Se citete n, s se afieze descompunerea acestuia n factori primi. 16. Se citesc m, n numrtorul i numitorul unei fracii. S se simplifice aceast fracie. 17. Se citete n, s se afieze toate posibilitile de scriere a lui n ca sum de numere consecutive. 18. Se citete n i k, s se afieze n ca sum de k numere distincte.

    19. Se citete n, s se determine o alegere a semnelor + i astfel nct s avem relaia 12(n+1)

    n=0, dac ea este posibil. 20. Se citete n i irul de valori reale x1, x2, , x n-1, xn ordonat cresctor. S se determine distana

    maxim ntre dou elemente consecutive din ir. 21. Se citete n gradul unui polinom i irul xn, xn-1, , x1 soluiilor reale a unui polinom P. S se

    determine irul an, an-1, , a1, a0 coeficienilor polinomului P. 22. Se citesc dou iruri de valori reale x1, x2, , x n-1, xn i y1, y2, , y m-1, ym ordonate cresctor. S

    se afieze irul z1, z2, , z n+m-1, zn+m rezultat prin interclasarea celor dou iruri. 23. Un ir de fracii ireductibile din intervalul [0,1] cu numitorul mai mic sau egal cu n se numete ir

    Farey de ordinul n. De exemplu, irul Farey de ordinul 5 (ordonat cresctor) este: 0/1, 1/5, , 1/3, 2/5, , 3/5, 2/3, , 4/5, 1/1. S se determine irul Farey de ordinul n, cu n citit.

    24. Se citete n i S o permutare a mulimii {1, 2, , n}. S se determine numrul de inversiuni i signatura permutrii S.

    25. Se citete n i S o permutare a mulimii {1, 2, , n}. S se determine cel mai mic numr k pentru care S

    k={1, 2, , n}.

    26. Fie M={1, 3, 4, } mulimea numerelor obinute pe baza regulii R1, i a regulii R2 aplicate de un

    numr finit de ori: R1) 1M R2) Dac xM atunci y=2x+1 i z=3x+1 aparin lui M. Se citete n, s se determine dac n aparine mulimii M fr a genera toate elementele acesteia mai mici dect n.

    27. Se citete n, k i o matrice A=(ai,j) nxn ptratic. S se determine Ak.

    28. Se citete n i o matrice A=(ai,j) nxn ptratic. S se determine d determinantul matricii A. 29. Se citete n i cele n perechi (xi, yi) de coordonate a n puncte Pi n plan. S se determine care dintre

    cele n puncte poate fi centrul unui cerc acoperitor de raz minim. 30. S se determine, cu 5 zecimale exacte, rdcina ecuaiei x3+x+1=0 care exist i este unic n

    intervalul [-1,1].

    31. Se citete n i irul de valori reale x1, x2, , x n-1, xn. S se determine poziia de nceput i lungimea celui mai mare subir de numere pozitive.

    32. Se citete n, s se afieze binomul lui Newton: (x+y)n.

  • 29

    33. Se citete n, s se afieze binomul lui Newton generalizat: (x1+x2++xp)n=n!/(n1!n2!np!)

    x1n

    1x2n2xp

    np pentru n1+n2++np=n i ni>0, i=1,p.

    34. Se citete n, s se determine descompunerea lui n ca sum de numere Fibonacci distincte. (Fn=Fn-1+Fn-2 pentru n>1 i F1=1, F0=0).

    35. Avem la dispoziie urmtoarele trei operaii care se pot efectua asupra unui numr n: O1) i se adaug la sfrit cifra 4; O2) i se adaug la sfrit cifra 0; O3) dac n este par se mparte la 2. S se afieze irul operaiilor care se aplic succesiv, pornind de la 4, pentru a obine un n care se citete.

    36. Fie funcia lui Ackermann definit astfel: A(i,n)=n+1 pentru i=0; A(i,n)=A(i-1,1) pentru i>0 i n=0; A(i,n)=A(i-1,A(i,n-1)) pentru i>0 i n>0. Care este cea mai mare valoare k pentru care se poate calcula A(k,k) ?

    37. S se determine suma tuturor numerelor formate numai din cifre impare distincte. 38. Scriei o funcie recursiv pentru a determina c.m.m.d.c. a dou numere m i n. 39. Scriei o funcie recursiv pentru a calcula an pe baza relaiei an=(ak)2 pentru n=2k, i an=a(ak)2

    pentru n=2k+1.

    40. Scriei o funcie recursiv pentru a determina prezena unui numr x ntr-un ir de valori reale x1, x2, , x n-1, xn ordonate cresctor folosind algoritmul cutrii binare.

    41. Scriei o funcie recursiv pentru a determina o aezare a 8 turnuri pe o tabl de ah astfel nct s nu se atace ntre ele. (Tabla de ah va fi reprezentat printr-o matrice ptratic de 8x8).

    42. S se determine peste ci ani data de azi va cdea n aceeai zi a sptmnii. 43. Avem la dispoziie un fiier ce conine numele, prenumele i media tuturor studenilor din grup.

    S se afieze studentul cu cea mai mare medie. S se afieze toi studenii bursieri. S se afieze studentul care are media cea mai apropiat de media aritmetic a mediilor pe

    grup. S se afieze toi studenii din prima jumtate a alfabetului. S se afieze toi studenii n ordine invers dect cea din fiier. S se creeze un fiier catalog care s conin aceleai informaii n ordinea alfabetic a

    numelui.

    44. Avem la dispoziie dou fiiere ce conin numele, prenumele i media tuturor studenilor din cele dou grupe ale anului n ordinea descresctoare a mediilor. S se afieze toi studenii din ambele grupe care au media mai mare dect media anului. S se creeze prin interclasare un fiier totalizator care conine toi studenii anului n ordinea

    descresctoare a mediilor.

  • 30

    Probleme dificile

    Dup cum se poate bnui, informatica conine i ea, la fel ca matematica, o mulime de probleme foarte dificile care i ateapt nc rezolvarea. Asemnarea cu matematica ne intereseaz mai ales n privina unui aspect "capcan" asupra cruia dorim s atragem atenia aici. Enunurile problemelor dificile sau foarte dificile de informatic este, n 99% din cazuri, foarte simplu i poate fi citit i neles de orice student. Acest fapt consituie o capcan sigur pentru cei ignorani. Dac n matematic lucrurile nu stau aa, asta se datoreaz numai faptului c studiul matematicii are vechime i problemele, mpreun cu dificultile lor, snt ceva mai bine cunoscute. n informatic nu avem ns aceeai situaie. Ba chiar se ntmpl c probleme foarte dificile snt amestecate n culegerile de probleme de informatic printre probleme uoare, mai ales datorit lipsei de cultur de specialitate a autorilor. Acest capitol i propune s pun n gard n privina dificultii problemelor oferind o mic iniiere n acest domeniu (mai multe se pot afla studiind Complexitatea algoritmilor i dificultatea problemelor). Deasemeni el i propune s umple lacuna ce mai exist nc la ora actual n cultura de specialitate.

    Dificultatea problemelor de programare a cror enunuri urmeaz este considerat maxim de teoreticienii informaticii (ele se numesc probleme NP-complete). Nu v lsai pclii de faptul c le-ai ntlnit n unele culegeri de programare. Ele snt depite n dificultate doar de problemele insolvabile algoritmic ! Dar n ce const dificultatea lor ?

    Spre deosebire de matematic, dificultatea problemelor de informatic nu este dat de faptul c nu se cunoate un algoritm de rezolvare a lor, ci datorit faptului c nu se cunoate un algoritm eficient (!) de rezolvare a lor. Existena unei metode de proiectare a algoritmilor att de general valabil, cum este metoda back-tracking, face ca prea puine probleme cu care ne putem ntlni s nu aib o soluie. Dar, ntruct n cazul metodei back-tracking, cutarea soluiei se face ntr-un mod exhaustiv (se caut "peste tot", pentru ca s fim siguri c nu lsm nici o posibilitate neexplorat), durata cutrii are o cretere exponenial-proporional cu dimesiunea datelor de intrare. De exemplu, timpul de cutare

    care depinde de valoarea de intrare n poate avea o expresie de forma T(n)=c2n secunde, unde c este un factor de proporionalitate ce poate varia, s zicem, de la c=12.5 cnd algoritmul este executat pe un calculator sau c=62.8 cnd el este rulat pe un calculator de cinci ori mai performant. Dar, indiferent de

    calculator, pentru n=100 avem 2100

    =(210

    )10(103)10=1030, deci timpul msurat n secunde are ordinul de

    mrime mai mare de 30. Cea mai larg estimare pentru vrsta Universului nostru nu depete 20 mild. ani ceea ce transformat n secunde conduce la un ordin de mrime mai mic de 20. Deci, chiar i pentru valori mici ale lui n (de ordinul sutelor) am avea de ateptat pentru gsirea soluiei de 10 miliarde de ori mai mult dect a trecut de la Big Bang ncoace ! Pot fi n aceast situaie considerate astfel de programe ca rezolvri rezonabile, doar pentru c ele gsesc soluia n cazurile n care n=2, 3, 4, , 10 ? Exemplele urmtoare snt doar cteva, uor de ntlnit "din greeal", dintr-o list cunoscut ce conine la ora actual peste ase sute de astfel de probleme. Pentru fiecare din aceste probleme nu li se cunosc alte soluii dect inutilii algoritmi de gen back-tracking. n list apare des noiunea de graf, aa c o vom introduce n continuare ct mai simplu cu putin: printr-un graf se nelege o mulime de vrfuri i o mulime de muchii care unesc unele vrfuri ntre ele. Orice hart (schematizat) rutier, feroviar sau de trafic aerian reprezint desenul unui graf.

    1. Problema partiionrii sumei. Fie C un ntreg pozitiv i d1, d2, , dn o mulime de n valori ntregi pozitive. Se cere s se gseasc o partiionare a mulimii d1, d2, , dn astfel nct suma elementelor partiiei s fie exact C.

    2. Problema rucsacului. Avem un rucsac de capacitate ntreag pozitiv C i n obiecte cu dimensiunile d1, d2, , dn i avnd asociate profiturile p1, p2, , pn (n caz c ajung n rucsac). Se cere s se determine profitul maxim ce se poate obine prin ncrcarea rucsacului (fr ai depi capacitatea).

    3. Problema colorrii grafului. S se determine numrul minim de culori (numrul cromatic) necesar pentru colorarea unui graf astfel nct oricare dou vrfuri unite printr-o muchie (adiacente) s aib culori diferite.

    4. Problema mpachetrii. Presupunnd c dispunem de un numr suficient de mare de cutii fiecare avnd capacitatea 1 i n obiecte cu dimensiunile d1, d2, , dn, cu 0

  • 31

    Majoritatea acestor probleme apar ca probleme centrale la care se reduc n ultim instan problemele concrete ale unor domenii capitale ale economiei i industriei, cum snt de exemplu planificarea investiiile, planificarea mprumuturilor i ealonarea plii dobnzilor, alocarea i distribuirea resurselor primare (mai ales financiare), etc. Pentru nici una din aceste probleme strategice

    nu se cunoate un algoritm optim de rezolvare, ci doar soluii aproximative. Dac s-ar cunoate algoritmii de soluionare optim atunci majoritatea sectoarelor i proceselor macro- i micro-economice ar putea fi conduse n timp real i optim (!!) cu calculatorul, fr a mai fi necesar prezena uman. Un exemplu cert de domeniu care s-a dezvoltat extraordinar i n care rolul soft-ului a fost esenial este chiar domeniul construciei de calculatoare, mai