42 0 2MB
Lectia 1 Informatica - noţiuni introductive Definiţie 1: Informatica este ştiinţa care se ocupă cu prelucrarea informaţiilor cu ajutorul calculatorului. Informaţiile prelucrate pot avea diferite tipuri (valori numerice intregi sau reale, şiruri de caractere, imagini, sunete, filme, etc.). În prezent, calculatorul este implicat din ce în ce mai mult în viaţa noastră, fiind utilizat în diferite aspecte după cum urmează: pentru gestionarea informaţiilor: accesul rapid şi exact la anumite informaţii care ne interesează la un anumit moment(de exemplu: bazele de date); pentru rezolvarea unor probleme din domenii diferite cum ar fi matematica, fizica, chimia, etc; pentru comunicare: in prezent comunicarea rapida face parte din viata de zi cu zi, utilizând frecvent reteaua internet prin programele specifice (e-mail, chat, etc.); pentru păstrarea amintirilor: realizarea de albume foto virtuale şi arhive cu filme; pentru relaxare: jocuri, filme, muzică. În această carte vom învăţa să rezolvăm probleme cu ajutorul calculatorului utilizând limbajul de programare C++. Orice program are la bază un algoritm de rezolvare. Definiţie 2: Algoritmul1 este alcătuit dintr-o succesiune de etape, numite paşi, care trebuie parcurse într-o anumită ordine astfel încât plecând de la datele iniţiale ale problemei, într-un timp finit sa ajungem la rezultatul dorit. Algoritmul este noţiunea fundamentală a informaticii. Totul este construit în jurul algoritmilor (şi al structurilor de date, cum ar fi listele sau grafurile). Date de intrare
Date de iesire
(Ce se dă)
Program C++
(Ce se cere)
(scris pe baza unui algoritm de rezolvare)
Definiţie 3: Descrierea unui algoritm de rezolvare a unei probleme sau a unei situaţii date într-un limbaj de programare se numeste program sau cod sursă. Cele mai importante proprietăţi ale unui algoritm sunt următoarele: Corectitudinea - este proprietatea algoritmului de a furniza o soluţie corectă a problemei date. În acest sens este de dorit ca algoritmii să se bazeze pe fapte şi relaţii matematice demonstrabile. Caracterul univoc sau deterministic - plecând de la un set de date iniţial anume, rezultatul este unic, sau altfel spus, repetarea execuţiei algoritmului duce întotdeauna la aceleaşi rezultate. Generalitatea - este proprietatea unui algoritm de a rezolva o clasă sau categorie de probleme, şi nu doar o singură problemă particulară. Spre exemplu, un algoritm care rezolvă doar ecuaţia x2 + 5x − 6 = 0 este mai puţin general decât unul care rezolvă ecuaţia de gradul II care are următoare formă generală ax2 + bx + c = 0, oricare ar fi valorile lui a,b,c.
1
Cuvântul are la origine numele matematicianului persan Al-Khwarizmi
Claritatea - proprietatea algoritmului de a descrie cu exactitate şi fără ambiguităţi paşii care trebuiesc parcurşi în rezolvarea problemei. Verificabilitatea - acea proprietate a algoritmilor care permite ca fiecare pas să poată fi verificat într-un timp rezonabil de către om, folosind mijloace de validare de încredere. Optimalitatea - proprietatea unui algoritm de a se termina după un număr minim de paşi. Spre exemplu, dacă se cere să se calculeze suma primelor n numere naturale, putem aplica formula de calcul, şi astfel algoritmul se termină într-un singur pas, pe când dacă am aduna toate numerele de la 1 la n, el s-ar termina abia în n paşi, şi deci nu ar fi optim. Finitudinea - este proprietatea algoritmului de a se termina într-un număr finit de paşi. Există şi algoritmi care nu se termină într-un număr mărginit de paşi, dar aceştia se numesc "metode algoritmice". Eficienţa - este proprietatea unui algoritm de a se termina nu numai într-un număr finit, ci şi "rezonabil" de paşi, chiar dacă acesta nu este cel mai mic posibil (nu este optim). Algorimul este ineficient şi dacă rezultatul se obţine într-un timp mai lung decât cel dorit sau permis. Existenţa unei intrări (datele de prelucrat). Întrucât operatorii se aplică unui operand (sau şi mai multor operanzi deodată), este de neconceput un algoritm fără niciun operand. Intrările permise formează împreună un set (mulţime) specific de obiecte sau valori, care se numeşte "domeniul" algoritmului. Existenţa unei ieşiri (rezultatele). Este de neconceput un algoritm care nu are nicio ieşire, deoarece în acest caz intră în discuţie însăşi utilitatea sa. Operaţiile care apar în cadrul unui algoritm sunt: Operaţii de intrare ieşire: datele de intrare se vor citi de la tastatră sau din fişiere text şi ele reprezintă valorile iniţiale cu care se incepe rezovarea unei probleme. Datele de ieşire reprezintă rezultatul problemei după parcurgerea algoritmului şi aceste fie vor fi afişate pe ecran, fie vor fi scrise în fişiere text. Operaţia de atribuire: reprezintă operaţia în urma căreia valoarea unei expresii (matematice, logice sau relaţionale) este memorată într-o variabilă Operaţia de decizie: determină valoarea de adevăr a unei expresii logice şi în funcţie de rezultatul obţinut se continuă execuţia programului pe una din cele doua ramificatii posibile(adevărat sau fals).
Etapele rezolvării unei probleme cu ajutorul calculatorului 1. Analiza problemei: presupune: citirea şi analiza cu atenţie a enunţului problemei date pentru identificare datelor de intrare (datele iniţiale ale problemei). (Ce se cunoaste ? ) Înţelegerea şi identificarea rezultatului aşteptat (stabilirea datelor de iesire). (Ce se cere?) Alegerea strategiei de rezolvare a problemei (identifiarea algoritmului optim de rezolvare a problemei) (Cum rezolv?) Pentru rezolvarea unei probleme date pot exista mai multe metode. În acest moment trebuie identificat care este cel mai optim mod de rezolvare a problemi astfel încât în cel mai scurt timp şi cu cele mai puţine resurse să
obţinem rezultatul dorit. Analiza timpului de lucru a unui program se numeste complexitate1, dar pentru acest subiect vom discuta mai pe larg intr-un capitol separat. 2. Descrierea în limbaj natural a modului de rezolvare propus, stabilirea tipurilor de informaţii care trebuie prelucrate precum şi a tipurilor de rezultate aşteptate. Limbajul natural descrie în termeni largi etapele propuse pentru rezolvarea problemei date. 3. Descrierea algoritmului în limbaj pseudocod: Limbajul pseudocod este un limbaj intermediar între limbajul natural şi limbajul de programare. În aceasta etapă se stabilesc paşii de algoritm, tipurile datelor de intrare, de manevră şi de ieşire, se identifică condiţiile care impun şi se scriu în expresii matematice care sunt uşor de interpretat de calculator (calculatorul nu face presupuneri si nici nu ghiceşte ce doritţi dumneavoastră ci doar execută rapid comenzile pe care le-a primit). Un algoritm scris în limbaj pseudocod nu este un program care poate fi rulat direct pe calculator, dar poate si transcris uşor întrun limbaj de programare ţinând cont de vocabularul, semantica si sintaxa limbajului de programare. În această carte vom folosi un limbaj pseudocod scris în limba română (pentru a fi mai uşor de inteles logica algoritmicii). Limbajul pseudocod se va baza implementarea ideii de rezolvare într-un format apropiat de limbajul C++, dar care nu pune accent pe sintaxa riguroasă care trebuie respectată atunci când scrii într-un limbaj de programare. 4. Scrierea codului sursă: Aceasta este etapa în care algoritmul scris în limbaj pseudocod este transcris în limbaj de programare, ţinând cont de regulile impuse de acesta şi repectând semnificaţia construcţiilor sintactice corecte impuse de limbajul de programare. 5. Corectarea erorilor sintactice: Corectarea unui cod sursă din punct de vedere sintactic se numeste compilare2. În aceasta etapă programul este verificat, iar eventualele greşeli sau omisiuni ale respectării regulilor sintactice sau semantice sunt semnalate de compilator print-o listă de erori. Cel care a scris programul are obligaţia să corecteze aceste erori folosindu-se de masajele de eroare afişate precum şi de cunoştinţele sale. Mesajul de eroare afişat, care semnalează o eroare de compilare, nu indică întotdeauna corect modalitatea de corectare (el este mai mult informativ). Erorile de eroare vor fi căutate începând de la poziţia semnalat de compilator sau de la poziţia semnalată spre începutul programului. O serie de greşeli frecvent întâlnite la începători sunt generate de definirea eronată a tipurilor de date care vor contine rezultatele. Dacă rezultatul aşteptat depăşeşte ca valoare domeniul de definiţie stabilit atunci aceasta greşeala nu va fi identificată de către compilator, deci nu va fi corectată in acestă etapă. La execuţia programului vom avea însă surpriza unor rezultate neaşteptate, chiar daca soluţia de rezolvare găsită este corectă si programul scris nu are greseli de compilare. 6. Testarea programului: În această etapă se verifică corectitudinea rezolvării problemei prin analiza rezultatului obţinut pentru diferite valori ale datelor de intrare. Tot aici se identifică si eventualele erori de gândire, care apar prin alegerea unui algoritm de rezolvare greşit. În această etapă trebuie indentificate seturi de date de intrare numite şi cazuri limită pentru care programul s-ar putea bloca sau ar genera rezultate greşite datorită unei neglijenţe în etapa de analiză şi implementare a programului. Complexitatea unui algoritm este determinată ţinând cont de spaţiul de memorie utilizat (complexitate spaţiu) si de timpul de obţinere a rezultatului (complexitate timp). Prin complexitate spaţiu înţelegem dimensiunea spaţiului de memorie utilizat de program. Un program necesită un spaţiu de memorie constant, independent de datele de intrare, pentru memorarea codului său, a constantelor, a variabilelor simple şi a structurilor de date de dimensiune constantă alocate static şi un spaţiu de memorie variabil, a cărui dimensiune depinde adesea de datele de intrare de cerinţele problemei de rezolvat şi din spaţiul de memorie necesar apelurilor de proceduri şi funcţii. Prin complexitate timp înţelegem timpul necesar execuţiei programului. Înainte de a evalua timpul necesar execuţiei programului ar trebui să avem informaţii detaliate despre sistemul de calcul folosit. 1
2
Un compilator este un program (sau set de programe) care traduce textul scris într-un limbaj de programare (limbajul sursă – low level) într-un alt limbaj de calculator (numit limbaj ţintăhight level). Sursa originală se numeşte de obicei cod sursă iar rezultatul cod obiect. În general codul sursă este compilat pentru a crea un program executabil.
Limbajul pseudocod şi schema logică Asa cum am precizat anterior pseudocodul este o forma de reprezentare a algoritmilor şi ca orice limbaj foloseşte un grup de cuvinte cheie (citeşte, scrie, dacă, atunci, cât timp, pentru, etc.), organizate în construcţii sintactice care traduc structurile fundamentale 1, dar neavând o sintaxă rigidă ca un limbaj de programare. Limbajul pseudocod lasă la libera alegere a utilizatorului introducerea unor notaţii care să permită o mai buna exprimare. Schema logică este un mijloc de descriere a algoritmilor prin reprezentare grafică. Fiecărui tip de operaţie îi este consacrată o figură geometrică (un bloc tip) în interiorul căreia se va înscrie operaţia din pasul respectiv, iar succesiunea operaţiilor este indicată prin săgeţi. Blocuri utilizate în realizarea schemelor logice:
START
STOP
Marchează începutul / sfărşitul unui algoritm reprezentat în schemă logică
Se utilizează pentru implementarea operaţiilor de intrare / ieşire
Se utilizează pentru scrierea condiţiilor în cazul structurilor alternativă sau repetitivă
Se utilizează pentru scrierea operatiilor de atribuire (atunci când o variabilă primeste o valoare)
Se utilizează pentru conectarea liniilor care leagă diferitele figuri geometrice şi marchează un punct de intersecţie. Legăturile dintre blocurile schemei logice se realizează numai prin intermediul săgetilor, pentru a stabili sensul de parcurgere al algoritmului.
Pentru întocmirea unei scheme logice corecte sunt necesare respectarea unor anumite reguli după cum urmează: Orice schemă logică se întocmeşte de sus în jos; Legătura intre blocurile schemei se face numai prin săgeţi, pentru a stabili sensul de parcurgere; În cazul întâlnirii unui bloc de decizie se precizează deasupra liniilor de legătură când expresia
1
Structurile fundamentale din programarea structurată sunt structura liniara, structura alternativa şi structurile repetitive.
Aplicaţii practice 1. Un algoritm este un limbaj de programare? a. Adevărat b. Fals 2. Cu ajutorul unui calculator se pot prelucra următoarele tipuri de informaţii: a. Imagini b. Documente c. Numere d. Cărţi 3. Descrierea unui algoritm se poate face prin: a. Limbaj natural b. Limbaj de programare c. Limbaj pseudocod d. Nici un răspuns nu e corect 4. Limbajul pseudocod este un limbaj de programare? a. Fals b. Adevărat 5. Datele de intrare sunt si date de ieşire? a. Adevărat b. Fals 6. Complexitatea unui cod sursa a unui program este masurată prin numărul de linii de cod scrise? a. Adevărat b. Fals 7. Corectarea erorilor de compilare implică automat si corectarea erorilor de gândire? a. Adevărat b. Fals 8. Datele de ieşire reprezintă acele valori obţinute la terminarea unui algoritm? a. Adevărat b. Fals 9. Limbajul pseudocod este: a. Un cod fals b. Un limbaj intermediar de scriere a algoritmilor şi care face trecerea de la limbajul natural la cel de programare c. Un limbaj nefolositor d. Nici un răspuns nu e corect 10. Pentru a verifica corectitudinea funcţionării unui program acesta trebuie testat cu: a. Valorile pentru care a fost gândit în etapa de analiză b. Cu orice fel de valori c. Cu valori speciale identificate pentru cazurile limită d. Nici un răspuns nu e corect. 11. Enumeraţi proprietăţile unui algoritm: 1............................. 2................................ 3................................... 4................................ 5............................. 6................................ 7................................... 12. Precizaţi care este diferenţa între scrierea algoritmului în limbaj pseudocod faţă de limbajul de programare. (Precizaţi avantajele şi dezavantajele) 13. Care sunt deosebirile dintre erorile de compilare si erorile de gândire? 14. Definiti următorii termeni: a. Complexitatea unui algoritm b. Operaţia de compilare c. Limbaj de programare d. Limbaj natural
Lectia 2. Elemente de bază în reprezentarea algoritmilor Una dintre principalele noţiuni care intervin în programare este noţiunea de dată. Definiţie 1: Data este o informaţie care se prelucrează cu ajutorul calculatorului. Datele se pot clasifica: a. După locul în care sunt prelucrate: date de intrare - reprezintă un set de informaţii iniţiale care sunt cunoscute şi care reprezintă punctul de plecare în rezolvarea problemei. date de manevră – se utilizează în interiorul algoritmului pentru a memora la un anumit moment valori intermediare necesare procesului de rezolvare al problemei date date de ieşire - sunt rezultatele aşteptate şi care sunt obţinute prin prelucrarea datelor de intrare cu ajutorul algoritmului dat. b. După tipul informaţiilor memorate: date numerice – conţin ca valori numere întregi sau reale date logice – pot sa conţină ca valoare doar: True sau False date de tip caracter – conţin ca valoare un singur caracter din cele 256 din codul Ascii 1 date structurate – sunt acele date care se compun pe baza unor reguli precise din datele simple(numere, caractere, logice) c. După felul în care îşi schimbă valoarea pe parcursul unui algoritm 1. variabile - valorile se modifică pe masură ce algoritmul se execută 2. constante- valorile lor rămân constante pe toata durata de execuţie a programului O variabilă se caracterizează prin: numele variabilei - este format din unul sau mai multe caractere (litere mari sau mici ale alfabetului englez, numere si caracterul underline) cu condiţia ca primul caracter nu fie cifră. tipul variabilei – stabileste mulţimea de valori posibilă pentru variabila respectivă precum si setul de operaţii permise; un tip de dată poate fi elementar (reprezinta date de tip numeric-întreg sau real şi nenumeric-caracter, logic), structurat ( sunt obţinute prin gruparea tipurilor elementare de date după reguli bine precizate ) sau referinţă (permit referirea la date alocate dinamic în timpul execuţiei programului) valoarea variabilei – reprezintă valoarea efectivă pe care o are o variabilă la un moment dat în interiorul codului sursă. într-un moment dat o variabilă are întotdeauna o singură valoare, valoarea ei modificându-se doar în urma unei operaţii de atribuire sau a unei operaţii de citire de la tastatură sau din fişier text. adresa variabilei – reprezintă locaţia fizică din memoria calculatorului în care se păstrează valoarea unei variabile. în majoritatea situaţiilor adresele variabilelor sunt invizăbile pentru utilizator. Pentru memorarea informaţiilor în memoria internă a calculatorului se foloseste sistemul binar, care are doar două valori 0 si 1.
1
ASCII este acronimul pentru American Standard Code for Information Interchange, ceea ce înseamnă "Codul Standard American pentru Schimbul de Informaţii". ASCII reprezintă un sistem de codificare a caracterelor bazat pe alfabetul englez. Codurile ASCII reprezintă caractere text pentru calculatoare, echipamente de comunicaţie şi echipamente care lucrează cu text. Setul de caractere ASCII conţine 128 de caractere: litere mari şi mici, numere, elemente de punctuaţie şi coduri de control.
Definiţie 2: Unitatea elementară de memorare a informaţiilor în memoria internă a calculatorului este bit-ul, care poate avea doar valoarea 0 sau valoarea 1( modelarea fizică a sistemului binar este comutatorul.0 – nu trece „curent electric”, 1- trece „curent electric”).
K1 ↔1
K1 ↔0
A
B
a. comutatorul K1 închis, echivalentul valorii 1 trece „curent electric” de la punctul A la B
A
B
b. comutatorul K1 deschis echivalentul valorii 0 nu trece „curent electric” de la punctul A la B
Definiţie 3: Un octet(byte) este alcătuit dintr-un grup de 8 biţi şi orice informaţie poate fi memorată utilizând întotdeauna un număr întreg de octeţi, măsurându-se în multipli de octeţi(1024 octeţi= 1Kb, 1024 Kb=1Mb, etc).
Reprezentarea datelor numerice în memoria calculatorului În funcţie de valoarea pe care o au datele numerice ele pot reprezenta numere naturale, numere întregi sau numere reale, iar pentru fiecare astfel de număr se vor aloca în memorie un număr diferit de octeţi. Reprezentarea numerelor naturale Formatul de reprezentare întreg fără semn nu presupune nimic în plus decât trecerea de la baza 10 la baza 2. În aceasta reprezentare putem scrie spre exemplu: numărul (188)10 = (10110110)2 (1·102+8·101+8·100)10 = (0·20+1·21+1·22+0·23+1·24+1·25+0·26+1·27)2 O reprezentare a unui număr întro bază de numeraţie notata B foloseste doar cifre din inteervalul [0, B-1]. Trecerea unui numar de la o bază la alta presupune aflarea unei secvente unice de resturi conform algoritmului următor: numărul se imparte la baza si se retine restul obtinut. Acesta constituie ultima cifra din reprezentare in acea baza. câtul obtinut in urma acestei prime impartiri este din nou imparti la baza si se retine iarasi restul. Acest rest constituie a doua cifra, in ordinea de la dreapta la stanga, a reprezentarii in baza aleasa. algoritmul continuă până când câul obţinut este mai mic decât baza. Acest cât va reprezenta cea mai semnificativă cifră a numărului în baza data. Tabelul următor prezinta paşii acestui algoritm pentru trecerea numarului 25 în baza 2: Nr. baz a 25:2 25 2 (25)10=(11001)2 rest 1 12 2 0 6 2 0 3 2 1 1 2 1 0
Reprezentarea în baza 2 a numărului 25 se obţine luând în ordine inversă resturile împarţirii la 2. Pentru a putea memora un număr natural în memoria internî a claculatorului se pot aloca 1,2 sau 4 octeţi. Pe un octet se pot memora numere naturale cuprinse în intervalul [0..255] bit: 7 6 5 4 3 2 1 0 cea mai mică valoare naturală reprezentată pe un octet este 0: 0 0 0 0 0 0 0 0 adică numărul natural 0=0·20+0·21+0·22+0·23+0·24+0·25+0·26+0·27. bit: 7 6 5 4 3 2 1 0 cea mai mare valoare naturală reprezentată pe un octet este 0: 1 1 1 1 1 1 1 1 adică numărul natural 255=1·2 0+1·21+1·22+1·23+1·24+1·25+1·26+1·27= 1+2+4+8+16+32+64+128 Propun ca exerciţiu de calcul reprezentarea intervalului de numere naturale care pot fi memorate pe 2 octeţi. De exemplu, numerele întregi reprezentate pe 32 bits(4 octeţi) pot lua valori cuprinse în intervalul [-2147483648, 2147483647]. Adunarea, scăderea şi înmulţirea acestor numere returnează rezultate exacte atâta vreme cât nu se depăşesc limitele precizate. În cazul în care apare o depasire (overflow) rezultatul este imprevizibil. Rezultatul împaţirii numerelor întregi reprezentate este tot un număr întreg obţinut prin rotunjirea rezultatului corect la întregul imediat mai mic. Reprezentarea numerelor întregi Numerele întregi se reprezintă în memorie în complement faţă de 2. Reprezentarea în complement fata de 2 este folosită de majoritatea procesoarelor actuale. Ideea acestei reprezentări se întelege pe baza observaţiei simple că numărul x adunat cu numărul -x trebuie să dea întotdeauna valoarea 0. Întrebarea ce se pune este cum se scrie -x, deoarece pentru numerele întregi pozitive se păstreză regula de la paragraful precedent. Cel mai simplu este să folosim un bit pentru reprezentarea semnului (de ex., 0 înseamnă plus şi 1 înseamnă minus) si ceilalţi (n-1) biţi pentru reprezentarea valorii absolute. Numerele negative se reprezintă astfel: plecăm de la reprezentarea în baza 2 a opusului (care este pozitiv), inversăm toate cifrele până la ultimul 1 (exclusiv) Exemple: (22)10 = (00010110)2, număr pozitiv ( -22)10 = (11101010)2, număr negativ Primul bit (cel scris cu culoare roşie) se mai numeste bit de semn deoarece el indică semnul numarului (este 0 dacă şi numai dacă numărul este pozitiv). Avantajul acestei reprezentări este urmatorul: algoritmii de adunare şi de scadere a două numere reprezentate în cod complementar sunt identici cu algoritmii de adunare si de scadere pentru numere pozitive reprezentate in baza 2. Pe un octet se pot memora numere naturale cuprinse în intervalul [-128..+127] Reprezentarea numerelor reale Modul în care numerele reale sunt reprezentate în memorie este reglementat de IEEE1 Floating Point Standard2, un set de reguli care ne ajută în prezicerea gradului de inexactitate a rezultatelor calculelor aritmetice. Una dintre sursele de erori în calculul ştiinţific este eroarea de 1
Institute of Electric and Electronic Egineering IEEE Floating Point Standard — standardul IEEE de reprezentare a numerelor în virgulă mobilă este un set de convenţii de reprezentare şi de operare a numerelor reale în memoria calculatorului şi care are câteva obiective: Creşterea preciziei operaţiilor cu numere reale. Standardizarea operaţiilor cu numere reale pe toate platformele de calcul. Stabilirea felului în care sunt tratate erorile. 2
rotunjire datorată calculelor aritmetice inexacte efectuate de calculator. Eroarea de rotunjire face parte din categoria erorilor inevitabile dar consecinţele sale diferă de la o problema la alta, de la o strategie de rezolvare la alta. O singura operaţie aritmetică efectuată de calculator cu numere reale va da de cele mai multe ori un răspuns cu un grad relativ mare de precizie. Pentru reprezentarea numerelor în calculator se folosesc două formate de reprezentare: formatul cu virgulă fixă: ± partea întreagă. partea zecimală de exemplu:12.351 sau -54.789 formatul cu virgulă mobilă: s-a impus datorită necesităţii de a reprezenta în sistemele de calcul numere foarte mari sau foarte mici cu un grad de precizie ridicat. La baza acestui mod de reprezentare se situează reprezentarea numerelor reale cu ajutorul mantisei(indică ordinul de mărime al numărului printr-o putere a bazei) şi exponentului exponentul (mărimea numărului în cadrul ordinului respective): ± mantisă·E±exponent. Mantisa în reprezentarea normalizată este un număr subunitar, E reprezintă valoarea bazei 10, iar exponentul este un număr întreg care stabileşte valoarea numărului real. De exemplu: numărul real -102.224 scris în virgulă fixă va fi egal cu 0.102224·E3 în virgulă mobilă. Reprezentarea caracterelor (valorilor alfanumerice) În cazul reprezentării caracterelor, există un standard internaţional care defineşte numerele, reprezentabile pe un octet, corespunzătoare fiecărui caracter în parte, numit standardul ASCII1. În acest mod sunt grupate un număr de 256 de caractere, fiecărui caracter fiindu-i asociat câte un număr natural din intervalul [0,255], număr care poartă denumirea de cod ASCII. Astfel: Caracter Codul ASCII literele mari A...Z au coduri între 65...90 literele mici a...z au coduli între 97...122 cifrele 0...9 au coduri între 48...57
Aplicaţii practice 1. Datele de intrare reprezintă: a. Rezultatele aşteptate şi obţinute prin prelucrarea unor valori cu ajutorul unui algoritm de calcul b. Valori constante pe toată durata de execuţie a algoritmului c. Un set de valori iniţiale , cunoscute şi care reprezintă punctul de plecare în rezolvarea unei probleme d. Nici un răspuns nu este corect 2. O variabilă se caracterizează prin: a. ..................................... b. ..................................... c. ..................................... d. ..................................... 3. Valoarea unei variabile este: a. Formată din unul sau mai multe caractere cu condiţia ca primul caracter să nu fie cifră b. O mulţimea de valori posibile c. O locaţie din memoria calculatorului d. Valoarea efectivă pe care o are la un moment daîn interiorul codului sursă. 4. Un bit este alcătuit din 8 octeţi? a. Adevarat; 1
ASCII este acronimul pentru American Standard Code for Information Interchange, ceea ce înseamnă "Codul Standard American pentru Schimbul de Informaţii". ASCII reprezintă un sistem de codificare a caracterelor bazat pe alfabetul englez.
b. Fals 5. Determinatţi următoarele valori echivalente: a. 1024 byte reprezintă ......................Mb; b. 1024 Mb reprezintă...............Gb; c. 1Gb este egal cu ...................octeţi; d. 1 octet este format din..............biti. 6. Reprezentaţi pe un octet următoarele numere naturale: a. 85 b. 200 c. 15 d. 255 7. Care sunt valorile naturale reprezentate în următorii octeţi: a. 10011100 b. 11000011 c. 10010000 d. 11110000 8. Reprezentaţi următoarele numere întregi pe un octet: a. -15 b. 24 c. -12 d. 30 9. Pentru reprezentarea numerelor întregi în memoria calculatorului se utilizează primul bit din reprezentare(cel mai din stânga) ca bit de semn. Astfel, daca acesta are valoarea 1 atunci numărul respectiv va fi negativ? a. Adevarat; b. Fals. 10. Transformaţi următoarele numere reale din formatul în virgulă fixă, în formatul în virgulă mobilă: a. 12.21 b. -56.98 c. 0.34 d. 3456.089 11. Transformaţi următoarele numere reale scrise în virgulă mobilă în formatul virgulă fixă: a. 0.76·E-2 b. 0.543265644·E5 c. 0.8700077·E2 d. -0.347611·E-6 12. Care este codul ASCII pentru următoarele caractere: a. A are codul ................., D are codul..................,V are codul......................; b. 0 are codul..................., 7 are codul..................,9 are codul .......................; c. b are codul.................., f are codul..................., x are codul........................ 13. Numărul de caractere din codul ASCII extins este de 256? a. Adevarat b. Fals 14. Un caracter ocupă în memorie a. 2 octeţi; b. 1 octet; c. 4 octeti; d. 256 de octeţi. 15. Pentru orice informaţie se alocă în memoria calculatorului un număr întreg de octeţi? a. Adevarat; b. Fals.
Lecţia 3 Elemente de bază ale limbajului C++ Pentru a putea utiliza cu uşurinţă un limbaj de programare trebuie să cunoaştem următoarele doua aspecte: 1. sintaxa limbajului: reprezintă totalitatea regulilor de scriere în limbajul respectiv 2. semantica limbajului: reprezintă cunoaşterea construcţiilor sintactice corecte şi semnificaţia acestora Aceste aspecte se studiază spre exemplu şi atunci cînd înveţi o limbă străină. Dacă înveţi doar cuvintele şi nu înveţi şi regulile gramaticale nu vei reuşi să te exprimi într-un mod coerent. Spre deosebire însă de un limbaj natural, în cazul nostru studiul unei limbi străine, dacă într-o exprimare folosim în mod gresit o expresie într-un context avem şanse destul de mari ca interlocutorul să ne înţeleagă, atunci când comunicăm cu un calculator, trebuie să repectăm cu exctitate regulile de comunicare. Calculatorul nu face presupuneri, nu ghiceşte ceea ce aţi fi dorit să-i spuneţi. Dacă nu vă exprimaţi corect într-un limbaj de programre nu veti obţine decât un şir considerabil de mesaje de eroare.
Setul de caractere În limbajul C++ setul de caractere utilizat pentru scrierea programelor este setul de caractere al codului ASCII: litere mari şi mici ale alfabetului englez cifrele sistemului zecimal semnele matematice şi de punctuaţie şi separatori: +,-,*,/,%,,=,#,!,&,|,?,^,(,),[,],{,},;
Separatori şi comentarii Separatorii au rolul de a delimita unităţile lexicale dintr-un program. Iată lista separatorilor admişi în limbajul C++: (,) parantezele rotunde încadrează lista de parametrii a unei funcţii, sau precizează ordinea de efectuare a operaţiilor pentru evaluarea unei expresii. { } acoladele încadrează instrucţiunile compuse, care se mai numesc şi blocuri. [ ] parantezele drepte încadrează dimensiunile tablourilor " " ghilimelele încadrează şirurile de caractere ' ' apostrofii încadrează un singur caracter ; fiecare instrucţiune se încheie cu caracterul ; /* */ comentariile sunt încadrate de caracterele /* şi */ sau dacă dorim ca un singur rând din codul sursă sa fie comentat, sau în dreptul unei instrucţiuni să apara un comentariu folosim caracterele //.Comentariile sunt texte care vor fi ignorate în momentul execuţiei programelor, dar au rolul de a clarifica si a face un cod sursă mai clar pentru cel care citeşte acel cod.
Identificatori Definiţie1: Identificatorii sunt acele constructii care au rolul de a denumi elemente ale programului si reprezintă nume de: constante, variabile, funcţii, etc. Din punct de vedere sintactic un identificator este constituit dintr-o succesiune de litere mari sau mici ale alfabetului englez, cifrele sistemului zecimal si caracterul “_”, cu condiţia ca primul caracter să nu fie o cifră. Spre exemplu: Identificatori corect scrişi Identificatori greşit scrişi max_1 nume prenume citire_vector 1max _unu a+b
Observaţii: 1. un identificator poate avea orice lungime, dar sunt luate în considerare doar primele 31 de caractere 2. În limbajul C++ se face diferenta dintre literele mari şi literele mici, din acest punct de vedere spunem că limbajul este case-sensitive (identificatorii max_1 şi Max_1 sunt diferiţi). 3. este recomandat ca identificatorii folosiţi să fie sugestivi, pentru a nu apela la comentarii pentru a întelege scopul în care este folosit un identificator. Este util să construim identificatori prin compunerea mai multor cuvinte, şi recomandat este ca iniţiala fiecărui cuvânt să fie majusculă (Citire_Vector, Afisare_Matrice)
Cuvinte cheie (keywords) Cuvintele cheie sunt identificatori speciali, rezervaţi limbajului C++, cu înţeles predefinit şi care pot fi utilizaţi numai în construcţiile sintactice în care sunt definiţi. În limbajul C++ toate cuvintele cheie se scriu doar cu litere mici, iar în programele din această carte cuvintele rezervate vor fi scrise îngroşat. Tabelul care cuprinde toate cele 32 de cuvinte cheie ale limbajului C++ este : auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
Structura generală a unui program C++ Un program C++ este alcătuit din funcţii şi variabile. Orice program C++ trebuie să conţină în mod obligatoriu o funcţie specială numită main. Această este specială prin faptul că execuţia programului debutează întotdeauna la începutul acestei funcţii. Structura unui program C++ are următoarea structură: // declaraţii directive preprocesor –fisiere antet (header) #include //definiţii de tipuri de date şi variabile globale //definiţii de funcţii utilizator void main() { //declaratii locale în functia main // instructiuni c++ } Unde: Directivele preprocesor sunt fişiere librării memorate separat si care au extensia .h. Astfel: iostream.h este un fisier antet (header) care este utilizat pentru gestionarea intrările şi ieşirile implicite de date (datele de intrare se vor prelua împlicit de la tastatura, si datele de ieşire vor fi afişate în mod implicit pe monitorul). Librăria iostream.h face parte din biblioteca implicită a limbajului C++. În funcţie de alte obţiuni ale utilizatorului se vor insera în codul sursă si alte fişiere antet cum ar fi:
conio.h - este un vechi fişier antet, folosit de vechile compilatoare C pentru a realiza interfata utilizatorului(cele mai folosite funcţii definite în biblioteca conio.h sunt clrscr()-sterge ecranul cu toate datele afişate în urma execuţiei unui program, getch() citeste de la tastaură un caracter, dar caracterul citit nu este afisat pe ecran, se utilizează în situaţia în care dorim sa oprim în anumite puncte un program în execuţie pentru a putea vedea şi analiza informaţiile afisate; după apasarea oricărei taste programul îşi continuă execuţia cu următoarea instrucţiune) math.h – este un fişier care face din biblioteca standard a limbajului C, unde sunt definite funcţiile matematice (cum ar fi radical din x –sqrt(x), ridicare la putere pow(a,b), modulul unui număr abs(a),funcţiile trigonometrice, etc. fstream.h-este un fişier în care sunt definite funcţiile de bază pentru lucru cu fişiere text. Stream-urile implicite tastaura şi monitorul se vor schimba în fişiere text de intrare sau de iesire. După includerea în program a fişierelor header urmează o secţiune rezervată definirii de tipuri de date şi variabile globale. Definiţie 2: Definirile globale de variabile se fac la începutul programului si acestea vor fi cunoscute în toate funcţiile din program. Definiţie 3: Definirile locale de variabile se fac în cadrul unei fucţii şi ele sunt cunoscute doar în funcţia în care au fost definite. În cazul programelor simple, care conţin doar funcţia main() nu este necesar definirea globala a variabilelor. Funcţiile utilizator : definirea oricărei funcţii este constuită din antetul funcţiei si corpul funcţiei antetul funcţiei conţine numele funcţiei, tipul rezultatului pe care funcţia îl calculează şi o listă de parametri prin care funcţia comunică cu exteriorul ei, încadrată între paranteze rotunde: tip_rezultat nume_functie(lista de parametri) nu fac obiectul materiei de clasa a IX-a, ele vor fi învăţate pe larg în clasa a X-a Funcţia main() este o fucţie specială, mai este numită şi funcţia principală sau programul principal, prezenţa ei este obligatorie în orice program C++ deoarece execuţia oricărui program începe cu aceasta. Pentru început vom scrie doar programe constituite doar din funcţia main(). Cel mai simplu program C++, care desigur nu are nici un efect este: void main() { }
Prezentarea ecranului mediului de programare C++ 3.1 Lansarea în execuţie a mediului de programare C++ se face lansând în execuţie fişierul executabil bc.exe aflat în directorul BIN din pachetul Borland C++, obţinut după instalarea acestuia. După acestă acţiune ecranul afişat va avea următoarea formă: 2 1 3 4 6
5
Unde: 1. bara de titlu în care este trecut mediul de programare Borland C++ for DOS 2. butoane pentru minimzare/ maximizare şi inchidere aplicaţie 3. bara de meniu a mediului de programare care conţine opţiunile: File, Edit, Search, Compile, Debug, Project, Options, Windows, Help 4. zona de lucru în care veti scrie programele C++ 5. meniul Help care conţine semnificaţia principalelor taste funcţionale pentru operaţiile de bază: F1- lansează help-ul limbajului C++ pentru a ne ajuta în cazul semnificaţiei, modului de execuţie al unei comenzi, sintaxă, definire F2- tastă utilizată pentru a memora pe hard fişierul curent deschis şi care conţine codul sursă al programului scris in C++ F3-deschide o nouă fereastră in care se va scrie un cod sursă. După apasarea tastei F3 trebuie precizat numele noului fisier in forma nume.cpp ALT+F9 realizează operaţia de compilare a programului, adică o verificare din punct de vedere sintactică a programului scris, si care va afişa toate erorile din program. F10 –permite cursorul sa ajungă în partea de meniu principal al limbajului C++ 6. 1:1 – precizează poziţia curentă a cursorului în zona de lucru, în cazul nostru linia 1, coloana 1. Pentru a afişa această fereastă pe intreg ecranul monitorului apasaţi ALT+ENTER. Meniul File conţine următoarele obţiuni: New - Deschide un nou fisier sursă cu numele implicit Noname00.cpp, sau ....001.cpp Open... - deschide un fisier cpp existent pe disk Save – salvează fisierul curent Save as - realizează un lat fişier cu continut identic cu cel curent, dar cu nume schimbat Save all - salveaya continutul tuturor fisierelor deschise Change dir...-permite schimbarea directorului curent in care va fi memorat fisierul curent Print – tipareste la imprimanta continutul sursei programului curent Quit - inchide aplicaţia Borland C++. Etape în scrierea si execuţia unui program C++: 1. se deschide aplicaţia Borland C++ 2. se stabileste directorul curent în care vom salva sursa programului folosind File → Change dir... →selecţie director dorit si la final se apasa butonul OK 3. Se deschide un fisier nou : File →New sau direct apasând tasta F3, caz în care trebuie sa stabilim un nume pentru noul fişier 4. se scrie în zona de lucru codul sursă al programului 5. se salvează pe parcursul editării programului si la terminarea acestei operaţii continutul programului utilizând File → Save sau tasta F2 6. Se verifica respectarea regulilor sintactice compilând programul folosind combinaţiile de taste ALT+F9 sau din meniul superior alegând Compile → Compile 7. după ce au fost corectate toate erorile de compilare, se mai salvează o dată programul scris după care se lansează în execuţie prin combinaţia CTRL+F9 sau din meniul superior Run→Run 8. În această etapă se verifică corectitudinea funcţionării programului scris verificând şi analizând rezultatele afişate.
Tipuri de date standard Noţiunea de dată a fost prezentată pe larg în lecţia trecută. Orice limbaj de programare dispune de un set de date predefinite numite şi tipuri de date standard. Tipurile de date standard sunt prezentate în următorul tabel: Grupa de dată
Tipul
Nr. octeţi ocupaţi
întreg
char unsigned char int unsigned int long unsigned long
1 octet cu semn 1 octet fara semn 2 octeti cu semn 2 octeti fară semn 4 octeţi cu semn 4 octeţi fara semn
float double real long double void
Domeniu de valori
Mod de reprezentare în memorie
-128...127 codul ASCII al 0...255 caracterului. -32768...23767 complement faţă de 2 0...65535 în baza 2 -231..231-1 complement faţă de 2 0.. 232-1 în baza 2 -38 38 [3.4·10 ...3.4·10 ] u virgulă mobilă simplă 4 octeţi cu semn [-3.4·10-38...-3.4·1038] precizie [1.7·10-308...1.7·10308] u 8 octeţi cu semn virgulă mobilă dublă precizie [-1.7·10-308...-1.7·10308] -4932 4932 [3.4·10 ...3.4·10 ] u virgulă mobilă dubla 10 octeţi cu semn [-3.4·10-4932...precizie 3.4·104932] Tip de dată special pentru care mulţimea valorilor este vidă
Observaţii: În cazul tipului de dată char, deşi a fost introdus pentru stocarea datelor de tip alfanumeric, el poate fi folosit în calcule numerice şi logice în intervalul de valori pe care le poate stoca. În cazul datelor de tip char, int se pot folosi modificatorii de tip: o unsigned pentru a obţine doar numere naturale, o long pentru a modifica dimensiunea reprezentării În limbajul C++ nu există un tip de date special pentru valorile logice. Valoarea 0 este asociată valorii de adevăr fals, orice valoare diferită de 0 fiind asociată valorii de adevăr adevărat. Pentru a declara o variabilă în limbajul de programare C++ se foloseşte următoarea costrucţie sintactică: denumire_tip_standard variabilă; Dacă dorim să declarăm mai multe variabile de acelaşi tip este suficient să le separăm cu aracterul virgula. Exemplu: Declarare variabile Efect int a,b,c; am definit trei variabile numite a,b, c de tip intreg float x; x variabilă reala simplă precizie char ch; ch variabilă de tip caracter unsigned n; variabila n este de tip int fără semn unsigned long m; variabila m este de tip long fără semn unsigned char p; variabila p este de tip char fara semn double d; variabila d este un numar real dublă precizie
Operatori. Expresii. Evaluarea expresiilor Operatori aritmetici Operatorii aritmetici se împart în două categorii:
operatori unari: se aplică asupra unui singur operand.Singurul operator aritmetic unar definit în C++ este caracterul - scris în fata unui număr întreg sau real si care determină semnul valorii respective. operatori binari: se aplică asupra a doi operanzi. Operatorii binari definiţi în limbajul C++ sunt: Operator + * /
%
Semnificaţie adunare scadere înmulţire a/b daca a şi b sunt două valori întregi determină câtul împartirii dacă a şi b sunt doua valori reale determina rezultatul împărţirii determină restul împarţirii a două numere nu se aplica valorilor float sau double
Prioritatea operatorilor este prezentată în următorul tabel: Operator Operatorul unar Cel mai prioritar Operatorii multiplicativi: *,/ ,% Prioritate medie Operatorii aditivi:+,Cel mai putin prioritar Operatorii aritmetici se grupeaza de la stânga la dreapta Ordinea de evaluare este cea de la matematică. Prioritatea operatoriloe se poate schimba daca in relaţiile matematice intervin caractere ( , ) folosite pentru gruparea termenilor expresiilor matematice. Exemple: Expresie matematică Valoare obţinută Dacă avem două variabile a=20 şi b=3 definite de tip int atunci: a+b 20+3=23 a-b 20-3=17 b-a 3-20= -17 a/b 20/3=6 a%b 20%3=2 b/a 3/20=0 b%20 3%20=3 (a+b)/(a-b) (20+3) / (20-3)=23/17=1 (a+b)%(a-b) (20+3) % (20-3)=23%17=6 (a+b)/2 (20+3)/2=23/2=11 Expresie matematică Valoare obţinută Dacă avem două variabile a=2.0 şi b=3.5 definite de tip float atunci: a+b 2.0+3.5=5.5 a-b 2.0-3.5=-1.5 b-a 3.5-2.0= 1.5 a/b 2.0/3.5=0.5714 a%b Operaţie nepermisă b/a 3.5/2.0=1.75 (a+b)/(a-b) (2.0+3.5)/(2.0-3.5)=5.5/-1.5=-3.66666 (a+b)/2 (2.0+3.5)/2=5.5/2=2.75 Operatori relaţionali şi de egalitate
Operatorii relaţionali sunt operatori binari şi desemnează relaţia de ordine în care se găsesc cei doi operanzi. Rezultatul aplicării unui operator relaţional este 1 (adevărat) dacă cei doi operanzi sunt în relaţia indicată de operator, şi 0(fals), altfel. Tabelul cu operatorii relaţionali din limbajul C++ este: Operator Semnificaţie = = este egal < mai mic
mai mare >= mai mare sau egal != diferit Exemple: Expresie Valoare obţinută relaţională Dacă avem două variabile a=20 şi b=3 definite de tip int atunci: a==b 20 este egal cu 3? rezultat 0 (fals) a!=b 20 este diferit 3? rezultat 1 (adevarat) a=b 20 mai mare sau egal cu 3? rezultat 1 (adevarat) Operatori logici Operatori logici globali: Există trei tipuri de operatori logici globali: Operator Denumire Tip Prioritate ! Negaţie logică Operator unar && Operator binar Conjucţie logică(şi logic) || Operato binar Disjuncţie logică(sau logic) Aşa cum ştiţi deja în limbajul C++, valoarea logică fals are asociata valoarea 0, iar orice valoare diferită de 0 are semnificaţia de adevărat. Prin urmare efectul operatorilor logici este acelaşi ca în matematică şi este prezentat în tabele următoare: a !a a b a && b a b a || b 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 Exemple: Expresie logică Valoare obţinută 1,daca x se divide la 3 x%3 0, daca x nu se divide la 3 1,daca x se divide par !(x%2) 0, daca x impar 1, daca x apartine intervalului [a,b] (x>=a)&&(x=a)&&(xb) & binar conjuncţie logică(şi logic) bit cu bit ^ dijuncţie logica exclusivă (sau exclusiv) bit cu bit binar | binar disjunţie logică(sau logic) bit cu bit Operatorii de delasare au ca efect deplasarea reprezentării binare a primului operand spre stânga () iar numărul de poziţii care se deplasează este precizat de al doilea operand. La deplasarea la stânga, poziţiile rămase libere în dreapta se completează cu 0. La deplasarea spre dreapta, poziţiile rămase libere în stânga se completează cu 0 (daca operandul stâng este un întreg pozitiv) sau cu 1 (dacă operandul este negativ). Efectul operaţiilor la nivel de bit este prezentat mai jos: a ~a a b a&b a b a^b a b a|b 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 Exemplu: Fie două numere întregi a şi b reprezentate pe 1 octet: bit: 7 a=25 0
6 0
5 0
4 1
3 1
2 0
1 0
0 1
Valoare 25
b=2 0 0 0 0 0 0 1 0 2 Atunci rezultatul urmatoarelor operatii va fi: 1 1 1 0 0 1 1 0 ~a -26 a&b 0 0 0 0 0 0 0 0 0 a|b 0 0 0 1 1 0 1 1 27 a^b 0 0 0 1 1 0 1 1 27 Ab 0 0 0 0 0 1 1 0 25/22=6 Operatori de atribuire Operatorii de atribuire sunt operatori binari care permit modificarea valorii unei variabile. Limbajul C++ are un singur operator de atribuire simplu (=) şi 10 operatori de atribuire compuşi cu ajutorul operatorului de atribuire simplu. Operaţia de atribuire simplă are următoarea sintaxă: variabilă = expresie; Efect: se calculează valoarea expresiei şi se obţine un rezultat; rezultatul se memorează la adresa variabilei.
Efectul acestei operaţii este întotdeauna de la dreapta la stânga Atenţie! A nu se confunda operaţia de atribuire cu operaţia matematică desemnată prin acelaşi simbol ”=”. De exemplu daca avem declaraţia int a=10, operaţia a=a+1; în informatică este perfect corectă si are ca semnificaţie schimbarea valorii variabilei a la valoarea 11. Din punct de vedere matematic relaţia a=a+1 este o relaţie gresită. Operaţia de atribuire compusă are următoarea sintaxă: variabilă operator = expresie; unde operatorul aparţine mulţimii {*, /, %, +, -, , &, |, ^}. Expresia din partea dreaptă a semnului ”=” poate fi la rândul ei tot o operaţie de atribuire, cu alte cuvinte se pot scrie operaţii de atribuire înlănţuite respectând următoarea sintaxă: variabilă_1=variabila_2=...=variabila_n=expresie; Exemplu: Fie două variabile a=30 şi b=2 de tip întreg int atunci: Operatie de atribuire compusă Operaţie echivalentă a + = b; a=a+b; a - = b; a=a-b; a* = b; a=a*b; a / = b; a=a/b; a=b*=2 a=b*2; a=b=a*b; a=b=60;
Efect a are valoarea 32 a are valoarea 28 a are valoarea 60 a are valoarea 15 a are valoarea 4 a şi b au valoarea 60
Operatorul de incrementare şi de decrementare Operatorii de incrementare/ decrementare sunt operatori unari care au drept scop cresterea/micşorarea valorii unei variabile cu 1. Operator Denumire ++ incrementare -decrementare Forma generala de uitlizare a acestor operatori este: Forma generala Efect variabila++; este forma postfixata a operatorului de incrementare, se utilizeaza mai intâi valoarea variabilei si apoi se creste valoarea ei cu 1 variabila--; este forma postfixata a operatorului de decrementare, se utilizeaza mai intâi valoarea variabilei si apoi se scade valoarea ei cu 1 ++variabila; este forma prefixata a operatorului de incrementare, se efectuează mai întâi cresterea cu 1 a valorii variabilei şi cu noua valoare se utilizează variabila --variabila; este forma prefixata a operatorului de decrementare, se efectuează mai întâi scăderea cu 1 valorii variabilei şi cu noua valoare se utilizează variabila Operatori condiţionali Operatorii condiţională sunt ”?” şi ”:” şi se utilizează numai împreună. Sintaxa generală a unei expresii condiţionale este: expresie_1 ? expresie_2 : expresie_3 Efect: se evaluează expresie_1. Dacă expresie_1 are o valoare diferită de 0 atunci valoarea expresiei condiţionale este egală cu valoarea expresiei_2. Dacă expresie_1 are o valoare egală cu 0 atunci valoarea expresiei condiţionale este egală cu valoarea expresiei_3.
Exemplu: expresia x < > = = = != & ^ | && || ? : =
*=
/= ^=
%= += - = |= =
&=
Asociativitate Dreapta →stanga
Prioritate Prioritate maxima
stanga →dreapta
Dreapta →stanga Dreapta →stanga
Prioritate minima
Aplicaţii practice 1. Completaţi spaţiul punctat pentru x =129: a. Numărul x are .......... cifre. Notăm numărul de cifre cu nr. b. Numerele formate din nr cifre aparţin intervalului închis ........................................ c. Suma cifrelor numărului x este ................................................................................. d. Media aritmetică a cifrelor numărului x este ............................................................ e. Câtul împărţirii numărului x la 4 este ....................................................................... f. Restul împărţirii numărului x la 4 este ...................................................................... g. Câtul împărţirii numărului x la 130 este.................................................................... h. Restul împărţirii numărului x la 130 este.................................................................. 2. Completaţi spaţiul punctat cu expresiile matematice corespunzătoare. a. Numărul real x aparţine intervalului închis [10, 20] dacă şi numai dacă ................................................................................................................................... b. Numărul real x aparţine intervalului închis [a,b] U [c,d] dacă şi numai dacă ................................................................................................................................... c. Numerele naturale x şi y sunt numere consecutive dacă şi numai dacă ................................................................................................................................... d. Un număr natural x este impar dacă şi numai dacă restul împărţirii numărului la 2 este............................................................................................................................. e. Două numere naturale x şi y sunt ambele nenule dacă şi numai dacă ................................................................................................................................... f. Un număr x este strict pozitiv dacă şi numai dacă ................................................................................................................................... g. Trei numere a, b, c sunt în ordine strict crescătoare dacă şi numai dacă ................................................................................................................................... h. Trei numere naturale a, b, c sunt pitagorice dacă
................................................................................................................................... i. Trei numere reale a, b, c pot fi laturile unui triunghi dacă ................................................................................................................................... 3. Calculaţi rezultatul următoarelor expresii: a. 15340:20+32·15-139 c. 5075-(125-(75-(7+18))) b. (((7x+34)%17+18)/5-12)*8 d. (((5·12/5·18)-25%2)·3)·2 4. Care este rezultatul următoarelor expresii? a. (77+5)/3*2 c. 7+(7+(7+7%2))/3 b. (49+63)/7/4 d. 72/9+9%4 5. Fie urmaătoare declaraţie: int a;Care va fi rezultatul functiei sizeof(a)? a. 1 b. 2 c. 4 d. 0 6. Fie următoarea declaratie de variabile: int a=2,b=3; Care va fi rezultatul expresiei (a+b)/2? a. 2.5 b. 3 c. 2 d. 5 7. Fie următoarea declaratie de variabile: int a=10,b=100; Care va fi rezultatul expresiei (a+b+abs(a-b))/2?(observaţie: abs(x) este o functie care calculează valoarea absolută a parametrului dat x ) a. 10 b. 100 c. 1000 d. 50 8. Care este rezultatul următoarei expresii condiţionale x%2==0 ? y=1: y=0 ? a. 0 c. Expresie b. 1 scrisă gresit 9. Daca avem următoarea declaraţie de variabile int a=7, b=5, c=3; Care este rezultatul următoarei expresii (float)(a+b+c)/2? d. Eroare a. 7.5 b. 7 c. 9 10. Fie următoarea declaraţie de variabile long a=40, b=10; Calculaţi valorile expresiilor: a. a+=b; c. a*=b; b. a-=b; d. a=b*2; 11. Expresia a”. Din acest punct de vedere forma generală a operaţiei de citire este: cin>>nume_variabilă; Dacă dorim să citim succesiv mai multe variabile, atunci putem utiliza operatorul de extragere înlănţuit, adică: cin>>nume_variabilă_1>>nume_variabilă_2>>…>>nume_variabilă_n; De exemplu: Scrieţi un program care citeste de la tastatură doua numere intregi. Program C++ Explicaţii: #include void main() { int a,b; cin>>a; cin>>b; } #include void main() { int a,b; cin>>a>>b; }
Daca presupunem ca tastam secvenţa de caractere 10 100 atunci în variabila a vom avea valoarea 10 si in variabila b vom avea valoarea 100. Acelaşi lucru se va obtine daca tastăm secventa 10 100 Citirea variabilelor se face liniar. Este un program echivalent cu cel de sus, citirea variabilelor se face succesiv.
Observaţii: datele de intrare din orice program se vor citi fie de la tastatură fie din fisier text la citire valorile numerice care se citesc trebuie introduse de la tastatura, separate de caractere albe(spaţiu, Tab, Enter).
Operaţia de afişare Definiţie 2: Prin afişarea sau scrierea datelor vom întelege operaţia prin care rezultatele obţinute prin prelucrarea datelor de intrare vor fi afişate pe ecranul monitorului, fie vor fi memorate într-un fişier text pe un suport extern de memorare. Stream (flux) de ieşire
Memoria calculatorului
“datele de ieşire curg din interior(memoria calculatorului)” spre exterior(ecran)
În fişierul antet iostream.h este definit acest stream de ieşire a datelor de la tastatură, denumit cout (console output). Atunci când dorim să afişăm datelele le vom extrage din fluxul de ieşire, folosind operatorul de ieşire ”