Sunteți pe pagina 1din 75

Un alt fel de introducere in programare?

sau
Helping others to find their way!
Imagined and created by
Dorin-Mircea Popovici
Sa facem cunostinta!

• El este Robyx

• In conditii normale, Robyx se deplaseaza pe un plan.

• Sa zicem ca acesta este planul lui Robyx

• Si aceasta este casa lui Robyx


Vedere 2D (up view)

• Sa presupunem ca Robyx se afla in punctul A


• Iar casa lui Robyx este marcata prin B
A

• Problema:

Ajutati-l pe Robyx (situat in A) sa gaseasca


un drum spre casa sa (marcata prin B)!

B
Vedere 3D (perspective view)

B
Ce abilitati i-ar fi necesare lui Robyx?

• Sa paseasca la stanga, dreapta, in jos si in sus.


(0,0)
• adica x
A

• in situatia noastra, referindu-ne la contextul


planului sau, notand pozitia lui Robyx prin
(x,y):
pasul la stanga inseamna (x-1,y)
pasul in sus inseamna (x,y-1), etc.
B
y
Si acum sa-l ducem pe Robyx acasa!

(0,0)
• Notam pozitia initiala a lui Robyx cu x
A, de coordinate (xa,ya), A

• pozitia casei lui Robyx cu B, de


coordinate (xb,yb), si
• pozitia curenta a lui Robyx prin (x,y).
• Initial avem (x,y)=(xa,ya)

B
Care este conditia care, odata indeplinita ne asigura y
ca Robyx a ajuns acasa? R: (x,y)=(xb,yb)
Si acum sa-l ducem pe Robyx acasa! (cont)
Care sunt actiunile pe care Robyx ar trebui sa le (0,0)
intreprinda pentru a ajunge acasa? x
A
R: Ar trebui sa faca pasi, pas dupa pas

Cati pasi? Sau cat timp trebuie sa faca Robyx pasi?


R: Nu stim cati, dar trebuie sa fie acasa la final.
Adica (x,y)=(xb,yb) B
y
Si acum sa-l ducem pe Robyx acasa! (cont)

Cu alte cuvinte: (0,0)


(x,y)=(xa,ya) =A A
x

Robyx face un pas:


(x,y) -> (x+1,y)
sau
(x,y) -> (x,y+1)

B
A ajuns Robyx acasa? = B? R: NU
y
Z Z
R: DA Z
Ce am invatat pana acum?
• Am inteles enuntul unei probleme
• am identificat contextul, starea initiala si starea finala (i.e. cerintele, prelucrarile
necesare si rezultatul asteptat)

• Am imaginat o solutie a problemei


• am identificat elementele auxiliare necesare solutionarii problemei
• am identificat pasii care conduc la obtinerea solutiei (algoritmul)

• Am pus in aplicare solutia problemei


• am urmat pasii mentionati mai sus

• Cat ne costa?
• La aceasta intrebare vom raspunde in 2 ore. Deocamdata nu ne gandim la asta!
Important este sa obtinem un rezultat corect!
Traducand in pseudocod avem …

• start
• citeste xa, ya, xb, yb
• x=xa; y=ya;
• executa
• fa un pas: i.e alege aleator intre x=x+1 si y=y+1
• atata timp cat ((x!=xb)&&(y!=yb))
• stop
Cu alte cuvinte …
x=0;y=0;
Conditii initiale
do {
arataPozitie();

choice=random(-1,1);
if (choice<0) x=x+1;
else y=y+1;

if (x>9) x=9; Solutie


if (y>9) y=9;

if ((x==9)&&(y==9)) home=true;

} while (!home); Conditii finale


arataPozitie();
Fixarea cunostintelor prin exercitii …

• Redactati folosind limbajul natural, pseudocod, sau orice mijloc


schematic un algoritm care conduce la obtinerea solutiei pentru
problema de mai jos:
• Rezolvati ecuatia de gradul I de forma mx+n=0, unde m si n sunt prestabilite
sau se citesc de la tastatura

• Determinati elementul de valoare maxima dintre 2 elemente numere intregi.


• Determinati elementul de modul maxim dintre 2 elemente numere intregi.

• Determinati elementul de valoare minima dintre 2 elemente numere intregi.


• Determinati elementul de modul minim dintre 2 elemente numere intregi.
Fixarea cunostintelor prin exercitii … (cont)

• Redactati folosind limbajul natural, pseudocod, sau orice mijloc schematic


un algoritm care conduce la obtinerea solutiei pentru problema de mai jos:

• Stiind ca Dorel poate duce in camionul sau 1.5 tone (adica 1500 Kg) iar excavatorul
companiei poate excava dintr-o singura cupa maxim 0.6 mc (sa zicem 300 Kg)
simultati procesul de incarcare al camionului astfel incat capacitatea sa maxima sa nu
fie depasita.

• Indicatie: Se va cere utilizatorului sa introduca valoarea unei excavatii, aceasta se va


adauga valorii incarcaturii curente a camionului, si tot asa, pana cand valoarea unei
excavatii va produce depasirea capacitatii camioului.
Sa punem ordine in lucruri …
Cum arata, ce contine si ce produce un program

• Structura unui program,


• Date
– instructiunea de atribuire,
– citire/scriere,
• Operatii
– operatori aritmetici si logici
– Instructiuni decizionale
– Instructiuni de ciclare

28.02.2013 15
Structura unui program

28.02.2013 http://ebautu.homenet.org/ 16
Primele 3 intrebari

• Ce este un program?
• O insiruire de instructiuni ce implementeaza un algoritm de rezolvare a unei
probleme
• Cum obtinem un program?
• Fisier sursa -> cod obiect -> cod masina
• Eu pot scrie un program?
• Perseverand “DA”

28.02.2013 http://ebautu.homenet.org/ 17
Un exemplu de program C++
// primul meu program C++ A – directive, librarii
#include <iostream.h>
B – declaratii, ct, fctii, tipuri
int main()
{
cout << "Bine ati venit!"<<endl;
return 0;
}
C – functia main()

D – implementarea functiilor declarate in zona B


Realizarea unui program C/C++
• Identificarea/conceperea algoritmului
• transcrierea algoritmului în limbajul de programare utilizand un
mediu de programare
• compilarea programului
• fişierul sursă C se transformă în fişier executabil
• în Dev-C++, folosiţi tasta F9 sau opţiunea Compile & Run din meniul Execute
• testarea programului (şi corectarea erorilor)

28.02.2013 http://ebautu.homenet.org/ 19
De la "vorba" la "fapta“ – pasul 1
• Editare

• C1ex1.c

28.02.2013 http://ebautu.homenet.org/ 20
De la "vorba" la "fapta“ – pasii 2&3
• C1ex1.c

compilare
• C1ex1.obj

link
• C1ex1.exe

28.02.2013 http://ebautu.homenet.org/ 21
De la "vorba" la "fapta“ – pasul 4
• C1ex1.exe

28.02.2013 http://ebautu.homenet.org/ 22
Al doilea program C++
// Al doilea program C++
#include <iostream>
using namespace std;

char nume[20];

int main()
{
cout << "Cum va numiti?"<<endl;
cin >> nume;
cout << "Bine ai venit, "<<nume<<endl;
system("PAUSE");
return 0;
}
28.02.2013 http://ebautu.homenet.org/ 23
Program = Date + Operatii

28.02.2013 http://ebautu.homenet.org/ 24
Date

28.02.2013 http://ebautu.homenet.org/ 25
Tipuri de date ale limbajului C
• Limbajul C este un limbaj tipizat
• fiecare informatie are asociat un tip de date
• Tipuri de date primare (de baza)
• caracter (char)
• număr întreg (int)
• număr real simplă precizie (float)
• număr real dublă precizie (double)
• Tipuri de date complexe (derivate) se obţin prin combinarea celorlalte
tipuri.

28.02.2013 http://ebautu.homenet.org/ 26
Tipuri fundamentale
Tipuri Mărime Domeniu de valori
fundamentale (octeţi)
char 1 -128…127
int 4 -2147483648…2147483647
2 -32768…32767
float 4 -3,40×1038...3,4×1038
double 8 -1,79×10308...1,79×10308
• Tipurile char şi int admit subtipuri în funcţie de care se
modifică domeniul de valori
• unsigned/signed char
• short/long unsigned/signed int
28.02.2013 http://ebautu.homenet.org/ 27
Constante

28.02.2013 http://ebautu.homenet.org/ 28
5

3 ?

28.02.2013 http://ebautu.learsomestuff.com 29
Valori constante
• Constantă = informaţie care nu poate fi modificată de program
• fiecare constantă are asociat un tip de date
• Tipuri de constante
• caracter
• şir de caractere
• număr întreg
• număr real

28.02.2013 http://ebautu.homenet.org/ 30
Constante caracter
• un caracter ASCII scris între apostrofuri
• 'C', '0', '.', '!'
• au întotdeauna tipul char
• secvenţă escape = backslash (\) urmat de caractere cu semnificaţie
specială
• \’ single quote – caracterul apostrof
• \” double quote – caracterul ghilimele
• \\ backslash – caracterul backslash
• \n new line – trecerea la rândul următor
• \t horizontal tab – tabulator orizontal (multiplu de 8)

28.02.2013 http://ebautu.homenet.org/ 31
Constante şir de caractere
• o secvenţă de caractere scrise între ghilimele
• "acesta este un sir"
• "acest sir contine ghilimele astfel \" "
• se pot scrie pe mai multe randuri:
• "acesta este un sir\
pe mai multe randuri"
• "acesta este un sir"
"pe mai multe randuri"

28.02.2013 http://ebautu.homenet.org/ 32
Constante număr întreg
• un număr întreg
• scris în baza 10 – 12
• folosind cifre 0...9
• cifrele au ponderi egale cu puterea lui 10
• scris în baza 8 – 014
• folosind cifre 0...7
• cifrele au ponderi egale cu puterea lui 8
• scris în baza 16 – 0xC
• folosind cifre 0...9 si litere A...F
• cifrele au ponderi egale cu puterea lui 16

28.02.2013 http://ebautu.homenet.org/ 33
Constante număr real
• un număr real scris în baza 10, cu sau fără zecimale, cu sau fără
exponent
• Exponentul = litera e urmată de un număr întreg n (puterea lui 10).
• 10 10.0 10e0
• 1.5 15e-1 0.15E1 = 0.15 x 101
• 0.3 .3 3E-1
• separator pentru zecimale este punctul

28.02.2013 http://ebautu.homenet.org/ 34
Variabile

28.02.2013 http://ebautu.homenet.org/ 35
5

3 ?

28.02.2013 http://ebautu.learsomestuff.com 36
5

28.02.2013 http://ebautu.learsomestuff.com 37
Variabila
• = o zona de memorie capabila sa retina o informatie
de un anumit tip, accesibila de catre programator
printr-un nume si printr-o adresa de memorie de
catre calculator

int i; int i=3;


int i; int i;
adresa valoarea
lui i
&i 3
lui i

28.02.2013 http://ebautu.homenet.org/ 38
Identificatori
• un nume pe care programatorul îl dă unei entităţi (o variabilă, funcţie,
tip de date, etc) pentru a putea lucra mai uşor cu aceasta.
• identificator
• secvenţă de caractere alfanumerice şi underscore (_)
• începe cu o literă sau underscore.
• literele mari diferă de litere mici

28.02.2013 http://ebautu.learsomestuff.com 39
Exercitiul 1.1
• Găsiţi identificatorii corecţi:
• varsta
• 1_secret
• greutate
• _secret
• total1980
• _
• 1980total
• _1980

28.02.2013 http://ebautu.homenet.org/ 40
Declararea variabilei
• înainte de a fi folosită orice variabilă trebuie declarată
• float PI = 3.1415926;
• int varsta = 26, greutate;

• greutate este declarata (alocata fara valoare initiala)


• PI si varsta sunt initializate (alocate si cu valoare initiala)
• tipul variabilei determină:
• operaţiile care se pot efectua asupra valorii variabilei
• domeniul de valori a variabilei
28.02.2013 http://ebautu.homenet.org/ 41
Afişarea/citirea datelor
• int varsta = 20;
• float pi = 3.141528;

• cout<<"Varsta este "<<varsta<<endl;


• cout<<"Pi este aproximativ “<<pi<<endl;

• int varsta;

• cout<<"Ce varsta aveti?";


• cin>>varsta;
• cout<<“Felicitari, aveti “<<varsta<<“ ani!“<<endl;

28.02.2013 http://ebautu.homenet.org/ 42
Instrucţiuni C
• instrucţiunile unui program determină operaţiile pe care acesta le
efectuează
• o instrucţiune este formată din cuvinte cheie, expresii şi/sau alte
instrucţiuni.
• instrucţiunile simple se termină cu punct si virgulă
• instrucţiunile compuse se scriu între acolade

28.02.2013 http://ebautu.homenet.org/ 43
Instructiunile vida si compusa
• instrucţiunea vidă nu execută nici o operaţie (se scrie doar ; )
• Instructiunea compusa consta dintr-o succesiune de declaratii si
instructiuni incluse intre acolade

28.02.2013 http://ebautu.homenet.org/ 44
Instrucţiunile expresie si atribuire
• este compusă dintr-o expresie C

• efect: se evaluează expresia


x++;
printf(“Salut”);
a = 5;

28.02.2013 http://ebautu.homenet.org/ 45
Program = Date + Operatii
Operatii
Operatori aritmetici
• Operatori unari de păstrare/schimbare a semnului: + şi –
• Operatori binari multiplicativi *, / şi %
• Operatori binari aditivi + şi –
• Exemplu:
• int i = –2 + 3 * 4 – 5;
• Este diferit de –(2 + 3 * 4 – 5);
• Si este diferit de – 2 + 3*(4 – 5);
Instrucţiunea decizionala if
• permite execuţia unei instrucţiuni în funcţie de valoarea unei expresii

• Ramura else şi instrucţiune2 sunt opţionale.


Instrucţiunea decizionala if (cont)
• efect: se evaluează expresie; dacă rezultatul nenul, atunci se execută
instrucţiune1, altfel se execută instrucţiune2
• exemple:
if (delta < 0)
printf(“Delta este negativ\n”);
else
printf(“Delta este 0 sau pozitiv\n”);

if (bani > 100)


bogat = 1; // oare?
Totul depinde de “expresie”
• Operatori relationali (0=fals, nenul = adevarat)
< <= > >= == !=
• Atentie! a==0 este diferit de a=0

• Operatori logici
! negatie logica - are prioritatea cea mai ridicata
&& SI logic - prioritate mai mica decat operatorii relationali
|| SAU logic - prioritate mai mica decat operatorii relationali
X !X
≠0 0
0 1

X Y X && Y X Y X || Y
0 0 0 0 0 0
0 ≠0 0 0 ≠0 1
≠0 0 0 ≠0 0 1
≠0 ≠0 1 ≠0 ≠0 1
Exercitiul 1.3
Considerati secventa de cod:

if ((delta < 0)&&(bani<100)) printf(“Delta este negativ si sigur


nu sunt bogat\n”);

Modificati if-ul astfel incat sa trateze si cazul in care “delta e


negativ” dar “sunt bogat”

28.02.2013 http://ebautu.homenet.org/ 53
Sfaturi
• daca primul operand al expresiei in care apare operatorul && este 0,
sigur rezultatul final este 0, indiferent de valoarea celui de-al doilea.
• daca primul operand al expresiei in care apare operatorul || este !=0,
sigur rezultatul final este 1, indiferent de valoarea celui de-al doilea
• Expresiile logice in C se calculeaza prin scurtcircuitare
• daca primul operand are valorile de mai sus, corespunzator operandului &&
sau ||, cel de-al doilea operand nu se mai evalueaza.

10/23/2012 http://ebautu.homenet.org/ 54
Exercitii propuse
1. Să se realizeze un program C++ care afiseaza: "Bine ai venit!"

#include <stdlib.h>
#include <iostream>
using namespace std;

int main(){
cout << "Bine ai venit!“<<endl;
system("pause");
return 0;
}

Modificați programul anterior așa încât să afișeze 3 mesaje pe 3 rânduri diferite. Incercati apoi sa le
puneti pe acelasi rand.
Exercitii propuse (cont)
2.Scrieţi un program care citeşte două numere intregi de la tastatură şi afişează suma lor.

#include <stdlib.h>
#include <iostream>
using namespace std;

int main(){
int nr1, nr2;
int suma;

cout << "Introduceti primul nr:";


cin >> nr1;
cout << "Introduceti al doilea nr:";
cin >>nr2;
suma = nr1+nr2;
cout << "Suma este " << suma<<endl;

system("pause");
return 0;
}
Exercitii propuse (cont)
a) Modificați programul anterior așa încât să citească de la tastatură 3 numere întregi și să afișeze
suma lor.
b) Modificați programul anterior așa încât să citească de la tastatură 3 numere reale de tip float și să
afișeze suma lor.
c) Modificați programul anterior așa încât să citească de la tastatură 3 numere reale de tip double și
să afișeze suma lor.
d) Modificați programul anterior așa încât să calculeze rezultatul împărțirii a două numere întregi
(deîmpărțitul va fi primul număr, împarțitorul al doilea număr citit). Atenție la tipul variabilei ce
reprezintă câtul!
e) Modificați programul anterior așa încât să calculeze restul împarțirii primului număr introdus la cel
de al doilea. Folosiți operatorul %.

28.02.2013 http://ebautu.homenet.org/ 57
Exercitii propuse (cont)
3. Scrieți unprogram care citește un număr întreg de la tastatură și verifică dacă este
par.
4. Scrieţi un program determină soluţia unei ecuaţii de gradul 1 cu coeficienţi reali, de
forma ax+b = 0. Coeficienţii a si b vor fi citiţi de la tastatură.
5. Executaţi programul pentru a rezolva ecuaţia 3x+8=0.
6. Folosind instrucţiunea if-else, scrieţi un program care citeşte un număr intre 1 si 7 şi
afişează ziua corespunzătoare a săptămânii.
7. Scrieti un program care transformă o temperatură citită de la tastatură din grade
Celsius in grade Farenheit. Formula de conversie este F=32+9*C/5.
8. Scrieti un program care pentru trei numere naturale citite de la tastatura determină
dacă pot fi laturile unui triunghi şi daca acesta este dreptunghic.

28.02.2013 http://ebautu.homenet.org/ 58
Instructiuni de ciclare

28.02.2013 http://ebautu.learsomestuff.com 59
Ce au in comun?
• Culesul roadelor
pamantului
• Spalatul vaselor
• Mersul pe jos

• CICLITATEA
http://insemnarile-unei-
http://www.dollo.ro/2012/03/degustare-
• Cat timp? Pana cand?vinuri-transilvania-liliac/
femei.blogspot.ro/2011/06/jucarie-noua-
vorba-surorii-mele.html

28.02.2013 http://ebautu.learsomestuff.com 60
Pana cand? … Atata timp cat …!

28.02.2013 http://ebautu.learsomestuff.com 61
Instrucţiunea de ciclare do-while
• execuţă o instrucţiune cât timp o expresie are valoare nenulă
(adevărată)

• Instructiunea instr poate fi o instrucțiune complexă (e.g. un bloc de


instrucțiuni)

9/26/2017 http://ebautu.homenet.org 62
Instrucţiunea de ciclare do-while (cont)

• sintaxa:
do
instructiune;
while(conditie);
• efect:
• se execută instructiune;
• dacă valoarea expresiei conditie este 0, atunci se opreşte execuţia lui do-
while,
• altfel se repetă încă o dată corpul lui while.

9/26/2017 http://ebautu.homenet.org 63
Instrucţiunea de ciclare do-while (cont)
• Se dorește citirea unui număr între 1 și 10. Dacă
utilizatorul introduce un număr care nu satisface
această condiție, atunci i se cere din nou.

int n;
do {
cout << "Introduceti un numar intre 1 si 10";
cin >> n;
} while ((n<1)||(n >10));

9/26/2017 http://ebautu.homenet.org 64
Instrucţiunea de ciclare do-while (cont)
• Se dorește calculul sumei primelor n numere
naturale:

// i – numarul curent, s – suma pana la nr curent


int i=0, s=0;
do {
// la suma s adaugam numarul curent i
s=s+i;
i=i+1; // crestem numarul curent
} while (i<n);

9/26/2017 http://ebautu.homenet.org 65
Pana cand? … Atata timp cat…?

28.02.2013 http://ebautu.learsomestuff.com 66
Instrucţiunea de ciclare while
• execuţă o instrucţiune cât timp o expresie are valoare nenulă
(adevărată)

• efect:
• dacă valoarea expr (conditie) este 0, atunci se opreşte execuţia lui while,
• altfel se execută instr şi se repetă while încă o dată.
• Instructiunea instr poate fi o instrucțiune complexă (e.g. un bloc de
instrucțiuni)
9/26/2017 http://ebautu.homenet.org 67
Instrucţiunea de ciclare while (cont)
• Se dorește calcularea sumei cifrelor unui număr
intreg.

int s = 0; //initial suma este 0


while(n != 0) {
s += n%10;//se aduna la s ultima cifra
n=n/10;//se scoate ultima cifra din numar
}
cout << "suma cifrelor este “<<s<<endl;

9/26/2017 http://ebautu.homenet.org 68
Instrucţiunea de ciclare while (cont)
• Se dorește calcularea sumei numerelor de la 0 la n.

int i=0,s=0;
while(i<n) {
s=s+i;
i=i+1;
}

9/26/2017 http://ebautu.homenet.org 69
Instrucţiunea de ciclare for
• execută o instrucţiune cât timp o expresie are valoare nenulă
• sintaxa:

• efect:
• se evaluează exp1 (initializare) o singură dată.
• dacă exp2 (continuare) este 0, se opreşte for-ul.
• Altfel, se execută instr, apoi exp3 (actualizare) şi se repetă for-ul (fără
iniţializare).

28.02.2013 http://ebautu.learsomestuff.com 70
Instrucţiunea de ciclare for (cont)
• Se dorește afișarea numerelor impare mai mici decat
n.

int i;
for(i = 1; i <= n; i += 2)
cout << i << endl;

9/26/2017 http://ebautu.homenet.org 71
Instrucţiunea de ciclare for (cont)
• Se dorește calcularea produsului primelor n numere
naturale ( n! ).

/* declaram p–produsul numerelor pana la


iteratia curenta, i–iteratia (numarul) curent*/
int p = 1, i;
for(i = 1; i <= n; ++i)
// la fiecare pas, produsul curent se
// inmulteste cu numarul curent
p *= i;
cout << n <<"! este "<<p<<endl;

9/26/2017 http://ebautu.homenet.org 72
Exercitiul 2.2

• Scrieti un program care afiseaza numerele divizibile cu 3 mai mici


decat un numar n, citit de la tastatura.

• Afisati numerele de forma 5k+3 mai mici decat un numar n, citit de la


tastatura.

28.02.2013 http://ebautu.learsomestuff.com 73
Dar sa revenim la vechea noastra cunostinta Robyx

• Si-a gasit drumul spre casa?


A

• Dar daca va intalni niste obstacole?


• Il va mai gasi?

Aceasta este provocarea mea pentru voi!


Succes!