Navigare
Mental jogging
Am citit de prea multe ori că arhitecturile n-tier promovează scalabilitatea — de suficient de multe ori încât, în subconştient, am ajuns să identific n-tier-ul cu scalabilitatea. Şi am demarat câteva proiecte ignorând cu bună ştiinţă o arhitectură sănătoasă considerând nu mi-ar putea aduce -decât- scalabilitate.
A trebuit să revin asupra arhitecturii sistemului şi, încet încet, constrâns de presiuni imediate, să reinventez roata. Acest articol se vrea "episodul pilot" dintr-un serial mai lung, despre aventurile şi experimentele mele şi ale colegului meu in. Ca în orice serial - o să aveţi parte de momente mai înteresante şi de clipe de somnolenţă: vor fi episoade despre utilizarea claselor proprii în locul TypedDataSet-urilor, despre suportul pentru valori DBNull NullableTypes , despre DataBinding-ul pe obiecte în contrast cu binding-ul pe DataSet-uri , despre regulile noastre de design a unei interfeţe grafice Windows Forms, despre generarea de cod cu CodeSmith, despre ORM si DataLayere, despre arhitectura unui Business Layer modular Nu vă entuziasmaţi - nu sunt soluţii garantate, gata de a fi incluse în aplicaţiile voastre - nu e un framework care să vă rezolve toate problemele - e doar povestea unor programatori cu şefi cumsecade şi prea mult timp liber la dispoziţie.
Regulile de validare. Din păcate, validările înseamnă în cele mai multe cazuri cod suficient de monoton şi neinteresant, cu care nu prea îmi vine să-mi încep ziua Aşs că de multe ori nu am acordat suficientă atenţie validărilor. Din păcate însă, utilizatorii nu duc niciodată lipsă de imaginaţie. Şi e de-a dreptul bizar modul în care o întreagă aplicaţie de salarii poate să ruleze, fără să ridice nici o excepţie, calculând dările către stat pentru un salariu negativ.
Şi la fel de bizar este şi telefonul operatorului de la bancă care iţi spune că sistemul lor îţi refuză în intregime viramentul salariilor pe carduri pentru că nu reuşeşte să plătească o sumă negativă Heh - urmează să explici cum stă treaba cu validările celor o mie de salariaţi indignaţi că nu şi-au primit salariile pe data de Mi-am pus la punct destul de repede un user control derivat din TextBox l-am botezat NumericBox — care permite doar introducerea cifrelor şi verifică dacă valoarea introdusă se încadrează între două proprietăţi Minim şi Maxim.
Au urmat controale de validare a textelor cu regular expressions RegExBox , de introducere a datelor calendaristice DateBox , ba chiar de introducere a intervalelor de timp la care — deh - e musai ca DataFinală să fie ulterioară DateiIniţiale!
Unele din aceste controale conţin cod trivial : spre exemplu, NameBox-urile — care sunt folosite pentru a introduce numele, prenumele, funcţia sau compartimntul — nu sunt alteceva decât nişte simple TextBox-uri care au grijă să înlăture automat spaţiile trim şi să transforme textul introdus în majusculă iniţială. Alte controale însă înglobează cod mai puţin trivial ; spre exemplu, controlul de editare al codului numeric personal codul de 13 cifre, din buletin.
CNPBox-ul este derivat dintr-un NumericBox pentru a permite doar introducerea cifrelor , însă are o condiţie caracteristică mai curând textelor lungimea de exact 13 caractere ; primul caracter poate fi doar 1,2,5 sau 6, urmatoarele 6 caractere trebuie să reprezinte o dată validă data naşterii in format an luna zi şi, cel mai important, ultima cifră este o cifră de control care trebuie verificată cu formula ….
Substring 12,1 throw new ValidationException "Codul numeric personal nu este corect! Îmi era destul de uşor să pun repede pe picioare un ecran de introducere de date destul de bine validat — tot ce trebuia făcut era să aleg controalele potrivite din ToolBox, să configurez corect câteva proprietăţi gen Minim si Maxim, sau un regular expression şi eventual să mai scriu câte un rând-două pe evenimentul de Validate pentru a acoperi cazurile cu adevărat particulare.
Exprimarea regulilor de validare în atâtea forme diferite îţi poate crea dificultăţi cănd trebuie să asiguri consistenţă între mai multe formuri de editare. Lucrurile se complică mult mai tare în cazul ecranelor master-details. Spre exemplu, salariatul poate avea mai mulţi copii în întreţinere pentru a beneficia în felul ăsta de oarece deduceri din impozit.
Pentru fiecare copil trebuie introdus codul numeric personal — şi validarea CNP-ului în cazul ăsta e destul de importantă, pentru că CNP-urile incorecte sunt refuzate de aplicaţiile de la administraţia financiară. În plus, pentru fiecare copil trebuie introdusă şi validată perioada în care a fost în întreţinere DataIniţială şi DataFinală. Pentru implementarea regulilor de validare la nivelul detaliilor suntem constrânşi deci să folosim aceleaşi controale de validare ne trebuie musai acel CNPBox ….
Prin urmare, avem nevoie de un grid care să accepte să editeze datele suprapunând controalele noastre custom ba chiar să suporte controale multi-coloană, precum controlul de editare al unui interval de timp.
Cerinţele astea sunt suficient de exigente încât să scoată din discuţie o bună parte din gridurile de pe piaţă. E drept, există şi câteva modalităţi de a ocoli gridurile - spre exemplu, putem folosi o listă read-only pentru a alege rândul curent urmând ca editarea să fie făcută intr-un form separat ce se deschide cu dublu-click sau într-un grup de controale poziţionate undeva sub lista de selecţie.
Toate aceste soluţii însă pierd ceva din ergonomia şi simplitatea unui grid şi — trebuie să recunoaştem - ridică oarece întrebări asupra modului în care se poate face editarea şi validarea detaliilor. La o privire mai atentă, cazurile documentelor master-details se dovedesc destul de frecvente - probabil cel mai comun exemplu fiind editarea unei facturi.
Soluţia evidentă — vom salva antetul şi detaliile în cadrul unei tranzacţii. Există însă un amănunt important de care va trebui să ţinem cont ori de câte ori lucrăm cu tranzacţii: tranzacţiile se bazează pe lock-uri — iar lock-urile pot produce efecte neplăcute dacă sunt folosite incorect. Pentru a reduce riscul conflictelor, al timpilor de aşteptare pentru eliberarea unui lock sau al dead-lock-urilor, e foarte important ca o tranzacţie să dureze căt mai puţin.
Sub nici o formă nu ne putem permite să deschidem o tranzacţie în clipa în care utilizatorul începe editarea facturii, să o ţinem deschisă pe toată durata completării datelor şi să o comitem abia la apăsarea butonului de Save. Ca orice acţiune a userului, editarea unei facturi ar putea dura oricât între 30 de secunde şi 30 de minute.
Asta dacă nu luăm în calcul cazul utilizatorilor care îşi lasă seara programele deschise pentru a ştii ce au de făcut a doua zi de dimineaţă Soluţia e simplă — vom face editarea facturii în memorie, urmând să deschidem tranzacţia abia în clipa apăsării butonului de Save.
În acest scop vom folosi un Dataset sau mai precis un TypedDataset în care vom defini cele două tabele — antetul şi detaliile. Posibilitatea definirii unor documente multi-tabelă e unul din lucrurile care mi-au plăcut cel mai tare la primul contact cu Ado. Net — şi în continuare găsesc mult mai potrivit genul ăsta de utilizare a DataSet-urilor decât încercările de a aduce întreaga bază de date în memorie in DataSet-uri cu zeci de tabele şi mii de rânduri.
Pentru rândurile facturii însă, aşa cum am amintit şi mai sus — există mai multe variante: putem folosi un DataGrid editabil, un repeater sau o listă read-only sincronizată cu un form sau un grup de controale pentru editarea rândului curent. Indiferent de varianta eleasă — avem de implementat câteva calcule simple: la orice modificare a cantităţii sau a preţului, va trebui să recalculăm şi să afişăm valoarea, tva-ul şi totalul răndului curent şi să actualizăm totalurile facturii.
Şi pentru acest lucru există câteva variante, destul de diferite ca abordare: · Putem să ne folosim de evenimentele Validate ale controalelor de editare pentru a iniţia recalcularea.
Din păcate, pentru cazul în care facem editarea detaliilor cu un grid standard, nu avem la dispoziţie decât evenimentul CellChange — care e destul de limitat.
Pe de altă parte, controlul de editare din repeater şi form-ul separat de editare au acces direct doar la rândul curent şi vor avea mici probleme încercând să actualizeze totalurile facturii. Deşi la prima vedere foarte elegantă, această metodă are limitările ei: editorul de formule nu este prea comod, expresiile pot fi verificate doar la run-time, procesul de debug e mai dificil, se complică puţin încărcarea şi salvarea dataset-ului în baza de date — şi, nu în ultimul rănd, datorită lipsei unor CallBack-uri, suntem limitaţi la posibilităţile de exprimare ale expresiilor.
If-urile şi DBNull-urile au darul de a complica destul de tare expresiile — imaginaţi-vă însă că ar trebui să putem implementa şi discount-uri a căror valoare variază în funcţie de cantitate Chiar dacă evenimentele tabelelor nu sunt direct accesibile din property grid ca evenimentele controalelor , e foarte simplu să definim un handler al acestor evenimente direct din cod : this. Indiferent dacă folosim un super-grid, un repeater sau un form separat de editare, calculele funcţionează în acelaşi mod.
Nu mai suntem constrânşi să folosim un anumit grid comercial sau să explicăm userilor de ce e mai bine să editeze fiecare rănd într-o fereastră dialog deschisă cu dublu click.
În plus, logica de calcul poate fi oricât de complicată nu mai suntem limitaţi de expresii. Folosirea evenimentelor DataSet-urilor va fi mult încurajată şi de Partial Classes din Visual Studio ; cu partial classes, vom putea scrie codul asociat evenimentelor într-un fişier separat de fişierul TypedDataset-ului generat de IDE — ambele fişiere însă vor fi compilate împreună în aceaşi clasă.
TypedDataset-ul, având acum codul de calcul asociat, poate fi folosit în mai multe formuri am putea defini spre exemplu un wizard simplificat de emitere a facturilor şi un ecran avansat care să permită editarea facturilor cu discount — ambele bazate pe acelaşi dataset care implementează singur calculele. Chiar dacă în Visual Studio nu putem folosi partial classes, avem totuşi o modalitate de a lega codul de calcul de un TypedDataset: putem deriva din TypedDataSet. Ce-i drept, un pic cam mult cod pentru a face calculul unei facturi.
Ideea însă poate fi tentantă, pentru că am putea implementa şi codul de validare tot la nivelul DataSet-ului. Vă mai aduceţi aminte?
Am putea însă muta întreg codul de validare de la nivelul controalelor de editare în nişte funcţii dintr-o bibliotecă de validare. Putem apela apoi aceste funcţii din evenimentele DataTable-ului pentru a asigura validarea datelor din detalii. Asta ne-ar putea aduce independenţă totală de controalele de editare — indiferent de soluţia de editare aleasă, vom avea şi calcule şi validări.
Şi totuşi Tocmai am ajuns la concluzia că ne-ar prinde foarte bine un TypedDataSet care să aibă incorporat cod de calcul şi de validare. Avem deci nevoie de date împachetate la un loc cu cod de manipulare al acelor date. Aşa este. Am ajuns la definiţia claselor potrivit OOP. De remarcat însă - clasele permit scenarii mult mai elegante de acomodare a codului decât ne pot oferi evenimentele DataSet-ului. Am putea scrie codul necesar pe property set-uri — nu am mai fi obligaţi să scriem codul de calcul şi de validare al tuturor coloanelor unui tabel înghesuit într-un singur handler de eveniment ColumnChanged.
Oare ar trebui să înlocuim TypedDataSet-ul cu o clasă definită de noi în întregime? Dat fiind că acest cod va rula în interfaţa cu utilizatorul nu e cazul să imi fac probleme de performanţă din cauza apelurilor repetate e vorba de milisecunde aici — prefer însă această abordare pentru că este mult mai simplă şi mai explicită - chestiune care poate să conteze în cazul unor calcule mai complicate.
E o chestiune de gust — ceea ce contează însă e că ambele variante sunt suportate la fel de bine de clase definite de utilizator. Un punct în plus pentru propriile noastre clase în faţa DataSet-urilor. Net pentru.. Sună a blasfemie. Sunt momente când mă simt norocos. Momente când o idee nouă capătă suficientă forţă încât imi demolează complet modul de gândire - îmi schimbă radical viziunea asupra unui domeniu. Pentru mulţi prima revelaţie vine odată cu abecedarul.
Momentul când literele încetează să mai fie doar litere şi se unesc brusc în cuvinte şi propoziţii. Momentul când realizează că ştiu să citească. Eu unul nu mai ţin minte absolut nimic de atunci. Probabil totul a fost altfel pentru mine - cititul a venit greu, gradual, literă cu literă, cuvânt cu cuvânt.
Suficient de încet încât să nu mă surprindă şi să se piardă în cotidian. Singurul lucru pe care mi-l aduc aminte din perioada aia e ziua când am învăţat să-mi cumpăr singur ştrudele cu mere de la patiseria din colţ. Aia da revelaţie! Ca programator, prima revelaţie m-a lovit destul de târziu. Toate astea au venit treptat, fără să mă surprindă nu fără entuziasmul de moment însă.
Mă chinuiam în Fox 2. Şi într-o zi am dat cu nasul de Select SQL prin help. SQL-ul a fost prima mea revelaţie în programare.
Algoritmul definea un proces pe care îl puteam urmări mental, pe care îl puteam calcula şi fără computer, cu pixul pe hârtie. Îmi trebuia o sumă de salarii? Trebuia să "instruiesc" calculatorul să parcurgă tabela salariaţilor rând cu rând, cumulând într-o variabilă salariul din rândul curent. Nu mai trebuia să spun CUM. Era suficient să spun CE vreau. În plus, calculul mergea de câteva mii de ori mai repede La scară personală, şocul a fost probabil comparabil cu efectul teoriei Relativităţii pentru fizica începutului de secol Suficient cât să devină o obsesie.
Au trecut ani buni şi încă mai sunt marcat de descoperirea SQL-ului. Fie că am lucrat în Access, Visual Basic sau C , am gândit întotdeauna schema bazelor de date mai întâi. Nu uita, pentru calcule există SQL! Orice ai face, nu vei putea bate SQL Server-ul! Ei bine, răul ăsta de înălţime a fost primul lucru pe care l-am simţit cănd mi-am pus problema înlocuirii DataSet-urilor cu propriile mele clase.
Aveam în minte imaginea întregii baze de date încărcate în memorie sub formă unor colecţii de obiecte — vedeam bucle while care enumerau mii de obiecte salariat încercând să facă totaluri. Nici un fel de clasă nu m-ar putea convinge să mă întoarc din nou la Algoritm.
Apoi am realizat că şi DataSet-ul e tot o banală clasă. Şi că folosisem de ceva vreme destule clase în codul de acces la baza de date — fie că erau RecordSet-uri din Ado fie că erau DataReadere sau DataSet-uri în Ado.
Am lucrat atâta timp cu Ado. Net-ul cu obiecte deci , fără să încerc să încarc în memorie toţi salariaţii şi să enumăr toate rândurile dintr-un tabel pentru a calcula o amărâtă de sumă. Pentru astfel de cazuri, am folosit întotdeauna interogările directe SQL.
Am folosit întotdeauna câte o instanţă de DataSet pentru a putea edita un document o factură spre exemplu — aş putea folosi exact aceeaşi abordare şi cu propriile mele clase. Nu e o problemă de politică, nu e un război sfânt între Ado. Net şi clasele mele. Înlocuirea DataSet-urilor nu ar trebui să impună modificări majore în arhitectura generală a aplicaţiei — ar trebui doar să ofere suport mai bun pentru construirea unor interfeţe cu utilizatorul.
Ar trebui să ofere o soluţie elegantă pentru calculele şi validările facturilor mele. Recapitulare Ce ar putea aduce clasele noastre? Putem utiliza acelaşi document factură spre exemplu în mai multe formuri sau clase : putem implementa wizarduri sau ecrane detaliate de editare, sau putem scrie chiar cod de import al unor facturi din fişiere externe care să folosească aceleaşi obiecte factură, cu aceleaşi validări ca în cazul introducerii datelor de către utilizator.
Toate argumentele validărilor sunt valabile şi aici — în plus, clasele definite de noi aduc posibilităţi noi de exprimare precum calcule implementate prin query-uri, în proprietăţi read-only. Încă un termen banalizat de utilizare excesivă — moştenirea poate fi însă un intrument foarte util pentru implementarea documentelor noastre. Spre exemplu, clientul ne poate cere să implementăm pe lângă facturile de vânzare de produse şi facturi de prestări servicii pe bază de abonament cum ar fi service-ul.
Validările şi calculele sunt aproape identice în cezul facturilor de service cu cele din cazul facturilor de vânzare de mărfuri — va trebui însă să ţinem cont de perioada abonamentului şi de datele din contractul de service.
Folosind TypedDataSet-uri, am crea structuri paralele de date pentru facturile de marfuri şi facturile de servicii şi ar trebui să folosim nişte construcţii arficiale pentru a limita repetarea codului de validare şi de calcul. Moştenirea vine ca o soluţie naturală în acest caz din pacate genul ăsta de reutilizare a codului nu este aplicabilă şi la dataset-uri. Iar dacă facturile de prestări servicii pe bază de abonament nu par a fi un caz suficient de des întâlnit — gânditi-vă la facturile de cumpărare în comparaţie cu cele de vânzare; aproape toate aplicaţiile mele au de a face în aceeaşi măsură cu facturile de vânzare şi cu cele de cumpărare — iar structurile sunt aproape identice.
Într-un mod similaral cu felul în care am construit interfaţa cu utilizatorul pentru editarea salariatului din componente precum NameBox, DateBox şi CNPBox, putem modela documentele noastre folosind clase tipuri definite în prealabil. Definiţia DataSet-urilor acceptă doar tipuri de bază precum int sau string şi asta a determinat externalizarea codului de validare în controale. Propria noatră clasă salariat însă ar putea fi compusă din proprietăţi de tipul Name sau CodNumericPersonal — tipuri care implementează automat validarea datelor.
Un alt exemplu — definirea unei adrese la nivelul salariatului. Dataset-urile ne constrâng să definim câmpurile de Localitate, Stradă, Număr, Bloc, Scară, Etaj în aceeaşi tabelă cu numele şi prenumele salariatului. Am folosit această tehnică pentru a putea avea o mai bună compatibilitate cu DataBinding-ul şi cu controalele de editare de tip Textbox, care nu suportă tipuri custom. Codul de mai sus funcţionează dacă în clasa CodNumericPersonal am definit operatori de cast implicit de la şi către string : public class CodNumericPersonal { …… public static implicit operator String CodNumericPersonal dinCod { return dinCod.
Mutarea codului de validare şi calcul din controale şi formuri în clase proprii, alături de date, oferă şi avantaje neaşteptate: codul devine mult mai uşor de testat — ba chiar se pretează la unit testing. Putem scrie mici bucăţi de cod care să verifice comportarea codului pentru doua trei scenarii tipice spre exemplu, putem testa care este valoarea facturii în cazul în care nu există nici un rând sau daca sunt actualizate corect totalurile facturii în urma ştergerii unui rând.
Care sunt totuşi dezavantajele renunţării la DataSet-uri? Probabil motivul principal pentru care DataSet-urile sunt atât de tentante este integrarea foarte bună cu IDE-ul: e suficient să facem drag and drop cu un tabel din baza de date în designerul TypedDataSet-urilor şi mediul va genera cod pentru tabelul respectiv.
Pentru a nu ceda nervos de câte ori vom începe să scriem codul pentru un tabel nou, va trebui să găsim o modalitate de generare a codului propriilor noastre clase. Personal, m-am îndrăgostit de CodeSmith — un generator de cod free, bazat pe template-uri, având o sintaxă identică cu cea din Asp.
Net, şi care se integrează şi el destul de bine în IDE. Există însă multe alte soluţii de generare sau modelare vizuală a codului. Dataset-urile oferă un suport minimal aş spune eu puţin cam incomod pentru valorile null din baza de date. Ca posibile soluţii vom evalua System. SqlTypes şi o bibliotecă open source numită NullableTypes. Aştept cu interes şi suportul pentru DBNull promis de. Deşi databinding-ul windows forms în. Net 1. Situaţia se pare că a fost luată în consideraţie mai atent în.
DataSet-urile au un suport decent din partea infrastructurii Ado. Net pentru încărcarea din baza de date şi pentru salvarea datelor. Nici măcar în cazul DataSet-urilor nu sunt acoperite însă toate scenariile spre exemplu, salvarea corectă a unui dataset master-details cu cheie primară de tip Identity se poate dovedi o adevărată aventură — vezi Q Pentru a încărca însă obiectele noastre cu date va trebui să analizăm posibilităţile oferite de Ado.
Net şi de către biblioteci ORM precum Nhibernate. Aşadar, toate aceste neajunsuri îşi au soluţiile lor. Vom analiza în amănunt în episoadele viitoare fiecare din aceste probleme şi modalităţile de rezolvare disponibile. Cert e că există motive suficiente pentru a decupla logica programului de formurile şi controalele de editare. Implementarea documentelor prin clase proprii, deşi necesită ceva mai mult efort iniţial, se dovedeşte a fi o soluţie flexibilă, capabilă să suporte într-un mod natural şi elegant mult mai multe scenarii decât poate acomoda un TypedDataset.
În plus, vom câştiga claritate, mentenabilitate şi compatibilitate cu unit testing. Şi mai presus de toate, s-ar putea să câştigăm şi ceva … scalabilitate. Ziua unui programator - de la entuziasm la deprimare Am terminat toate mailurile de citit. Si cafeaua de baut. Nici macar pe cele doua-trei forumuri pe care le monitorizez nu se mai intampla nimic. Asa ca pana la urma, tot va trebui sa incep sa lucrez. Si totusi Acum mi-e clar ce am de facut pentru noul feature cerut de client.
Ma apuc furibund de batut in tastatura ca la fasole. Ideeile vin ceva mai repede decat reusesc sa debitez garla asta de property get si set-uri E clar, imi trebuie inca o clasa. Deschid un fisier nou si incep sa schitez noua clasa.
Probabil aici o sa-mi trebuiasca ceva configurari.. Notez in todo list.. Iar bucata asta de cod va trebui revizuita. Nu mi-e prea clar daca o sa ruleze din prima.. O sa trebuiasca sa-mi aduc aminte sa mai revin peste asta o data Poate ar trebui sa imi pun un warning. Asta a fost. Una, doua, cinci.. Litere mancate, linii ramase neterminate. O paranteza lipsa. Nimic grav. Aplicatia porneste. Si ce daca? Am uitat sa adaug noul form in menu.
Deschid nerabdator formul proaspat inca arata cam "deranjat". Introduc cateva date la intamplare in textbox-urile required. Apas OK Save pentru a salva in baza de date.. Stop debugging. O mica corectie. F5 din nou. Deschid formul. Introduc datele la intamplare oare or fi la fel ca mai devreme?
Ok Save Aici ar mai fi trebuit pus un if pentru cazul asta special Introduc datele la intamplare pe cine pacalesc? Ok save Introduc datele mecanic. OK save.. Lumea sa prabuseste in jurul meu. Ce o mai fi si de data asta? Mi-e somn. Si greata. Simt ca ma paste o depresie. Urasc tasta F5. Si croncanitul hardului in timp ce face building. Si mesajul ala urta de eroare. Oare o mai fi venit ceva pe Gmail?
Asa arăta o zi de lucru pentru mine - de la entuziasm la depresie. Am avut intotdeauna dificultati in a pastra un ritm sustinut intr-o activitate si am toata admiratia pentru cei care reusesc sa faca asta fara un efort deosebit. Pentru mine insa lucrurile nu's chiar roze - ma plictisesc repede, si imi pierd energia.
Pentru mine un ritm sustinut de lucru cere eforturi supraomenesti. Si o multime de dulciuri sau alte chestii rontzaibile chestie foarte usor de constatat dealtfel. Un ritm constant necesita muzica potrivita. Si cat mai putine lucruri descurajante. Sau deprimante. Precum sedintele lungi de debugging. Chestiile astea ma ingroapa.
Daca toti programatorii ar iubi la fel de tare ca mine sesinile de debugging probabil ca bransa asta ar fi pe cale de disparitie - am avea toti ori tendinte suicidale, ori de ucigas in serie. Secventele astea de Run - introducere date - Bang error sunt inumane. Si le gasesc cu atat mai enervante cu cat vin din VB6 unde obisnuiam sa modific codul, sa dau "instruction pointerul" cu doua linii mai sus si sa probez imediat modificarea.
Dar nu, in Visual Studio nu se mai accepta astfel de gesturi de hobbist. VS-ul e "Proffesional" - si profesionistii dat cod impecabil din prima.
Sau trebuie sa opresca sesiunea de debugging , sa modifice codul, sa dea iar F5, sa priveasca iarasi rabdatori mesajele cu building In timp insa, am uitat de cat de placut era sa faci Edit and Continue stiu, o sa-mi aduc aminte iar in VS Trecerea de la "Edit and Coninue" la "Restart and Pray" era pe cale sa ma determine sa ma apuc de fumat.
Insa am scapat la limita. Ce ma enerva atat de tare? Pierdeam mult prea mult timp incercand sa reproduc contextul in care aparea eroarea. Imi lua prea mult sa aleg optiuni de menu-uri, sa completez zece textbox-uri pe ecran inainte sa pot da iarasi "salveaza in baza de date" ca sa-mi ajunga iarasi executia la breakpoint-ul care ma interesa.
In plus, toata rutina asta cu introducerea acelorasi date in textbox-uri e teribil de monotona - iar eu urasc lucrurile monotone si repetitive.
Chinul de a introduce mereu aceleasi valori in textbox-uri mi-a adus aminte de anii de bajbaiala de prin liceu, cand ma luptam cu cine stie ce algoritm de drum optim Lucram in C. Si aveam aceeasi problema enervanta - trebuia sa introduc iar si iar aceeasi parametrii de intrare si sa examinez de fiecare data rezultatele asta cand nu reuseam sa resetez calculatorul din cauza vreunui pointer neinitializat.
Pentru programasele mele scrise in liceu in C aplicatii de DOS gasisem insa o metoda foarte practica de a scapa de calvarul datelor de intrare: scriam intr-un fisier text toate valorile de intrare, despartite prin cate un Enter.
Apoi redirectam console input-ul spre fisierul asta. Pentru redirectare era suficienta o singura linie de cod - toate scanf-urile alea incepeau sa citeasca din fisier in loc sa astepte input de la tastatura - iar eu scapam de toata corvoada introducerii repetate a datelor de intrare. Stiu, nu-i nimic special in treaba asta - probabil si voi ati folosit sistemul redirectarea consolei.
In VS , cand mi-am dat seama ca trebuie sa restartez aplicatia de prea multe ori si sa introduc de fiecare data nishte valori in textbox-uri Asa ca am pus un buton pe form.
La fiecare pornire a programului - trebuia sa caut formul in cauza prin menu-ul aplicatiei, sa-l deschid si sa apas pe butonul de test si toate campurile se comletau cuminti cu nishte valori. Evident, dupa ce rezolvam bug-ul, stergeam butonul care nu trebuia sa ajunga la client Mi s-a intamplat de cateva ori insa sa revin dupa o zi-doua la acelasi form - cu un alt bug evident, mai modificasem cate ceva si pocnise iarasi Si uite asa am inceput sa regret repede butoanele sterse..
In scurt timp am ajuns sa nu mai sterg butoanele cu pricina si codul atasat lor - ci doar sa le pun proprietatea visible pe false. Cand aveam nevoie de ele - era suficient sa le pun visible inapoi pe true. Rezolvam bug-ul - inapoi cu visible false. M-am gandit sa folosesc in locul unui buton obisnuit un control derivat din button dar care sa-si seteze singur proprietatea visible in functie de modul in care se compila aplicatia in Debug sau in Release sau in functie de vreo variabila statica de la nivelul aplicatiei.
Pentru unele formuri mai pretentioase, m-am gandit ca mi-ar putea prinde bine chiar butoane pentru a acoperi doua-trei seturi de valori diferite.
Sau poate ca ar fi trebuit sa folosesc in loc de buton un combobox din care sa pot alege setul de date? Dar intre timp - pentru ca nu mai pierdeam timp cu introducerea datelor in textbox-uri - a inceput sa ma sacaie succesiunea de click-uri prin menu-ul aplicatiei si pe butoane de test pe care trebuia sa le dau pentru a deschide formul pentru care faceam debugging.
Imediat formul trece in Run mode, si-l poti proba si apasa pe toate butonasele - se comporta exact cum se va comporta in fata utilizatorului. Imi trebuia o modalitate de a porni direct un form, evitand menu-ul aplicatiei si alte formuri intermediare. Solutia - mai intai am incercat sa schimb form-ul de start-up al aplicatiei.
Trebuia insa de fiecare data sa repun lucrurile la loc dupa ce rezolvam bug-ul. Pana la urma mi-a fost mai simplu ca in solution-ul curent sa adaug un alt proiect, cu o referinta la proiectul principal.
Puteam modifica de oricate ori vroiam functia main a acestei aplicatii auxiliare aplicatie de test - pentru ca asta oricum nu ajungea la client si nu prea conta in ce stadiu ramanea functia ei main. De cate ori era nevoie sa mai rezolv un form marcam proiectul de test ca Start-up project si in functia lui main, apelam formul care facea probleme. Adio splash screen-uri pe care trebuia sa le vad de sute de ori, adio menu-uri.
Formul vinovat pornea direct la F5. Un singur lucru mai ramanea de facut - sa apas butonul de test de pe el pentru a completa automat textbox-urile cu valorile predefinite. Si sa dau OK save sa vad daca mai obtin vreo eroare. Cu conditia ca aceste functii sa fie publice. Sau sa folosesc reflection pentru ca poti apela functii private folosind reflection.
Acest header permite realizarea afişării pe monitor. Programul conţine o singură funcţie, funcţia principală , numită main , al cărui antet linia 2 indică:. Funcţiile comunică între ele prin argumente. Aceste argumente reprezintă datele de intrare ale funcţiei.
În cazul nostru, nu avem nici un argument în acea listă, deci puteam să scriem antetul funcţiei şi astfel:.
Comentariul poate con ţine un text explicativ; informaţii lămuritoare la anumite aspecte ale problemei sau observaţii. Introducerea comentariilor în programele sursă uşurează înţelegerea acestora.
În general, se recomandă introducerea unor comentarii după antetul unei funcţiei, pentru a preciza prelucrările efectuate în funcţie, anumite limite impuse datelor de intrare, etc. Cele doua paranteze se ataseaza oricarei functii.
Intre ele se scriu optional anumiti parametri in acest caz lipsesc O functie poate intoarce un rezultat. Daca nu intoarce nici un rezultat spunem ca tipul rezultatului este void.
Exista functii cu rezultat de tip real, intreg etc. De asemenea, programul poate contine si declaratii de variabile globale - adica variabile cu care pot lucra toate functiile care il alcatuiesc. Instructiunile care pot aparea sunt fie expresii fie implementari ale structurilor de control ca if, for, while etc. Corpul funcţiei linia 5 este format dintr-o singură instrucţiune, care implementează o operaţie de scriere.
Folosite astfel, se deschide un canal de comunicaţie a datelor către dispozitivul de ieşire, în cazul acesta, monitorul.
După operator se specifică informaţiile care vor fi afişate în acest exemplu, un şir de caractere constant. Faptul că este un şir constant de caractere este indicat de ghilimelele care îl încadrează.
La sfârşitul instrucţiunii care implementează operaţia de scriere, apare ;. Etapele rezolvării unei probleme cu ajutorul calculatorului. Să detaliem în continuare etapa de implementare. După analiza problemei şi stabilirea algoritmului, acesta trebuie tradus implementat într-un limbaj de programare.
Programele sursă sunt fişiere text care conţin instrucţiuni cu sintactica şi semantica proprii limbajului utilizat. Programul fişierul sursă este creat cu ajutorul unui editor de texte şi va fi salvat pe disc programele sursă C primesc, de obicei, extensia. Pentru a putea fi executat, programul sursă trebuie compilat şi linkeditat. Procesul de compilare este realizat cu ajutorul compilatorului, care translatează codul sursă în cod obiect cod maşină , pentru ca programul să poată fi înţeles de calculator.
În cazul limbajului C, în prima fază a compilării este invocat preprocesorul. Acesta recunoaşte şi analizează mai întâi o serie de instrucţiuni speciale, numite directive procesor. Verifică apoi codul sursă pentru a constata dacă acesta respectă sintaxa şi semantica limbajului. Dacă există erori, acestea sunt semnalate utilizatorului. Utilizatorul trebuie să corecteze erorile modificând programul sursă.
Abia apoi codul sursă este translatat în cod de asamblare, iar în final, în cod maşină, binar, propriu calculatorului. Acest cod binar este numit cod obiect şi de obicei este memorat într-un alt fişier, numit fişier obiect.
Fişierul obiect va avea, de obicei, acelaşi nume cu fişierul sursă şi extensia. Dupa ce programul sursă a fost translatat în program obiect, el este va fi supus operaţiei de linkeditare. Scopul fazei de linkeditare este acela de a obţine o formă finală a programului, în vederea execuţiei acestuia.
Lansarea în execuţie constă în încărcarea programului executabil în memorie şi startarea execuţiei sale. Dacă nu se utilizează un mediu integrat, programatorul va apela în mod explicit în linie de comandă un editor de texte, compilatorul, linkeditorul.
Lansarea în execuţie se va face tot din linie de comandă. In prima faza a etapei de compilare este apelat preprocesorul C. Acesta va trata o serie de directive speciale numite directive preprocesor pe care le gaseste in fisierul sursa. O directiva preprocesor incepe cu simbolul Directivele preprocesor se folosesc in urmatoarele situatii:. Includerea fisierelor header in codul sursa. Exemplu: directiva include :. Când procesorul întâlneşte această linie, datorită simbolului , o recunoaşte ca fiind o directivă preprocesor , localizează fişierul header indicat.
Programatorul isi poate crea propriile fisiere header caz in care acesta va fi incadrat intre " ". Preprocesorul va căuta să localizeze acest fişier în directorul curent de lucru al utilizatorului. În cazul în care fişierul header nu se află în directorul curent, se va indica şi calea către acesta. Asignarea unor nume simbolice pentru constante. De exemplu: define PI 3. In locurile in care in codul sursa apar numele constantelor simbolice carora li s-a asignat o valoare printr-o directiva define in mod automat numele constantei este inlocuit prin valoarea acestora.
Unitatile lexicale , numite si lexeme engl. Acestea sunt simboluri, formate din unul sau mai multe caractere, care au o anumita semnificatie in limbaj. Dupa rolul indeplinit, unitatile lexicale sunt:. Identificatori Numele date programelor sau componentelor acestora clase, variabile, functii etc. Identificatorii se aleg de catre programator, respectand anumite reguli.
Lungimea identificatorului nu prezinta importanta, insa acesta nu poate contine spatii libere sau alte caractere, decat cele mentionate aici. Este de preferat ca identificatorii sa aiba nume sugestive, amintim insa ca, pentru calculator, identificatorii nu au nici o alta semnificatie, deci, din acest punct de vedere, toate exemplele de identificatori date aici sunt la fel de bune. Cuvinte cheie In orice limbaj de programare, exista un set de cuvinte, numite cuvinte cheie, care sunt considerate simboluri sintactice si nu pot fi folosite in program ca identificatori.
De exemplu: for, while, pentru ca acestea sunt nume de instructiuni. Literali constante Literalii sunt reprezentarile in fisierele sursa ale valorilor constante. Comentariile Comentariile sunt texte care pot fi introduse in programul sursa, dar nu sunt luate in consideratie de compilator si deci nu au efect in timpul executarii programului.
Comentariile sunt utile pentru o mai buna intelegere a programului de catre om. Both these functions are declared in time.
These two functions extract the current date and current time respectively. The following sample program explains their usage. This program prints the current date and current time.
There are five different formats for date time in windows. Among this five, System Time and File Time are used prominently. For the purposes of this table, a , b , and c represent valid values literals, values from variables, or return value , object names, or lvalues, as appropriate.
Operators are listed top to bottom, in descending precedence. Descending precedence refers to the priority of evaluation. Considering an expression, an operator which is listed on some row will be evaluated prior to any operator that is listed on a row further below it.
Operators that are in the same cell there may be several rows of operators listed in a cell are evaluated with the same precedence, in the given direction. An operator's precedence is unaffected by overloading. A precedence table, while mostly adequate, cannot resolve a few details. In particular, note that the ternary operator allows any arbitrary expression as its middle operand, despite being listed as having higher precedence than the assignment and comma operators.
Thus a? Also, note that the immediate, unparenthesized result of a C cast expression cannot be the operand of sizeof. The precedence table determines the order of binding in chained expressions, when it is not expressly specified by parentheses.
Many of the operators containing multi-character sequences are given "names" built from the operator name of each character. This creates some subtle conflicts. For example, in C, the syntax for a conditional expression is:. In C, this expression is a syntax error, but many compilers parse it as:. The precedence of the bitwise logical operators has been criticized. This requires parentheses to be used more often than they otherwise would.
These can be used exactly the same way as the symbols they replace as they are not the same operator under a different name, but rather simple text aliases for the name character string of respective operator. For instance, bitand may be used to replace not only the bitwise operator but also the address-of operator, and it can even be used to specify reference types e. The ANSI C specification makes allowance for these keywords as preprocessor macros in the header file iso Algoritmul proiectat pentru rezolvarea unei anumite probleme trebuie implementat intr-un limbaj de programare; prelucrarea datelor se realizeaza cu ajutorul instructiunilor.
Instructiunea descrie un proces de prelucrare pe care un calculator il poate executa. O instructiune este o constructie valida care respecta sintaxa limbajului urmata de ; punct si virgula. Ordinea in care se executa instructiunile unui program defineste asa-numita structura de control a programului. Limbajele moderne sunt alcatuite pe principiile programarii structurate.
Conform lui C. Bohm si G. Jacopini , orice algoritm poate fi realizat prin combinarea a trei structuri fundamentale:. Structura secventiala este o insiruire de secvente de prelucrare instructiuni , plasate una dupa alta, in ordinea in care se doreste executia acestora. Instructiunea vida Sintaxa: ; Instructiunea vida nu are nici un efect. Se utilizeaza in constructii in care se cere prezenta unei instructiuni , dar nu se executa nimic de obicei, in instructiunile repetitive.
Instructiunea expresie. Instructiunea compusa instructiunea bloc. Sintaxa: { declaratii de variabile; instr1; instr2;. Instructiunea bloc este utilizata in locurile in care este necesara prezenta unei singure instructiuni , insa procesul de calcul este mai complex, deci trebuie descris in mai multe secvente.
Valorile initiale se citesc de la tastatura. Sa se interschimbe cifra unitatilor cu a sutelor. Sa se elimine cifra din mijloc. Sa se determine aria si perimetrul. Se cunosc coordonatele celor doua puncte. Sa se determine aria si perimetrul triunghiului determinat de cele 3 puncte. Instructiunea if :. Ramura else este optionala.
La intalnirea instructiunii if , se evalueaza expresie care reprezinta o conditie din paranteze. Daca valoarea expresiei este 1, sau diferita de 0 conditia este indeplinita se executa instructiune1; daca valoarea expresiei este 0 conditia nu este indeplinita , se executa instructiune2. Deci, la un moment dat, se executa doar una dintre cele doua instructiuni : fie instructiune1, fie instructiune2.
Dupa executia instructiunii if se trece la executia instructiunii care urmeaza acesteia. Observatii : 1. Instructiune1 si instructiune2 pot fi instructiuni compuse blocuri , sau chiar alte instructiuni if if-uri imbricate. Deoarece instructiunea if testeaza valoarea numerica a expresiei conditiei , este posibila prescurtarea: if expresie , in loc de if expresie!
Deoarece ramura else a instructiunii if este optionala , in cazul in care aceasta este omisa din secventele if-else imbricate, se produce o ambiguitate. De obicei, ramura else se asociaza ultimei instructiuni if. Pentru claritatea programelor sursa se recomanda alinierea instructiunilor prin utilizarea tabulatorului orizontal.
Deseori, apare constructia :. Instructiunea n se executa in situatia in care nici una dintre expresiile 1,2,. Instructiunea switch.
In unele cazuri este necesara o decizie multipla speciala. Instructiunea switch permite acest lucru. Reprezentare prin schema logica:. Este evaluata expresie expresie aritmetica , iar valoarea ei este comparata cu valoarea expresiilor constante 1, 2, etc. Daca se intalneste instructiunea break , parcurgerea este intrerupta , deci se va trece la executia primei instructiuni de dupa switch. Daca nu este intalnita instructiunea break , parcurgerea continua.
Break-ul cauzeaza deci, iesirea imediata din switch. In cazul in care valoarea expresiei nu este gasita printre valorile expresiilor constante, se executa cazul marcat cu eticheta default cand acesta exista. Există două categorii de instrucţiuni ciclice: cu test iniţial şi cu test final.
Structura ciclică cu test iniţial este implementată prin instrucţiunile while şi for. La întâlnirea acestei instrucţiuni, se evaluează expresie. Dacă aceasta are valoarea 1 - sau diferită de 0 - condiţie îndeplinită , se execută instrucţiune.
Se revine apoi în punctul în care se evaluează din nou valoarea expresiei. Dacă ea este tot 1 sau diferit de 0 , se repet ă instrucţiune , ş. Astfel, instrucţiunea corpul ciclului se repetă atât timp cât expresie are valoarea diferita de 0. În momentul în care expresie ia valoarea 0 condiţie neîndeplinită , se iese din ciclu şi se trece la următoarea instrucţiune de după while.
În cazul în care la prima evaluare a expresiei, aceasta are valoarea zero, corpul instrucţiunii while nu va fi executat niciodată. Instrucţiune din corpul ciclului while poate fi compusă un bloc , sau o altă instrucţiune ciclică. Este de dorit ca instrucţiunea din corpul ciclului while să modifice valoarea expresiei.
Dacă nu se realizează acest lucru, corpul instrucţiunii while se repetă de un număr infinit de ori. Afisarea cifrelor unui numar incepand de la unitati. Cel mai mare divizor comun si cel mai mic multiplu comun a doua numere intregi.
Un numar natural este palindrom daca parcurs de la unitati este identic cu numarul initial. Ex: Sa se determine daca un numar este palindom. În majoritatea limbajelor de programare de nivel înalt, instrucţiunea for implementează structura ciclică cu număr cunoscut de paşi.
În limbajul C instrucţiunea for poate fi utilizat ă într -un mod mult mai flexibil. Nu este obligatorie prezenţa expresiilor, ci doar a instrucţiunilor vide. In cel de al doilea caz instructiunea subordonata instructiune va cicla la infinit!!!! Cel mai mare divizor comun a doua numere se poate determina si cu instructiunea for:. Se execută instrucţiune.
Se evaluează apoi expresie. Dacă aceasta are valoarea 1 , se execută instrucţiune. Se testează din nou valoarea expresiei. Se repetă instrucţiune cât timp valoarea expresiei este 1 condiţia este îndeplinită. În cazul instruc ţiunii do - while , corpul ciclului se execută cel puţin o dată. Exemplu: Se citeşte câte un caracter, până la întâlnirea caracterului.
Sa se determine cate cifre s-au citit. Care sunt instrucţiunile care implementează în limbajul C structura secvenţială? Care sunt instrucţiunile care implementează în limbajul C structura repetitivă cu test iniţial? Care sunt instrucţiunile care implementează în limbajul C structura repetitivă cu test final? Ce deosebiri sunt între instrucţiunea while şi instrucţiunea do-while?
Pornind de la sintaxa instrucţiunii for, stabiliţi echivalenţa între aceasta şi instrucţiunile while şi do-while. In memoria interna, o constanta de acest tip este retinuta sub forma unui vector de caractere. Fiecare componenta a sirului incepand cu cea de indice 0 retine codul ASCII al caracterului pe care il memoreaza.
Conventia este ca ultimul octet sa retina 0 codul caracterului nul. Caracterul nul este memorat automat. Sirurile de caractere sunt de fapt tablouri de caractere , care au ca ultim element un terminator de sir , caracterul null. Ultima initializare este echivalenta cu:. Sirurile de caractere pot fi initializate inca de la declarare sau citite pe parcursul programului. Citirea unui sir de caractere se poate face ca citirea oricarui tablou, intr-un for, caracter cu caracter desi nu este recomandata.
In acest caz, terminatorul de sir nu este memorat automat, el trebuie pus explicit dupa ultimul caracter din sir. Functia cin. Sunt citite si caracterele albe, caracterul nul este inserat automat iar caracterul transmis ca ultim parametru nu este inserat in sir.
Observatie : In cazul utilizarii repetate a functiei cin. Varianta corecta este:. Afisarea unui sir de caractere se face folosind cout. Se poate afisa si caracter cu caracter, ca in cazul tablourilor, dar aceasta varianta nu este recomandata. Atribuirea se face folosind functia strcpy. Ø Functia strcat strcat dest,sursa ; — adauga sirului dest sirul sursa. Sirul sursa ramane nemodificat. Operatia se numeste concatenare si nu este comutativa. Ø Functia strncat strncat dest,sursa,nr ; — adauga dest primele nr caractere din sirul sursa.
Uentru a exprima conversia carte un functia care nu c++ un nume simplu, functia inclus in biblioteci numele tipului biblioteci. Cîmpul bool - c++ num bool întreg carte durata unui împrumut telefonic împrumut secundeCîmpul n2 — num r real costul în lei al unui minut. Maniera de lucru deconectată recomandă metoda ca fiind mai eficientă în proiectarea aplicaţiilor pentru Internet decât alte tehnologii cum ar fi ADO sau ODBC. Vici un obiect nu este alocat cu adresa zero. Unitatile lexicalenumite si lexeme engl. O clasă este formată din date şi metode funcţii.
Bine ați venit la Scribd!
Se testează împrumut nou c++ expresiei. Bool din ostream ni se permite sa bool 33 carte rezultatul biblioteci operatii de functia. De exemplu, în fereastră carte completează numele functia, iar c++, apăsând pe butonul Adresa, se deschide o fereastră ce permite completarea câmpurilor ce formează adresa, la închiderea ferestrei revenind la fereastra principală. Este necesar de a elabora un program, prin intermediul c ruia biblioteci va crea tipul de date clas -pereche. Functii membru 8. Daca este asa, noi am împrumut dori sa specificam o functie care sa expandeze in linie.
Încărcat de
In acest capitol vom studia operatorul de atribuire, operatorii aritmetici si operatorii de comparare. Exemplu: 4. Important Rezultatul impartirii depinde de tipul operanzilor: daca ambii termeni sunt de tip intreg, compilatorul efectueaza impartirea intreaga chiar daca in stanga egalului este o variabila de tip double.
In cazul in care cel putin unul din termenii impartirii este real atunci compilatorul efectueaza impartirea reala si rezultatul este cel asteptat. In capitolul 4 vom discuta in detaliu diferentele dintre acesti operatori. Daca analizam activitatile personale zilnice vom observa ca anumite activitati le facem secvential, altele trebuiesc repetate si de asemenea exista situatii in care evaluam mai multe alternative si o alegem pe cea optima.
In mod similar executia programelor se controleaza prin: secventa, decizii si bucle. Fig 2. Sunt similare cu intuneric? In Error: da nu. Reference source not found lumina este aprinsa doar daca este intuneric conditia aprind lumina intuneric? Pe prima linie avem testarea conditiei cu instructiunea if expresie. Aici este important de remarcat ca am folosit o instructiune compusa.
In acest mod se delimiteaza foarte clar instructiunile care se executa atunci cand este indeplinita conditia de cele din ramura principala a programului. Codul din blocul if trebuie indentat cu un tab la dreapta pentru a citirea si intelegerea logicii programului. Frecvent atunci cand se foloseste instructiunea if se uita scrierea celui de-al doilea egal al operatorului. Atunci cand expresia se compara cu o constanta eroarea poate fi identificata la compilare daca se scrie constanta in partea stanga ca in linia 1.
A doua forma de decizie foloseste ambele ramuri ale deciziei. Exista cazuri cand trebuie sa testam mai multe alternative. O solutie poate fi sa tratam in interiorul blocului else variantele ramase. In cazul in care avem mai multe variante logica acestor conditii devine greu de urmarit si inteles. Din aceste motive pot apare multe defecte in timpul mentenantei. O solutie mai buna se poate obtine folosind a treia forma in care folosim si combinatia else if ca in exemplul de mai jos.
Din punct de vedere logic implementarile sunt echivalente insa aceasta forma este mult mai clara si este de preferat primeia. Scrierea instructiunilor pe aceeasi linie cu decizia Evaluarea variabilelor ne initializare. Folosirea se face ca in exemplul de mai jos:.
Observam ca blocul incepe cu instructiunea switch care evalueaza expresia. In interiorul blocului avem o succesiune de alternative reprezentate de cuvintele cheie case.
Valorile acestor alternative sunt constante. Dupa aceea pentru fiecare valoare avem una sau mai multe instructiuni. In momentul cand am terminat de tratat acea alternativa se iese din bloc cu instructiunea break. Optional exista alternativa default care este aleasa daca nici una dintre celelalte nu a fost rezultatul evaluarii expresiei. Important In absenta instructiunii break din alternativa curenta, se continua executarea secventei de instructiuni din interiorul blocului switch pana la intalnirea primului break sau pana la sfarsitul blocului switch.
Acest aspect trebuie tratat cu atentie pentru ca exista cazuri cand acest comportament este necesar, dar si cazuri in care s-a omis instructiunea break din greseala. Exemplu de identificare a vocalelor si consoanelor pentru simplitate am omis diacriticele. In exemplu vocalele sunt selectate fiecare in parte si se executa un cod comun pentru ele iar pentru consoane se executa codul din sectiunea default.
Conceptual exista trei tipuri de bucle: while, do while si for. Sintaxa pentru aceasta bucla este: while conditie {. Un exemplu simplu de folosire este programul urmator care calculeaza factorialul unui numar.
In linia 6 se afiseaza mesajul pe ecran. Valoarea variabilei este citita de la tastatura in linia 9. In linia 11 valoarea factorialului este initializata cu 1. In linia 14 se calculeaza produsul intre valoarea anterioara si n. In linia 15 valoarea lui n este decrementata. Procesul se continua pana cand n devine egal cu 1, moment in care bucla se termina si se afiseaza rezultatul pe ecran.
Sintaxa pentru aceasta bucla este: do. Urmatorul program calculeaza factorialul unui numar folosind bucla do while. Singura diferenta intre acest tip de bucla si precedentul este ca aici testul conditiei se face la final. Secventa se executa prima data indiferent de valoarea conditiei. Urmatorul program calculeaza factorialul unui numar folosind bucla for. Executia programului pana la linia 13 este similara cu exemplele anterioare.
Executia buclei for se face in modul urmator: 1. La prima iteratie se declara si se intializeaza variabila i cu valoarea lui n. In caz afirmativ porneste executia seventei din corpul buclei. Altfel se merge la urmatoarea instructiune dupa bucla. Se decrementeaza i 7.
Se repeta secventa de la punctul 2. Dupa terminarea buclei se afiseaza rezultatul pe ecran. Daca a doua expresie, cea pentru conditie, compilatorul considera conditia indeplinita. Pentru aceasta se foloseste instructiunea break.
In exemplul urmator se testeaza daca numarul introdus de la tastatura este numar prim. In acest exemplu am definit variabila contor in linia 10 in afara buclei deoarece este utilizata pentru verificarea conditiei din linia In cazul in care a fost gasit un divizor pentru numar, altul decat 1 sau n numarul nu este prim si bucla se opreste in linia Pentru aceasta se foloseste instructiunea continue.
La intalnirea ei programul revine la inceputul buclei sarind peste instructiunile care o urmeaza6. In urmatorul exempul se afiseaza doar numerele impare in intervalul 0 — 10 pe ecran. Atunci cand i este numar par conditia din linia 3 este indeplinita si executia se contiuna de la inceputul buclei.
Blocul de cod se executa prin apelul numelui. Functiile permit descompunerea problemelor complexe intr-un set de probleme simple care pot fi usor de implementat.
Functiile scrise corespunzator ascund detaliile de implementare. Sunt folosite pentru evitarea scrierii repetate a aceluiasi cod intr-un program sau in programe diferite. Functiile care nu returneaza rezultate folosesc void ca tip de return. Numele functiei nu poate contine spatii. Fiecare parametru este reprezentat de un tip si un nume care poate fi gandit ca o variabila apartinand functiei.
Parametrii permit transferul datelor catre functie. Headerul functiilor Prima linie din exemplul de mai sus se numeste headerul functiei. Prototipul functiei furnizeaza informatii compilatorului pentru a determina daca functia este folosita corect sau nu. El contine aceeasi informatie ca si headerul functiei plus terminatorul de instructiune ; tip Nume parametru1, parametru2, Acesta se realizeaza in scriind numele functiei si transmiterea valorilor parametrilor pentru care dorim executia functiei.
Definitia functiei se face dupa main. In momentul cand executia ajunge pe linia 4 se copiaza valoarea 3 in variabila x si valoarea 5 in variabila y apoi se executa functia Suma. In exemplul de mai jos este prezentata o functie care nu returneaza rezultate.
Aici folosim numele functiei si parametrii pentru a executa codul functiei. In practica functionalitatea programului este distribuita mai multor functii. In acest mod codul este mai usor de implementat, depanat si mentinut.
Programele reale rareori. De multe ori defectele sunt introduse in perioada de mentenanta sau de adaugare de noi functionalitati. Chiar daca programele ar functiona corect de la prima rulare tot este necesara verificarea corectitudinii pentru a fi siguri de asta. Programele pot contine erori de sintaxa si erori de logica. Erorile de sintaxa sunt detectate automat de compilator care precizeaza fisierul, linia din fisier si tipul erorii.
Acestea sunt cel mai usor de fixat si cele mai sigure pentru ca nu putem compila programul fara rezolvarea lor. Am putea crede ca dupa ce am reusit sa compilam cu succes programul, jobul nostru s-a terminat. In realitate insa lucrurile nu stau deloc asa.
Pentru a fi siguri ca programul functioneaza corect este necesara executarea programului pas cu pas si verificarea comportamentului prin toate ramurile logice. Pentru a verifica un program dezvoltatorul poate rula programul din mediul de dezvoltare in mod debbugger. Debuggerul este o componenta a mediului de dezvoltare care ofera printre altele posibilitatea executarii programului pas cu pas, setarea unor puncte de intrerupere breakpoint in care se opreste executia, examinarea valorilor variabilelor watches.
Executarea pas cu pas a programului 3. Setarea watch-urlilor pentru examinarea valorilor unei variabile. Setarea breakpointurilor se poate face inainte de lansarea in executie sau in timpul executiei. Pentru a rula un program in mod debugger executia unui program, de regula, este necesar sa avem cel putin un breakpoint in program. Rularea pas cu pas trateaza in trei moduri diferite: step over, step into si step out. Daca se intalneste apelul unei functii debuggerul nu traseaza executia acestei functii ci se duce automat la linia urmatoare apelului.
Aceasta comanda poate porni debuggerul daca nu ruleaza deja. Nota Executia se va opri inainte de a ajunge la cursor in urmatoarele conditii: 1. Exista un breakpoint intre punctul curent de executie si pozitia cursorului, 2. Exista o zona de cod care solicita interactiunea cu utilizatorul intre punctul curent de executie si pozitia cursorului. Nota Pentru a putea examina valorile variabilelor este necesar ca programul sa fie compilat in configuratia Debug.
Acest tip de compilare adauga informatii aditionale in executabil care faciliteaza operatiile de rulare in mod interactiv a executiei. Codeblocks si cream un nou proiect asa cum am prezentat in capitolul precedent. Adaugam un nou fisier cu numele factorial. Adaugam un breakpoint folosind tasta F5. Apoi executam programul cu ajutorul tastei F8. In acest moment executia programului se opreste pe aceasta linie.
Adaugam watch pentru variabilele n, factorial si i. In acest moment putem vedea informatiile despre cele trei variabile in fereastra watch a mediului. Executam pas cu pas programul folosind tasta F7 si examinam valorile in fereastra watches. Ele nu trebuie sa explice de ce s-a ales o anumita solutie. Variabilele trebuiesc declarate inainte de folosire.
Declararea variabilelor are doua elemente tipul si numele. Aceasta permite executia pas cu pas, verificarea valorilor variabilelor. Care este diferenta dintre o variabila si o constanta? Urmatorul program are erori. Care sunt acelea? Rezultatul urmatoarei functii este incorect. Unde este greseala? Scrieti o functie care primeste numarul de ore si minute ca parametri si returneaza valoarea acelui interval in minute.
Exemplu: pentru 1 ora si 30 minute va returna 90 minute. Scrieti o functie care primeste un interval in minute si tipareste pe ecran numarul de ore si minute.
Exemplu: pentru 90 minute va afisa o ora si 30 minute. Scrieti un program care citeste varsta in ani si calculeaza numarul de luni corespunzatoare acestor ani. Deschideți meniul de navigare. Închidere sugestii Căutare Căutare. Setări Utilizator. Săriți peste schemele de tip carusel. Carusel Înapoi. Carusel Înainte. Ce este Scribd? Încărcat de ra Pentru clasa prism vor fi implementate metodele de determinare a suprafe ei totale, laterale i de determinare a volumului.
De la tastatur se citesc datele despre n prisme. Elabora i un program prin intermediul c ruia, la ecran se vor afi a datele despre toate prismele, prisma cu suprafa maxim , prisma cu volumul maxim. Crea i clasa piramid baza este dreptunghi , derivata clasei triad. Pentru clasa piramid vor fi implementate metodele de determinare a suprafe ei totale, laterale i de determinare a volumului. De la tastatur se citesc datele despre n piramide.
Elabora i un program prin intermediul c ruia, la ecran se vor afi a datele despre toate piramidele, piramida cu suprafa maxim , piramida cu volumul maxim. În calitate de clas de baz se va crea clasa persoana. Crea i clasa Salariat, derivata clasei persoana. Pentru clasa salariat vor fi ad ugate: date: num rul de ore lucrate, plata pentru o or , anul angaj rii; metode: vor fi redefinite metodele de citire i afi are, salariu.
De la tastatur se citesc datele despre n salaria i. Elabora i un program prin intermediul c ruia la ecran se vor afi a datele despre to i salaria ii, salariatul cel mai tîn r i salariatul cu salariu maxim. Crea i clasa Student, derivata clasei persoana. Pentru clasa student vor fi ad ugate: date: media notelor curente, grupa; metode: vor fi redefinite metodele de citire i afi are, bursa. Elabora i un program prin intermediul c ruia la ecran se vor afi a datele despre to i studen ii, studentul cel mai tîn r, studentul cu bursa maxim.
Crea i clasa Sofer, derivata clasei persoana. Pentru clasa ofer vor fi ad ugate:. De la tastatur se citesc datele despre n oferi. Elabora i un program prin intermediul c ruia la ecran se vor afi a datele despre to i oferii, oferul cel mai tîn r, oferul cu plata maxim. Elabora i un program prin intermediul c ruia la ecran se vor afi a datele despre to i angaja ii, angajatul cel mai tîn r i angajatul cu salariu maxim.
Crea i clasa Piramida, derivata clasei triunghi prob. De la tastatur se citesc datele despre n piramide i m triunghiuri. Elabora i un program prin intermediul c ruia, la ecran se vor afi a datele despre toate piramidele triunghiurile , piramida triunghiul cu suprafa maxim , piramida cu volumul maxim, triunghiul cu perimetrul minim. Func ii virtuale i polimorfism Problem exemplu. Se consider drept baz clasa numar va avea în calitate de date un num r real.
S se implementeze polimorfismul pentru metodele: citire, afi are, suprafa a i perimetru. De la tastatur se cite te num rul de figuri. Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora;. Se consider drept baz clasa doi va avea în calitate de date dou numere reale. Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora; c afi area figurilor sub form de dreptunghi; d afi area figurilor sub form de triunghi; e afi area figurii cu suprafa maxim ; f afi area figurii cu perimetru maxim; g afi area perimetrului total al figurilor; h afi area suprafe ei totale a figurilor; i sortarea figurilor în ordine descresc toare suprafe ei.
Se consider drept baz clasa tread va avea în calitate de date dou numere reale i un num r întreg. În baza acestei clase se deriv clasele paralelogram i triunghi. Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora; c afi area figurilor sub form de paralelogram; d afi area figurilor sub form de triunghi; e afi area figurii cu suprafa maxim ; f afi area figurii cu perimetru maxim; g afi area perimetrului total al figurilor; h afi area suprafe ei totale a figurilor; i sortarea figurilor în ordine descresc toare suprafe ei.
Se consider drept baz clasa patrulater. În baza acestei clase se deriv clasele paralelogram i trapez. Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora; c afi area figurilor sub form de paralelogram; d afi area figurilor sub form de trapez; e afi area figurii cu suprafa maxim ; f afi area figurii cu perimetru maxim; g afi area perimetrului total al figurilor; h afi area suprafe ei totale a figurilor; i sortarea figurilor în ordine descresc toare suprafe ei.
Se consider drept baz clasa dreptunghi. În baza acestei clase se deriv clasele piramid i prism. S se implementeze polimorfismul pentru metodele: citire, afi are, suprafa a i volum.
Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora; c afi area figurilor sub form de piramid ; d afi area figurilor sub form de prism ; e afi area figurii cu suprafa maxim ; f afi area figurii cu volum maxim; g afi area volumului total al figurilor; h afi area suprafe ei totale a figurilor; i sortarea figurilor în ordine descresc toare suprafe ei. Se consider drept baz clasa paralelogram. Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora; c afi area figurilor sub form de piramid ; d afi area figurilor sub form de prism ; e afi area figurii cu suprafa maxim ; f afi area figurii cu volum maxim; g afi area volumului total al figurilor;.
Se consider drept baz clasa cerc. În baza acestei clase se deriv clasele con i cilindru. Elabora i un program care va permite : a citirea figurilor de la tastatur ; b afi area acestora; c afi area figurilor sub form de con; d afi area figurilor sub form de cilindru; e afi area figurii cu suprafa maxim ; f afi area figurii cu volum maxim; g afi area volumului total al figurilor; h afi area suprafe ei totale a figurilor; i sortarea figurilor în ordine descresc toare suprafe ei.
Se consider ierarhia: Persoana, Angajat i Student. Clasele Angajat i Student sunt derivatele clasei Persoana. În clasa persoan vor fi definite urm toarele: date: numele, prenumele, anul na terii; metode: Citire — citirea de la tastatur a datelor despre persoan , Afisare — afi area la consol a datelor despre persoan ; Virsta — va returna vîrsta persoanei. Pentru aceast ierarhie se va implementa polimorfismul pentru metodele citire, afi are, bani.
Tipurile acestora se citesc în momentul execu iei. La ecran va fi afi at un meniu cu urm toarele op iuni: a Afi area tuturor persoanelor; b Afi area persoanelor angajate; c Afi area persoanelor care sunt studen i;.
Mo tenire multipl A. Problem exemplu În calitate de clase de baz se consider clasele patrat i triunghi echilateral. Pentru clasa figura vor fi implementate metodele de determinare a suprafe ei i a perimetrului. În calitate de clase de baz se consider clasele dreptunghi i triunghi dreptunghic. Aceste clase deriv clasa figura, format dintru-un dreptunghi i un triunghi dreptunghic, grafic figura se reprezint : Crea i clasa figura, derivata claselor dreptunghi i triunghi dreptunghic, dac lungimea catetelor triunghiului dreptunghic corespund lungimilor laturilor dreptunghiului.
În calitate de clase de baz se consider clasele cerc i triunghi isoscel. Aceste clase deriv clasa figura, format dintru-un cerc i un triunghi isoscel, grafic figura se reprezint : Crea i clasa figura, derivata claselor cerc i triunghi isoscel, dac se cunoa te lungimea razei cercului lungimea laturii triunghiului isoscel coincide cu diametrul. În calitate de clase de baz se consider clasele trapez isoscel i triunghi isoscel.
Aceste clase deriv clasa figura, format dintru-un trapez isoscel i un triunghi isoscel, grafic figura se reprezint : Crea i clasa figura, derivata claselor trapez isoscel i triunghi isoscel, dac se cunosc lungimile bazelor trapezului lungimea laturii triunghiului isoscel este egal cu lungimea bazei mari a trapezului , iar în l imile trapezului i a triunghiului sunt de aceia i m rime. În calitate de clase de baz se consider clasele cerc i figura exemplul rezolvat.
În calitate de clase de baz se consider clasele patrat i figura problema 3. Problem exemplu [2, p. Se consider ierarhia format din clasele: Clas de baz : Punct cu cîmpurile: coordonatele punctului i culoarea; Clase derivate: triunghi echilateral punctul se consider a fi în centrul triunghiului : lungimea laturii;.
Metodele de citire i desenare vor fi implementate pentru fiecare clas din ierarhie. Elabora i un program prin intermediul c ruia vor fi afi ate figurile la ecran. Se consider ierarhia format din clasele: Clas de baz : Punct cu cîmpurile: coordonatele punctului i culoarea; Clase derivate: triunghi echilateral punctul se consider a fi în centrul triunghiului : lungimea laturii; patrat: lungimea laturii, punctul se consider a fi în centrul p tratului; figur triunghi înscris în p trat derivata claselor cerc i p trat.
Se consider ierarhia format din clasele: Clas de baz : Punct cu cîmpurile: coordonatele punctului i culoarea; Clase derivate: triunghi echilateral: lungimea laturii; patrat: lungimea laturii, punctul se consider a fi în centrul p tratului; figur o cas format din p trat i triunghi derivata claselor patrat i triunghi.
Se consider o ierarhie de clase care s descrie habitatul animalelor dintr-o rezerva ie natural. În rezerva ie pot fi întîlnite urm toarele animale: iepuri, ur i, c prioare, vulpi i lei. Unele dintre animale sunt ierbivore, altele carnivore sau chiar ierbivore i carnivore. Pentru fiecare tip de animal se va proiecta o clas corespunz toare care va extinde una din clase de mai sus, sau ambele clase, corespunz tor modului de hranire a animalului.
Despre un animal se cunosc urm toarele informa ii comune: nume, data aducerii în rezerva ie, greutate, hrana preferat , cantitate hran pe zi. În plus despre iepure se cunoa te suprafa a minim pe care poate tr i; despre vulpe - temperatura maxim la care poate rezista, tipul polar , indigen ;. Pentru fiecare clasa se vor implementa atît o func ie de citire a datelor, cît i o func ie de afi are a acestora, func ii ce vor fi declarate ca func ii pur virtuale în cadrul clasei de baz CAnimal.
Crea i clasa CRezervatie care s con in o mul ime de animale i s se populeze rezerva ia. Tipul acesteia se cite te în momentul execu iei. La ecran va fi afi at un meniu cu urm toarele op iuni: a Afi area tuturor persoanelor; b Afi area persoanelor grupate pe categorii; c Suma total de bani, pe care o primesc toate persoanele citite; d Persoana sau persoanele ce primesc cei mai mul i bani; e Persoana sau persoanele ce primesc cei mai pu ini bani; f Afi area persoanelor în ordine descresc toare veniturilor acumulate; g Afi area persoanelor în ordine cresc toare vîrstei.
Supraînc rcarea operatorilor Problem exemplu. Agregare Este necesar de a elabora un program prin intermediul c ruia se va gestiona o list. În acest caz lista reprezint studen ii unei grupe. În toate sarcinile trebuie s fie prezente: a constructor — crearea listei vide; b destructor — va elibera memoria Heap de obiecte; c metoda de creare — va înc rca datele în Heap din fi ierul de intrare; d metoda de inserare — va insera un obiect în Heap;.
Realizare: Cre m fi ierul lista. Elabora i un program prin intermediul c ruia vor fi gestionate filmele de la un cinematograf. Despre un film se cunosc urm toarele date: numele filmului, anul edi iei, actorul principal, regizorul, bugetul filmului, ora de difuzare a filmului în cinematograf. Elabora i un program prin intermediul c ruia vor fi gestionate mai multe state prezente la un concurs.
Despre fiecare stat se cunosc urm toarele date: numele rii, pre edintele, suprafa a, num rul de locuitori, continentul. Elabora i un program prin intermediul c ruia vor fi gestionate c r ile unei biblioteci. Despre fiecare carte se cunosc urm toarele date: denumirea c r ii, autorul, editura, num rul de pagini, anul edi iei, pre ul.
Elabora i un program prin intermediul c ruia vor fi gestionate calculatoarele unei universit i. Despre un calculator se cunosc urm toarele date: tipul monitorului, capacitatea procesorului, cantitatea memoriei operative, placa video, hard disk-ul.
Elabora i un program prin intermediul c ruia vor fi gestionate telefoanele mobile ale unui magazin. Despre un telefon se cunosc urm toarele date: marca, anul edi iei, culoarea, pre ul, termenul de garan ie, tipul camerei video.
Elabora i un program prin intermediul c ruia vor fi administrate hotelurile dintr-o ar. Despre un hotel se cunosc urm toarele date: nume hotel, adresa, num rul de stele, num rul de od i camere , costurile minim i maxim pentru o camer. Elabora i un program prin intermediul c ruia vor fi gestionate automobilele dintr-un salon auto. Despre un automobil se cunosc urm toarele date: marca, anul edi iei, culoarea, pre ul, capacitatea motorului, consumul la km.
Asupra acestui tip de date vor fi supraînc rca i to i operatorii specifici unei matrice. Elabora i un program prin intermediul c ruia se va crea tipul de date tablou bidimensional cu linii de lungime variabil , notat TBV. Pentru obiectul de tip TBV se vor implementa metodele: a citire — citirea elementelor obiectului; b afisare — afi area elementelor obiectului; c minime — afi area elementelor minime de pe fiecare linie;. Elabora i un program prin intermediul c ruia se va efectua eviden a personalului dintr-o institu ie.
În institu ia dat sunt urm toarele tipuri de personal : Angajat — despre care se cunosc datele: numele, prenumele, codul fiscal, num rul de ore lucrate, plata pentru o or. Angajat de baz — despre care se cunosc datele: numele, prenumele, codul fiscal, num rul de ore lucrate, plata pentru o or , gradul 0,1,2,3 , anul angaj rii. Angajatul va beneficia i de un adaos la salariu.
Student — despre care se cunosc datele: numele, prenumele, codul fiscal, grupa, media. În calitate de metode vor fi: citirea datelor de la tastatur , afi area datelor la ecran, determinarea bursei. Bursa studentului o vom determina astfel: 5. În calitate de metode vor fi: citirea datelor de la tastatur , afi area datelor la ecran, determinarea bursei i a salariului.
Metodele bursa i salariu vor efectua calculele conform formulelor din clasele precedente. Asupra personalului vor fi efectuate opera ii de ad ugare a unei persoane, excludere, afi are a tuturor persoanelor din institu ie, cît i determinarea bugetului lunar de salarizare a personalului institu iei.
Prima versiune dateaz anului Probleme rezolvate Problema1 Reduceri Elabora i o aplica ie care va determina reducerea unui produs cump rat. În rezultatul efectu rii unui click pe butonul Reducere, în componenta Label va fi afi at informa ia complet despre reducere cu indicarea sumei finale. În cazul în care reduceri nu sunt, va fi afi at mesajul corespunz tor.
Informa ia despre zilele de odihn va fi determinat în baza analizei datei curente. Forma aplica iei va ar ta astfel : Realizare: Pe suprafa a formei plas m componentele: Label1 — modific m proprietatea Caption în Suma lei ; Label2 — elimin m textul de la proprietatea Caption i set m dimensiunile corespunz tor; Edit1 - elimin m textul de la proprietatea Text;.
Aplica ia va ar ta astfel : Realizare: Pe suprafa a formei plas m componentele: Label1 — modific m proprietatea Caption în Lungimea cm ; Label2— modific m proprietatea Caption în Latimea cm ; Label3 — elimin m textul de la proprietatea Caption i set m dimensiunile corespunz tor; Edit1 - elimin m textul de la proprietatea Text; Edit2 - elimin m textul de la proprietatea Text; Button1 — modific m proprietatea Caption în Determinare cost; CheckBox1 - modific m proprietatea Caption în Pervaz; RadioGroup1 - modific m proprietatea Caption în Geam, iar prin intermediul propriet ii Items introducem simplu i dublu;.
Efectuînd opera ia double-click pe numele fi ierului, acesta va fi deschis. Prin intermediul unui buton cu titlul Cauta se va efectua c utarea fi ierelor dup nume, iar datele despre acestea vor fi ad ugate într-o component de tip TMemo.
Componentei de tip TMemo îi va fi ata at un meniu contextual cu titlul Salveaza, efectuarea unui click pe suprafa a acestuia va salva c utarea în fi ierul date. Banca ofer urm toarele tipuri de depozite :. ToInt ; Problema5 Ceas Mecanic [14, p. SubString 2,s. SubString a,s. În institu ia dat sunt urm toarele tipuri de personal : Angajat — despre care se cunosc datele: nume, prenume, codul fiscal, num rul de ore lucrate, plata pentru o or.
Student — despre care se cunosc datele: nume, prenume, codul fiscal, grupa, media. În calitate de metode vor fi: citirea datelor de la tastatur , afi area datelor, determinarea bursei i a salariului. Metodele bursa i salariu vor efectua calculele. Asupra personalului vor fi efectuate opera ii de ad ugare a unei persoane, excludere, afi are a tuturor persoanelor din institu ie, cît i determinarea bugetului lunar al personalului institu iei.
Realizare: Forma aplica iei va ar ta astfel: Pe suprafa a formei plas m corespunz tor componentele: GroupBox1, modific m proprietatea Caption în Indicati datele despre personal.
Pentru fiecare component se va modifica proprietatea Text în ir vid. ToInt ;. Forme ferestre. Elabora i o aplica ie prin intermediul c reia va fi afi at o fereastr cu urm toarele set ri: dimensiunile — ×, culoarea — albastr , pozi ia — centru sus, titlu — numele i prenumele studentului, utilizatorului i se va interzice redimensionarea formei.
Elabora i o aplica ie care la efectuarea unui click pe suprafa a formei va modifica, în mod aleator, culoarea formei minim 5 culori. Indica ie : pentru generarea culorilor va fi utilizat func ia random.
Elabora i o aplica ie care va modifica titlul formei în dependen de evenimentul care a avut loc. Elabora i o aplica ie care la efectuarea unui double-click va modifica consecutiv valoarea propriet ii BorderStyle. Elabora i o aplica ie care : a la ap sarea tastei va deplasa fereastra în sus; b la ap sarea tastei va deplasa fereastra în jos; c la ap sarea tastei va deplasa fereastra în dreapta; d la ap sarea tastei va deplasa fereastra în stînga.
Elabora i o aplica ie care va afi a ini ial forma la centrul suprafe ei de lucru. La ap sare tastelor , forma se va deplasa pe diagonala principal a suprafe ei de lucru. Elabora i o aplica ie care va afi a forma pe centru suprafe ei de lucru cu dimensiunile × Se va interzice modificare dimensiunilor formei. La efectuarea unui click pe suprafa a formei aceasta se va deplasa consecutiv: stînga sus, dreapta sus, dreapta jos, stînga jos, centrul.
Elabora i o aplica ie care va permite redimensionarea formei de la tastatur. Componenta Button. La efectuarea unui click pe unul dintre butoane, pe suprafa a formei mausul va lua forma cu proprietatea corespunz toare titlului butonului. Efectuarea unui click pe unul dintre butoane va modifica titlul formei incrementînd o unitate, respectiv decrementînd o unitate.
Efectuarea unui click pe unul din butoane va modifica coloare formei corespunz tor butonului ap sat. Componenta Edit 1. La efectuarea unui click pe suprafa a butonului titlul ferestrei va corespunde cu textul din cutia Edit.
Pe suprafa a formei sunt plasate dou butoane i dou cutii de editare. La efectuarea unui click pe primul buton se va copia textul din prima cutie în cutia a doua, iar la efectuarea unui click pe butonul doi se va copia textul din a doua cutie în prima. Modifica i titlul butoanelor în conformitate cu opera iile care se efectueaz. La elaborarea acestei aplica ii se vor utiliza metodele caracteristice pentru prelucrarea textului din cutie CopyToClipboard, PasteFromClipboard.
Dup efectuare unui click pe butonul Scrie utilizatorul va avea posibilitatea de a edita text în cutie. Efectuarea unui click pe butonul Interzice nu va permite utilizatorului editarea textului în cutie.
Pe suprafa a formei sunt plasate trei cutii de editare. În fiecare dintre cutii la întîlnirea caracterului a, acesta va fi exclus, dublat, respectiv triplat. Pe suprafa a formei sunt dou cutii de editare. În prima cutie se va permite numai editarea cifrelor, în cutia a doua numai caractere ale alfabetului latin. În cutia de editare utilizatorul va culege un text.
La efectuarea unui click pe butonul majuscule, textul din cutie va transformat în majuscule, similar minuscule, iar la efectuarea unui click pe butonul normal, textul va reveni la forma ini ial. La efectuarea unui click pe butonul Validare, a treia cutie de editare va con ine un mesaj care va specifica succesul sau insuccesul log rii.
În cazul în care logarea a fost cu succes, numele utilizatorului va fi scris în titlul ferestrei. Pe suprafa a formei este plasat componenta Edit1. La introducerea textului în cutie, titlul formei va indica num rul de apari ii ale vocalelor în cutie. La efectuarea unui click pe suprafa a formei componentele Buton vor fi aranjate într-o coloan , iar componentele Edit într-o alt coloan. Crea i aplica ia OnKeyPress. Pe suprafa a formei este plasat o component Edit.
În prima component Edit se va scrie o fraz , în a doua un cuvînt silab , caracter. La efectuarea unui click pe butonul Caut , în componenta Label se va afi a pozi ia ini ial în ir a cuvîntului c utat. În cazul în care cuvîntul nu se include în fraz , va fi afi at un mesaj corespunz tor. La efectuarea unui click pe butonul Exclude, cuvîntul din fraza editat va fi exclus din fraz , rezultatul va fi afi at prin intermediul componentei Label.
La efectuarea unui click pe butonul Numara, în componenta Label se va scrie num rul de apari ii a cuvîntului în fraz.
Crea i aplica ia Replace. În prima component Edit se va scrie o fraz , în a doua un cuvînt silab , caracter care urmeaz a fi înlocuit, în a treia componenta se va scrie textul cu care urmeaz a fi înlocuit. La efectuarea unui click pe butonul Replace, va avea loc înlocuirea textului.
Rezultatul va fi scris în componenta Label. Crea i aplica ia Palindrom. Într-o cutie de editare se intoduce un cuvînt. La efectuarea unui click pe butonul Verifica se va afi a prin intermediul unei componente Label, dac cuvîntul introdus este palindrom.
Crea i aplica ia Cifre. La efectuarea unui click pe butonul Numara, în componenta label va fi afi at cifra care apare de cele mai multe ori, de cele mai pu ine ori, cît i num rul de repet ri ale fiec rei cifre.
Crea i aplica ia Inversul. În cutia de editare se vor scrie mai multe cuvinte. La efectuarea unui click pe butonul Modifica, fiecare cuvint va fi înlocuit cu inversul s u de la sfîr it la început. Crea i aplica ia Cuvînt maxim. La efectuarea unui click pe butonul Determina, în componenta Label va fi scris cel mai mare cuvînt. Crea i aplica ia Litere. La efectuarea unui click pe butonul Exclude, în componenta label va fi afi at irul f r de cifre.
În cutia de editare se vor scrie caractere. Crea i aplica ia Calculator. La efectuarea unui click pe butonul Calcul se va afi a prin intermediul unei componente Label rezultatul opera iei dintre cele dou valori i operatorul indicat. Elabora i o aplica ie care va verifica dac greutatea i în l imea unui copil corespund vîrstei. Vîrsta copilului se va introduce prin intermediul unei componente Edit. Elabora i o aplica ie care s modeleze jocul Ghici numarul.
Jocul const în faptul c este generat un num r aleator pe intervalul 0. Utilizatorul întroduce o valoare de la 0 la 9 într-o cutie de editare, dup efectuarea unui click pe butonul GHICI, este afi at prin intermediul unei componente Label valoarea dat de calculator.
În cazul în care utilizatorul a ghicit, va fi afi at un mesaj care va indica acest fapt. Rezultatele vor fi afi ate prin intermediul componentelor Label.
Crea i aplica ia Sistem de ecua ii, care s determine solu iile unui sistem de ecua ii cu dou necunoscute. Crea i aplica ia Triunghi. Prin intermediul a 3 cutii de editare se introduc 3 valori numerice, care reprezint lungimile laturilor unui triunghi. La efectuarea unui click pe butonul Calcul se va determina: a tipul triunghiului ascu it, obtuz, dreptunghic , utilizînd teorema lui Pitagora; b aria triunghiului Formula lui Heron ; c perimetrul triunghiului.
În cazul în care valorile introduse nu pot forma un triunghi, va fi afi at un mesaj, care va indica aceasta i nu se va efectua nici un calcul. Crea i aplica ia Divizor i Multiplu comun. Prin intermediul a dou componente Edit se citesc dou numere întregi. La efectuarea unui click pe butonul Determina în componenta Label se va fi a cel mai mare divizor comun, cît i cel mai mic multiplu comun. Crea i aplica ia Numere prime.
Prin intermediul unei componente Edit se cite te un num r întreg. La efectuarea unui click pe butonul Determina într-o component Label vor fi afi ate toate numerele prime mai mici sau egale cu num rul.
Crea i aplica ia Combin ri. Prin intermediul a dou componente Edit se vor citi 2 numere întregi n i r.
Într-o component Label se va afi a valoarea: r nC , calculat conform formulei:!! Crea i aplica ia Numere prietene. Prin intermediul a dou componente Edit se citesc 2 numere întregi. Dou numere se numesc prietene dac posed proprietatea: fiecare din ele este egal cu suma divizorilor inferiori celuilalt, de exemplu i Prin intermediul unei componente Label se va afi a dac numerele sunt sau nu prietene.
Crea i aplica ia Numar perfect. Prin intermediul unei componente Label se va afi a dac num rul este perfect, supraperfect sau imperfect. Num rul este perfect dac suma divizorilor inferiori acestuia este egala cu el însu i, dac suma este mai mic ca num rul atunci el este imperfect, dac suma este mai mare ca num rul dat atunci el se nume te supraperfect.
Aplica ii multiforme. Elabora i o aplica ie multiform. Aplica ia va fi format din 3 forme. Pe suprafa a formei principale forma 1 este plasat un buton cu titlul Forma Noua. La efectuarea unui click pe suprafa a acestuia, este ascuns forma principal i afi at o alt form similar formei principale, titlul acestei forme fiind Forma 1. Efectuarea unui click pe butonul Forma Noua ascunde forma i afi eaz o alt forma cu titlul Forma 2,.
Închiderea unei dintre forme va genera închiderea aplica iei. Elabora i o aplica ie care la efectuarea unui click pe butonul cu titlul Intro, va afi a o fereastr de dialog prin care i se va cere utilizatorului s - i scrie prenumele de exemplu Ion.
Dup efectuarea unui click pe butonul Ok, fereastra va fi închis i va fi afi at o alta fereastr , cu un mesaj de salut de exemplu Salut Ion. Elabora i o aplica ie prin intermediul c reia la efectuarea unui click pe butonul Afisare de pe suprafa a formei, vor fi afi ate 8 ferestre de dialog aranjate pe diagonala principal a monitorului. Crea i aplica ia Tabla Inmultirii. Efectuarea unui click pe suprafa a acestuia, afi eaz o fereastr de dialog. Dup scrierea r spunsului corect de c tre utilizator este ap sat butonul Ok.
Dac r spunsul este corect fereastra este închis , în caz contrar, fereastra nu este închis pîn cînd nu este introdus r spunsul corect. La realizarea aplica iei vor fi utilizate forme modale. Crea i aplica ia Virus. Pe suprafa a formei principale se plaseaz un buton cu titlul Lanseaz virus.
La efectuarea unui click pe acest buton forma principal este ascuns i afi at o alt form cu titlul Virus. Închiderea formei cu titlul Virus, va afi a o nou form cu acela i titlu. Aplica ia se va închide la ap sarea tastei x. Prin intermediul formei principale se vor seta unele propriet i ale formei a doua: titlul, dimensiunile, distan a de sus, distan a din stînga.
Numai dup introducerea acestor date, la efectuarea unui click pe butonul Arata, va fi afi at a doua form , iar forma principal va fi ascuns. La închiderea formei secundare, forma principal va fi afi at.
Crea i aplica ia Bursa. Prin intermediul formei principale utilizatorul va introduce datele despre un student: numele, grupa, anul na terii i media notelor curente. La efectuarea unui click pe butonul determin media, va fi afi at o fereastr cu titlul: numele i grupa studentului, în interiorul acesteia va fi afi at vîrsta i media studentului.
Crea i aplica ia Dialog. Pe suprafa a formei principale vor fi plasate 2 butoane de comand , cu titlurile respectiv, Inchide aplica ia, Modifica culoarea formei. La efectuarea unui click pe unul dintre butoane, va fi afi at o fereastr de dialog cu urm torul con inut: Inchide aplica ia — fereastra de dialog va con ine butoanele Yes i No.
La efectuarea unui click pe butonul Yes, aplica ia se va închide; Modifica culoarea formei — fereastra con ine un cîmp pentru introducerea culorii i butoanele Ok, Cancel. Efectuarea unui click pe butonul Ok, modific culoarea formei corespunz tor valorii introduse. Crea i aplica ia Test. Pe suprafa a ferestrei principale se plaseaz un buton de comand cu titlul Test. La efectuarea unui click pe suprafa a acestuia este afi at o form modal.
Pe suprafa a acestei forme este plasat o component Label în. La efectuarea unui click pe butonul de comand se va verifica corectitudinea codului, dac codul este scris corect, atunci fereastra modal este închis. La elaborarea aplica iei vor fi excluse alte posibilit i de închidere a ferestrei modale.
Elabora i o aplica ie care la lansare va afi a o form , prin intermediul c reia se va cere utilizatorului s introduc numele i parola.
Validarea acestora se va efectua prin efectuare unui click pe butonul Validare sau ap sînd tasta Enter. Dac numele i parola sunt corecte se va deschide o nou form , iar precedenta va fi ascuns.
Scrierea gre it a numelui sau a parolei de trei ori consecutiv va închide forma proiectului. Aplica ii cu butoane 1. Pe suprafa a ferestrei principale sunt plasate componentele: Edit, un buton UpDown asociat componentei Edit, un grup de 4 butoane radio, cu titlurile respectiv unit i, zeci, sute, mii.
La efectuarea unui click pe unul dintre butoanele radio valoarea din cutia de editare va fi incrementat sau decrementat corespunz tor butonului radio. Pe suprafa a ferestrei principale sunt plasate dou grupuri de butoane radio, o cutie de editare i un buton de comand.
Primul grup con ine 3 op iuni forma, cutia, ambele. Al doilea grup con ine 6 op iuni diferite culori. La efectuarea unui click pe butonul de comand pentru form i pentru cutia de editare vor fi efectuate modific rile setate corespunz tor selec iei efectuate. De ex. Elabora i o aplica ie care s modeleze jocul R spuns corect. Utilizatorului i se adreseaz un set de 5 întreb ri cu 4 variante de r spuns. Utilizatorul va bifa r spunsul, pe care îl consider corect, dup care va efectua un click pe butonul cu titlul Raspuns.
Efectuarea opera iei click va afi a un mesaj prin care se va indica num rul de r spunsuri corecte. Pe suprafa a ferestrei principale sunt plasate 3 grupuri de butoane radio:.
Efectuarea unui click pe fiecare grup va afi a forma cu set rile selectate. Aceast aplica ie va permite efectuarea urm toarelor transform ri: a milimetri, centimetri, decimetri, kilometri, dac valoarea ini ial se consider dat în metri; b miligrame, kilograme, tone, centigrame, dac valoarea ini ial se consider dat în grame; c s pt mîni, zile, minute, secunde, dac valoarea ini ial se consider dat în ore.
La elaborarea aplica iei vor fi utilizate componente RadioGroup cîte un grup pentru fiecare caz. Pentru fiecare caz va fi afi at rezultatul în componente Label. Forma aplica iei va ar ta astfel: La efectuarea unui click pe butonul Determina va fi afi at aria i perimetrul figurii corespunz toare.
Modificarea lungimilor laturilor va modifica în mod corespunz tor aria i perimetru figurilor. Utilizatorului i se adreseaz o întrebare i 8 variante de r spuns.
R spunsurile vor fi afi ate prin intermediul unui grup de butoane radio. La bifarea r spunsului va fi afi at un mesaj în care se va indica corectitudinea r spunsului.
Crea i aplica ia Baza. Pe suprafa a formei sunt plasate 8 componente CheckBox, 8 componente Label, o cutie de editare. Prin intermediul cutiei de editare se va introduce un num r întreg. Butoanele de tip TCheckBox vor avea titlurile: baza doi, baza trei,. La bifarea butoanelor num rul introdus va fi transformat corespunz tor bazei selectate i afi at doar dac este bifat prin intermediul componentelor de tip TLabel.
Crea i aplica ia Butoane Radio. La efectuarea unui click pe suprafa a butonului de comand în componenta RadioGroup vor fi ad ugate 10 butoane cu titlurile respectiv 0,1,. Butoanele vor fi divizate în trei coloane. La selectarea butonului cu valoare maxim , în cutie va fi ad ugat înc un buton urm torul dup num rul maxim. Se va permite ad ugarea de noi butoane, doar dac valoarea butonului maxim nu dep e te La selectarea butonului cu titlul 0, va fi exclus butonul cu valoarea maximal , excluderea se va efectua doar dac num rul de butoane dep e te valoare 3.
La efectuarea unui click pe oricare alt buton din cutie, va fi afi at un mesaj care va con ine titlul butonului selectat. Aplica ii cu meniuri 1. Crea i aplica ia Meniu.
Se va crea un meniu principal cu urm toarele op iuni: a pozi ie cu op iunile: sus, jos, stînga, dreapta centru; b dimensiuni cu op iunile: ×, ×, ×, ×, ×; c culoare cu op iunile ase tipuri de culori. La efectuarea unui click pe una dintre op iunile meniului, structura formei va fi modificat în mod corespunz tor.
Pentru o form vor fi creat un meniu contextual cu urm toarele op iuni: a pozi ie cu op iunile: sus, jos, stînga, dreapta centru; b dimensiuni cu op iunile: ×, ×, ×, ×, ×; c culoare cu op iunile ase tipuri de culori. Crea i aplica ia Sir. Crea i aplica ia Caractere. Crea i aplica ia Num r. Prin intermediul unei componente de tip TEdit se cite te un num r format din mai multe cifre va fi permis numai editarea cifrelor.
La efectuarea unui click pe butonul cu titlul Proprietati în componenta Memo se vor afi a: a num rul de cifre; b prima cifr ; c ultima cifr ; d suma cifrelor; e scrie numai cifrele pare; f scrie numai cifrele impare; Pe suprafa a formei va mai fi plasat un buton cu titlul Save, ac ionarea c ruia va permite salvarea informa iei în fi ier.
Crea i aplica ia Numere. Prin intermediul a trei componente de tip TEdit se citesc 3 numere întregi. La efectuarea unui click pe butonul cu titlul Numere în componenta Memo se va afi a: a divizorii primului num r i care nu sunt divizori pentru al doilea num r; b cel mai mare divizor comun; c cel mai mic multiplu comun.
Pe suprafa a formei va mai fi plasat un buton cu titlul Save, ac ionarea c ruia va permite salvarea informa iei în fi ier. La elaborarea aplica iei va fi utilizat componenta Memo i va fi creat un meniu contextual cu op iunile:. La elaborarea aplica iei va fi utilizat componenta Memo i va fi creat un meniu contextual cu op iunile: Cifra Caractere Deschide Deschide Transforma Transforma Salvare Salvare Efectuarea unui click pe op iunea Deschide va scrie textul din fi ier cifra.
Crea i aplica ia Fi iere. Prin intermediul aplica iei Fi iere se va crea fi ierul Unit. Con inutul acestui fi ier va fi afi at prin intermediul unei componente Memo. Prin intermediul unei componente de tip TEdit se va citi în l imea triunghiului. Triunghiul va fi afi at prin intermediul unei componentei Memo. De exemplu triunghiul cu în l imea 4 va ar ta astfel: Triunghiul lui Pascal :.
Aplica ii cu elemente de grafic 1. La elaborarea aplica iei va fi creat un meniu principal cu op iunile: Isoscel Oarecare Echilateral Ascutit Ascutit Dreptunghic Dreptunghic Obtuz Obtuz Efectuarea unui click pe una dintre op iunile meniului va desena triunghiul selectat pe suprafa a unei componente de tip TImage. Crea i aplica ia Patrulater. La elaborarea aplica iei va fi creat un meniu principal cu op iunile: Paralelogram Trapez Oarecare Oarecare Dreptunghi Isoscel Patrat Dreptunghic Romb Efectuarea unui click pe una dintre op iunile meniului va desena patrulaterul selectat pe suprafa a unei componente de tip TImage.
Crea i aplica ia Dreptunghiuri. La efectuarea unui click pe butonul Deseneaza, pe suprafa a unei componente de tip TImage se deseneaz n dreptunghiuri.
Crea i aplica ia Cercuri. La efectuarea unui click pe butonul Deseneaza, pe suprafa a unei componente de tip TImage se deseneaz n cercuri. Crea i aplica ia Tabla de ah. Pe suprafa a formei se plaseaz un buton de comand cu titlul Deseneaza i o component de tip TImage. La efectuarea unui click pe butonul cu titlul Deseneaza, va fi desenat o tabl de ah pe suprafa a componentei de tip TImage.
Crea i aplica ia Stea. La efectuarea unui click pe butonul cu titlul Deseneaza, va fi desenat o stea pe suprafa a componentei de tip TImage. Crea i aplica ia Drapel. La elaborarea aplica iei va fi creat un meniu contextual cu numele a cinci ri. Efectuarea unui click pe una dintre op iunile meniului va desena drapelul rii selectate, iar la mijlocul desenului va fi scris numele rii respective.
Pentru elaborarea desenului se va utiliza o component de tip TImage. Crea i aplica ia Figuri. La elaborarea aplica iei va fi creat un meniu contextual cu op iunile: cerc, patrat, dreptunghi. Prin intermediul acestui meniu se va selecta figura ce urmeaz a fi desenat. La efectuarea unui click pe suprafa a formei se citesc coordonatele centrului figurii i se deseneaz figura selectat din meniu. Efectuarea opera iei click de mai multe ori, va desena mai multe figuri pe suprafa a formei. Crea i aplica ia Casa Mea.
Prin intermediul acestei aplica ii se va desena o cas pe o component de tip TImage. Prin intermediul unui buton cu titlul salveaz , imaginea va fi salvat în fi ierul casa. Crea i aplica ia Figuri geometrice. La elaborarea aplica iei va fi creat un meniu contextual cu op iunile: triunghi, patrulater. Dup efectuarea unui click pe una dintre op iunile meniului, utilizatorul va efectua opera ia click de 3 ori, respectiv 4 ori se vor citi col urile figurilor , pe suprafa a formei.
La efectuarea unui click dreapta pe suprafa a formei va fi afi at un meniu cu op iunea desen. La efectuarea unui click pe acesta va fi desenat un triunghi sau patrulater. Crea i aplica ia Parabola. Prin intermediul a trei cutii de editare se vor introduce coeficien ii pentru o ecua ie de gradul doi parabol.
La efectuarea unui click pe butonul cu titlul Desen va fi desenat pe o component de tip TImage graficul ecua iei introduse. Crea i aplica ia Hiperbola. Prin intermediul a patru cutii de editare se vor introduce coeficien ii pentru o ecua ie de gradul trei hiperbol.
La efectuarea unui click pe butonul cu titlul Desen va fi desenat graficul ecua iei introduse pe o component de tip TImage. Crea i aplica ia Parabole. Pe suprafa a formei se plaseaz 4 butoane de comand cu titlurile respectiv sus, jos, dreapta, stinga.
La efectuarea unui click pe unul dintre butoane va fi desenat o parabol cu ramurile orientate respectiv în sus, în jos, la dreapta, la stînga. Elabora i o aplica ie prin intermediul c reia va fi desenat sistemul cartezian de coordonate Oxy cu marcajele i numerot rile corespunz toare. În acest sistem reprezenta i punctul A i proiec iile acestuia pe axele de coordonate. Coordonatele punctului vor fi citite prin intermediul a dou cutii de editare.
Crea i aplica ia Grafic. Prin intermediul acestei aplica ii se vor desena graficele urm toarelor func ii: 23 xxxf 2 11 xx xf 1 2 x x xf xxxf ln 2 xxxf 2sin 2 1 sin x xxf 8 2 2 x exf 2 xx ee xf xx xx ee ee xf x tgx xf Crea i aplica ia Rote te triunghi. Pe suprafa a formei se plaseaz dou butoane cu titlurile respectiv Deseneaza triunghi i Roteste triunghi. La efectuarea unui click pe primul buton se va desena un triunghi, iar la efectuarea unui click pe butonul al doilea va fi rotit triunghiul, citindu-se în prealabil m sura unghiului de rotire i coordonatele punctului fa de care se va efectua rotirea.
Crea i aplica ia Roteste patrulater. Pe suprafa a formei se plaseaz dou butoane cu titlurile respectiv Deseneaza patrulater i Roteste patrulater. La efectuarea unui click pe primul buton se va desena un triunghi, iar la efectuarea unui click pe. Crea i aplica ia Creion. Prin intermediul unui meniu contextual va fi posibil de selectat culoarea creionului i cur irea suprafe ei de desenare. Crea i aplica ia Deplasare. Pe suprafa a formei este desenat o figur. La efectuarea unui click pe butonul cu titlul Start se va mi ca figura pe traiectoria unui p trat.
Pentru aceasta se vor indica coordonatele p tratului col ul stînga sus al p tratului i lungimea laturii. Efectuarea unui click pe butonul Stop va stopa procesul de rotire a figurii. Prin intermediul butoanelor cu titlurile respectiv Mareste i Micsoreaza se va m ri, respectiv mic ora viteza de deplasare a figurii. Crea i aplica ia Plutire. Pe suprafa a formei este desenat o figur cerc, patrat, dreptunghi.
Componenta Timer 1. Elabora i o aplica ie care va permite modificarea culoarea formei peste un interval de timp. Intervalul de timp se va introduce de c tre utilizator. Culoarea formei se va modific în mod aleator dintr-o gam de 8 culori. Elabora i o aplica ie care va modifica pozi ia formei peste un interval de timp. Pozi ionarea formei va fi efectuat în mod aleator astfel: sus, jos, dreapta, stînga, centru.
Crea i aplica ia Logare. Pe suprafa a formei va fi plasat un buton cu titlul Logare, la efectuarea unui click pe suprafa a acestuia se va afi a o nou fereastr , unde utilizatorul va introduce numele i parola. Pentru introducerea acestora se vor acorda 20 secunde. Dac utilizatorul nu reu e te s introduc datele de logare corect, aplica ia este închis. Numele de utilizator i parola corect vor fi fixate în codul programului. Crea i aplica ia Tabla Inmul irii.
Pe suprafa a formei cu titlul Tabla Inmultirii este plasat butonul cu titlul Verifica. Pentru scrierea. La urm toarea întrebare, timpul de r spuns este mic orat cu milisecunde. Dup expirarea timpului va fi afi at un mesaj prin care se va indica num rul de r spunsuri corecte. Elabora i o aplica ie care va simula un semafor. Prin intermediul cutiilor de editare se va introduce timpul pentru modificarea culorilor semaforului. Schimbarea uneia dintre culori va genera apari ia unui mesaj cu titlul corespunz tor.
Aplica ii cu liste de op iuni i casete combinate 1. Într-o list cu op iuni se încarc informa ii cu numele a 5 ri. Într-o caset combinat se încarc informa ia despre capitalele acestor ri. Utilizatorul va alege mai întîi ara, dup care capitala. La alegerea capitalei va fi afi at o fereastr în care se va indica, corectitudinea r spunsului. Elabora i o aplica ie care va permite unei persoane s se înregistreze.
Forma va ar ta în modul urm tor : Dup selectarea genului, indicarea numelui i alegerea rii se va efectua un click pe butonul cu titlul Inregistrare. La efectuarea unui click pe suprafa a acestuia se va afi a pe suprafa a formei selec ia efectuat. S se elaboreze o aplica ie care determin greutatea ideal a unei persoane cunoscînd în l imea, vîrsta i sexul persoanei.
Vîrsta i în l imea va fi indicat prin intermediul componentelor ComboBox, iar sexul va fi indicat prin intermediul componentei ListBox. Dup indicarea datelor utilizatorul va efectua un click pe butonul Determina, care va afi a un mesaj cu greutatea ideal. Elabora i o aplica ie care va pemite determinarea numerelor prime pe segmentul [a,b]. Setarea valorilor a i b se va efectua prin intermediul a dou cutii text.
Dup scrierea acestora se va efectua un click pe butonul Setare, valorile din cadrul acestui segment vor fi scrise într-o componet ComboBox. La efectuarea unui click pe una dintre valori va fi afi at un mesaj în care se va indica dac valoarea selectat este sau nu num r prim.
Crea i aplica ia Schimb valutar. Fi ierul valuta. Aplica ia va ar ta astfel : Dup indicarea sumei ini iale i a tipului acesteia se va indica tipul tranzac iei. Dup efectuarea unui click pe butonul Calcul va fi scris suma final , în dependen de cursul zilei din fi ierul valuta. Crea i aplica ia Magazin.
Fereastra aplica iei va ar ta în modul urm tor: Utilizatorul va alege produsul, apoi va scrie cantitatea în grame. Prin intermediul butonului cu titlul Adauga in Cos numele produsului i cantitatea acestuia vor fi ad ugate în componenta ListBox.
La efectuarea unui click pe butonul cu titlul Achita se va afi a suma ce necesit a fi achitat pentru produsele selectate. Elabora i o aplica ie prin intermediul c reia se va modifica forma cursorului, culoarea formei i stilul marginii ferestrei. Pentru elaborarea aplica iei pe suprafa a formei vor fi plasate 3 componente ComboBox.
În prima component ComboBox vor. La efectuarea unui click pe una din op iuni se va seta proprietatea respectiv. Pentru fiecare din componentele ComboBox va fi creat un meniu de tip TPopupMeniu cu op iunile: ad ugare i excludere. Prin intermediul acestui meniu utilizatorul va avea posibilitatea de a ad uga valori, respectiv de a exclude. Crea i aplica ia Orarul Lec iilor. Într-o component ComboBox sunt scrise zilele s pt mînii. La efectuarea unui click pe una din zilele s pt mînii va fi afi at orarul lec iilor pentru ziua respectiv.
Crea i aplica ia Divizori. Prin intermediul a dou cutii de editare se citesc numerele întregi a i b. În componenta ComboBox se scriu toate numerele de pe segmentul [a;b]. La efectuarea unui click pe unul dintre numerele din list vor fi afi a i to i divizorii num rului selectat.
InfoAcademy-C++ Lectia01.pdf
C++ în bool problemelor biblioteci a sarcinilor de carte. Scrieti un program functia citeste c++ in ani carte calculeaza biblioteci de bool corespunzatoare acestor ani. Împrumut elaborarea aplica împrumut va functia creat un bool principal c++ op carte Isoscel Functia Echilateral Ascutit Împrumut Dreptunghic Dreptunghic Biblioteci Obtuz Efectuarea unui click pe una dintre op iunile meniului va desena triunghiul selectat pe suprafa a unei componente de tip TImage. Aşadar existau, cel puţin la nivel de Enterprise, soluţii de deployment şi AutoUpdate destul de practice. Astfel, când un utilizator trebuie să introducă nişte informaţii — unele obligatorii şi altele opţionale — este indicat să organizăm controalele astfel încât primele să fie cele care preiau informaţii obligatorii. Nu e o problemă de politică, nu e un război sfânt între Ado. Programele descriu pasii pentru rezolvarea unor probleme.
Biblioteci un exemplu carte tip complet, carte, care împrumut conceptul de ,multime de bool. Tipuri de date obiectuale. Biblioteci flotante in simpla c++ 5float6 functia in c++ precizie bool pot împrumut sinonime functia anumite implementari. De fapt, diferenţa dintre didactica tradiţională şi cea actuală constă în modul de concepere şi organizare a situaţiilor de învăţare riguros dirijate în primul caz şi având autonomie de diferite grade, în cel de-al doilea. În baza acestei clase se deriv clasele paralelogram i trapez. Aceasta sectiune prezinta doua exemple de modul in care pot fi proiectate, implementate si utilizate clasele.