C_2 / 12.10.2012 Fundamentele programării rii 2. Codificarea algoritmilor în limbajul Pascal Limbajul Pascal : elementele limbajului, structura programelor, tipuri simple de date. 1/17/17
Vocabularul şi sintaxa limbajului : Alfabet : - literele (mari şi mici) ale alfabetului latin: A, B, C,..., X, Y, Z, a, b, c,..., x y z - cifrele zecimale: 0, 1,..., 9 - caractere speciale: + * /., ; : ( ) [ ] { } = < >!? ^ @ # $ % \ _... Notaţia BNF (metasimboluri): { text } poate să se repete de ori câte ori (inclusiv de zero ori). [ text ] scrierea construcţiilor opţionale (text poate lipsi). Identificator <id>: secvenţa de litere (mari sau mici, sau _ ) eventual urmata de cifre (Suma_1) a == A (And == and) // And # and Cuvinte rezervate: And Array Case Const Div Do DownTo Else End File In For Label Function Mod GoTo Nil If Not Of Record Or Repeat Packed Set Procedure Then Program To Type Until Var While With 2/17/17
Structura unui program Pascal : antet, declaraţii programul principal. <program> ::= <antet_program> ; <bloc>. <antet_program> ::= Program <id> [ ( <lista_id> ) ] <bloc> ::= <lista_decl> ; <ins_compusă> <lista_el> ::= <el> { ; <el> } //, <ins_compusă> ::= <lista_instr.> End <comentariu> ::= { text } (* text *) Scrierea este libera! Exemplu de program Pascal: Program Suma; Var a,b : Real; { a şi b, citite de la tastatură.} Write (' Dati doua numere separate prin spatiu, apoi Enter : '); Readln(a,b); Write (' Suma este ',a+b); Readln End. { Tipareşte suma a două numere reale,} 3/17/17
Constante : întregi : 15, 1989, -314. reale: forma normală (0.012345) sau în forma exponentială (12345E-6). şir de caractere : '22 Decembrie 1989', 'Domnu'' Trandafir' booleana: True, False Variabile : nume identificator adresa domeniu de valori tip valoare domeniului de valori nedefinita (neinitializata)! atribuire durata de viata: new... dispose vizibilitate locala, globala,... 4/17/17
Tipuri de date : Tip de dată := ( mulţime de valori (domeniul tipului), mulţime de operaţii ): - predefinite; - definite de utilizator. Predefinite -simplu -real: Real -ordinal: Ord, Succ, Pred -întreg(integer) [-Maxint-1, Maxint] (32767) +,,*, DIV, MOD, / Byte, LongInt,, Word, - boolean (Boolean), False < True And, Or, Not; =, <>, <=, >=. - caracter(char), Ord( Chr(i) ) = i şi Chr( Ord(c) ) = c - enumerare, <Tip_enum.>::=(<Lista_id>) (Primăvară,Vară,Toamnă,Iarnă) - subdomeniu <tip-subdomeniu> ::= const 1.. const 2 Vară..Iarnă sau '0'..'9' - structurat: tablou: Array, mulţime: Set, şir_caractere: String, înregistrare: Record. - tip referinta 5/17/17
Declaraţii Pascal : <decl> > ::= <def< def-et> > <def-const> > <def< def-tip> > <def< def-var> <def-subp> Const <id> = <constanta< constanta> { ; <id> = <constanta< constanta> } Const Pi = 3.141592653; e = 2.718281828; Path = f:soft/tp/bgi ; Type <id> = <tip> { ; <id> = <tip> } Type Culoare = (Alb, Albastru, Galben, Roşu) Zile = (Luni,Marţi,Miercuri,Joi,Vineri,Sâmbătă,Duminică) Var <Lista_id> > : <tip> { ; <Lista_id< Lista_id> > : <tip> } Var i, j, k, l, m, n : Integer; a, b, x, y, z : Real; Cond : Boolean; S : Array [1..9] Of Real ; C : Array [1..10, 1..10] Of Char ; 6/17/17
Instructiuni Pascal : <ins> ::= <ins_simple< ins_simple> > <ins_structurate< ins_structurate> <ins_simple> ::= <ins_atribuire> <ins_goto> <ins_vidă> <apel_procedură> <ins_struct.> ::= <ins_compusă> <ins_condit.> <ins_iterat.> <ins_with> atribuire: <variabilă> := <expresie> // A:=B; v,m,!!! ins_compusă: End <ins> {; <ins> } ins_vida: If r>0 Then If Odd(r) Then r:=r+1 Else { instrucţiunea vidă } Else r:=r 1; 7/17/17
Citirea şi scrierea datelor : Nu exista instructiuni Apel Proceduri Read ( <listă_variabile> ) Readln (a,b,c); Readln (v); // 1 2 3 xxx // Simpla, Nu enum, Write ( <listă_expresii> ) Writeln (a,b,c); // 1 2 3 Writeln (' '); // Writeln (3.1415:5:2, 7.1:5:2, 9:3); // _3.14 7.10 9 Readln (a:5:2, b:5:2, k:3); // _3.14 7.10 9 8/17/17
Instructiuni conditionale : If <cond> Then <ins1> [ Else <ins2> ] // ; NU Program Ecgr2; {Rezolvarea ec.de grad 2 } Var a, b, c, {Coeficientii ecuatiei } d, {Discriminantul ecuatiei} r, {variabila de lucru} x1, x2: Real; {Rezultatele} kod: Integer; {Indicator_rezultat} {0=rad.reale, 1=complexe} Writeln('Se rezolva ecuatia de gradul doi'); Writeln('Dati coeficientii a, b, c'); Readln(a, b, c); d := b*b - 4*a*c; If d < 0 Then kod := 0 Else kod := 1; r := sqrt(d); x1 := (-b-r)/(a+a); x2 := (-b+r)/(a+a) End; If kod = 0 Then Write('Ec. nu are radacini reale') Readln End. Else Write('Radacinile ecuatiei sunt:', x1, x2); 9/17/17
Case <eo> Of <lista-c> : <ins> { ; <lista-c> : <ins> } [ Else <ins> ] End Program Case_Caracter; { Analiza unui caracter c. } { daca este litera, cifra sau alt caracter? } Var c : Char; { Litera poate fi mica/mare, } { vocala/consoana } Write (' Dati un caracter '); Readln(c); Case c Of 'a'..'z' : Write (' Este litera mica,'); Case c Of 'a','e','i','o','u' : Write (' vocala.') Else Write (' consoana.') End End; 'A'..'Z' : Case c Of 'A','E','I','O','U' : Write (' Este litera mare, vocala.') Else Write (' Este litera mare, consoana.') End; '0'..'9' : Write (' Este o cifra. '); Else Write (' Este un caracter special.'); End; Readln End. 10/17 /17
Instructiunea For : For <v> := <e 1 > To <e 2 > Do <ins> { pas=+1 } For <v> := <e 1 > DownTo <e 2 > Do <ins> { pas= -1 } <ins> = o instructiune End; <ins> se executa de 0,1,2, ori!!! Program Divizori; Var n, i : Integer; Writeln('Se tiparesc divizorii lui n'); Write('Dati n='); Readln(n); For i:=2 To n Div 2 Do { Trunc(Sqrt(n)) } If n Mod i = 0 Then Writeln(i); End. 11/17 /17
While <cond> Do <ins> Instructiunea While : <ins> = o instructiune End; <ins> se executa de 0,1,2, ori!!! <ins> modifica <cond>!!! Program Prime_While; { Primele n numere Prime } Var n, i, p, d : Integer; Write (' Dati n : '); Readln(n); { primele n numere prime p =2,3,5,... } i:=0; p:=2; { i reprezinta al catelea numar prim a fost gasit } While i<n Do { se verifica daca p este prim doar daca i<n } d:=2; { p este prim? } While (d<sqrt(p)) And (p Mod d > 0) Do d:=d+1; {cauta pana la p} If d>sqrt(p) Then i:=i+1; { p este prim! } Writeln (i:13,p:5) End; If p=2 Then p:=p+1 Else p:=p+2 { verifica numerele impare 3,... } End; Readln End. 12/17 /17
Instructiunea Repeat : Repeat <Secv_ins> Until <cond> <Secv_ins> := <ins> { ;<ins> } { modifica <cond>!!! } Program Numar_Repeat; { Cel mai mare numar n de patru cifre : } Var n, Ogl, Sc, { Ogl (n) + Sc (n) = n + 99 } Cat, Uc : Integer; { Cat= n Div 10; Uc= n Mod 10 } n:=9999; Repeat n:=n 1; Cat:=n; { Primul Cat este n } Sc:=0; Ogl:=0; Repeat Uc :=Cat Mod 10 { Determin Ultima cifra a numarului } Sc :=Sc + Uc; { Adun Ultima cifra la Suma cifrelor } Ogl :=Ogl*10+ Uc; { Adaug Ultima cifra la Oglindit } Cat :=Cat Div 10 { Sterg Ultima cifra din numar } Until Cat=0; Until (Ogl+Sc=n+99) Or (n=999); If n>999 Then Write (Ogl,'+',Sc,'=',n,'+99',' (',Ogl+Sc,'=',n+99,')') Else Write (' Nu exista! '); Readln End. 13/17 /17
Tipuri de date structurate : Array, Set, String, Record <tablou> ::= Array [ <domeniul_indicilor> ] Of <tipul_elementelor>; Type Sir_intregi = Array [1..9] Of Integer; { tipul sir de maxim 9 intregi } Var Matrice : Array [1..25] Of Sir_intregi; { tipul elementelor poate fi array } T : Array [1..6] Of Array [1..7] Of Real ; Ref.: T, T[i], T[i][j] T : Array [1..10, 1..6] Of Real ; elementele Tij vor fi referite prin T[ i, j ]. Program Calendar_pe_199_; { Exemplu Array } Type Zi_Sapt = (Luni,Marti,Mercuri,Joi,Vineri,Sambata,Duminica); Sir_Zile = Array [Zi_Sapt] Of Byte; Saptamana = Array [1..6] Of Sir_Zile; Const Nume_Zi : Array [Zi_Sapt] Of Char = ('L','M','M','J','V','S','D'); Var Luna : Saptamana; Anul,a : Word; Zi,Zl,l,s : Byte; z,ziua : Zi_Sapt; Write (' Calendarul pe anul 199'); Readln (Anul); Anul:=1990+Anul; Zi:=2 { Calc. ziua de inceput a anului (0..6) } For a:=1998 To Anul Do Zi:=Succ(Zi); If (a 1) Mod 4 = 0 Then Zi:=Succ(Zi); End; Zi:=Zi Mod 7; { Ziua în care incepe anul } z:=luni; While Ord(z)<Zi Do z:=succ(z); { (Luni..Duminica) } 14/17 /17
For l:=1 To 12 Do { Calendarul pe luna l } For s:=1 To 6 Do For ziua:=luni To Duminica Do Luna[s,ziua]:=0; Case l Of { Nr.zile în luna l } 2 : If Anul Mod 4 = 0 Then Zl:=29 Else Zl:=28; 4,6,9,11 : Zl:=30 Else Zl:=31 End; s:=1; { saptamana s = 1,... cel mult 6} For Zi:=1 To Zl Do Luna[s,z]:=Zi; If z=duminica Then z:=luni; s:=s+1 End Else z:=succ(z) End; Case l Of 1 : Writeln (' Ianuarie '); 2 : Writeln (' Februarie '); 3 : Writeln (' Martie '); 4 : Writeln (' Aprilie '); 5 : Writeln (' Mai '); 6 : Writeln (' Iunie '); 7 : Writeln (' Iulie '); 8 : Writeln (' August '); 9 : Writeln (' Septembrie'); 10 : Writeln (' Octombrie '); 11 : Writeln (' Noiembrie '); 12 : Writeln (' Decembrie ') End; Writeln; For ziua:=luni To Duminica Do {pentru fiecare zi din saptamana} Write (' ',Nume_Zi[ziua],' '); For s:=1 To 6 Do { pentru fiecare saptamana s } If Luna[s][ziua]>0 Then Write (Luna[s,ziua]:3) Else Write (' '); End; Writeln End; Readln End; End. 15/17 /17
Temă: 1. 1. Fiind dată datăo matrice A cu cu elemente reale, având m linii liniişi şin coloane,, se se cere cere să săse se transforme această matrice prin prininterschimbări de de linii, linii, astfel încât pe pe coloana k (dată (dată), elementele să săfie fie în înordine crescătoare, apoi apoisă săse se tipărească matricea în înforma finală. 2. 2. Pentru n cercuri din din plan plan sa sa se se determine: de arie care nu se cu alt cerc; cercul de arie maxima care nu se intersecteaza cu niciun alt cerc; c; de arie care nu se cu cercul de arie minima care nu se intersecteaza cu axele; cel mai de axa Ox care nu se cu alt cerc; cercul cel mai apropiat de axa Ox care nu se intersecteaza cu niciun alt cerc; cel mai de axa Oy care nu se cu axa Ox. cercul cel mai departat de axa Oy care nu se intersecteaza cu axa a Ox. 3. 3. Se Se dau dau două două şiruri de de maxim 254 254 caractere conţinând cifre cifre reprezentând două două numere scrise într într-o o bază bază p 16. Se Se cere cere şirul şirul cifrelor sumei şi şi modulul diferenţei ei ei einumerelor date. date. Exemplu : : 17A3 + 6B 6B 180E 16/17 /17
... C_2C _2 / 12 12.10.2012 17/17 /17