Sunteți pe pagina 1din 102
rela a Nofiunea de algoritm este des utilizati in informatica (mai ales in programare). In continuare, vom da cdteva exemple prin - care sé scoatem in eviden{a proprictitile, structura si datele cu care lucreazi un algorifm. Problema “Salut!” Fiecare persoani reactioneazi diferit cand rispunde la: iclefon. Astfel, Alexandru, elev in clasa a V-a, are in minte trei moduri de salut: “Bund ziual”, “Novoc!”, “Salut!”, in fanctie de persoana cu care se intélneste, , " Imaginafi un plan care sd ia in calcul situatiile in care Alexandru vorbeste la telefon cu: mama, tata, Ioana (verisoara), Roberta (colega de banc&), Florin (verigor) si Mircea (coleg de clas’), La p&rinti raspunde cu “Bund ziua!”, la verigori cu“Noroc!”, iar la colegi cu “Salud!”. Solutie Vom realiza un plan de rezolvare imp4rfit in mai multe etapé, notéind cu x numele persoanei care da telefon lui-Alexandru: Etapa 0. incepe rezolvarea. Etapa 1. Suna telefonul gi se prezint persoana cu numele x. . Etapa 2. Dacii x este mama sau x este tata, atunci Alexandru réspunde la telefon cu ..Bund ziua!”. Etapa 3, Daca x este Ioana sau x este Florin, atunci Alexandru raspunde Ia telefon cu’,,Noroc!”, « Etapa 4. Daci x este Roberta sau x este Mircea, atunci Alexandru raspunde fa telefon cu ,,Salut?”. Etapa 5, Sfarsit rezolvare. Problema “Numere consecutive” Se dau doui numere naturale. Se cere sé se verifice daci numerele date sunt consecutive. fn caz afirmativ si se precizeze care . este ordinea lor. Solutie La fel ca in problema anterioar’, vom elabora un plan de rezolvare, notand cua si b cele doud numere. Etapa 0. fncepe rezolvarea. Etapa 1. Asociem lui a o valoare concretd (un numiar natural). Etapa 2. Asociem lui b o valoare concreta (un numér natural), Etapa 3. Dacii b este egal cu a+1, atunci precizim faptul ci numerele sunt consecutive in ordinea a, b, apoi trecem direct la Etapa 6, Etapa 4. Daci a este egal cu.b+1, atunei precizim faptul ci numerele sunt consecutive in ordinea b, a, apoi trecem direct la Etapa 6. Etapa 5, Precizam faptul ci a si b nu sunt mumere consecutive. Etapa 6, Sfarsit rezolvare. Problema “C€rti de joc” lonut este un mare iubitor al c&rtilor de joc. fn vitrina lui plind de jucarii se giisesc multe tipuri de pachete de cirfi de Ne joc, Intr-o seara vine in vizitt verisoara lui Ioana gi se hotirasc sa‘. inventeze un nou joc de c&rti, folosind un pachet obignuit, carfi numerotate cu 1 (as-ul), 2, ..., 14 (popa). Pentru fiecare numir exist’ cate patru carfi care se disting prin desenul de pe ele: romb, inim’ rosie, inima neagra si trefl4. Jocul inventat de cei doi verisori are urmitoarele reguli: R1: La fiecare etapa, din pachetul de c&rti Ionut si Ioana iau cate o carte si le adaugé la cele luate anterior, R2: Jocul este cAstigat de cel care are in m4n& o carte cu numarul 1 sau-10 de culoare rosie (romb sau inimi rosie). R3: Jocul se incheie remiza, dac& in aceeasi etap’ Lonuf si Ioana ridicd o carte cu numérul | sau 10 de culoare rosie (romb sau inima rosie). Se cere sd se precizeze o modalitate de simulare a jocului (precizfnd toate situatiile ce pot interveni). Se stie ci la inceputul jocului c&rtile sunt amestecate de tat&l lui Ionut, nelipsind nicio carte din pachet, Solutie Vom nota cu nrl, ent numarul, respectiv culoarea c&rfii alese de Jontit la ‘un moment dat, iar cu mr2, cu2 numarul, respectiy culoarea c&rfii alese de Ioana. Etapa 0, fncepe rezolvarea, Etapa 1, lonut ia o carte, in felul acesta nrl si cul au asociate un numir gi respectiv una dintre variantele romb, inima rosie, inima neagra gi trefia, pentru culoare. Etapa 2. Ioana ia o carte, in felul acesta ur2 si cu2 av asociate un numiar gi respectiv una dintre variantele romb, inima rosie, inima neagri gi treflé, pentru culoare. Etapa 3. Dac& (mrt este egal cu 1 sau arl este egal cu 10) si (cul este romb sau cul este inima rogie)) si ((nr2 este egal cu 1 sau nr2 este egal ci 10) si (cu2 este romb sau cn2 este iInima rogie)), atunci jocul se termina remizi gi se trece direct la Etapa 7. Etapa 4, Daca ((nrl este egal cu'l sau nrl este egal cu 10) si (cul este romb sau cul este inimii rogie)), atunci jocul este cAstigat de Ionut si se trece direct la Etapa 7. . Etapa 5. Daca ((nr2 este egal cu | sau nr2 este egal cu 10) si (eu2 este romb sau cu2 este inimd rosie)) atunci jocul este cAstigat de Ioana gi se trece direct la Etapa 7. Etapa 6. Se trece alegerea altor carti de caitre Ionut si Ioana, adicd se repetit Etapa 1. Etapa 7. Sfargit rezolvare, © Planurile de rezolvare prezentate la cele trei probleme le vom numi algoritmi. © Fiecare dintre cei trei algoritmi rezolva problemele in cazul general, Prima problema pentru un nume notat cu x, a doua pentru doud numere notate cu a, b, respectiv a treia pentru numerele si culorile carfilor alese la un moment dat de citre Ionut si Ioana, nr1, nr2, cul, cu2. De aici desprindem ideea ca algoritmii folosesc date (care pot fi constante sau variabile). Datele constante riman cu aceeasi valoare de la inceputul algoritmului si pand la sfarsitul lui, pe cand cele variabile se pot modifica. Constantele i variabile pot lua valori dintr-o multime bine definita, De exempiu, in cazul primelor dou’ probleme x, a, b pot lua ca valori doar numere naturale (evident mai mici decat o valoare maxima pe care o impune cel care rezolva problema, de exemplu 32000). Acestea nu pot lua ca valori, de-exemplu, litere sau numere cu parte fractionara. Pentru a treia problema, variabilele cul, cu2 pot fi utilizate numai cu valorile romb, inima rosie, inimé neagra gi trefla, © Algoritmii prezentati folosesc operatii aritmetice (adunare, scidere, inmulfire, Impirtire), operatii de comparare (mai mic, mai mare, mai mare sau egal, mai mic sau egal, egale, diferite, simbolizate prin <, >, >=,<== respectiv <>). ]© in toti algoritmii prezentafi fiecare operatic se executé o data, de doua ori, .j dar nu se ‘repeté de prea mute ori, la un moment dat se termin4 executia ei. Acest lucru este vizibil in problema “Carfi de joc”, Jonut si Ioana iau c&rti repetat, dar la un momend dat se opresc (fie gi pentru faptul 0 exista 48 de carti). * Analizénd cu. atentie algoritmii anteriori, observim c& fiecare dintre ci furnizeazi o solutie corecti, indiferent de valorile datelor cu care se facepe. . © Fiecare algoritm porneste cu anumite date (care se numesc date de intrare) _ gi se termind cu obfinerea unor anumite date, mesaje, care rezolva. problema (numite date de iegire). © Etapele prezentate in algoritmi se mai numese si pasi. * Rezolvarea unei probleme in programarea calculatoarelor presupune gisirea unui algoritm. Din observatiile prezentate putem da o descriere a notiunii de algoritm. ee ciieis i : ‘ Prin algoritm injelegem o: succesiune: de operagii (aritmetice, de) comparare, etc.) care se.efectueazd de‘un numdar finit:de:ori si care | i pornind de la. anumite. date'de intrare, ne conduc la anumite: date de. legire:ce rezolva-o eure : ‘ : 4 reas cecelel deer Pentru fiecare dintre problemele urmitoare ‘se cere sA se ‘scrie un algoritm de rezolvare, ca in exemplele prezentate anterior (precizand fiecare etap&). 1. Se dau doud numere naturale, se cere si se precizeze care dintre ele este mai mare, 2. Cunoscind lungimea gi latimea unui ‘dreptunghi, se cere sa se determine aria si perimetrul. 35 fntr-o sApiiman’. Alexandr strange o sum’ de bani. CunoscAnd cat a strans in fiecare zi, determinati suma de bani. 4. — fn ciclul primar Ionut a participat la diferite concursuri strangand multe diplome. Cunoscdnd numarul de diplome obtinute in fiecare dintre cele patro clase, determinati numarul total de diplome, precum gi fn ce clasa a obtinut cele mai multe. 5. Alexandru a fnvatat submultiplii metrului. Cunoscfnd lungimea unui autoturism in metri, deteriminati lungimea acesteia in decimetri, centimetri si in milimetri. 6. La un pare de distractii exist’ o reducere de 50 la.-suta. la bilete pentru grupurile de persoane, dacé numarul de persoane este. cel putin. de 20. Cunoscand pretul unui bilet (fri reducere) si: numarul de persoane dintr-un grup, se cere si se determine cat va pl&ti pe bilet o persoan’ (evident, din grup). Ts Se da un numér natural. Se cere sd se verifice daca este cifra sau nu: fn capitolul anterior am vazut un mod de reprezentare a algoritmilor, in care fiecare etap& este descrisd in cuvinte care arata actiunile (numite instructiuni) ce se realizeaz’, ca de exemplu: asocierea de valori unei variabile, conpararea -unor date, trecerea de la o etapa ja alta (dacd nu se precizeaz’ explicit trecerea la 0 anumita etapa, atunci se face trecerea automat la etapa uimiatoare — in acest caz.se spune c& actiunile se efectueazi secvential), etc. Modul acesta nu este agreat is calculator, ‘find necesara ‘transcrierea algoritmilor intr-un limbaj de programare rezultatul fiind un program: Rolul limbajelor de programare este de a obtine o modalitate de reprezentare a algoritmilor, care s& fie standardizata. Pentru acest lucru se folosese cuvinte din limba ‘englez4 impreuna cu un set de reguli, care trebuie respecte, in caz contrar algoritmii (programele) nu functioneaz’. Dintre cele mai utilizate limbaje de programare amintim: Pascal, C, C++, Java si Basic. Dintre acestea, cel mai usor dé invatat este limbajul: Pascal. 1 amele acestui limbaj a fost dat in memoria lui Blaise Pascal — mare matematician, fizician si filozof francez, care a trait in secolul al XVII-lea si printre multele contributii la dezvoltarea stiintelor exacte este gi creatorul unui calculator mecanic, capabil si efectueze operatii aritmetice. Pentru fnceput, vom prezenta programe care lucreazi numai cu_ date constante. Limbajele de programare au destule asemanari cu limbile studiate: englezi, francezi, romani — in sensul c& trebuie respectate’ anumite reguli, se utilizeaza cuvinte cu semmnificatie precizata, caractere, etc. Limbajul Pascal foloseste literele alfabetului englez: a, b, ¢, d,..., z, A, B,C, D,..., Z, cifrele 0, 1, 2, ..., 9, caracterele speciale _,+,-,*,/,<, >, =, 5 ;, virgula, spafiul (numit si blanc). Pentru a realiza anumite actiuni se folosesc cuvinte din limba englezi (numite cuvinte cheie) care au o anumitd semnificatie, dintre acestea amintim: program, begin, end, var, type, const, write, writeln, read, xead1n si multe altele pe care le vom prezenta la momentul potrivit. fn limbajul Pascal scrierea cu litere mari sau mici nu conduce la interpretarea diferiti a cuvintelor cheie sau a altor notiuni (de exemplu, begin sau BegiN are aceeasi semnificatie). in continuare datele de intrare vor fi preluate de la tastatura, iar cele de iegire . vor fi afigate pe ecran. Datele constante pot fi clasificare, pentru inceput in dou’. Prima categorie este alcatuita din date numerice (numere naturale <2147483648, exemplu: 2301), iar cea de-a doua categorie este alc&tuit’ din caractere si siruri de caractere (acestea find precedate si urmate de caracterul apostrof, exemple: ,’a’, *primul program’,’0 este cifra cea mai mica’). Prima instructiune pe care o prezentiim este write. Aceastd instructiune permite afisarea datelor pe ecran, avand doua forme: write (date) writeln (date) fn fiecare dintre aceste doua instructiuni, date trebuie inlocuit cu date constante (dacd sunt mai multe, atunci ele sunt separate prin cate o virgula). Prima varianta afiseazii datele pe acelasi rand lasand cursorul dupa ultimul caracter afisat (la o noua utilizare a acestei instructiuni se vor afisa datele in continuare pe acelasi rand), A doua varianta este diferita de prima prin faptu! c& mut& cursorul pe randul urmator, fnainte de a da primul exemplu precizim faptul cA dupa fiecare instructiune se pune caracterul punct si virgula. Situatiile cand nu se va pune acest caracter vor fi precizate la momentul potrivit. Exemplul 2.1. Priviti instructiunile de mai jos: Write(‘Florin mananca ‘, 2, ‘covrigi si ‘, 3, ‘banane’); Writeln (12345) ; Writeln(’Doru alearga’); Efectul acestor instructiuni este ci pe ecran apar caracterele: mananca 2covrigi si 3banane12345 Doru alearga fn continuare vom prezenta forma generald a-unui program in limbajul Pascal, care utilizeazi numai instructiunile write si writeln. Facem precizarea c& in capitolele urmatoare vom invata alte instructiuni si nofiuni ce vor conduce la programe mai complexe. program numeprogram; begin instructiuni end. Cuvintele cheie begin si end corespund primei si ultimei etape din algoritmii prezentati in capitolul anterior. instrucftiuni trebuie tnlocuit cu una sau mai multe instructiuni write sau writeln. numeprogram trebuie inlocuit cu un gir de caractere (litere, cifre, caracterul _» primul caracter nefiind cifri si nu confine spatii). Remarcém faptul ca linia Program numeprogram; poate lipsi, fiind optional, rolul ei fiind acela de a da o denumire programului prin care s& se stie ce se rezolva cu el. Exemplul 2.2, Sa se scrie un program care s& aiba ca efect afigarea pe ecran a urmatoarelor caractere: ; : * *# OR we program stelute; begin writeln(*‘*'); writeln (‘**"); writeln(‘***'); write (S*eee!) ; end. 1. Scriefi un program Pascal care s& afigeze pe ecran toate cifrele pare, una sub alta. 2. Sa se sctie un program care s& afiseze pe prima linie numele si prenumele vostru, pe a doua linie clasa si numele dirigintelui, iar pe linia urmitoare, numele gcolii. 3. S& se scrie. un program care: afigseazi pe prima linie literele. mici ale alfabetului englez, iar pe linia urmatoare literele mari. 4. Scrieti un program care s& afigeze pe ecran, unul sub-altul, cel mai mare gi cel mai mic numar format din trei cifre distinete. §. Scrieti un program care si afigeze toate numerele naturale formate din douad cifre, care se impart exact la 10, in ordine descrescatoare pe aceeasi linie, cu un spatiu intre ele. 6. Screti'un program care’s& afigeze cifrele 1, 2, 3, 4, 5, 6, 7; 8,°9,.0 pe acecasi linie cu un spatiu intre ele, iar pe linia urmatoare caracterele de pe: tastele care se gasesc deasupra acestor numere (!, @, ...). 7. Sase scrie un program care s& afigeze expresia 1+2+3+..tn=n (n+1) /2. Nee Ta generale despre medii de Piel es as a ea eae Cnet Pana Ja a vedea pe ecran rezultatele furnizate de un program, avem nevoie de cfteva cunostinte despre mediile de programare. tn continuare, voi prezenta cAteva notiuni despre mediul Borland Pascal, cel mai utilizat in scoli gi licee, Mediile de programare contin mai multe componente, dintre care amintim: - un editor de texte; - uncompilator. Editorul de texte permite scrierea, salvarea, modificarea fisierelor care contin programele scrise in limbajul Pascal, precum si lucrul cu mai multe ferestre, Compilatorul permite verificarea corectitudinii sintactice a programelor, avertizand si dand indicatii in legdtura cu erorile gasite, precum si crearea automata a unor fisiere utile executiei programului. Executia programului presupune deschi- derea unei ferestre (de intrari/iesiri) in care se cere introducerea datelor de intrare gi se afigeaza datele de iegire. Bx fn continuare, prezentim varianta DOS a interfetei mediului Borland Pascal, preferat’i de multi programatori (vezi Fig. 3.1). Pentru a se deschide aceast’ fereastra; trebuie si lans’im in executie fisiéful »bp.exe”, care de obicei se gaseste in folderul ,,C:\BP\BIN”. Fig.-3.1. Interfata mediului Borland Pascal Se observa existenfa unui mentu principal, care se activeaz4 prin tasta F10, deplasarea in el ficdndu-se cu ajutorul sigetilor (sau direct cu-mouse-ul). Pentru scopul nostru, util in prim’ fazi este meniul File (vezi Fig. 3,2), care ne permite: - & deschidem o fereastr lows (New) in care vom scrie un program, cu numele implicit , NONAME00.PAS”; - sideschidem un fisier (Open); -.* § salvam (Save, Save As, Save All) inir-un fisier programele din ferestre; - 'siralegem-un folder (Change dir) unde se vor prelucra figierele; - $8 iegim (Exit) din’mediul de programare, BY Borland Pascal 7.0. | : lo)x} Oper Save Save as... Save all Change div... Print Printer setup... DOs shell Exit Alt+k Fig. 3.2. Meniul File Pentru programul! scris in capitolul anterior gi salvat cu numele »Stelute.pas” avem: Fig, 3.3, Exemplu de program Lansarea in executare si verificarea corectitudinii sintactice (din punct de vedere al scrierii instructiunilor) se realizeazi prin combinatia de taste etrl + F9, Efectul acestei comenzi este scrierea in fereastra input/output a datelor de iegire: Copyright (ce) 1983,92 Borland Int Fig. 3.4. Rezultatul in-urma rularii programului Vizualizarea acestei ferestre se face prin combinatia de taste alt + FS, iar iesirea din. ea prin apdsarea unei taste, de exemplu Enter. Pentru lucrul cu mai multe feréstre mai trebuiesc refinute combinatiile de taste: > alt + F3, care permite inchiderea unei ferestre (cea in care ne gasim); > alt + numir_fereastra, care permite trecerea in fereastra cu numéarul respectiv (fiecare fereastri are asociat in mod unic un numér natural, Scris pe marginea ei in dreapta sus), Pentru a va obisnui cu acest mediu de Programare, ar fi util ca toate programele necesare rezolvarii problemelor din capitolul anterior, s& le Scrieti, sa le verificati si apoi sa le salvati. _ Notiunea de variabila. Citirea datelor poe ilaclc Variabilele se caracterizeaza prin faptul ci pe pareursul unui program isi pot modifica valoarea. O variabila se poate descrie prin: - nume, adicd o succesiune de caractere (litere mari si mici alé alfabetului englez, cifre zecimale, caracterul _ , primul caracter nefiind cifra); - tip, care di informafii privind multimea valorilor pe ‘care ‘le poate lua variabila, precum gi operatiile care se pot efectua cu ea; - valoare, la un moment dat o variabili poate si aibi o singura valoare de tipul precizat la declararea ci; - adresi, in memoria calculatorului pentru fiecare variabili compilatorul aloca automat o portiune din aceasta. Pentru inceput, vom prezenta doar tipurile intregi. Acestea sunt: * shortint, pentru numere din multimea {-128, “TQ7yiseg Oy 1,256... 127}5 * byte, pentru numere din multimea {0, 1, 2, ..., 255}; ¢ integer, pentru numere din multimea {-32738,-32737,...,0,1,2,.. +32767}; ¢ word, pentru numere din mulfimea {0, 1, 2, ..., 65535}; * ilongint, pentru numere din multimea {-2147483648, -2147483647,..., 0, 1, 2, ..., 2147483647}, Cu date de tip intreg se pot efectua operatii de comparare (rezultatul putdand fi adevarat sau fals) si operatii aritmetice, ‘ Operatiile de comparare sunt; <, >, <= (mai mic sau egal), >= (mai mare sait egal), = (egalitate), <> (diferit), : Operatiile aritmetice sunt: + (adunare), - (scidere), * (inmultire), / (impartire, rezultatul putand fi un numar cu zecimale), div (catul operatiei de imp§rtire) si mod (restul operatiei de impartire). Exemplul 4.1. Analizati operatiile urmatoare: 7 <7 este falsa 8<=7 este fals% 87<>86 este adevarata 23=12 este fais 23 div. 6 are ca rezultat 5 23 mod 6 are ca rezultat 3 843 are ca rezultat 11 Pentru a putea folosi ‘variabile in cadrul unui program, acestea trebuie declarate 1a fnceput folosind tipul corespunzittor, precedate de cuvantul cheie var (inainte de primul begin). Exemplul 4.2. Pentru probléma “Numere consecutive” din primul capitol ar trebui s& avem declaratiile: var a,b: integer; © Dac& avem mai multe variabile de acelasi tip, atunci declararea lor se face prin enumerarea numelor (separate prin virgula) si scrierea tipului o singura data, ‘© Nu pot exista in acelasi program dou variabile cu acelasi nume. * Numele variabilelor si tipul lor sunt separate prin caracterul “:”, Valoarea unei variabile poate fi schimbata prin doua instructiuni: atribuire si citire. Instructiunea de atribuire are forma generala: nume_variabild := éxpresie unde expresie are ca rezultat o dati de acelagi tip cu variabila. Exemplul 4.3. Dacd a si b sunt declarate ca ih exemplul anterior, atunci urmétoarele atribuiri sunt corecie: Dup aceste atribuiri a va avea valoarea 19, iar b valoarea 2. Citirea datclor_de la tastatura’ se poate realiza prin instructiunile read si xeadin care au formele generale: read( lista_nume_variabile) readin( lista_nume_variabile) Cele doud instructiuni au ca efect citirea datélor de la tastaturt (exact cate sunt tn list) gi atribuirea valorilor Citite, variabilelor. Este obligatoriu ca datele citite s% aiba acelasi tip cu cel al variabilelor, Prima variant’ lash cursorul pe acelasi rand, imediat dupa ultima data introdusii, iar a dova mutad cursorul pe linia urmitoare. Exemplul 4.4, Pentru variabilele x, y si suma declarate astfel var x,y,suma:longint; instructiunile urmatoare write (‘a=’); readin (a); write (‘b=’); read {b) ; suma ;=a+b; conduc la citirea unor date pentru a gi b (precedate de aparitia in fata acestora a caracterelor a=, respectiv b=) si apoi atribuirea valorii sumei a+b variabilei suma. © inir-o atribuire mai intdi se evalucazi expresia din partea dreapti si apoi valoarea acesteia se atribuie variabiléi, s + ih rezolvarea problemelor prin programe, trebuie si se aibi in vedere rezultatul operatiilor, pentru a se alege un tip de data suficient de mare (ca de exemplu, Longint). Cand se citese date intregi de la tastaturi cu aceeasi instructiune, acestea trebuie separate prin cAte un spatiu, Este de preferat folosirea instructiunii readin, pentru ca urmatoarele citiri sau afisari si se fact de pe un rand nou. © De obicei, la sfarsitul programului (fnainte de end.) se foloseste intructiunea readin, pentru a rimdne in fereastra input/output. in acest fel putem vizualiza datele de iesire, trecerea tn fereastra ce confine programul facdndu-se prin apasarea unei taste. 1. Se dau de la tastatura dou numere naturale cu maxim 7 cifre. Afisati citul si restul imp&rtirii primului numar citit la al doilea. Exemplu: pentru numerele 57 si 7 se va afisa: cat=8 rest=1 Solutie. Vom folosi doua variabile, a sib de tip longint pentru citirea numerelor (datorité numarului-mare de cifre ce pot avea numerele citite), iar pentru rest si cat inca doua variabile, x si c tot de tip Longint. program impartire; var a,b,c,x:longint; begin write('a='); readin(a); write ('"b='); readln(b); e:sa div b; risa mod b;' writeln('cat=',c); writeln('rest=' ,x) ; readin; end. 2. Se d& un numér natural cu exact patru cifre. Se cere s& se afiseze prima si ultima cifra. Exemplu: pentru numarul 5271 se va afiga: prima cifra=5 ultima cifra=1 Solutie. Vom citi numarul ta variabila x, de tip integer si determindm prima cifré prin impértire fa 1000 (luand cAtul), iar pentru ultima cifré impartim la 10 (luand restul). program prima_si_ultima_cifra; var x,p,u:integer; begin write('xs'); readln(x) ; p:=x div 1000; u:=x mod 10; writeln('prima cifra=',p); writeln('ultima cifra=',u); readin; end. 3. Se di un numir natural cu cel mult trei cifre, Se cere s& se afigeze patratul gi cubul acestui numa. Exemplu: pentru numarul x=345 se va afiga: patratul lui x=119025 cubul lui x=41063625 Solutie. Vom utiliza trei variabile de tip Longint x, p, ¢, prima pentru citirea numarului, a doua pentru pitratul lui x (adici x*x), iar a treia pentru cubul lui x (adicd x*x*x), program prima_si_ultima_cifra; var x,p,c:longint; begin write ('x='); readin (x); prax*x; C2=K*KNX; writeln('patratul lui x=',p); writeln('cubul lui x=' a); readln; end. : 1. Se dau de la tastatur& doua cifre nenule gi distincte, Afigafi cele dou numere care se pot forma cu aceste cifre. Exemplu: dacé se citesc cifrele 2 gi 7, se va afisa 27 si 72. 2. Forin are la bunici trei rate. Cititi in variabilele a; b, ¢ numirul de oud pe care le face fiecere rata tatr-o zi. Se cere s& se afigeze numérul total de oud, dupa o siptimana. Exemplu: daca se citesc datele a=3, b=1, e=3 se va afiga: Dupa o saptamana ratele dau 49 de oua. 3. Se d& un numar natural cu exact trei cifte th variabila a. Se cere si se schimbe valoarea lui a (si apoi si se afigeze) cu numéarul obfinut prin citirea cifrelor numirului initial de la dreapta la sténga, Exemplu: pentru a=437 se va afiga 734. 4. Se d& in variabila n un numar natural, Se cere si se afigeze valoarea sumei 14+24+3+...4n, Exemplu: pentru n=10 se va fisa 55 5. Se dau dou’ numere naturale cu maxim 4 cifre in variabilele a sib, Se cere Si_s¢ afiseze valoarea expresiilor a+b, a-b, a*b,a div b. Exemplu: pentru a=30. si b=4 se va afiga; 30+4=34 30-4526 30*4=120 30 div 4=7 6. Se da un numir natural format din exact 3 cifre, prima cifia mai mare strict decat 1. Se cere si se afigeze numarul obfinut prin micgorarea cu 1 a fiecdrei cifre. Exemplu: pentru numarul 318 se va afiga 207. Tipul boolean este format din dona valori true si false. Propozitiile care sunt adevarate (true) sau false se numesc propozitii boolene (sau logice). Dintre propozitiile boolene cele mai des intalnite amintim expresiile care folosesc operatiile de comparare.- Operatiile care folosesc date de tip boolean sunt: not, and, or, xor. Aceste operatii (numite gi operatori ogici) sunt perfect definite in tabelele urmatoare: x not x x ¥ x and y true false true true true false true true false false false true false false false false x x x or y x y xX xOr y true true true true true false true false true true false true false true true false true true false false [ false false false false * Operatorul not este unar (adicd foloseste un singur operand), © Operatorii and, or si xor sunt binari (adici folosesc c4te doi operanzi). Exemplul 5,1, Priviti propozitiile de mai jos: 7<8-3 este o propozitie falsi; x:=13; x*2>=20 este 0 propozitie adevarata; not ((x>10) and (x<18) ) este o propozitie falsa, Instructiunile alternative ne permit si alegem din una, dou’ sau mai multe variante una singura. Limbajul Pascal are doud instructiuni alternative if (cu doud variante) si case. Prezentim in continuare formele generale ale instructiunii i£. if expresie_booleand then instructiune si if expresie_booleand then instructiunel else instructiune2 Prima variant4 are urm&torul efect: se evalucazi’ expresie_booleand, dupa care daci valoarea este true se executl instructiune $i apoi se trece la executarea urmatoarei instructiuni (dupa if). A doua variant& are urm&torul efect: se evalueazi expresie_booleand, dupi care daci valoarea este true se executd instructiunel si apoi se trece la executarea urmitoarei instructiuni, iar dacd are valoarea false se executd instructiune?2 si apoi se se trece la executarea urmatoarei instructiuni. © {na doua varianté a instrucfiunii 4£'se executd numai una dintre cele dou’ instructiuni, fn functie de valoarea expresici boolene (niciodat’ amandoua), © fnainte de else nu se utilizeazd caracterul ;; Reeser toes 1. Se da de Ja tastaturé un numér natural n cu cel mult’9 cifre. Se cere s& se verifice daci numéarul este par sau impar. Exemple: Daca se citeste 123 se va afisa mesajul numar impar. Daca se citeste 20450408 se va afisa mesajul numar par. Solutie, Folosind operatorul mod se verificé dacd numarul retinut de variabila n este par sau impar. program paritate; var n:longint; begin write ('n='); readin(n); if n mod 2 = 0 then writeln('numar par') else writeln('numar impar') ; readin; end. 2. Se dau de la tastatura dou numere naturale cu cel mult 4 cifre in variabilele a sib. Afisati cele doud numere in ordine crescatoare. Exemptu: Daca pentru a si b’se citesc numerele 5 gi 3 se va afiga 3 5. Solufie. Se compara a cu b gi in functie de ordinca lor se afiseaz4. a b saub c. program crescatoare; var a,b:integer; begin write('a='); readIn(a); write('b='); readin (b) ; if a>b then writeln(b,' ',a) else writeln(a,' ',b); readin; end, 3. Se citeste de la tastatura un numér natural cu exact trei cifre. Se cere si se afiseze cel mai mare numér care se poate obtine cu cifrele numarului citit. Exemplu: Pentru numarul 293 se va afisa 932. Solufie. Dupa citirea numérului in variabila a, de determing ultima cifra, prima cifra si cifra din mijloc in variabilele u, p si m. Apoi, se iau in considerare toate cazurile (6 cazuri) in functie de ordinea lor. program numar_mare; var a,u,p,m:integer; begin write ('numar cu trei cifre=') ; readin (a) ; ur= mod 10; div 100; PB M:=(a-p*100) div 10; if p>m then if m>u then writeln(p,m,u) else if p>u then writeln(p,u,m) else writeln(u,p,m) else if p>u then writeln(m,p,u) else if m>u then writeln (m,u,p) else writeln(u,m,p) ; readin; end. 3. 4. 8. 10. Se dau dowd numere naturale cui cel mult 9 cifte fiecare. Se cere si sé afigeze acel numéar care are ultima cifrd mai mare. Exemplu: dacd se citesc numerele 234 gi 128 se va afiga 128, Se dau dowd numere naturale cu cel mult 5 cifre fiecare. Se cere si se inmulfeascA cel mai mare cu 2, iar cel mai mic cu 3, dup& care s& sc afigeze suma lor. Exemplu: dacé se citesc numerele 10 gi 30 se va afisa 90. Se dau dowd numere naturale cu cel mult 4 cifte fiecare, Se cere sh se verifice daca primul se tmparte exact la al doilea (se va afiga DA sau NU). Exemplu: daci se citesc numerele 101 si 30 se va afiga NU. Elevii clasei a V-a A se impart in trei categorii buni, medii gi slabi la invaatura in functie de media generali obfinuta la sfarsitul semestrului I. Prima treime sunt considerafi buni, a doua treime sunt considerati medi, iar cei din ultima treime, slabi. $tiind cAti elevi sunt in clas gi a cita medic. are Alex, determinafi in ce categorie se gaseste. Exemplu: dacd in clasd sunt 25 de elevi, iar Alex este al 3-lea, se va afisa buni. Dupé ce s-au jucat, Florin si Alex s-au culcat, CunoscAnd ora si minutele cand s-a trezit fiecare, se cere sii se precizeze care dintre ei s-a trezit primul. Exemplu: daci Florin s-a trezit la ora 16 gi 30 minute, iar Alex la ora 16 si 17 minute se va afiga Alex. : D&ndu-se un numér natural cu maxim patru cifre in variabila n, se cere si se afize cate numere impare sunt mai mici sau egale cu n. Exemplu: pentru numarul 13 se va afisa 7. Dandu-se dou’ numere naturale cu maxim patru cifre fiecare in variabilele a $1 b, se cere sa se afigeze cate numere impare sunt mai mici sau egale cub si mai mari sau egale cu a. Exemplu: pentru numarul a=10 gi b=19 se va afiga 5. Se da un numr natural cu maxim 9 cifte in variabila n, Se cere se determine ultima cifra a produsului 1+2+3+..+n, Exemplu: pentru numirul 11 se va afiga 0, Se da un numar natural cu maxim 9 cifre in variabila n. Se cere si se determine ultima cifta a puterii 9°, Exemplu: pentru numirul 5 se va afisa 9. Se dj un numir natural cu maxim 9 cifre in variabila n, Se cere si se determine ultima cifrd a puterii 3", Exemplu: pentru numirul 5 se va afisa 3. Instructiunea cae gerne re PEE ew a nn Instructiunea compusa se foloseste, atunci cand vrem sa folosim doua sau mai muite instructiuni in cadrul altei instructiuni. Forma generala a instructiunii compuse este begin instructiuni end Exemplul 6.1. Sa presupunem ca x, y, min, max sunt variabile de tip integer. Programul urm&tor determin’ cea mai mic’ gi cea mai mare valoare dintre x si y. program min_max; var X%,y,min,max: integer; begin write ('x='); readin (x); write ('y='); readin (y); if x>y then begin min:=y; max:=x end else begin min:=x; max :=y; end; writeln('min=',min,' max=',max) ; readin; end. fn afari de instructiunea if, mai existi o alti instructiune. alternativa gi anume case, Spre deosebire de if, case permite alegerea dintre mai multe variante. Formele generale sunt: case optiune of git_constantel : . instructiunel ; sit_constante2: instructiune2 ; case optiune of sir_constantel: instructiunel ; sir_constante2: instructiune2; . sir_constantek: instrucfiunek; sir_constantek: instructiunek; end else instructiune end unde optiune este o expresie de tip integer (sau char — tip de date'ce va fi studiat in capitolele urm&toare), instructiune, instructiunel, ..., instructiunek pot fi orice instructiune, iar sir_constantel, sir_constante2,..., sir_constantek pot fi constante de acelagi tip cu optiune separate prin caracterul virgula si constructii de forma n. .m, cate reprezint4 practic numerele naturale n, n+1, n+2,.... m (unde n si m sunt numere de tip integer, cu n pentru vara 156. .250 (iunie, iulie, august); - pentru toamna 251, .334 (septembrie, octombrie, noiembrie). program anotimpuri; var k:integer; begin write (‘introduceti o gi din an (1,2,...,365) "); readln(k) ; case k of 1..60, 335..365: writein('iarna'); 61. .155:writeln('primavara') ; 156..250:writeln('vara'); 251. .334:writeln('toamna') ; else writeln('numarul nu corespunde nici unui anotimp') end; readin end, 2. Se dau dou’ numere naturale in variabilele de tip integer a,b gi © operatic codificatt astfel: 1 pentru +, 2 pentru -, 3 pentru * si 4 pentru div. In felul acesta se pot fornia expresiile E=a+b, E=a~b, B=a*b, E=a div b, Se cere si se afigeze valoarea expresiei E. Exemplu: pentru numerele a=5, b=2 gi operafia 2 (adicd sc%dere) se va afisa B=3. Solutie. Vor folosi 0 variabila op de tip byte pentru a refine operatia ce trebuie efectuaté. Cele patru situatii sunt incluse in instructiunea case, ramura else permite atentionarea cAnd se introduce un numiar diferit de 1, 2, 3, 4. Pentru a opri execufia programului in aceasti situatie extrema se va folosi instructiunea halt: Prog: ram expresie aritmetica; var a,b,E:longint; begi: op: byte; n write ('a='); readin(a); write ('b='); readin (b) ; write ('optiune (1 pt, +, 2 pt. -, 3 pt. *, 4 pt. div) '); readin (op) ; case 1: 5 2: £ 3:5 4: 5 als beg: wr re ha. end end; writeln('E=', end. op of :=atb; :sa-b; ma*b; i=a div b; ‘e in iteln('operatie inexistenta’') ; adin; lt; E); readin; 1, Se da de la tastaturé un numiar natural cu maxim trei cifre in variabila a. Se cere si se afigeze valoarea’unei expresii conditionata de o optiune citita de la tastatura in variabila op, dup’ cum urmeaza: a”, dac’ op=1; a? + a5, dacd op=2; a? + a® + a‘, dact op=3, respectiv a? + a? + a’ + a° pentru op diferit de 1, 2 si 3. Exemplu: pentru a=2 si op=3 se va afisa 28 (adic valoarea expresiei 2? + ae 4°24), . i Se da in variabila k un numér natural cuprins intre-1 si 365 reprezentand numarul unei zile dintr-un an care nu este bisect. Afigati luna din care face parte ziua respectiva. Exemplu: pentru numarul 350 se va afiga decembrie: Folosind instructiunea case se cere s& se determine ultima cifra a produslui m- (m+1) + (m+2) -,+9,unde valoarea variabilei m se citeste de la tastaturd (numér natural nenul <10). Exemplu: pentru m=8 se va afisa 2. Se da de la tastatura un numéar natural format din trei cifre. Se cere sa se schimbe intre ele cifta sutelor cu cifra unitafilor, daci numérul este par, iar dac& numarul este impat, cifra zecilor cv cifra sutelor. Exemplu; péniru numarul 123 se va afisa 213, iar pentru numamul 124 sé va afiga 421. Se da dela tastatura un numéar natural cu trei cifre, Se cere sti se afiseze suma ciftelor gi cifra cea mai mica, dac& numéarul este par, respectiv produsul cifrelor gi cifra cea mai mare in cazul cand numarul este impar. Exemplu: pentru numirul 523 se va afiga 30 si 5, iar pentru: 524 se va afiga 11 si 2. Bren acl Co Tipul char. este alcdtuit din caracterele codului ASCII (denumirea vine de la inifialele cuvintelor American Standard Code. for Information Interchange). Initial, acest cod era format din 128 de caractere, apoi s-a extins la 256, Dintre aceste caractere cele cu codul cuprins intre 0 gi 32 sunt neimprimabile. Faptul ca fiecare caracter are asociat un cod. (numar natural de la 0 la 255) conduce la ordonarea caracterelor (dupa cod). Un caracter este mai mare decAt altul daca primul are codul mai mare. Pentru inceput, ne vom margini la caracterele cu codul intre 32 si.127, acestea fiind.cele mai utilizate. lA ie | IB lo e_ ic: Ic HE D - Ia Ss IE le % IF ff [5 iS ek i HL Ih ( IT - “ad ) [74 J. 106 il 42 e (75 IK LOT IK 43 + 76 IL 108 jl 44 a aT 109 ica. 45 = [78 IN 10 In 46 z [79 |O LIL Io a7 iy 80 P a2 5 a6 0 81 a nS ey 49 i 82 IR’ 114 ie SO 2 83 Is 115 Is ee 3 B4 Ir L16 te “52 4 IB lu Ley. (u. 53 5 186 118 lv 54 é 87 iim is la BS 7 a8 Tiz0 be 5 ig 89 iv 121 ¥ 57, _e 160 iz 122 a 58 z 91 C 123 { 59 ? 92 N\ 124 I 60 tlc a3 ] 125 } G1 FI 94 a 126 bh 62 > 95 27 DEL> 63 ie 96 y 64 @ fn limbajul Pascal putem utiliza caractere ale tipului char folosind caracterul apostrof inainte si dupa acestea. De exemplu, ‘a’, ‘G', .*", ‘=". * Dact x este de tip chax, putem determina codul su notat cu n (care este un numa natural de tip byte) astfel: n:=ord (x). Reciproc, daci cunoastem codul n asociat unui caracter, putem determina caracterul x (de tip char) astfel: x:=chr (n). Exemplul 7.1. Secventa de program: var x,y:char;n,m:byte; ¥ m n:=#ord(y) ; writeln(x,’ ‘,y); m:=60; n:=125; x:=chzr (m) ; y:=chr (n); writein(x,’ ‘,y); afigeaz@ pe ecran: 97 65 < Comentariile in limbajul Pascal sunt secvente de caractere precedate de caracterul ( si urmate de caracterul }. Asupra programului aceste caractere nu au niciun efect, rolul lor fiind de a face mai ugor de inteles algoritmul, Exemplul 7.2. O linie de program care contine un comentariu: write ('a='); xeadln(a); {citirea unui numar natural} 1, Se dau doua litere mici din alfabetul englez. Se cere sd se afiseze literéle.in. ordine alfabetic’, una sub alta. Exemplu: pentru literele t si d se va afisa: da & Solutie, Folosim dou’ variabile de tip char, a si b in care citim-doua catactere, apoi comparam caracterele direct sile afisam in ordine alfabeticd. program litere; var a,b:char; begin write ('prima litera '); readln(a); write('a dova litera '); readln(b); {compar caracterele citite} if a>b' then begin writeln (b) ; writeln (a) end else begin writeln (a); writeln (b) end; xeadin end. 2. De la tastatura se dai un caracter. Se cere s& se verifice daca caracterul dat este sau nu cifra in baza 10, Exemplu: pentru caracterul 2 se va afiga DA, iar pentru | & se va afiga NU. Solutie. Vom folosi variabilele: x de tip char in care citim caracterul, n de tip byte pentru codul ASCII asociat caracterului si sw de tip boolean, care va fi true, daca caracterul citit este cifr, respectiv false, contrar. program caracter_cifra; ‘ var x:char; n:byte; sw:boolean; begin write ('Introduceti un caracter '); readln(x); n:=ord (x) ; if (48<=n) and (n<=57) then {verific daca x este cifra} sw:=true else sw: =false; iff sw then writeln('DA') else writeln('NU'); readin end, facut eee 1. — Seda un-caracter de la tastatura. Se cere sd se afiseze codul ASCII al sau. Exemplu: pentru caracterul A se va afisa 65. Se da de la tastatur’ un numr ‘natural mai mare sau egal cu 32 si mai mic sau egal cu 255. Se cere si se afigeze caracterul care are codul ASCII egal cu numéarul citit. Exemplu: pentru numéarul 65 se va afisa A. Se da de la tastatura un caracter. Verificati dac& caracterul citit este liter’ mare, Exemplu: pentru caracterul H se va afisa DA, pentru caracterul %-se va afisa NUL Se d& de la tastatura un caracter. Verificati daca caracterul citit este litera mica. Exemplu: pentru caracterul h se va afiga DA, iar pentru caracterul + se va. afiga NU. Se da de la tastatura un caracter. Se cere s& se verifice dac& caracterul citit este operatie aritmetica (*, +, -, /). Exemplu: pentru caracterul / féspanail este DA, iar pentru # raspunsul este NU. a 2% Se citesc trei litere mari in’trei -variabile. Venincap daca cele trei litere sunt citite in ordine alfabetica. Exeimplu: pentru literele a, F, M rispunsul. este DA, iar pentru iutetele C, A, P rdspunsul este NU. Se dau de la tastatur’ dou’ cifre in variabilele a,.b si.un operator in variabila op de tip char (dintre *, +, -, /). Se cere s& se afiseze valoarea expresiei a op b. Exemplu: pentru cifrele 7 si 5, respectiv operatorul + se va afiga 7+5=12. Sirurile de caractere sunt secvente de caractere din codul ASCII precedate si urmate de caracterul apostrof. Numarul de caractere dintr-un sir de caractere se numeste lungimea sirului de caractere si nu poate dep&si 255. Tipul string este alcdtuit din siruri de caractere (numite pe scurt string-uri). Se pot folosi dou& variante ale acestui tip: string string[k] unde k este o constant, numir natural nenul mai mic sau egal cu 255. Variabilele declarate prin a doua forma nu pot retine giruri de caractere mai lungi decat k. Schimbarea valorii uniei variabile de tip string se poate realiza prin citire de Ja tastaturé sau prin atribuire direct. CAnd se citeste de la tastaturA un sir de caractere trebuie s4 introducem fiecare caracter unul dupa altul (fara spatii intre ele) si apoi tasta , pentru a incheia citirea. Sirurile de caractere se pot compara. Daci ne-am imagina -girurile de caractere ca find cuvinte intr-un dictionar, am avea o ordine a lor, Insa, tipul string confine siruri de caractere care nu sunt neaparat litere, dar toate pot fi gandite ca litere ale unui alfabet mare cu 255 de litere (ordonate prin codul ASCH). In general sirul de caractere x este mai mare decét sirul de caractere y, daca este indeplinit% una din conditiile: - yeste mai scurt decal x gi y apare integral la inceputul lui x (de exemplu, ‘popescu’ >’ pop’); - primele k-1 caractere din x sunt egale cu primele k-1 caractere (in aceeasi ordine) ca cele din-y, iar caracterul de pe pozitia k din x are codul ASCII mai mare ca cel de pe aceeagi pozitie din y (de exemplu, “ana_are’<'ana nare‘, pentru ci ‘\a’<'n’, iar pani la aceste caractere toate celelalte sunt egale). Lungimea unui sir de caractere x se determina prin constructia Length (x). Exemplul 8.1, Analizati secventa de program de mai jos: var x:string;n: integer; ='TIon'; n:=length (x) ; write (n); Dupa execufia acestei secvente de program se va afiga 3. Specific tipului string este operatia de concatenare, prin care la un sir de caractere se pot lipi caracterele altui sir de caractere. Operatia aceasta folosegte simbolul +. Exemplul 8.2, Priviti secventa de mai jos: var a,b: string; ‘Popescu ‘; Ion Alexandru’ ; :=atb; write (a); Aceasta secventa de program afigazii pe ecran sirul de caractere: Popescu Ion Alexandru Problemé 1. Se dau de Ja tastatura prenumele a doi elevi (cu maximum 40 de caractere). Se cere si se afiseze numele elevilor in ordine alfabeticd (cresc&toare), unul sub altul. : Exemplu: pentru urmitoarele prenume Alexandru si Alin se va afisa: Alin Alexandru Solutie. Prenumele elevilor le retinem in variabilele x si y de tip string[40], apoi se compara gi se afigeazi alfabetic. program siruri_ordonate; var x,y:string[40]; begin write('primul sir de caractere=') ; xeadln (x) ; write('al doilea sir de caractere='); readin (y) ; if x>y then begin writeln (y) ; writeln (x) end else begin writeln (x) ; writeln(y); end; readin end, Se citesc trei siruri de caractere, Se cere s& sc afigeze cel mai lung dintre ele (dact& sunt mai multe siruri de caractere cu lungime maxima se va afisa unul dintre ele). Exemplu: pentru. sirurile de caractere dana, anca, dinca se poate afisa unul dintre sirurile dana sau anca. 3 Solutie, Vom citi sirurile de caractere in variabilele x, y, z de tip string. Variabilele care retin lungimile sirurilor de caractere citite Lx, Ly, Lz sunt de tip byte. . Pentru a gasi sirul de caractere cel mai lung, mai folosim doua variabile max de tip string si Lmax de tip byte pentru lungimea lui. Initial max este x, iar Lmax este Lx, dup& care se compara lungimea girului de caractere retinut in max cu lungimile sirurilor de caractere retinute in y si z, modificéndu-se (max si Lmax) daca este cazul. program siruri_ordonate; var begil “,V,2%,Max:string; Lx, Ly, Lz ,Lmax: byte; n write('primul sir de caractere='); readln (x) ; write('al doilea sir de caractere='); readin{y) ; write('al treilea sir de caractere='); readln(z) ; Lx:=length (x); Ly:=length(y); Ly:=length(z) ; max: * Lmax:=Lx; if Imaxvé, atunci instrucfiune nu se executd niciodat’. | Dacd contor este de tip char se trece de la o valoare la alta folosind codul ASCII (de exempiu dupa ‘a’ vine ‘b’, apoi ‘c’, ete.). Exemplul 10.1. Se consider’ variabilele s, p gi i de tip integer. Secventa de instructiuni din stanga este echivalenti cu cea din dreapta. end; writeln(s,;"' ‘,p); se afiseaza 14 si 120 Efectul celei de-a doua variante este de a executa repetat Instructiune, prima dat4 pentru contor cu valoarea vi, apoi cu valoarea vi-1, ..., ultima dati cu valoarea vf. Dupa ce se iese din instructiune, contor are valoarea vi-1. Observatii © Daca vi0 do begin $:=8+x%;p:=p*x; if max9 si x<100), folosind variabila k. Cand gisim un astfel de numir se mireste k cu 1 (initial k are valoarea 0). program numere_cu_doua_cifre; var x,k:integer; begin k:=0; write ('nr='); readin (x); while x mod 2=1 do begin if (x>9)and(x<100) then k:=k+1; write ('nr=') ;readin (x) ; “end; writeln('Numarul de numere cu exact doua cifre t eh readin end. 3. Se citesc.mai multe caractere, Citirea se incheie prin introducerea caracterului *, Se cere s& se afigeze numarul de vocale citite (litere mari sau mici). Exempiu: pentrn caracterele t, u, A, C, 7, U, i, *,.se va afiga 4. Solutie. Vom citi caracterele in variabila ¢ de tip char. Citirea se face repetitiv, cat timp caracterul din c este diferit de caracterul *. Numararea vocalelor se tealizeaz& folosind variabila k (care initial are valoarea’0). Pentru a verifica daca caracterul din-c este vocala folosim instructiunea case, care Be prima ramurd ate toate vocalele mici, iar pe a doua vocalele mari. : Program nr_vocale; var cichar; ° k: integer; begin k:=0; write('caracter='); readln(c); while c<>'*!' do begin case'c of ‘at,tet, it tot tut: k:=k+1; "AY EV, ILIV Outs kisktl; end; © : write ('caracter=') ; readin (c) ; end; writeln('nr, vocale=',k); readin end. propuse i. Se d&,un numir natural nenul in variabila n. Se cere s& se-calculeze suma numerelor impare mai mici sau egale cu n, parcurgand aceste numere,cu 0 instructiune while. Exemplu: pentru numarul 12 se va afiga 36 (pentru c& 14345474 9+11=36). a Se dau de la tastaturé mai multe numere naturale cu maxim 9 cifre fiecare. Citrea se incheie cu 0. Se cere sd se afigeze cel mai mic numar nenul citit. Exemplu: pentru sirul de numere 23 12 11 8999 0 se va afiga 11. 3. Se citesc numere naturale (cu maxim 9 cifre) pan’ cind se introduce: un numir care are ultima ciffi 0. Se cere s4 se determine cite numere cu exact trei cifre distincte s-au citit. ; Exemplu: pentru girul de numere 12 123 56 454 3901 673 10010 se va afiga 2 (in sir numerele cu exact trei cifte, toate diferite sunt 123 gi 673). 4. Se d& un numir natural in variabila x. Se cere sa se afigeze toate numerele naturale impare mai mici sau egale cu k, in ordine crescdtoare folosind o instructiune while. Exemplu: pentru numarul 12 se va afigal 3.5 7 9 1. 5. Se di un numir natural in variabila -k. Se cere sa se afigeze toate riumerele naturale impare mai mici sau egale cu k, in ordine descrescdtoare folosind o instructiune while. Exemplu: pentru num&rul 12 se va afiga11.9 7 5 3 1. 6... Se citesc caractere pan’ cdnd se introduce caracterul *. Se cere s& se afigeze numérul de cifre citite. Exemplu: pentru sirul de caracter asadi2re45%12/6 (*.se.va afisa. 6. Ts Se citesc caractere pana cAnd se introduce caracterul *. Se cete si se afigeze numéarul de litere mici. ‘ Exemplu: pentru girul de caracter aRadi2re45%12/« (* se va afiga 5. 8. Se citesc caractere pana cAnd se introduce caracterul *. Se cere si se afigeze numérul de litere mari. : Exemplu: pentru girul de caracter aRad12rXe45%12/6 (* s¢ va afisa 2. 9 Se dau dou numere naturale in variabilele k gi h, cu k='0')and(c<='9') then nr:=nr+1; until c='%'; writeln('numar cifre ',nxr); readin end. 3. Se di un numér natural cu maxim patru cifre in variabila n si'o.ciffS in variabila k..Se cere s& se calculeze suma numerelor naturale divizibile cu k, care sunt mai mici sau egale cu n. Exemplu; pentru numerele 23 gi 4 04+4+64+12+16+20=60), se va afiga 60 (pentru ca Solutie. Pentru a parcurge toate numerele naturale mai. mici sau egale cu n gi a selecta pe cele, divizibile cu k, pornim de la n si .scidem la fiecare pas cate o unitate. Cand ajungem la 0 ne oprim, program suma_div_k; var'n,k: integer; s:longint; begin s:=0; write('n='); readln(n) ; write ('k='); readln({k); repaat ifn mod k = n:=n-1; until n=0; writeln(s) ; readin end. 0 then s:=stn; Probleme propuse 1, Se d& de la tastatura un numar natural cu cel mult 4 cifre. Se cere s& se determine cAte numere mai mici sau egale cu numfrul dat si mai mari ca 10 au ultimele doua cifre pare. Exemplu: pentru numarul 43 se va afiga 6 (numerele cu proprietatea cerut’ sunt 20, 24, 26, 28, 40, 42). 2, ,Se da de la tastatura un numéar natural cu cel mult 9 cifre. Se cere s& se determine cel-mai mare numar mai mic sau egal cu numirul dat gi-care are ultimele doua cifre pare. Exemplu: pentru numaral 4033 se va afiga 4028 3. Folosind instructiunea repeat se cere si se afiseze numerele pare cu exact doui cifre pe’ aceeasi linic in fisierul paxe : out in ordine descréscdtoare. 4. Folosind instructiunea repeat se cere si s¢ afigeze numercle pare cu exact doua cifre pe aceeagi linie in figierul pare. out in ordine crescdtoare, 5. Se citesc caractere de la tastatur’ pan’ cfind se introduce caracterul *, Se cere si se afiseze de cate ori s-a citit caracterul spatiu. Exemplu: penttu caracterele aaa bbaa coaa* se va afisa 2. 6, Se citesc caractere de la tastatura panii cind se introduce caracterul-*, Se cere sa se afiseze cate litere mari s-au citit. Exemplu: pentru caracterele aaa AbbCCaa ccaa* se va afisa 3. aeecte racic itlaie tert fn continuare vom folosi numai numere naturale care pot fi memorate cu ajutorul tipului longint. Prelucrarea cifrelor unui astfel de numar presupune accesul la fiecare’cifra. Acest lucru se realizeaza prin tmparfirea repetat& la 10, SA vedem cum stau lucrurile pe un exemplu. , Consideram in continuare variabila n, de tip longint, care retine numarul 1986. Vom imparti valoarea din n la 10 repetat astfel: Pasul 1. Determinarea ultimei cifre gi eliminarea ei pentru numarul 1986. ui=n mod 10, adicd u=6, ultima cifri a lui 1986 ni=n div 10, adicé n=198, dup eliminarea ultimei cifre Pasul 2, Determinarea ultimei cifre si eliminarea ei pentru numarul 198. u:=n mod 10, adicd u=8, ultima cifri a lui 198 ni=n div 10, adicaé n=19, dupa eliminarea ultimei cifre Pasul 3, Determinarea ultimei cifre gi climinarea ei pentru numarul 19. uz=n mod 10, adicd u=9, ultima cifra a lui 19 ni=n div 10, adicd n=1, dupa eliminarea ultimei cifre Pasul 4. Determinarea ultimei cifre gi eliminarea ei pentru numirul 1. t=n mod 10, adic& u=1, ultima cifra a lui 1 ni=n div 10, adicd n=0, dupa eliminarea ultimei cifre Pentru acest numar avem 4 pasi (pentru ci numirul are 4 cifre), ins& nu stim cu exactitate cite cifte au numerele memorate de n, de aceea folosim instructiuni repetitive cu numir necunoscut de pasi pentru a parcurge toate cifrele. , fn. concluzie, o schita de algoritm care prelucreazi cifrele unui numfr natural, memorata in varibala n ar arta astfel: sau oe repeat us=n mod.10; : prelucrare cifra u u:=n div 10; until n=0; while n>0 do begin uisn mod 10; prelucrare cifra u ui=n div 10; end; mele mR ae bets! 1. Se da de Ja tastatura un numir natural nenul memorat intr-o variabilé de tip longint. Se cere sé se afigeze numirul de cifre pe care le are numirul citit, Exemplu: pentru numarul 1998 se va afiga 4. Solutie. Numéarul citit se va fi memorat in variabila n. Pentru a nu distruge valoarea din n, vom utiliza in plus o variabili auxiliari notat% cu aux, pe care 0 vom . prelucra. program numar_cifre; var n,aux:longint; k:byte; begin write ('n='); feadln (n) ; ki=0; while aux>0 do begin kisk+1; auxisaux div 10; end; weiteln(n,' are ', k, ' cifre'); readln end. 2, Se da de Ja tastatur’ un numar natural memorat intr-o variabila de tip longint. Se cere si se afiseze cifra cea mai mare din numarul citit. Exemplu: pentru numarul 15877 se va afiga 8. Solutie. Numirul citit va fi memorat in variabila n. Pentru a nu distruge valoarea din n, vom utiliza tn plus o variabili auxiliar’ notat’ cu aux, pe care 0 vom prelucra cifta cu cift4, Variabila care va memora cifra maxima va fi notat& cu max si initial va avea valoarea 0 (aceasta fiind cifra cea mai mick posibil&), La ficcare pas ultima cifta a lui aux, retinutd in variabila u se va compara cu max. fn cazul in care u>max, atunci valoarea lui max se schimbi cu cea a lui u. program numar_cifre; var n,aux:longint; max ,u:byte; begin write ('n='); rveadln(n) ; aux:=n; Max:=0; while aux>0 do begin u:saux mod 10; if uwomax then max:=u; aux ux div 10; end; writeln('cifra cea mai mare’a lui-', n, ' este ', max); readin end. 3. Se d& de la tastaturi un numar natural memorat intr-o variabili n de tip longint. Se cere sd se afigeze numéarul obtinut cu cifrele din n in ordine inversa. Exemplu: pentru numarul 15877 se va afiga 77851. Solutie. Numirul citit va fi memorat in variabila n. Pentru a nu distruge valoarea di in n, vom utiliza in plus o variabila auxiliara notat{ cu aux, pe care o vom prelucra. Inversul lui n (numérul cu cifrele lui n citite de la dreapta la st{nga) initial va fi 0, dupa care pentru fiecare cifra u a lui n (de la sfarsit spre tnceput) inmultim i 1 in wt nv cu 10 si adunam u (operatic prin care lipim la inv cifra u), Pentra numirul 23, evolufia lui inv este urmatoarea: OF pinv:=inv*10+u, adic’ inv=0*10+3; ur=2;inv:sinv*10+u, adicd inv=3*10+2; wr=l;invesinv*10+u, adic inv=32*10+1; Astfel inv=321. program invers; . var n,aux,inv:longint; max,u:byte; begin write ('n='); readiln(n); while aux>0 do begin u:saux mod 10; inv:=inv*10+u; aux:=aux div 10; end; writeln('Numarul cu cifrele inversate ale lui ', n, ' este '', inv) ; readin end. Se dade la tastatura un numér natural in variabila n de tip Longint. Se cere sa se afigeze suma si produsul cifrelor lui n. Exemplu: pentru'numéarul 1216 se va afiga 10 gi 12 Se da de la tastaturd un numiér natural in variabila n de tip longint. Se cere si se afiseze cifra cea mai micd din n. Exemplu: pentru numarul 328 6456 se va afiga 2 Se d& de Ja tastatur’ un numér natural in variabila n de tip longint. Se cere sa se verifice dacd n este numar palindrom (adici dacii este citit de la stanga la dreapta sau de la dreapta la stanga rezultd acelagi numar). Exemplu: pentru numarul 3223 se va afiga PALINDROM, iar pentru 32213 se va afiga NEPALINDROM. Se da de la tastaturé un numéar natural in variabila n de tip Longint. Se cere 84 se afiseze cifrele lui n una sub alta in ordine inversi. Exemplu: pentru numarul 126 se va afisa 2 1 Se dade la tastatur un numér natural in variabila n de tip Longint. Se cere sa se afigeze fn cate cifre de 0 se termina n. Exemplu: pentru numarul 126000 se va afiga 3. Se da de la tastatura un numéar natural in variabila n de tip Longint. Se cere _ 88 se verifice daci, toate cifrele lui n sunt pare “EP va afiga DA in caz afirmativ, tespectiv NU contrar). Exemplu: pentru numarul 26000 seva afl iga DA, Limbajele de programare permit ca,in interiorul unei instructiuni repetitive s& existe alte instructinni repetitive. Un lucru foarte important trebuie avut in vedere, gi anume s& se evite folosirea variabilelor contor dintr-o instructiune repetitiva, ca variabile contor in cadrul altei instructiuni repetitive, care este interioara primei. Mai precis, nu putem avea ceva asemanator cu: for i Acest lucru nu este permis, pentru c4 prima variabilé contor trebuie miarit® cu o unitate la fiecare pas si in situatia prezentatd, la primul pas din for, variabila contor'i se mareste prin al. doilea for devenind n, situatie incorecta. ‘© Nu este indicat s& existe prea multe structuri repetitive una tn alta, pentru c& timpul de execufie creste. Incercafi si verificafi acest lucru’ pentru problemele urmatoare, luand date de intrare din ce in cé mai mari. Hacer 1. Se citesc de la tastaturi n numere naturale (mai mici sau egale cu 32000). Se cere sii se afigeze cate dintre numerele citite au toate cifrele pare. Exemplu: pentru n=5 gi mumerele 123 24 6842 231 886 se va afisa 3 (numerele cu toate cifrele pare sunt 24 6842 886) Solutie. Pentru fiecare dintre cele n numere care se citesc in variabila x, se verificd dac& toate cifre sunt pare (folosind variabila boolean& sw, care este true, daca x are toate cifrele pare, respectiv false, contrar). Cand se gaseste un astfel de numar se m®te un contor (notat cu k, inifial fiind 0) cu o unitate. program nr_cu_cifre pare; var k,x,i,n,aux,u:integer; sw: boolean; begin write ('n='); readin({n); k:=0; for i:=1 to n do begin writeln('dati un numar '); readin(x); {citim un numar natural} sw:=true; {verificam daca toate cifrele lui x sunt pare} while (aux>0)and sw do begin {daca se gaseste-o cifra impara se iese din while} u:=saux mod 10; iff u mod 2 = 1 then sw:=false; aux:=aux div 10 ~ end; if sw then k:=k+1; end; i writeln('Sunt ',k, ' numere cu toate cif. pare’); readin end. 2. Se da un numéar natural in variabila n (mai mic sau egal cu 100). Se cere sa se » afigeze toate perechile de numere a sib cu 90)and sw do begin u:=aux mod 10; if u=i then sw:=false; aux:=aux div 10; end; if not sw then write(i,' '); end; readin end. 2. Bene ets Se dau dou numere naturale in variabilele n si k cu cel mult trei cifte. Se cere si_se afiseze toate perechile de numere naturale (a, b) cu proprietatea c& 10y do if x>y then x:=x-y els ey-x; dime; @ yity-x; ana; Writéla('onmde = ',a); readin; end. : 3. Se dau trei numere naturale nenule in variabilele de tip integer a, b, c. Se cere si se determine cel mai mic multiplu comun pentru a, b, c. Exemplu: pentru.numerele 100 25 75 se va afisa 300. Solutie. Initial cel mai mic multiplu comun m este a, dup’ care se determina cel mai mare divizor comun x dintre m si 6, urmand calculul celui mai mic multiplu comun (m:=(m*b) div x). Se continua apoi cu m gi c, obtinandu-se in m cel mai mic multiplu comun dintre a, b gi c. program trei_numere; var a,b,c,d,x,y,m:integer; begin write ('a=') ;readln (a) ; write ('b=') ;readln(b) ; write ('c=!') ;readin(c) ; m:=a; {determin emmdc dintre m si b} xi=myy:=b; while x<>y do if x>y then x:=x-y else y:=y-x; m:=(m*b) div x; : {determin cmmde dintre m si ¢} x I=m;y:=C; while x<>y do if‘x>y then x:=x-y else y:=y-x? m:=(m*c) div x; writein('cmmme(',a,',',b,',',¢,')= '/m)i readin; end. 1, Se dau doud numere naturale renule, Se cere si se afigeze cel mai mic multiplu comun pentru aceste numere. Exemplu: pentru numerele 106 gi 150 se va afiga 300. 2. Se citesc numitorii si num&ritorii a dou’ fractii a/b gi c/d, Se cere si se afigeze suma gi produsul fractiilor in forma ireductibila, Exemplu: pentru a=8, b=12, c=4, d=8 se va afisa 7/6. 3. Se dau de Ja tastaturd n numere naturale nenule (mai mici sau egale cu 32000). Se cere s& se determine cel mai mic multiplu.comun pentru numerele citite. . Exemplu: pentru n=4 gi numerele 100 200 400 300 se va afiga 1200. 4, Se dau douad numere naturale nenule, Se cere sa se verifice daci numerele citite sunt prime intre ele (adic& cel mai mare divizor dintre ele este 1). Exemplu: pentru numerele 100 gi 150 se va afiga Nu sunt prime intre ele, iar pentru numerele 10 si 21 se vaafiga Sunt prime intre ele 5., Se da in variabila n de tip integer, un numir natural nenul. Se cere si se afigeze toate numerele mai mici ca n gi prime cu n, Exemplu: pentru numirul 12 se va afisa.l 5 7 11. 2 Pana acum am utilizat numai date numerice intregi. {n-continuare vom prezenta tipuri numerice care utilizeaza : date cu parte fractionar& nenuld. Pentru aceste numere se mai foloseste scrierea in formatul ab, unde a este un numéar rational, iar b un numéar intreg, cu seminificatia a- 10°. Spre exemplu, 3.142E+2 reprezinté numarul 3.142-107=314.2, iar 3.142m-2 reprezinté numarul 3.142:10°7%= 3.142:107 = 0.03242. Mentionam faptul ca limbajele de programare folosesc caracterul . in loc de , p tru.a separa partea intreaga de partea fractionara. Tipurile reale din limbajul Pascal sunt urmStoarele: real, single, double, extended, comp. 5 Tipul real permite utilizarea numerelor rationale care au valoarea absolutd cuprins4 intre 2, 9E-39 $i 1. 7E+3.8. ‘ i Tipul single permite folosirea datclor rationale cu valoarea absolut intre 1 45 $i 3.4E+38, double intre 5.0-324 gi 1.78308, extended intre 3 44932 gi 1. 1E4932, respectiv comp intre 0 si 2°°-1, Operatiile care pot fi folosite cu date reale sunt: ~ operatiile aritmetice +, -, *, /. Dact cel putin unul dintre operanzii unei expersii aritmetice este real atunci rezultatul va fi real. 7. Operatiile relationale <, <=, >, >=, <>, =. Rezultatul unei expresii care folosegte acegti operatori este de tip boolean. Pentru a afla partea fractionara a unei date x de tip real se foloseste frac(x), iar pentru a determina’ partea intreaga int (x), care reprezinta x-frac (x). AmAndoua valorile vor fi de tip- real. Exemple frac(1.2021) furnizeazé valoarea 0.2021 int (1.201) furnizeazi valoarea 1 Dac& vrem si obtinem date de tip intreg, atunci pentru x de tip real, trunc (x) furnizeazi cel mai mare numéar intreg mai tic sau egal cu x, dac& x este pozitiv, respectiv cel mai mic intreg mai mare sau egal cu x, pentru x negativ. round (x) furnizeaza cel mai apropiat intreg de x. Exemple trunc(3.786) furnizeaza valoarea 3 vound (3.786) furnizeaza valoarea 4 Pentru a determina valoarea absolutd (modulul) unui numér x de tip real sau intreg se utilizeaza abs (x). Exemple abs (3.14) furnizeazd 3.14 abs (-3.14) furnizeazd 3.14 abs (5) furnizeazd 5 abs (-5) furnizeazi 5 abs (0) furnizeaza 0 Afisarea cu format presupune ca pe ecran din dreptul cursorului si se aloce un anumit numiar de celule (in fiecare celuld se poate scrie un singur caracter) in care se vor afiga datele. Pentru x real avem write (x:k:h) sau writeln(x:k:h), unde k gi h sunt constante, numere naturale. Pe ecran se aloca k celule, din care h pentru partea fractionara. Afisarea cifrelor gi a punctului zecimal se va face aliniate de la dreapta spre stanga. Dac& numarul de ‘zecimale este mai mare decat h, ultimele zecimale nu se afiseazi. Dac’ numiirul de celule ramase pentru partea intreagd este mai mic decdt este necesar, atunci se vor serie toate cifrele (nu se trunchiaza partea intreaga). Exemple Pentru K1=2345.67893; write(x:10:3); Pentru “1545.67; writeln(x:10:4); writeln(12.0:10:2); writeln(x:0:0); {la apropiat integ} write (x:0:1); {se aprox, prima zecimala in functie de a doua} afisare se aproximeaza cu cel mai (Ol aae © in forma generala a formatului de afisare, daci se ia k=0, atunci pentru \ partea intreaga se aloc& atatea celule cAte sunt necesare (vezi exemplul de «mai sus), iar dac& se ia h=0, atunci se elimina partea fractionara.: Pentru x intreg sau sir de caractere ave write (x:k) sau writeln (x:k), unde k este constant’, numar natural. ran se alocd k celule pentro afigare. Afisarea cifrelor sau caracterelor se va aliniate de la dreapta spre stanga. Dac& k este mai mic decat numirul de cifre (sau numirul de caractere), atunci se vor afisa toate. Exemplu: pentru x?=676; writeln(x:10); write (‘ABCD’:8) ; se 1 afisa Problemeé-rezolvate 1, Se dau n numere reale. Se cere si se afigeze suma lor trunchiaté la 3 zecimale. Exemplu: pentru n=3 gi numerele 2.12345 2.234 123.4971 va afiga 127.855 . Solutie. Vom folosi o variabild,x (de tip real) pentru citirea numerelor si o variabila s (de tip real) pentru calculul sumei (intial are valoarea 0). Dupa ce se citeste cfte un numir fn x, acesta se adund la s. program suma_numere_reale; var n,i:integer; *,S:ireal; begin ® write('n='); readln(n) ; s$:=0; for i:=1 to n do begin write (‘dati al ',i,'-lea numar '); readin (x) ; S:=s+x; end; writeln(s:0:3); readin end. 2, Se dau n numere reale, Se cere si se afigeze cel mai mare in valoare absolut dintre numerele citite, trunchiat la doud zecimale. Exemplu: pentru n=3 si numerele 2.12345 -2,234 -123.4971 se vaafiga 123.50 Solutie. Vom folosi o variabil x (de tip real) pentru citirea numerelor si o variabilé max (de tip real) pentru. determinarea numarului cu valoarea absoluté maxima (intial are ca valoare primul numir citit), Dupa ce se citeste cate un numar in x, acesta se compara cu 'max, dacti max s:=stx[i]; p:=p*x[i]; end; writeln('Suma= ',s); writeln('Produsul = ',p); readin end. 4. in figierul text minmax.in se aflé un vector (pe prima linie valoarea lui n, 1$n£1000, iar pe linia a doua n numere reale separate intre ele prin cate un spatiu). Se cere s& se scrie in fisierul minmax.out pe prima linie. cea mai mic’ component, iar pe linia a doua cea mai mare componenta (trunchiate 1a doua zecimale). Exemplu: minmax.in minmax.out 4 Ae 2 30 1.1 3.2 50.00 Solutie. Dup& citirea vectorului vom determina componenta maxima gi minima (in variabilele max si min) parcurgand o singura dati vectorul, initial min gi max-sunt initializate cu prima component. La fiecare pas se compar’ componenta curenté cu max si min, modificdnd valoarea acestora daca este cazul. program dublare componente; var x:array[1..1000jof real; n,i:integer; min,max: real; £:text; begin assign (£,'’minmax.in'); reset (f£) ; {citire vector din fisier} readin(f£,n); for i:=1 to n do read (f£,x[i]); close (f) ; {determinarea minimului si maximului} min:=x[1]}; max:=x{1]; for i:=2 to n do begin if x[i]>max then max:=x[i]; if x[i]0 do begin U:=aux mod 10; inv:=inv*10+u; j@ux:=aux div 10; end; inv=a[i] then write (f,inv,' '); close (f) ; end, 2. 1n figierul text prime. in se afla pe prima linie un numér natural nenul n, cu cel mult 9 cifre, iar pe linia urmdtoare n numere naturale. Se cere s& se construiasc4 un vector cu toate numerele prime din fisicrul prime.in si apoi sa se scrie in fisierul prime. out (pe prima linie num4rul de componente, iar pe linia a doua componentele separate printr-un spatiu) Exemplu: prime:in . prime out 5 3 2 50 29 393. 17 229 17 Solutie. Vom citi numerele din fisier in vectorul a, cu n componente. Initializim vectorul x cu vectorul vid (adic& k:=0, k fiind num&rul de elemente al lui x). Parcurgem fiecare. componenta gi verificim daca. este. un numar prim, in, caz afirmativ.se introduce in vectorul x. fn final se scrie vectorul x in fisierul de iesire. program caomponente_palindroame; var a,x:array[1..1000]of longint; n,i,k:integer; sw: boolean; aux,j:longint; £:text; begin assign(f,'prime.in'); reset (f); {citire vector} readln(f£,n); for i:=1 to n do read(f,a[i]); close (£) ; k:=0; for i:=1 to n do begin aux:=a[i];{verificam daca a[i] este numar prim} sw:=true; if (aux=1)or(aux=0) then sw:=false else for j:=2 to aux div 2 do if aux mod j = 0 then sw:=false; if sw then {introducem a[i] in vectorul x} begin :skt1; x(k] :=a[i]; end end; assign (f£,'prime.out'); rewrite(f); {afisare vector x in fisier} writeln(£,k); for i:=1 to k do write (£,x[i],' '); close (£) ; end. 3. Se dau de la tastatura doua numere naturale cu cel mult patri cifre fiecare in ordine cresc&toare, folosind variabilele a gi b de tip integer. Se cere sd se sonstruiasch un vector, care s& contini toate numerele. pitrate perfecte cuprinse intre a gi b (inclusiv a gi b) gi apoi s& se afigeze pe ecran. . sExemplu: pentru a=23, b=100 se va afiga 25. 36 49 64.81.100 Solutie. Initializim vectorul-x cu vectorul vid (adicé k:=0, k.fiind numirul de elémente al-lui-x). Parcurgem toate numerele naturale de laa la b folosind variabila i, Dac& i este patrat perfect, fl introducem in vectorul x. Pentru a verifica dack i este’ patrat perfect parcurgem toate numerele naturale de la 0 la i/2°+ 1, si cm dac& gasim printre ele unul care ridicat la puterea a doua este egal cu i. I fargitul algoritmului se afiseaza vectorul x. Bay program patrate perfecte; var x:array[1..1000]of longint; ; i,n,a,b,j:integer; ae “gw: boolean; begin write ('a='); readin (a); write ('b='); readln(b); n:=0; for i:=a to b do begin (verificare, daca i este patrat perfect) sw: =talse; 3 for.j:m0. to 1+ (i div 2) do {afisare vector x} for i:=1 to n do write (x[i},' '); feadin . - Se da de la tastatura un vector cu n componente (1 intelegem schimbarea _ valorii lui a cu cea a lui b si cea a lui b cu ceaa lui a. Acesti operatic se-realizeaza » folosind o variabilé auxiliara aux, de acelagi tip cu a sib. Algoritmul de ordonare cresctoare se bazeazi pe parcurgeri repetate’ ale vectorului si interschimbarea componentelor aldturate, daci nu sunt .ordonate cresc&tor. Algoritmul se opreste cand s-a realizat o parcurgere fara sd se interschimbe elemente. Pentru a sti daci intr-o parcurgere . s-au. réalizat interschimbari vom utiliza o variabil boolean& (notata cu sw), primind valoarea true dac& nu s-a realizat nici o interschimbare (adici vectorul este ordonat crescator), respectiv false contrar., ‘ Pentru vectorul x cu n componente intregi avem: “‘Pepeat ‘swietrue? for i:=1 to n-1 do {parcurgem vectorul} M if x[i]>x[i+1] then {compo, alat. care nu sunt ord. cre.} begin {inteschimbare} Prima parcurgere ‘Solutie. Citirea 0 vom face fn vectorul x, iar ordonarea: folosind algoritmul Se porneste cu sw:=true prezentat mai sus. x [: [@ fio [5 [8 ; program ordonare_sir fp —» var x:array[1..1000]of£ real; i,n:integer; sw: boolean; aE 5 [10/8 aux:real; or) f:text; begin os {eitire vector} x: 18-18 ee ae assign(£,'sir.in'); = reset (f); eadln (f£,n); A doua parcurgere for eee nde Se porneste cu sw:=txrue read (£,x[i]); [x T: [e [5 [8 [10 close (f) ; {eordonare crescatoare} > repeat sw:=true; swi=false for i:=1 to n-1 do x : 5 8 8 10 if x[i]>x[i+1] then begin Atreia parcurgere aux:=x[i]; , x[i] :=x[i+1]; Se porneste cu sw:=true x[i+1] :=aux; x 1: [5 [8 8 [10 sw:=false; : , end; Nu se realizeaza interschimbiri si vectorul este ordonat crescdtor. until sw; {scriere in fisier} f j 'g3 y; tea a rewrite(2)7 oo . : for i:=1 to n do © Pentru a obtine vectorul ordonat descrescitor se schimba compararea ae ale) Ord, We x[i]>x[4+1] din algoritm cu x[i]0 do begin u:=auxx mod 10; s:=stu; auxx:=auxx div 10; end; y[i]:=s; end; {ordonare crescatoare} repeat sw:=true; if y[i]>y[itl] ‘then begin | auxx:=x [1]; xi] :=x[it1]; x[i+1] :=auxx; auxy:=y [il]; yi] :=y[it1]; ylitl] :=auxy; sw:=false; end; until sw; {seriere in fisier} assign (f,'sir.out'); rewrite (£) ; for i:=1 to n do write (£,x[i],' '); close (£) ; end. 3. De la tastaturi se dau n (1£n<40) elevi prin nume gi media generala la sfarsitul anului scolar. Se cere si se screeze un figier text cu numele clasam.txt (pentru a fi listat la imprimanta si afisat Ia panoul din curtea scolii) cu numele gi mediile elevilor, ordonati descresciitor dupa medii. in cazul in care exist& doi elevi cu aceeasi medie se va afiga mai fnainte cel care alfabetic este mai mic, Exemplu: pentru n=5 i elevii Popescu Dana 9.67 Andreescu Mircea 8.76 Manole Ana 9.21 Profeanu Ioana 10 Popescu Alexandru 10 se va crea fisierul clasam, txt Popescu Alexandru 10 Profeanu Ioana 10 - Popescu Dana 9.67 Manole Ana 9.21 Andreescu Mircea 8.76 Solufie. Citim numele elevilor in vectorul x si mediile in -vectorul y, Ordonim crescator componentele lui y gi cfind facem interschimbarea componetelor y[i], ‘yti+1], interschimb’m: si componentele Ki], xfitl), apoi afisim ‘somponentele vectorului x. fy. ordonarea componentelor pe langa cazul ‘ylilx[i4+1]): * y “Program clasament; var X:array[1..41Jof string; Yiarray[1..41l]of real; n,i:integer; auxx: string; . auxy: real; & sw:boolean; + £:text;. egin write ('numar elevi: ")e readin (n) ; for i:=1 to n do begin writeln('Elevul ',4,':'); write ('nume; write ('‘medie: end; ') ;veadin (x[i]) 7 ') preadin(y[il); {ordonare} repeat sw;=true; for if i:=1 to n-1 do ylilx[it1]) then begin auxx:=x[i] ;x[i] :=x[itl] ;x[it1] :=auxx; auxy:=y [i] ;y[i] :=y[i+1] ry [it1] :=auxy; sw:=false; end until sw; assign(f,'clasam.txt') ; rewrite (f£) ; for i:=1 te n do writeln(f,x[i],' ',y[i]:10:2); close (£); end. 1, in fisicrul numere . in se afla pe prima linie un numér natural n (asns4 0). Pe linia,a doua se afli componentele unui vector cu n elemente de tip longint. Se cere. 4 se. scrie in fisieru! numere . out vectorul dat cu prima jumitate a componentelor ordonate cresciitor, iar a doua jum&tate ordonate descresc&tor. Exempla: numere.out umere.in * a 5 20 1012 20976 1012 205 6 207 9 tn figierul text sir.in se afld pe prima linie un numér natural nenul n (1SnS100) si pe linia urmatoare n numere naturale cu maxim 9 — reprezenténd elementele unui vector. Se cere sé se ordoneze crescitor — dupa prima cifra (adicd un numéar este mai mic decat altul daca, primu - prima cifré mai micd, indiferent de numérul de cifre) al apoi S se serie in figierul six .out componentele acestuia separate prin céte un spatiu. Exemplu: sir.in 5. # 19 2 20 4012 5 4012 25 19 20 sir.out Se dé de la tastatura un vector cu componente numere reale, ordonat cresc&tor. Se cere s& se afigeze componentele distincte din vector trunchiate la dous zecimale. , . m Exemplu: pentru un vector cu 5 elemente, 10 20 20 21.33 21.33 se va afiga 10 20 21.33 Tonut are o suma s de bani, El merge initr-un magazin care are n jucarii. Cunoscand pretul fiecdrei jucdrii, determinati num&rul maxim de jucdrii pe care le poate cumpara cu suma de bani. Exemplu: pentru s=100, n=6 si jucdriile ou preturile 89 10 123 78 40se va afisa 2 Se dau n copii (isn<100) prin nume si fndltime (indltimea este dati in centimetri). Se cere si se afiseze numele copiilor in ordinea descrescitoare a indltimii. Exemplu: pentru n=4 gi datele Ana 120, Mircea 150, Alex 132, Dana 140 se vaafigaMircea Dana Alex Ana Se da un vector format din n caractere (1Sn$200). Se cere s& se formeze doi vectori: unul cu literele mari si celalalt cu literele mici din vectorul dat, apoi ordonafi crescdtor cei doi vectori si afisati-i. Exemplu: pentru n=14 si caracterele a56Dh (AxcB/&#g se va afisa ABD acghx Se da de la tastatura un vector cu n componente (1$n$100) numere de tip integer. Se cere si se determine pozitia poz pe care se gasegte maximul (primul dacd sunt mai multe ‘componente maxime) si apoi s&i se ordoneze crescStor componentele pana la pozitia poz si.descrescator celelalte, Dupa aceste ordondri se va afisa vectorul modificat. Exemplu; pentru un vector cu 7 elemente, 10° 5°20°7 $10 20 20872 Se da de la tastaturi un vector cu n componente (10 do begin k:=k+1; r[k]:=aux mod b; “aux:=aux div b; a ili : ul 4 la prima compon} {vectorul xr trebuie utilizat de la ultima P ; Trecerea unui numéar natural din baza‘b in baza 10 Vom. considera un num&r natural in baza b, avand cifrele o:, 2, ).,. cy (de la sténga spre dreapta), Numarul transformat in baza 10 este rezultatul evaluarii expresiei: : j Cab + cy eb Pe ayebR Fe + oy be Che Exemplul 24,2. Pentru numarul 1111001 scris in baza 2, expresia © 1:28 1+25% 1-244 1423404224 Qe2t 1 are valoarea 644+32+16+8+1 =121. in continuare prezentém algoritmul, care pornind de la vectorul c, ck componente determina numéarul corespunziitor in baza 10, notat cu x. . “:=0;p:=1; for i:=k downto 1 do begin x:sxte[i] *p; Pi=p*b; end; - Se pot folosi si sisteme de numeratie cu baza mai mare decat 10; in aceast’ situatie cifrele 10, 11, 12, ...8¢ vor inlocui cu literelea, B, Cc, ... Spre exemplu in baza 16 numirul A7CF se transform’ in baza 10 in valoarea expresici 10:16°+ 7+167+ 12-16+ 15 = 42959, Scrierea numerelor in baza 2 este foarte important’, pentru c& memorarea datelor se bazeaz& pe acest sistem de numerafie. Unitatea elementari a memoriei este bit-ul (1 sau 0), Memoria poate fi masurata cu multiplii bit- ului: 8 biti succesivi formeazi 1 octet (sau byte), 27° octeti formeaz’ imo (mega octet), 2?° Mo formeaz& 1G0 (giga octet), 27° Go formeazi 1 To (terra octet). Pentru a realiza operatii cu numere in diverse baze, transformiim numerele in baza 10, realizim operafiile, dup& care rezultatul él transform’m in baza je dorita, Se da un numér natural cu cél mult 9 cifre. Se cere cea mai mics baz in care “Se poate scrie numarul, apoi sii se determine scrierea sa in baza 1'0. Exemplu: pentru numarul 1203 se va afiga baza=4 siscrierea in baza 10 este 99 Solutie. Pentru a° gasi céa mai micd baz&. in care. se poate scrie numérul, determinam cifta.cea mai mare in variabila max.Astfel baza cdutatd va fi max+1. Pentru a doua parte a algoritmului, trecerea in baza 10 din baza maxt1, folosim secventa de instrucfiuni prezentaté mai sus. program det_baza; var n,;x,aux,p:longint; u,;max,b,k,i: integer; c:array[1..10]of integer; begin write('n="); readin (n); {vom construi un:vector-cu cifrele lui’n si det. cifra maxima, astfel b va fi 1+ acest maxim} aux:=n; max:=aux mod 10; k:=0; while aux>0 do begin u:=aux mod 10; if u>max then max:=u; k:=k+1; efk] :=u; aux:=aux div 10; end; b:=maxti; {vectorul are cifrele in ordine inversa} pie : for i:=1 to k do begin x:=x¥e [2] *p; pi=p*b:;- end;.: : writeln('baza=',b,' nr. in. baza 10 este ‘x7 readin end, 2. .Se dau doud numere naturale wnul tn: baza bi si altul in -baza b2 (2Sb1,b2£10). Se cere sa se afigeze suma celor doud numere (in'baza 10), Exemplu: pentru b1=2, b2=3 gi numerele 1001, respectiv 120 se va afiga 24 (pentru cé 1001 in baza 10 este 9, iar 120 in baza 10 este 15). Solutie. Pentru fiecare numar construim in vectorul c cifrele corespunzatoare, dupa care folosind secventa.de instructiuni prezentat la, inceputul capitolului, trecem numiarul in baza 10 (folosind variabila x), La fel se procedeaz’ si cu al doilea numiar. program det_baza; var nl1,n2,x,aux,p:longint; u,b1,b2,k,i:integer; ¢tarray[1..10]of integer; begin BA write ('nl=') ;readin(n1) ; write ('bl1=') ;readin(b1) ; aux:=nl1; k:=0; while aux>0 do begin u:=aux mod 10; k:sk+1; e[k]:=u; = aux:saux div 10; end; {vectorul c are cifrele in ordine inversa} write ('n2=') ;readin(n2) ; write ('b2=') ;readln(b2) ; aux:=n2; sk:=0; ‘while aux>0 do begin u:=aux mod 10; e[k] :=u; aux:saux div 10; end; hele c. are cifrele in ordine inversa} psel; ms for i:=1 to k do begin : x:=x+e[i}*p; P:=p*b2; end; writeln ('suma=' ,x); veadin. end. 3. Se da in variabila n un numér natutal'cu cel mult 3 cifte. Se cete s& se afigeze numerele (in baza 10) mai mici sau egale cu n, care transformiate tn baza 2 au numiérul de cifre de 1 egal cu numarul de cifre de 0. . Exemplu: pentru n=16 se va afiga 2 9 10 12 Solutie. Parcurgem cu 0 instructiune for toate numerele naturale ‘mai mici sau egale cu n. Pentru fiecare astfel de numar construim un vector c cu ciftele in baza 2, apoi calculém suma componentelor lui c in variabila nri,(care reprezint& practic numarul de cifre de i) si comparam nri cu diferenta dintre numarul de componente al lui c si nri, in caz de egalitate afigam numarul, program nr_cif_egale; var n,i,p,*,j,aux,k,u,nrl,nr0i integer; ciarray[1..5jof integez; begin write ('n=') ;zreadln(n) ; for i:=1 to n do begin aux:=i k:=0; while aux>0 do begin “ -aisaux mod 2; k:=kt1; e[k] :=u; aux:=aux div 2; end; , aril: for j to k do nrl:=nrl+e[j]; nr0:=k-nrl; if nrl=nr0. then write(i,' ')? end; readin end. ; Probleme.rezolvate 4. Se di un vector cu n.componente (1£nS100) numere naturale scrise in baza 10 (dé tip Longint) si o baz& in variabila b (2Sb$10). Se cere s& se afigeze componentele vectorului in baza b pe randuri diferite. Exemplu: pentru n=3, componentele 5 10 12 si b=2 se va afisa 101 1010 1100 2. Se d& un vector cu n componente (1£n$100) numere naturale scrise in baza b (componente de tip Longint si 2£bS10). Se cere si se afigeze componentele vectorului in baza 10 pe randuri diferite. Exemplu: pentri n=3, componentele 101 1010 1100 si b=2 se va afiga oR : : 10 12 3. Se dau doud numere naturale, unul in baza b1, iar celalalt in baza b2 (2b1,2£10), Se cere s& se verifice care este mai mare dintre cele doud numere. - Exemplu: pentru 12 in baza 3 si 100 in baza 2, cel mai mare dintre ele este 12 (pentru c& transformate in baza 10 avem 5>4). 4. Se dau dou numere naturale, unul in baza b1, iar celalalt in, baza b2 (2b1,b2$10). Se cere sa se calculeze produsul lor in baza b2, . Exemplu: pentru 12 in baza:3 i 100 in-baza 2, se va afiga' 10100 (pentru ca transformate in baza 10 avem 5' si 4, ‘produsul lor este 20 gi transformat in baza2 ned& 10100). . 5. Se cere s& se afiseze (transformat in baza 10) cel mai mare numér in.baza 2 format din n cifre (10 then writeln(f,cif[k],' de ', frecventalk],' ori’); close(£); end. 3. In fisierul text tablou.in se aflA pe prima linie un numar natural n (1Sns100), iar pe urmatoarele n linii cate n cifre (0 sau 1) separate titre ele prin céte un-spatiu. Se cere sf se scrie in fisierul tablou.out cate cifre de 1 sunt izolate in tablou (adicA sunt inconjurate numai de 0 sau.de marginéa tabloului), precum si linia si coloana pe care se gisesc, Consideram cin jurul unui element se gasesc elementele vecine din nord, sus, est, vest, nord-est, nord-vest, sud-est si sud-vest. Exemplu: tablou.in tablou.out C8 6 4 cifre de 1 izolate 101000 Coordonatele punctelor izolate: qoool1ol 11 aQ210000 26 oo00010 & 2 110001 64 000100 Solutie. Vom citi tabloul din fisierul tablou. in in variabila a, apoi il vom ‘borda cu 0 (linia 0, linia n+1, coloana’0, coloana n+1) pentru a evita situatiile de pe marginea tabloului. Un element de 1 este izolat daca in jurul sau se afl numai cifra 0, adicd dac& se formeaza un subtablou patratic dé dimensiune 3 cu elementele: 000 010 000 Pentru a verifica mai ugor daci elementul de pe pozitia (i+1,j+1), i,j=0,1,.,n-1 este izolat, vom declara un tablou constant cu elementele de mai sus si vom verifica daca el se suprapune peste tabloul initial (cu coltul din stanga sus pe linia i si coloana 3). in caz afirmativ avem un 1 izolat. Vom parcurge tabloul de dou ori, o dati pentru a numara 1-uri izolati si o dati pentru a determina liniile gi coloanele pe care se giisesc. program cifre_izolate; const izo:array[0..2,0..2]of integer=((0,0,0), {0,1,0), (0,0,0))¢ war asarray[0..101,0..101]o£ byte; n,i,j,nrizo,i1,jl:integer; fitext; sw:boolean; begin assign(f£, 'tablou.in'); veset(f£); veadin(£,n); for i:=1 to n do begin for j:=1 to n do read(f,ali,j1)? readin(f); vend; close(f£); {bordare tabiou cu linia 0.si n+1} £or j:=0 to n+l do begin al0,j] :=03 afnt+1,j]:=0; end; {bordare tablou cu coloana 0 si n+1} for i:=1 to n do ‘ begin ali,0]:=0; ali,n+1] end; {determinam numarul de cifre de 1 izolate} nrizo;=0; e for i:=0 to n-1 do for j:=0 to n-1 do begin {verific daca elementul'de pe linia i+1, } {col j+1 este izolat} , swistrue; for il:=0 to 2 do for jl:=0 to 2 do if izo[il,jll<>afi+i1,4+51) then sw:sfalse; if sw then nrizo:=nrizot+1; end; assign(£, 'tablou.out'); rewrite (£); writeln(f, nrizo,' cifre de 1 izolate'); writeln(f, 'Coordonatele punctelor izolate'); {determinam liniile si coloanele pe} {care se gasesc cifre dei izolate} for i:=0 to n-1 do for j:=0 to n-1 do begin (verific ‘daca elementul de pe linia i+i, } {col j+1 este izolat) . swietrue; for 11:=0 to 2 do for ji:=0 to 2 do Lt dzo[il,j1]<>ali+i1,j+51] then sw:=false; if sw then writeln(£,4+1,' ',3+1); end; close(£); end. 1. Se dau n caractere (1sns1000), Se cere si se determine numarul de litere a §1 numérul de litere mici care se gasesc printre cele n caractere xemplu: pentru n=10 si caracterele a2a Uh su , Nr. litere mici 5 a areas Nr. litere mari 3 2. Se dau n caractere (1£nS1000). Se cere si se determine numarul de cifre pare care se gasesc printre cele n caractere. Exemplu: pentru n=10 si caracterele a2a1b456u4 se va afisa Nr. cifre pare; 4 3. fn fisierul. text tabl.in se aflA pe prima linie un numar natural n (1S$n$1000), iar pe urm&toarele n linii cate n numere naturale (mai mici om egale cu 32000) separate intre ele prin cate un spatiu, Se cere sd se , i fisierul tabl.out de cate ori apar cifrele o, 2, 4, & 8 can a tablou. Dacd o cifra nu apare ca numar in fisierul tabl.in, atunci ea nu se scrie in fisierul tabl. out. Tanda tabl.out 4 4 de 3 ori 12 3 3456 1 8 de 3 ori 45 8 87 4 44 4 980 3 53454 in fisierul text tablou.in se afla pe prima Tinie un qumér neal (1£n$100), iar pe urmatoarele n linii cate a cifre (0 sau 1) i. int om prin cate un spatiu. Se cere 4 se scrie in fisierul tablou.out clite -grup _ de cifre de 1 (patru de 1 formand un tablou patratic de dimensiune ae : tablou (adict sunt tnconjurate numai de 0 sau de marginea = blou - i Considerim c& in jurul unui element se gasese elementele vecine din nord, sus, est, vest, nord-est, nord-vest, sud-est si sud-vest. emplu: "eel -in tablou.out 6 2 110000 Liope@. 000110 000110 ti10001 210100 Se numéar’ cele doua 4-grup-uri scrise ingrosat. Vom introduce no pornind de Ia un exemplu fiunea de functie in programare Se dau dowd fractii @52 ba cu a, b, ce, d numere naturale mai mici sau egale cu 2000000000, 640, c#0, Se cere 84 se afigeze in forma ireductibila suma ae —+—, bod Exempliul 28.1. Pentru @=100, b=15, c=45, d=27 se va afisa 25/3, Solutie. Un algoritm care rezolva problema ar fi urmatorul: ~ Se simplifict prima fractie, asfel incat s& se obtina o fractie ireductibila, Aceast& operatie se poate realiza calculand cel mai mare divizor comun pentru a gi b (notat cu d), dupa care se realizeazi atribuirile a:=a' div d; 4:=b div d; - S€ repeta pasul anterior pentru a doua fractie; - se determin’ numarétorul si numitorul fractiei sum’: ¢-=a*d-+b *e; f=b*d, 4 . @ Sf yee apoi se transforma fractia 7 » in fractie ireductibild ca la primul pas, Se observa ca s-a utilizat algoritmul de determinare a celui mai mare divizor comun,a doua.numere de trei ori, pentru: - asib; =» €8§hd - esif. Marimea algoritmului cre: alte date) de mai multe ori in subprogramelor: functiilor si procedurilor definite de utilizatori. in continuare ne vom ocupa de functii, anterioara, folosind o functie pentru calculul numere este urmatorul: Un program care rezolvi problema celui mai mare divizor comun a doud program exemplu; ; var a,b,c, d,e,£,g:longint; — function cmmdc(x,y:longint) :longint; begin Ue seal then cmmdc:=y else if y=0 then cmmdc:=x else begin while x<>y do if x>y then x:=x-y else y:=y-x; ommde := 7 end; end; begin write('a='); readin(a); write(' readin(b); write(' }: veadln(c); write('d='); readin(d); ssemmde(a,b); at=a div gib gr=ommdc (c,d); cr=c div g; 4 é *d+c*b; f:=b*d; , peommdc (@,£) 5 e:me div gy f:=£ div gi writeln(e,'/',£)7 readin; end. . x : + i ©. Functiile incep cu un antet’ care contine cuvantul nels SS em ied nume (prin care ea poate fi utilizata in aT hace “— e pam a ista ita i (t % cu tipul i L listé de date numit4 parametri (impreun: Small on dete i if 2 de. Rolul acestora este de a fi i v incadrati intre paranteze rotunde. R esto ees ite pe i i tunci cnd vrem sa folosim concrete (numite parametri efectivi), at ‘ ! 0 : a © Functia poate returna o singura valoare, tipul acestel valor! tebule oe la sfarsitul antctului:(precedat de caracterul :), Tipul functiei poate > real, char, string. —_ : Pemicbih wed lipsi (in acest caz nu se mai'utilizeaza parantezele ee Dupa antet, urmeaz’ partea declarativa (in exemplul anterior nu a fost nev > s. » a iabi tipuri). '°. §8 se declare variabile, constante, oo os ©. Dupii partea declarativa urmeazi corpul functiei cu instructiumt, care incepe cu begin si se termina cu end. ; _ | atin © _ in corpul functiei trebuie sd apara cel putin o attibuire care s4 contin’ stinga numele functiei, 44 Dup& aceste caracteriziri bazate pe exemplul anterior putem da forma generald a unei functii: function nume_functie(lis ta_parametrii_formali):tip_functie parte_declarativa begin instructiuni end Functia actioneazi aproape ca un program, de aceea ea face parte dintr-o categorie mai mare. care se numeste subprograme. Datele de intrare pot fi considerate parametrii efectivi, datele de iegire, valoarea returnatd de functie. lista_parametrii_formali reprezint2 0 succesiune de parametrii, Separati prin virguld dacd au acelasi tip, respectiv prin punct si virgulé cAnd se separa parametrii de tipuri diferite, , O functie returneazi o singura valoare. Vom vedea in capitolele urm&toare ca procedurile pot returna mai multe.valori (sau niciuna). fn cadrul unei functii putem utiliza variabile si constante. care. nu sunt declarate in functie, dar sunt declarate in program. Se pot declara variabile in functii, cu acelasi nume ca cele din program. In acest caz ele sunt utilizate local (adicd numai in functie) find independente de cele globale (definite in program). Functiile ‘se scriu in program imediat dupa declararea variabilelor din program. Utilizarea lor in program se realizeazi prin apeluri. Un apel presupune folosirea numelui functiei urmat. de parametrii efectivi precedati ‘si urmati de paranteze, in cadrul unor atribuiri, expresii, afigari. Apelul unei functii are ca efect inlocuirea paramettilor formali cu parametri efectivi in toate instructiunile functiei si returnarea unei singure valori (de. tipul precizat in antet). Dac& parametrii efectivi (care sunt variabile in program) se modificé prin diverse instructiuni in cadrul functiei, dup& iesirea din functie, acestia tsi reiau valorile pe care le aveau inainte de apel. Exemplul 28.2. brogram exemplu; var a,b:integer; function suma(x,y:integer) zinteger; var stinteger; begin Si=x+y; suma:=s; Hiex+1; yisyel; end; begin areal; b:=2; writeln(a,‘ ‘,b); writeln(suma(a,b)); writeln(a,‘ ‘,b); end, 1, Se dau doud numere naturale cu cel mult 9 cifre fiecare. Se cere sa se afiseze , cele doud numere in ordinea descresciitoare a sumei cifrelor lor. Exemplu: pentru numerele 2001 gi 236 se va afiga 236 2001 . pentru cd 11>3, 11=2+3+6 §1 3=24+0+0+L i i avea Solutie. in scrierea algoritmului vom folosi o functie cu numele ment _ hs 2 ca parametru un numar x de tip longint si va return a suma cifte i =o programul principal se va apela de doud ori aceasta functie, odaté pentru p num&r si apoi pentru al doilea numar. program suma_cif; var a,b:longint; sa,sb:integer; function suma(x:longint) :integer; var s:integer; begin s:=0; while x>0. do - begin s:=s+ x mod 10; xt=x div 10; end; suma:=s; end; begin write('a=');readin(a); write('b=');read1n(b); sa:=suma (a) ; sb:=suma (b) 7 if sa>sb then writeln(a,' ',b) else writeln(b,' ',a)7 readin; end. 2. in fisicrul text vector. in se afld un vector: pe prima linie n (1SnS1000), iar pe linia urmatoare n numere naturale cu cel mult 9 cifre fiecare, Se cere s& se scrie in figierul vector.out pe prima linie cea mai mica component, pe a doua linie cea mai mare componenta, iar pe.a treia linie suma componentelor, Se va utiliza o functie pentru determinarea celei mai mici componente, o funcfie pentru determinarea celei mai mari componente si o functie pentry calculul sumei componentelor unui vector, Exemplu: vactor.in vactor.out 4 4 53454 34 48 Solufie, Pentru a utiliza ca parametri in functii (si proceduri — yom vedea in capitolele urmatoare) vectori sau tablouri bidimensionale, trebuie s& declaram tipul parametri vectorul si dimensiunea, iar ca valoare returnaté cea mai. mica componenta, cea mai mare componenta, respectiv suma componentelor vectorului, program operatii_vector; type vector=array[1..1000]o£ longint; var x:vector; n,i:integer; max,min,s:longint; E:text; function minim(x:vector;n: integer); longint; var min:longint; . -i:integer; begin min:=x[1]; for i:=2 to n do if min>x[i] then mins=x[i]; minim: =min; end; function maxim(x:vector;n: integer) slongint; var max:longint; i:integer; begin max:=x[1)}; for iz=2 to n do if maxx[i,j] then minr=x[i,j}; minim:=min; end; function maxim(x:tablousn:i : i var max:longint; aD nd eS i, jrinteger; begin max:=x[1,1]; for i:=1 to n do for j:=1 to n do if max4, 36=2*3*6 gi 4=2*41*2*1 fn figierul text vector .in se aflfi un vector: pe prima linie n (10. Exemplu: var z,urreal; Pe ecran se va afisa o 1.414 zr=2; ur=aqrt (z); write (u:0:3); 8. Functia trune se apeleaz’ prin trunc() gsi returneazd cel mai mare intreg mai mic sau egal cu x, daci x este pozitiv, respectiv cel mai mic intreg mai mare sau egal cu x in celalalt caz, unde x este de tip intreg sau real. Exemplu: Pe ecran se va afiga 2-2 var x,z:real;y,u:integer; 2.56;22=-2.567 trune (x) surstrune (z) 7 write(y,’ ‘,w)i 9. Functia round se apeleazi prin round (x) gi returneazi cel mai apropiat intreg de x, unde x este de tip intreg sau real. Exemplu: var x,z:real;y,usinteger; Pe ecran se va afiga we 3-2 u3=2.56;z2=-2.16; yreround (x) ;u:=round(z)7 write(y,’ ‘,u); 10. Functia int se apeleaz’ prin int (x) si returneazi un numér de tip real cate reprezint’ partea intreagi a lui x (adic& un numéar intreg k cu proprietatea cA kSxlength(x[i]) then min: =length(x[i]); assign(£, 'elev.out'); rewrite(£); for i:=1 to n do if min=length(x[{i]) then writeln(£,x[i]); close(f); end, 6. fn fisierul text prop. in se afl4 pe primul rind o propozitie cu maxim 255 de caractere. Se cere s4 se scrie in fisierul prop.out unul dintre mesajele DA sau Nu. Se va scrie DA, dac& oricare dou cuvinte aliturate din propozitie sunt separate prin exact un spatiu, in caz contrar se va scrie NU, Exemplu: prop.in prop.out. Ana merge la mare DA Solutie. Citim propozitia in variabila s de tip string si apoi verificam folosind functia pos, dacd s confine dou’ spafii alaturate. In caz afirmativ se va scrie DA, respectiv NU, in caz conttar. program propl; var sistring; printeger; £:text; begin assign(f, 'prop.in'); reset (£); readln(£,s); close(f£); p:=pos(' ',s); assign(f, 'prop.out'); rewrite (f); if p=0 then writeln(£, 'DA') else writeln(f,'NU'); close (£); end. 7. ‘fn fisierul text pro.in se aflé pe primul rand o propozitie cu maxim 255 caractere. Se cere si se scrie in fisicrul pro.out portiunea din propozitie cuprinsa intre primul si ultimul spatiu. Dac’ propozitia nu are spatii-sau are un singur spatiu se va scrie in figier caracterul #, Exemplu: pro.in pro.out Ana merge la mare merge la Solutie. Citim propozitia in variabila s de tip string si apoi determinim jn variabila 1, folosind functia pos pe ce pozitie se afla primul spatiu. Apoi determinim in p2 (parcurgand caracterele de la ultimul spre primul) pozitia ultimului spatiu. Daca s are cel putin doua spatii, folosind functia copy se va afisa portiunea din s dintre pozitiile p1 $i 2, altfel se va afiga caracterul #, program prop2; var sistring; pl,p2:integer; Estext; begin assign(f,'pro.in'); reset (f); readln(f,s); close(f£); {determin poz. primului Spatiu} pli=pos(' ',s); {determin poz. ultimului Spatiu} p2:=length(s) ; while (p2>0)and(s[p2]<>' ') do p2:=p2-1; assign(f,'pro.out'); rewrite (£); if p2>pl then writeln(f,copy(s,pl+1,p2-p1-1) ) . else writeln(£,'#'); close(f£); end. 8. in fisierul text numere.in se afl mai multe numere naturale,.cu cel mult.9 cifte fiecare. Se cere s& se scrie pentru fiecareinie din fisierut numere, in, in figierul numere.out cel mai mare si cel mai mic numar pe. cAte ‘o linie, Separate printr-un spafiu. Dac’ o linie nu confine niciun numar, ‘atunci in fisierul numere . out pe linia corespunzitoare se va scrie caracterul #, Exemplu: numere.in numere. out 10 12 15 4 12 is 4 34 34 34 # 13 56 8 3 56 3 Solutie. Deschidem, ambele fisiere.in acelagi timp, Parcurgem ee - ae folosind functia eof, pentru fiecare linie parcurgem toate numerele (folosin functia eoln) si determin’m maximul si minimul lor in variabilele max gi min (initial max ate o valoare foarte mica, iar nino valoare foarte mare), apoi le — in fisierul de iesire. Dupa ce prelucrim o linie se trece pe linia urm&toare in am! fisiere. program numere; const mic=-1; mare=1000000000; var £,g:text; max,;min,x:longint; begin assign(f, 'numere.in'); reset (£); assign(g, 'numere.out'); rewrite (g) 7 while not eof(f) do . {eat timp nu suntem la sfarsitul fisierului} begin max:=mic;min:=mare; while: not eoln(£) do {eat timp nu suntem la sfarsitul liniei curente} begin read(£,x); if x>max then max: =x; if min>x then min:=x; end; if max>omic then writeln(g,max,' ',min) else writeln(g, '#'); . readin(£);{se trece la rand nou in £} end; close(£); close(g); end. 9. In fisierul text caract in se afl: pe mai multe {inti diverse caractere. Se cere si se si.se scrie pentru fiecare linie din fisierul caract.in in figierul caract.out toate caracterele diferite de spatii. Dacd o linie nu contine nici un caracter, atunci in fisierul caract .out nu se va scrie nimic. Exemplu: cavate ein caract.out Ape cd ou Abecau Tztzedddd TZ tz e dddd Solutic, Deschidem ambele fisiere in acelasi timp, ca in problema anterioara, Parcurgem liniile fisierului de intrare folosind. functia seekeof, ca. sé evitam caracterele albe, apoi pentru fiecare linie parcurgem toate caracterele -(folosind functia seekeoin) gi le scriem in fisierul de iesire. Dupa ce prelucrimo linie, se trece pe linia urmatoare in ambele fisiere, program caractere; var f£,g:text; x:char; begin assign(f, 'caract.in'); reset (£); assign(g, ‘caract.out'); vewrite(g); while not seekeof(£) do {cat timp nu sunt la sfarsitul fisierului, trecand si peste caracterele alba} begin while not seekeoln(f) do begin vead(f,;x); write (g,x); end; writeln(g); readin(f£); end; close(£); close(g); 1. Si se creeze un figier cu numele 14t_mard tat care s4 confina literele mari ale alfabetului englez impreuna cu codul ASCII. Pe o linie se va scrie o litera si codul sau. . 2. Se da un vector cu n (1Sn$100) componente numere reale in variabila x, on numar natural impar. Se cere sd se calculeze suma Je] ~ [xe] + fxs] -. +. + [Xn] trunchiat’ la dona zecimale, Exemplu: pentrun=3 si componentele 10 12.05 ~12 se vaafisa 9.95 3. Se di un vector cu n (1SnS100) componente numere reale in variabila x, n numéar natural impar, Se éere si se calculeze suma x,” ~ x,? + Fy + Xy2, Exemplu: pentru n=4 si componentele 3 3.1.1 1seva afiga -0.21 10. Se dau n numere naturale cu cel mult 9 cifte in vectorul x, 1$n$100. Se cere: a. sa se afigeze toate numerele prime din x; z b. sa se afiseze toate numerele patrate perfecte din x. Exemplu: Pentru n=5 gsi componentele 23 12 9 8.144: vaafisa a) 23 b) 9 144 in figierul text elev.in se afl4 pe primul rand un numar natural n (10 do begin u:=aux mod 10; aux:=aux. div 10; if u=i then sw:=true; end; if sw then write(i,' '); end; writeln('.'); end; {cif_dist} begin write('a='); readln(a); write('b='"); readin(b); write('c='); readin(c); cif_dist(a); cif _dist(b); cif dist(c); readin end. Procedurile incep cu un antet, care contine cuvantul cheie procedure si un nume (prin care ea poate fi utilizati in program), Numele este urmat:de o lista de date numite’ parametri (impreund cu tipul lor). incadrati intre paranteze rotunde, Rolul acestora este de a fi inlocuiti cu date concrete (numite parametri efectivi), atunci cand vrem sa folosim functia. Parametrii pot lipsi (in acest caz nu se mai utilizeazi parantezele rotunde). Dupa antet, urmeazi partea declarativa (in exemplu apar declarate cdteva variabile, adic& declarari de variabile, constante, tipuri). Dupa partea declarativa urmeaza corpul procedurii cu instructiuni, care incepe cu begin gi se termini cu end. : Folosirea procedurilor in program se realizeaz& prin mécanismul de apelare, ce presupune utilizarea numelui procedurii, urmat de parametrii efectivi, precedati gi urmafi de parantezi rotund’ (pentru exemplul urmitor, procedura cif_dist a fost apelata de trei ori). 44 Dupa aceste caracteriziri bazate pe exemplul anterior putem da forma a general a a unei proceduri: procedure nume_procedura (lista_parametrii_formali); parte_declarativa begin instructiuni end Procedura actioneaza aproape ca un program, de aceea ca face parte dintr-o categorie mai mare care se numeste subprograme. Datele de intrare, cat si datele de iegire formeaz’ parametrii efectivi. lista_parametrii_formali teprezinté o succesiune de parametri, separati prin virgul daci au acelagi tip, respectiv prin punct si virguld cind se separa parametrii de tipuri diferite. Pentru ca s4 putem returna valori programului, parametrii respectivi trebuie s& fie precedati de cuvantul cheie vax. in felul acesta parametrii efectivi care inlocuiesc parametrii formali precedati de. cuvantul cheie var, riman modificati dupa apel, ceilalti prametri nemodificandu-se. : Astfel, procedurile pot returna mai multe valori (sau niciuna, daca nu exist parametri formali precedati de vax). Parametrii prin care se returneaza valori programului, trebuie s& fie variabile (pentru ca isi vor modifica valoarea). fn cadrul unei proceduri putem utiliza variabile gi constante care nu sunt declarate in proceduri, dar sunt declarate in program. Se pot declara variabile in proceduri cu acelasi nume ca cele din program. in acest caz ele sunt utilizate local (adici numai in procedura) fiind independente de cele globale (definite in program). Procedurile se scriu in program imediat dup’ declararea variabilelor din program. Utilizarea lor in program se realizeazi prin apeluri. Un apel presupune folosirea numelui procedurii urmat de parametrii efectivi, precedafi si urmati de paranteze. : : Apelul unei proceduri are ‘ca efect inlocuirea parametrilor formali cu parainetri efectivi in toate instructiunile procedurii. Dac’ parametrii efectivi inlocuiesc parametrii formali care nu au cuvantul cheie‘var in fafa ‘lor (si sunt variabile in program) se modifica prin diverse instructiuni in cadrul procedurii, dupa iesirea din procedur& acestia tsi reiau valorile pe care le aveau fnainte de apel. Exemplu: program exemplu; var a,b,s,p:integer; procedure suma(x,ytinteger, var s:integer); begin sr=xty? wr=etl; yr=ytl; pr=30; end; begin a:=l; b:=2; pr=10; writeln(a,’ ‘,b,‘ *‘,D)i suma(a,b,8)7 writeln(s)? writeln(a,’ ‘sb,’ ‘,D); end. Dupa executare pe ecran se va afiga: TL 2o 19 3 L230 tee yates 1. Se dau trei numere naturale nenule in variabilele a, b, c. Se cere si se determine cel mai mare divizor comun si cel mai mic multiplu-comun pentru a,b, a ileane ‘ procedura care returneaza cel mai mare divizor comun gi cel mai mic multiplu comun pentru doud numere natural i le ne Se enule, date ca Exemplu: pentru numerele 12, 90, 36 se va afiga cmmdc=6 cmmmc=180 Solutie, Procedura cu numele cmmde_cmmmce va avea patru parametri formali primii doi sunt numerele pentru care se calculeazi cmmde si cmmme, iar witmatorii doi reprezinta cel mai mare divizor comun gi cel mai mic multiplu comun Acesti ultirai doi parametri sunt precedati de cuvantul cheie var, pentru ci valorile lor trebuie returnate programului. Aceasté procedura se apeleaz& de trei ori pentru a determina cel mai mare divizor comun gi cel mai mic multiplu comun al numerelor abgic. program numere; var a,b,c,d,m,d1,m1l:integer; procedure cmmdc_cmmme(a,b:integer i st ivar d,m:inte: ? var xa,yb:integer; " gents begin while xa<>yb do if xa>yb then xa:=xa-yh else yb:=yb-xa; 2=xa;p miea*b div d; end; begin weite('a='); readin(a); write('tb='); readln(b); write('c='); readin(c); emmdc_ommme (a,b,d1,m1) ; ommde_emmme (¢,;41,d,m) 3 emmde_cmmme (c,m1,a1,m) 7 writeln('cmmdc=',d); writen ('cmume=',m) ; readin end. 2. Sedau de la tastatura doi vectori cu componente intregi in variabilele x si y Gx are m elemente, iar y are n elemente, 1Sm,ns100). Se cere sA se construiasca doi vectori u si v, primul cu elementele pare din x, iar al doilea cu elementele pate din y (dupa construirea lui u gi v se vor afiga pe ecran, cAte un vector pe un rand). Exemplu: pentru m=4, x.cu elementele 2 55 44 2,n=5, y cu elementele 32 45 678 20 2111, se va afisa 2442 32 678 20 Solutie. Vom utiliza trei proceduri: prima pentru citirea unui vector, a dowa pentru construirea unui vector cu componentele pare ale unui alt vector, iar a treia pentru afigarea unui vector. in prima procedurA parametrii au var in fati pentru ca valorile lor trebuie returnate programului (pentru a fi utilizate in alte prelucrari), fn a doua proceduri primii doi parametri (dimensiunea gi vectorul) sunt utilizati pentru a construi un nou vector cu componente pare, acest vector gi dimensiunea sa vor. fi returnate programului prin doi parametri, Ultima procedur& afigeazi un vector dat ca parametru. program vectori; type vector=array[1..100]of integer; var x,y,U,Vivector; m,n,h,k:integer; procedure citire(var k:integer;var a:vector); var i:integer; begin write('™nx. componente=') + readin(k); for i:=1 to k do begin write('comp. a~ ',i,' -a ='); readin(alil); end; end; procedure construire(m:integer;x:vector;var h:integer;var u:vector) ; var isinteger; begin h:=0; for 1:=1 to m do i= x[i] mod 2 = 0 then begin h:=h+1; ulh] :=x[il; end; end; procedure afisare(k:integer; a:vector); var i:integer; begin for i:=1 to k do write(alil,' '); writeln; end; begin writeln('citire vector x:'); citire(m,x); writeln('citire vector y:'); citire(n,y); construire (m,x,h,u); construire(n,y,k,v); afisare(h,u); afisare(k,v); readin end. 3. Se dau doua tablouri patratice de dimensiuni m, respectiv n in variabilele a si b, Se cere sii se verifice daca tablourile a sib sunt egale:(10 do begin Ursaux mod 10; aux:=aux div 10; inv:=inv*10+u; end; if k=inv then palindrom:strue else palindrom:=false; end; begin write('a='); readln(a); krea; while true do begin if palindrom(k) then break; k:=k-1; end; writeln(k) 7 readin; end. 3. Se da de la tastatura un numéar natural in variabila a. Se cere s& se afigseze cel mai mic numar patrat perfect mai mare sau egal cu a. Exemplu: pentru numarul 20 se va afisa 25. Solutie. Se porneste cu o variabila k de la a gi se creste cu cate o unitate pana cand se ajunge la un numéar patrat perfect. Cand se ajunge Ja un numar a mane opreste fortat din executare programul folosind procedura halt. Inainte de apelu. _ acestei proceduri se va afisa numirul cautat. : program nr_pp; var a,k:longint; begin write('a='); readin(a); krsay; while true do begin if frac(sqrt(k))=0 then begin writeln(k); readin; halt; end; k:=k+1; end; end. 4.. In fisierul text prop.in se afla pe prima linie o propozitic cu maxim 255 caractere (litere mari si mici ale alfabetului englez gi spatii). tn propozitie cuvintele sunt separate prin unul sau mai multe spatti. Se cere 8a se serie in fisicrul prop. out propozitia fara spatii inutile (oricare doua cuvinte alaturate vor fi separate printr-un singur spatiu). Exemplu: prop.in prop.out Tonut merge la mare Tonut merge la mare Solutie. fn prima etapa se citeste propozitia in variabila s, apoi cat timp exista in s doua spatii aldturate se sterge primul, folosind procedura delete. Ciutarea a doua Spatii consecutive in s se realizeazi utilizind functia pos. Cand se ajunge la Situatia in care s nu mai contine doui Spatii alaturate se scrie valoarea-lui s tn fisierul prop out. Program propozitiel; var s:string; p:integer; Estext; begin assign(f, 'prop.in'); reset (£); readin(f£,s); close(£); Ptspos(' ',s); while p>0 do begin delete(s,p,1); P:=pos(' ',s); end; assign(£,'prop.out'); rewrite (f); write(£,s); close(f); end. 5. In fisierul text exp. in se afla pe prima linie un sir de maxim 255 caractere (cifre si caracterul #). In sirul de caractere apar numere separate de unul sau mai multe caractere #, aceste numere nu au mai mult de 9 cifre. Se cere s& se scrie in figierul exp’. out numarul cel mai mare. " Exemplu: . exp.in exp.out 1234##7878145696#12 78781 Solutie. fn prima etapa se citeste Propozifia in variabila s. Pentru a verifica dacd un caracter este cifra utilizim o constant’'cu numelé cif, care confine toate cifrele zecimale. Parcurgem toate caracterele din s si construim de fiecare dat cu primul caracter care este cifra, sirul de caractere format numai din cifre afaturate, apoi iL convertim in valoare numericd fc ‘osind procedura vai si il compariim cu max (care initial este -1). In final se afigeazi max. Dac& nu exista cifre in s atunci se va scrie -1 in figier, , program propozitiel; const cif :string[10]='0123456789'; var s,tistring; i,n,er:integer; nr,max:longint; E£rtext; begin assign(f,'exp.in'); reset (f); readln(£,s); close(£); wh. i: 1; n:=length(s) 7 ile i<=n do £ pos(s[i],cif)=0 then iseitl else begin while (i<=n)and(pos(s[i],cif}>0) do begin tret+s[il; iseitl; end; val(t,nr,er); if (er=0)and(max (pentru a verifica dac& doud mulfimi sunt diferite), <= (pentru a verifica dacd o mulfime este inclus’ in alta), >= (pentru a verifica dacd o multime include alta multime). * Pentru a citi o multime trebuie s& citim fiecare element si sa-1 adaugam la ca prin operatia de reuniune. Initial se porneste cu o multime vida. © Pentru a afisa o mulfime se parcurg elementele tipului prin care se defineste multimea gi se verificd daca se gasesc in ea (in caz afirmativ se afiseazd). J. Se di o multime, de caractere -(citirea se face caracter cu caracter de la tastatura, pana cfind se citegte caracterul #, care nu face parte din multime). Se cere sa se afiseze elementele multimii pe un rand cu un spatiu intre ele. Exemplu: pentru girul de caractere amnd12# se vaafigal 2 a d-mn Solutie. Pentru citirea multimii vom folosi variabila x, care initial are ca valoare multimea vida, apoi pe misur& ce se citesc caractere in variabila c se introduc in x (schimband valoarea lui x cu x+[c]), cat timp valoarea din c este diferita de caracterul #. Pentru a afiga clementele lui x, parcurgem folosind variabila i, toate codurile AscIz ale caracterelor imprimabile, verificand dacd caracterul corespunzator este in x (in caz afirmativ se va afiga). program citire afisare_multime; var x:set of char; . eschar; i:byte; begin {citixe multime} xr=[];3 read(c); while c<>'#' do begin rext+[c] read(c); end; writeln; {afisare muiltime} for i:=32 to 127 do begin esschr(i); if c in x then write(c," '); end; writeln; end. 2. Se dau de la tastatura doud multimi a cu m, respectiv B cu n elemente (numere naturale de tip byte). Se cere si se afiseze intersectia, reuniunea si cele doud diferente pentru multimile date. Exemplu: pentru mulfimea A cu 3 elemente: 1 3 7 si Bcu 5 elemente: 2 3 5 7 10 se va afiga: A intersectat cu B: 3.7 A reunit cu B; 12357 10 A= Br 1. Br Ar 25 10 Solutie. Pentru citirea unei multimi vom folosi o procedura care are doi parametti, unul pentru a returna multimea gi altul pentru .numarul de elemente al multimii (pentru a folosi mulfimi ca parametru se declard tipul multime in sectiunea type). Pentru afisarea unei multimi, date ca parametru vom utiliza procedura afis. program operatii_cu_mulitimi; type multime=set: of byte; var a,b,c:multime; m,;nibyte; procedure afis(a:multime); var i:byte; begin for i:=0 to 255 do if din a then write(i,' ')j writelin; end; procedure cit(var a:multime;m:byte) ; var i,x:byte; begin ar=(l; for i:=1 to m do begin read (x); a:=a+([x]; end end; begin {eitire multime A} writeln('Multimea A:'); write('nr. de elemente=');readin(m); write('dati elementele unul dupa '); writeln(‘altul cu un spatiu intre ele'); eit(a,m); {citire multime B} writeln('Multimea B:')7 write('nr., de elemente=');readln(n); write('dati elementele unul dupa '); writeln('altul cu un spatiu intre ele'); cit(b,n); {intersectia} write('A intersectat cu B: '); cr=a*b; afis(c); {reuniunea} write('A reunit cu B: '); e:satb; afis(c); {diferenta A-B} write('A - Br '); C3sa-b; afis(c); {diferenta B-A} write('B - A: '); cr=b-a; afis(c); readin end. 3. Se d& un numar natural cu maxim 9 cifre in variabila n, Se cere s4 se afiseze cifrele distincte si numarul lor din n. : Exemplu; pentru numarul 112318 se va afiga: Cifre distincte: 1 23 8 Numarul cifrelor distincte 4 Solutie. Vom crea o multime cu toate cifrele din n (dac acceasi cifti se repeti de mai multe ori, ea va raméne in mulfime o singura data), apoi elementele ei se vor afiga. Pentru a determina numirul de elemente ale unei multimi vom utiliza o functie care returneaz4 acest numar, program nreifre_cu_multimi; type multime=set of byte; var a:multime; u:byte;n, aux: longint; procedure afis(a:multime) ; var i:byte; begin for i:=0 to 255 do if i in a then write(i,' '); writeln; end; function nrelem(a:multime) :byte; var nr,i:byte; begin nr:=0; for i:=0 to 255 do if i in a then nr:=nr+1; nrelem:=nr; end; begin write('n='); xeadin(n); as=[]; aux:=n; while aux>0 do begin ursaux mod 10; aux:=aux div 10; arsa+[u]; end; write('cifre distincte: ‘); afis(a); writeln('Numarul cifrelor distincte ',nrelem(a)); readin end. Se dau n siruri de caractere (fiecare sir de caractere cu maxim 255 de caractere). Se cere sa se afigeze literele mici (ale alfabetului englez) comune tuturor sirurilor de caractere, Exemplu: pentru'n=3 si sirurile de caractere Ab89cb Xxb89wewA CcAs23&bbdrr se va afisa be Se da un sir de caractere intr-o variabila de tip string. Folosind tipul set se cere s& se determine num§rul de cifre distincte care apar in sirul de caractere. Exemplu: pentru sirul de caractere Ana are 121 de mere si 27 pere se va afisa 3. (pentru ca in sirul de caractere apar cifrele1, 2, 7—numirate o singura dat). in fisierul text malt in se afl4 dou’ mulfimi, pe cate o linie fiecare (0 linie contine n+1 numere de tip byte, primul este n, iar urmatoarele, elementele multimii, separate intre ele prin cate un spatiu). Se cere s& se scrie in fisierul mult.out elementele comune celor dou’ mulfimi, separate prin cate un spatiu. Exemplu: mult.in mult .out 41578 5 8 52568 10 in fisierul text muit in se afl doua multimi, pe cate o linie fiecare (0 linie confine n+1 numere de tip byte, primul este n, iar utmitoarele, elementele mulfimii, separate intre ele prin cAte un spafiu). Se cere s& se scrie in fisierul mult .out unul dintre mesajele DA sau NU. DA fn cazul in care prima multime este inclusa in a doua multime, respectiv wu, contrar, Exemplu: mult.in mult .out 3.25.7 DA 525671 In fisierul text mult.in se aflA doud multimi, pe cate © linie fiecare (0 linie Contine ni+1 numere de tip byte, primal este n, iar urmatoarele, elementele multimii, separate intre ele prin cate un spatiu). Se cere s& se scrie in fisierul mult.out elementele multimii cu mai multe elemente. Dacd amandoud au acelasi numar de elemente, se vor afisa ambele miltimi. Exemplu: mult.in mult .out 3157 12567 525671 fn figierul numere. in se afld pe o linie doud numere naturale cu maximum 9 cifre fiecare, separate prin cAte un spatiu. Se cere s& se scrie in fisierul numere. out toate cifrele comune o singura dati, pe o linie separate intre ele prin cate un spatiu. Exemplu: numere.in 42312 127823 numere.out 128 Tn figierul text mult.in se afld m multimi, pe cate o linie fiecare (o linie confine nel numere de tip byte, primul este n, iar urmitoarele, elementele mulfimii, Separate intre ele prin cate un Spatiu). Numarul m,se afla pe prima linie. Se cere sa se scrie in fisierul mult out elementele comune celor m mulfimi, separate prin cate un Spatiu. Exemplu: mult.in mult.out a 58 41578 5256810 45981 “ Coordonate in plan. Aria unui triunghi ORS IE A PRT SERS SSAA RE AE MAC Uy GOES CELT MSH eS SIEOT RLS fn continuare ne vom ocupa de calculul distanjelor dintre'doua puncte, date prin coordonatele lor carteziene si de determinarea ariéi unui triunghi prin diverse formule, ‘Vom, considera in continuare douad puncte M(xM,yM). si ae Coordonatele acestor..puncte pot fi considerate de. tip real sau tntreg. Aplic’ teorema lui Pitagora in triunghiul. MNA se obtine MN = (xM -xN)? +(yM - Ny? N Pentru calculul ariei S a unui triunghi ABC cu A(xA,yA), B(xB,yB), C(xC,yC), AB=a, AC=b, BC=c, p=(at+b+c)/2 avem formulele: «© S=ah,/2, 8 = beh,/2, S = ch/2, unde h,, h,, h, sunt lungimile indltimilor triunghiului ABC pe laturile BC, AC, respectiv AB. « S=,/p(p-a)(p—b)(p—c) , formula lui Heron ¢ S=(a-b-sinC)/2, § = (b-e'sinA)/2, S = (@c-sinBy2, ° S= J thal gt ao yf A pd ~ leg ally yh ma yl 2 © Pentru ‘a calcula aria unui patrulater, pentagon, hexagon, etc, acestea se impart in mai multe triunghiuri si se insumeaza ariile lor. * Pentru a verifica dack un punct M se-gaseste in interiorul Sau pe laturile unui trunghi ABC se verificd egalitatea aria(ABC) -= aria(ABM)+aria(ACM)+ aria(BCM). . est © Pentru a verifica dacé trei puncte distincte A, B, C sunt coliniare; este suficient s4 verificam conditia aria(ABC)=0, OB gating © Cand verificafi dact doud numere reale x si y sunt egale este bine si folosifi egalitatea aproximativa Ix-y/<0.00001, pentru c& in memoria ‘calculatorultui Se retin doar o parte din zecimalele numerelor teale, rezolvate 1. Se dé-un triunghi apc prin coordonatele varfurilor a, B, c $i un punct ™ prin coordonatele lui. Se cere s& se verifice dac& punctul este in exteriorul triunghiului sau nu (se va afiga unul dintre mesajele pa, pentru exterior si'NU contrar), ‘ . . Exemplu: pentru a (3,0), B(0,4),C(0,0) sim(0,10) se va afiga'Da, : Solutie. Vom folosi- o funefie care retumeaz& aria. unui triunghi dat prin coordonatele varfurilor (folosind formula tui Aeron) si-o.procedur’ pentru'citirea coordonatelor unui punct, Pentru a verifica dacd un punct este exterior triunghiului folosim conditia din observatii, ca un punct s¥ fie in interiorul sau pe laturile-unui triunghi. : * program poz_punct_triunghi; var XA, YA, XB,YB,XC,yC,xM,yM:real; 8,81,82,83:real; function aria (xA,yA,xB,yB,xC,yC:real) ‘real; var a,b,¢c;p:real; begin Grssart { (xA-#B) * (2A~28) + (yA-yB) * (yA-yB) ) ? brasart ( (KA-xC) * (xA-xC) + (yA-yC)* (vA-yo)) ; arssare ( (xC-xB)* (2C-xB) + (yC-yB) * (yC-yB) ); Pr=(atb+c) /2; ‘ aria:=sqrt (p* (p-a) *(p-b)*(p-c)) 7 end; procedure citpunct (var %,ytreal); begin write('abscisa='); readin (x) ; 2 write('ordonata='); readin(y); end; begin : writeln('"Coordonate A:'); eitpunct (xA,yA) ; writeln('Coordonate B:'); citpunct (xB,yB); writeln('Coordonate C:'); citpunct (xC,yC) ¢ writeln('Coordonata M:'); eitpunct (xM,y¥M) 7 s:=aria(xA, yA, xB,yB,xC,yC)? s1:saria(xA,yA,xB,y5,xM,yM) 7 anna s3:saria(xM,yM,xB,yB,xC, i ; i = hen writeln('NU') if abs(s-sl-s2-s3) <0.00001 ee ett catty readin; end. 2. Se da un poligon convex cu n laturi, prin coordonatele varfurilor, pene de intrare se citesc din figierul poli.in, pe prima linie n, jar pe urmatoarele linii, coordonatele varfurilor (cu un spativ intre ele) istreum, sens — " citire. Se cere s4 se afigeze aria poligonului in fisierul poli -out trum 3:zecimale. ixemplu: ee aa poli.out 4 12.000 RROO awwea Solutie. Pentru a calcula aria unui poligon convex cun varfuri partajam re in triunghiuri ca in figura, apoi pentru aria unui triunghi folosim una. dintre formulele prezentate la inceputul capitolului. Ad Program poz_punct_triunghi; var x,y:array[1..100]o£ Yeal; 8,81,82,s3:real; n,i:integer; E:text; function aria (xA,yA,xB,yB,xC,yC:real) :real; var s:real; begin . Br Sabs (xA*YB+xB*yC+xC*yA-xC*yB-xA*yC-xB*yA) /2; aria:sa; end; begin assign(f,'poli.in'); reset (£); readin(f£,n); for i:=1 ton do readin(f,x[i],y[il); close(£); 8:=0; for is=1 te n-1 do siestaria(x(1],/y[1],x[4],ylil,x[is1],yli+l]); assign(f, 'poli.out'); rewrite(£); writeln(£,8:0:3); close(£); end. 3. in fisierul text puncte. in pe prima linie se afl4 n, iar pe urmatoarele n linii coordonatele'a n puncte (separate intre ele prin cate un spatiu tn formatul abscisd ordonata). Se cere si se scrie in ‘fisierul puncte.out coordonatele punctelor celor mai apropiate de origine, Exemplu: .puncte.in Puncte.out 4 03 03 -3 0 Li. 3 43 -3 0 Solutie. Vom utiliza o functie care returnedza distanta dintre dou’ puncte, date prin coordonatele lor (ca parametri), Dupa citirea coordonatelor Se va determina cea mai mica distanta de la originea sistemului de coordonate la celelalte puncte in variabita min, dupa care se calculeaza ined odath aceste distanfe gi se afiseaz’ punctele aflate la distanfa min de origine, program poz_punct_triunghi; var x,yrarray[1..100]of real; min,d:real; n,i:integer; E:text; function dist (xA,yA,xB,yB:real) :real; var d:real; a begin dr=sqrt ( (XA-xB) * (#A-xB) + (yA-yB) * (vA-yB))? distr=d; end; begin assign(f, 'puncte.in'); veset(f); readin(f£,n); for i:=1 to n do readin(£,xfil,yLlil); close(£); min:=dist(0,0,x[1],-y[1])z for i:=2 to n do begin d:=dist (0,0,x[41,y[i]l); if demin then min:=d; end; assign(f, 'puncte.out'); rewrite (£); for i:=1 to n do begin sadist (0,0,x[i],yfil); if abs(min-d)<0.00001 then writeln(£,x[i]:0:0," ',y{il:0:0); end; close(£); end. Probleme propuse 1. Se dau coordonatele virfurilor unui triunghi aBc. Se cere sd se afigeze lungimile indltimilor corespunzatoare jaturilor BC, AC, tespectiv AB, trunchiate la dou’ zecimale. Exemplu: pentru A(0,0),8(0,3),C(4,0) se va afiga 2.40 3.00 4.00 2. Se da un triunghi prin Iungimile laturilor sale. Se cere sa se afigeze aria triunghiului trunchiat’ la doua zecimale. Exemplu: pentru lungimile laturilor 3 4 5 se va afiga 6 .00 4. Se dau n triunghiuri prin fungimile laturilor lor. Se cere s& se determine triunghiul sau triunghiurile (laturile lor) cu aria maxima. Exemplu: pentru n=3 si triunghiurile cu lungimile laturilor 223 345 111.5 se va afisa: 345 7. Se da un patrulater convex prin lungimile laturilor si tun, Se cere si se afigeze aria patrulaterului, gimile diagonalelor. Se da in variabila S un numéar natural nenul. triunghiurile dreptunghice (lungimile laturilor lor care au aria egala cu $ gi catetele numere naturale, Se cere si se afiseze toate trunchiate la doua zecimale) Se dau_n.segmente prin coordonatele capetelor. Se cere si se afiseze un segment de lungime maxim4. Datele de intrare se citesc din fisierul when in in formatul: pe prima linie este n, iar pe urmatoarele n linii cate patru umes intregi x1 y1 x2 y2, reprezentind coordonatele capetelor segmentelor. fn fisierul Segm.out s¢ vor scrie coordonatele capetelor unui segment care are lungimea maxima (unul dintre ele). Exemplu: segm.in segm.out 3 050 0040 Q 050.0 oo12 Sa se determine toate triunghiurile dreptunghice (lungimile catetelor lor), pentru care se cunosc lungimea ipotenuzei a (numar natural cu maxim 5 cifie) si faptul cd, catetele au lungimi numere naturale. Exemplu: pentru a=5 se va afisa 3 gi 4. Sa se determine toate dreptunghiurile (lungimile laturilor), peritru care se Cunosc aria (numar natural cu maxim 5 cifre) si faptul ci i imi ca | numere naturale, ili Sen Exemplu: pentru a=5 se va afiga 3. gi 4, Rae rea cig od Tarceva Wc DIRS CHOSEN OER 1. Se di un numa natural n cu cel mult 5 cifre. Se cere: a) S&se calculeze suma 1+2+3+..+n. b) Sa se calculeze suma cifrelor lui n. oo. . 3 Sa se verifice dacé numarul obtinut cu cifrele lui n citite de Ja 'dreanta la sténga este prim (dac& numéaral este prim se va afiga mesajul “Este prim!”, altfel mesajul “Nu este prim!”), Exemplu: pentru n=92 se va afisa: a) 4278 b) 11 ie 3 —— (Olimpiada Judeteand, clasa a V-a, 2002) 2. Se da de la tastatur’ un numéar natural n cu cel mult 4 cifre. Sa se obtind (daca este posibil) cel mai mic numar patrat perfect stergand sifte din n. Daca problema nu are solutie se va afiga mesajul 'Nu exista solutie!'. Exemple: ; : . Pentru n=419 se va afiga: 1 (pentru cd 1=1*1, se mai pot forma si alte patrate perfecte: 4=2*2, 9=3*3, 49=7*7, dar acestea sunt mai mari decat 1). =7326 a afiga: 36 (pentru ci 36=6*6). ane) ® (Info-Kids, clasa a V-a, 2002) 3. Se considera un tablou unidimensional cu n componente (25850) nutmere naturale mai mici sau egale cu 30000. Folosind cele mai mici 3 cifte dintre cifrele unitatilor componentelor tabloului unidimensional s& se determine cel mai mic numar de trei cifre. Dac& problema nu are solutie se va afiga mesajul ‘Nu exista solutie!'. : =5 si componentele 3081 45 500 3456 54 se vaafisa 104 SRO Pea P (info-Kids, clasa a V-a, 2002) 4. Directorul unei scoli doreste s& premieze la sfarsitul anului scolar pe cei mai buni elevi la invagatura, Pentru acest lucru el are de rezolvat dowd probleme: . a) S& determine cati elevi vor fi premiati dintre cei n (2sns700) levi ai ae Dupa discutii aprinse cu ceilalti profesori se hotaraste in Consiliul Profesora ca numarul premiantilor s4 fie n-k, unde k este cel mai mare numér patrat perfect mai mic strict decat n. De exemplu, pentru n=150, k este 144 (pentru c4 144=127), deci vor fi premiati 150-144=6 elevi. b) Pentru a fi cat mai multi liniste la premiere, in Consiliul Profesoral se.ia decizia ca elevii care nu vor fi premiafi s4 fie asezati pe terenul de Sport pe randuri de cate p elevi (unde p’sk). fn acest scop, directorul a numerotat elevii nepremiati de la 1 la k si a hotirat ca elevii sa fie asezati in ordinea descrescditoare a numerelor asociate, Scrieti un program care: ~ citeste de la tastatura n, numarul de elevi din scoala; — ‘determing gi afigeaz& pe ectan numarul de elevi premiati; — afigeaz’ pe ecran modul de asezare a elevilor nepremiati Exemplu: un exemplu de executare a programului creat de voi ar putea fi: Introduceti num&rul de. elevi din scoala n = 35 Numarul de elevi premiati: 10 Elevii nepremiati; 25 24 23 22 21 20 19 18 17 16 15 14 13 12 41 109 9 8 7 6 5 43 24 (Concurs National de Informaticé pe Internet, clasa a V-a, 2002) 5. De 1 iunie in Oraselul Copiilor se afl4 n copii. Primarul orasului ofera gratuit copiilor cate un tricou pe care este scris un numar dintre1, 2, ., n.Nu exist doua tricouri pe care sa fie scrise doua numere Ia fel. : Pentru n numar natural citit de 1a tastatura (1 KP Ki} relatia de ordine ee tea alfabeticd. In fisierul vare.in se di pe o singura linie, secvenfa, iar in fisierul varf.out se va scrie numérul cerut. Secventa de catactere din fisierul de intrare are maxim 1000 de caractere $i cel putin un caracter, . Exemplu: varf.in var .out abcdbabefdchax 4 Observatie. in exemplu fnaltimea maxi i axima este 4, pentru ci succesi caractere abefdcb este un varf, Alt varf mai inalt nu exist, . “ (Contaminare, clasele VII-VIIT, 2005) 23, 7 ee ms sir de caractere t format din cel mult 255 de litere mici ale fal lui englez, Cu literele din t se pot forma cuvj ant fii A cuvinte, fi eee Pp , fiecare cuvant fiind — se citese de la stanga la dreapta toate litere] iti in € care nu au fost citite anterior gi sunt ordonate crescator (conform ordinii din alfabet); ar ate : = once cuvant nou incepe cu prima liter’ nefolosit& anterior. Sirul Se citeste de pe prima linie a fisierului str. IN Cuvintele obtinute se scriu pe linii succesive ale fisierului str. our Exemplu: SIR.IN adebdgbxpge SIR.OUT adegx bdpa be (Unfo-Kids, clasa a VIl-a, 2002) 24. Se di un numar natural n (n<1000) si un numar natural p. Se cere si se.afigeze exponentul maxim EF astfel incat Produsul 1#2* ... n s& fie divizibil cu pe Exemplu: pentru n=7, p=6 se va af sa 2 (2*2*3*...*7=5040 $i 5040 este divizibil cu 6, cu 6*=36, dar nu est " Al 7 ae ka ) , © divizibil Unjfo-Kids, clasa a VII-a, 2002) 25. De 1 iunie se desfigoara un concurs intre elevii a doud scoli: Se.1 si ve ‘ Fiecare scoala are in echipa cate 10 elevi. Fiecare elev din an " = i i i ..,8,9}, iar cei din Sc.2 un eleme ciat un element din multimea {0,1,...,.8,9}, din multimea {A,B,...,1,7}, Se desfagoara n probe de concurs. = pentru fiecare prob’ sunt date printr-un = de ee ecu : i i i i ww exis! ; lementele asociate elevilor si ordinea, Un el ev dac& nu e . Snseamiis c& a abandonat. Fiecare elev primeste la sfarsitul. unei. probe un punctaj dupa cum urmeaza: - primul primeste 20 de puncte; - al doilea 19 puncte; -al treilea. 18 puncte; g§.a.m.d. : - cel care nu termina proba primeste 0 puncte. - . Dandu-se n (numarul de probe) si rezultatele la fiecare proba, se cere: a) Numiarul de elevi care la sfarsitul concursului au obtinut punctajul 0. j i ala; Sa se afigeze punctajele obtinute de fiecare scoala, a se “a clasamentul si punctajul obtinut de: fiecare elev, pentru fiecare scoala in parte. Exemplu: pentru dateie de intrare n=3 BA3DFGI9 4891 FCo ABOL ‘a afiga pe ecran: : a 7 Bae au obtinut 0 puncte la sfarsitul concursului. b) Sc.l a obtinut 155 puncte; Se.2 a obtinut 160 puncte. c) Clasamentul pentru Sc.1 este: Boo= lasamentul pentru Sc.2 este: HE HPOABUUOAPAa~aAUNYwWoRDOR (Olimpiada judefeand, clasa a VIl-a 1997) pentru un text dat, cu cel mult 255 caractere (citit de la tastatura) s& se afiseze: a) numéarul de spatii; b) numérul de litere din text; ¢) ecuvintele formate numai dintr-o.singurd litera, Exemplu: pentru textul baa ce aa si bbb se va afisa a) 7 b) 12 qd) aa bbb (PACO, clasa a VIl-a, 2001) 27. Peo tabla de sah cu n lini sin coloane (1(2,3)->(3,2)->(3,3)-> (4,2) me dems neni cadet alge Pe drum se mananca cantitatea de firi: uri: HOH Prin pitratelele de coordonate (2,3) gi (3,3). se trece de doud ori. (Olimpiada Judejeand, clasa a V1-a, 2007) 244454+64+040424+8+0410537 28. Ionicé are o cutie plind numai cu cuburi. Pe fiecare = bs ° an , i a i I peste altul formand un : un moment dat, Ionic’ ageazf n cuburi unul p : ' han eee i Ioni i ifra k gi o modalitate de scoal a nica vazand turnul ii spune o cifra m ° ised din turn. Mai precis Ionicd trebuie si scoat cuburi pentru a obtine un inailtime inima a Atoarele reguli: turn cu indltimea minima dupa urma 2 ; . e aun moment dat, se poate scoate o grupa cu cel putin k cuburi alaturate care au pe.ele scrise aceeagi cifta; oe . ° pn elimin’ incepand de la baza turnului, de fiecare dat& incepand rima 4 ce respecta conditia anterioara. oe Sa os oe ee care si determine turnul final, dupa eliminarea tuturor grupelor de cuburi conform modalitatii Hee de tatal lui ee de Late i i ima: linie numerel Fisierul de intrare turn.in are pe pri lini rel u o i ¢ linia urmatoare ci! SnS59000, 2SkS9) separate printr-un spatiu, iar. p a | pa pe euburi in ordine de la baza cubului spre varf, separate intre ele prin cate un spatiu. : : . 4 Fisierul its iesire turn.out va confine pe prima linie ae reise ‘| ramase, iar pe linia urmatoare cifrele ramase Gn ordine, de la baza cul la varful sau) separate intre ele prin cate un spatiu. Exemplu: : turn.out turn.in 3 20 3 739 |139 10222000775555577 : m Observatie. Evolutia turnului este urmatoarea: Dupa eliminarea gruputui de cuburi cu cifrele 2 2 2 se obtine: 10000775555577739 Dupa eliminarea grupului de cuburi cu cifrele 9 0 0 O se obfine: 1775555577739 Dupé eliminarea grupului de cuburi cu cifrele 5 5 5 5 5 se obtine: 17777739 Dup eliminarea grupului de cuburi cu cifrele 77°77 7 seobtine: 139 (Olimpiada Nationalé, clasa a VI-a, 2007) 29. Se citeste de la tastatura o expresie aritmetic& scrisd corect din punct de vedere matematic, Aceasti expresie confine numai operatorii + $i -, iar operanzii Pot. avea doar una din formele: no -numéar natural fara semn; nem ~cu semnificatia n radical din m, unde m si n sunt numere naturale fara semn, n>3; m ~cu semnificatia radical din m, unde m este numar natural firg semn, Se cere ca pornind de la o expresie aritmetics’ de forma precizata anterior si se efectueze calculele astfel incat s& fie indeplinite simultan conditiile: a) expresia are numir minim de radicali din numere libere de Ppatrate (expresia poate avea numai astfel de tadicali) si valoarea egal cu a expresiei initiale; b) numerele de sub radicalii expresiei de la punctul a) trebuie si apard tn ordine crescitoare, Observatie. Prin numar liber de patrate injelegem un numér natural care nu se divide cu niciun patrat perfect diferit de 1. Exemplu: 12 nu este liber de patrate pentru ca se divide cu 4, in timp ce 14 este liber de patrate. Exempla: Pentru expresia 4x12+r75-2r341+2r20+2r4 se va afiga 5+11r344r5 (Concursul National de Informatica, clasa a VIl-a, 1998) 30. Se di o multime x= (x, X2,+++1%Xn} den (2_[(Start of header) IG 2. ikSTxX> ([(Start of text) Be 7 e8 2 28 fe 3 \kETX> “|(End “of text) cca 68 ID 22 4 I |(End of transmision) 36 Is 69 no fa 5 [eEno> “[(inewiry) B7 bs 70 I [6 _|cACK> (Acknowledge) 38 ie eo i a {2 kBELL> Bop ia toe I8__I (Backspace) ott 73 p04 ts 9k HTS (Horizontal tabulation) 44 [) 4 eo nos : 0 kre> |(tdne feed) 42 |e 7 206 1 21 kyrs |(Vertical tabulation) 43 [+ 16 oF 7 kEF>__|(From feeay aa a te E KCR> (Caxrige return) l~ 4 |cso>_ |(Shift out) He im +LL9 pa M5 Kkesi> |(shift in) a7. a pil | 6 IsDLE> [(Data link espace) 48 lo ae pee 17 _|kDC1>_|(Device control 1) 49 {1 BD ies 18 |epc2> |(device control 2) 50: /2 iS pid 119 kepe3> _|(@evice control 3) 513 ge ats 20 \cbc4> [(Revice control 4) 52 14 iv. 16 _t. 21 |cNAK> |itlegative acknowledge) 535 ee 17 ud 22 I_ |(Synchronous idle) 54 |6 7 pte 23 |cETR> [(End of transmission block) 55 [7 ee fs poe —| 24 [cans _|(Cancel) 56 |e Boy ee : 25 _| {End of medium) 57 19 eae 2h 26 j’ |(Substitute) I58- |. 5 + 22 a 27_kESC> [(Gscape) 1591: et 423. It 28 krs>. (File separator) 60 le 3 i nga ti 29 ‘kGs> (Group separator) 61 = loa i 25 fh I30_|kRS> (Record separator) 62 b 95 Hee B1 [cUs> [Unit separator) Tesi loa 227 J | B2 legpes (space) 64 t— —! AN EXA 2 A2.4, Tabel cu functii predefinite Tipuri si functii numerice predefinite bs (>) abs = - ‘eal aloarea absolut’ a lui x 7 . : ea Patratul lui x mame sin (x) Real sau intreg. | Sinusul-valorii argumentului - exprimat in radiani cos (x) Real sau intreg Cosinusul valorii argumentului exprimat in radiani ; arctan ( i i i shortin [-128, 127] x) Real sau intreg Unghiul exprimat in radiani a cArui integer [-32768, 32767] 2 octeti in(x) Real sau intreg Laat ae =onge 2 cies “ 7 gus 647] 4 eee exp (x) Real sau intreg Walcaren ee = an ss 8 aa i exponentiale- ic | pentru argumentul icd oa fo. G55351 2 octet a . ) [Real sau intreg” faiialit pitied wen int (x Real Partea intre , ; I ‘eagad a argumentului x A2.2. Functii predefinite : rac (x) Real sau intreg Partea fractionar’ a argumentului x 7 = (frac(x)=x-int(x)) Fara argument Valoarea numarului x’ | intreg _| Elementul urmator argumentului | intreg Elementul ce precede argumentul intreg Al catelea element este argumentul in multimea de valori a tipului abs | __intreg Valoarea absolut’ a argumentului sar intreg P&tratul argumentului trunc real Cel mai mare intreg mai mic sau egal cu argumentul, dac& argumentul este pozitiv, respectiv cel mai mic intreg mai mare sau egal cu argumentul in celalalt caz round | _real Cel mai apropiat intreg de argument A2.3. Tipul real a aBsc ME real (2.9B-39, 1.7E 6 octeti single [1.5B-45, 3.48£+38] 4 octeti double [5.0B-324, 1.7E+308] . 8 octeti extended L [3.4B-4932, 1.1E4932] 10 octeti comp {0, 2°-1) 8 octeti Cuprins 1, Algoritmi. Nofiuni introductive......-.1:ese ean 2. Limbajul Pascal. Notiuni introductive. Primul program 3. Notiuni generale despre medii de programare.... 4, Notiunea de variabila. Citirea datelor de intrare 5, Tipul boolean. Instructiunea alternativa if........ 6. Instructiunea compusi, Instrucfiunea alternativa case. 7. Tipul char. Codul ASCH. Comentarii 8. Siruri de caractere. Tipul string.. 9. Fisiere text. 10. Instructiuni tepetitive cu numar cunoscut de pasi 11. Instructiuni repetitiva cu numar necunoscut de pasi, conditionat SUPOTIOL. o.seccescecseeeercnee beter ereasentaeenneeysareeenager tants 12. Instructiuni repetitiv’ cu numar necunosc! 13. Prelucrarea cifrelor unui numar natural 14. Mai multe instructiuni repetitive una in alta. 15. Siruri de numere........-. 16. Divizori. Numere prime... 17. Cel mai mare divizor comun. 18. Tipurile reale, Afisarea datelor cu format. 19. Tablouri unidimensionale.... 20, Prelucrarea componentelor tablourilor uni imensionale. Construirea tablouri unidimensionale 21. Inserari si eliminari de componente dintr-un tablou unidimensional. 22. Ordonarea componentelor unui tablou unidimensional. 23, Baze de numeratic......c ee 24. Tablouri bidimensionale. 25. Tablouri patratice....... 26. Construirea tablourilor bidimensionale. 27. Tablouri unidensionale si bidimensionale constante. 28. Functii definite de utilizator... 29, Functii predefinite............ 30. Proceduri definite de utilizator 31. Proceduri predefinite 32. Tipul multime......... 33. Coordonate in plan. Aria unui triunghi... 34. Probleme date la diverse concursuri de informatica. Anexa 1. Tabela codurilor ASCIL..........-..+++ Anexa 2. Tipuri gi functii numerice predefinite 102 107 115 120 125 a3i 140 154 163 172 178 184 199 200 la acest nivel. V4 recomandam: ibleme (Pascal si'¢-+ +)” pentru gimnaziu” = , Mircea Balan Comenzile se pot face pe adresa editurii:. Str. Stanjeneilor'nr. 6, bl. 30, et. 4, apt. 11, sector 4, Bucuresti sau la telefoanele:. . Tel: 031-105.62.84; Tel/Fax: 021-636.63. ad: Mobil: 0722-530390, 0722- 573701; bee e-mail: none minal 10 ‘ www.ls-infomat.ro * > WWW. smanuale-de- informatica ro. LI oF il ISBN 978- 973- 7658-13-5

S-ar putea să vă placă și