Sunteți pe pagina 1din 58

Fundamentele programării

Curs 1

Introducere in limbajul C

Elena BAUTU & Dorin-Mircea POPOVICI


{ebautu,dmpopovici}@univ-ovidius.ro
Web: http://www.disciplinele.ml/
Cuprins
• Structura unui program
• Date
– instructiunea de atribuire
– citire/scriere
• Operatii
– operatori aritmetici
– instructiunea if
– operatori logici

10/1/2017 Web: http://www.disciplinele.ml/ 2


Structura unui program

10/1/2017 Web: http://www.disciplinele.ml/ 3


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”

10/1/2017 Web: http://www.disciplinele.ml/ 4


Un exemplu de program C
// primul meu program C
A – directive, librarii
#include <stdio.h>
B – declaratii, ct, fctii, tipuri

int main()
{
printf("Bine ati venit!\n");
return 0;
} C – functia main()

D – implementarea functiilor declarate in zona B

10/1/2017 Web: http://www.disciplinele.ml/ 5


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

10/1/2017 Web: http://www.disciplinele.ml/ 6


Limbajul C
• limbaj de programare
– nespecializat (folosit în diverse domenii)
– nivel mediu (uşor de învăţat, relativ uşor de
folosit)
– foarte popular (datorită portabilităţii sale)
– predecesorul multor limbaje (C++, PHP, Java, C#)
• C11 – varianta standard ISO
• foloseşte fişiere sursă cu extensia .c
– .cpp pentru C++

10/1/2017 Web: http://www.disciplinele.ml/ 7


Realizarea unui program C
• Identificarea/conceperea algoritmului
• transcrierea algoritmului în limbajul C
(folosind 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)

10/1/2017 Web: http://www.disciplinele.ml/ 8


Primul program C
• Folosim mediul de programare Dev-C++
– http://www.bloodshed.net/dev/

• Programul “Hello world”


// primul meu program C
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("Bine ati venit!\n");
system("PAUSE");
return 0;
}
10/1/2017 Web: http://www.disciplinele.ml/ 9
De la "vorba" la "fapta“ – pasul 1
• Editare

• C1ex1.c
10/1/2017 Web: http://www.disciplinele.ml/ 10
De la "vorba" la "fapta“ – pasii 2&3
• C1ex1.c

compilare
• C1ex1.obj

link
• C1ex1.exe
10/1/2017 Web: http://www.disciplinele.ml/ 11
De la "vorba" la "fapta“ – pasul 4
• C1ex1.exe

10/1/2017 Web: http://www.disciplinele.ml/ 12


Al doilea program C
// Al doilea program C
#include <stdio.h>
#include <stdlib.h>

char nume[20];

int main()
{
printf("Cum va numiti?\n");
scanf("%s",&nume);
printf("Bine ai venit, %s!\n",nume);
system("PAUSE");
return 0;
}
10/1/2017 Web: http://www.disciplinele.ml/ 13
De la "vorba" la "fapta" – reloaded

10/1/2017 Web: http://www.disciplinele.ml/ 14


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;
}
10/1/2017 Web: http://www.disciplinele.ml/ 15
Program = Date + Operatii

10/1/2017 Web: http://www.disciplinele.ml/ 16


Date

10/1/2017 Web: http://www.disciplinele.ml/ 17


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.
10/1/2017 Web: http://www.disciplinele.ml/ 18
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
10/1/2017 Web: http://www.disciplinele.ml/ 19
Constante

10/1/2017 Web: http://www.disciplinele.ml/ 20


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

10/1/2017 Web: http://www.disciplinele.ml/ 21


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)

10/1/2017 Web: http://www.disciplinele.ml/ 22


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"

10/1/2017 Web: http://www.disciplinele.ml/ 23


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

10/1/2017 Web: http://www.disciplinele.ml/ 24


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

10/1/2017 Web: http://www.disciplinele.ml/ 25


Variabile

10/1/2017 Web: http://www.disciplinele.ml/ 26


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

10/1/2017 Web: http://www.disciplinele.ml/ 27


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

10/1/2017 Web: http://www.disciplinele.ml/ 28


Exercitiul 1.1
• Găsiţi identificatorii corecţi:
• varsta
• 1_secret
• greutate
• _secret
• total1980
• _
• 1980total
• _1980

10/1/2017 Web: http://www.disciplinele.ml/ 29


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
10/1/2017 Web: http://www.disciplinele.ml/ 30
Afişarea datelor
• funcţia printf afişează pe ecran un mesaj (şir de
caractere)
– mesajul poate să conţină coduri speciale pentru afişarea
altor informaţii
• %d– informaţii cu tip întreg
• %f – informaţii cu tip real (float sau double)
– int varsta = 20;
– float pi = 3.141528;
– printf("Varsta este %d", varsta);
– printf("Pi este aproximativ %f\n", pi);

– printf este alternativa pentru cout<<“Mesaj”

10/1/2017 Web: http://www.disciplinele.ml/ 31


Citirea datelor
• funcţia scanf citeşte de la tastatură un mesaj (şir
de caractere)
– mesajul poate să conţină coduri speciale pentru
citirea unor informaţii în variabile
• observati folosirea lui & înainte de numele variabilei
– int varsta;
– printf("Ce varsta aveti?");
– scanf("%d", &varsta);

– scanf este alternativa pentru cin>>variabila.

10/1/2017 Web: http://www.disciplinele.ml/ 32


Unitati lexicale

10/1/2017 Web: http://www.disciplinele.ml/ 33


Unităţi lexicale
• Unităţi lexicale = atomii unui program C
– sintaxa = reguli de îmbinare astfel încât să obţinem programe
corecte
– unităţile lexicale sunt echivalente cu cuvintele unei limbi, iar
sintaxa limbajului C cu gramatica
• Exemple de unităţi lexicale
– comentarii
– directive de preprocesare
– valori constante
– cuvinte cheie
– identificatori
– operatori
– instrucţiuni

10/1/2017 Web: http://www.disciplinele.ml/ 34


Mulţimea caracterelor
• similar cu alfabetul unei limbi
– fiecare caracter are un înţeles special pentru
compilatorul C
• limbajul C foloseşte caracterele ASCII
– litere (mici şi mari din alfabetul englez)
– cifre (de la 0 la 9)
– caractere de spaţiere (spatiu, tab, enter, etc.)
– caractere speciale ( [ { \ # ~ | % ^ ? etc.)
– alte caractere ( @ ` $ etc.)

10/1/2017 Web: http://www.disciplinele.ml/ 35


Comentarii
• sunt secvenţe din program ignorate de compilator.
– Programatorul poate scrie aici observaţiile sale privind
părţi din program.
• comentariile nu pot fi imbricate
• comentariu pe o linie: începe cu // şi se termină la
sfarşitul liniei

– // primul meu program C


– este folosit pentru a nota un pas din program
• i++; // valoarea lui i creste cu 1

10/1/2017 Web: http://www.disciplinele.ml/ 36


Comentarii (2)
• comentariu bloc: încep cu /* şi se termină la
primul */

– este folosit pentru a nota o secvenţă mai


mare/importantă din program
• /*
• primul meu program C este
• programul Hello world
• */

10/1/2017 Web: http://www.disciplinele.ml/ 37


Exercitiul 1.2
• Găsiţi comentariile corecte:
• // un exercitiu pentru voi //
• /* un exercitiu pentru voi
• // un exercitiu pentru voi */
• // un exercitiu
pentru voi
• /* un exercitiu
pentru voi
*/
• /**/

10/1/2017 Web: http://www.disciplinele.ml/ 38


Directive de preprocesare
• Preprocesare = modificarea automată a
programului sursă înainte de compilare
• Directivele de preprocesare încep cu #
– #include, #define #ifdef etc.
/* #include este înlocuită cu
fişierul sursă indicat */
#include <stdio.h>
/* stdio.h contine functii pentru
intrare/iesire */

10/1/2017 Web: http://www.disciplinele.ml/ 39


Cuvinte cheie
• secvenţă de caractere rezervate de limbaj
– nu pot fi folosite ca identificatori

auto, break, case, char, const,


continue, default, do, double, else,
enum, extern, float, for, goto, if,
int, long, register, return, short,
signed, sizeof, static, struct,
switch, typedef, union, unsigned,
void, volatile, while.
10/1/2017 Web: http://www.disciplinele.ml/ 40
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

10/1/2017 Web: http://www.disciplinele.ml/ 41


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

10/1/2017 Web: http://www.disciplinele.ml/ 42


Instrucţiunile expresie si atribuire
• este compusă dintr-o expresie C

• efect: se evaluează expresia


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

10/1/2017 Web: http://www.disciplinele.ml/ 43


Program = Date + Operatii

10/1/2017 Web: http://www.disciplinele.ml/ 44


Operatii

10/1/2017 Web: http://www.disciplinele.ml/ 45


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);

10/1/2017 Web: http://www.disciplinele.ml/ 46


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.

10/1/2017 Web: http://www.disciplinele.ml/ 47


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?

10/1/2017 Web: http://www.disciplinele.ml/ 48


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

• Operatori logici
! negatie logica
&& SI logic
|| SAU logic
10/1/2017 Web: http://www.disciplinele.ml/ 49
Negatia logica
• ! Este operator unar  are prioritatea cea
mai ridicata

X !X
≠0 0
0 1

10/1/2017 Web: http://www.disciplinele.ml/ 50


Operatori logici
• && si || sunt operatori binari, au prioritatea
mai mica decat operatorii relationali

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

10/1/2017 Web: http://www.disciplinele.ml/ 51


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”

10/1/2017 Web: http://www.disciplinele.ml/ 52


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/1/2017 Web: http://www.disciplinele.ml/ 53


Exercitii propuse
1. Să se realizeze un program C care afiseaza: "Bine ai venit!"

#include <stdio.h>
#include <stdlib.h>
int main(){
printf("Bine ai venit!");
system("pause");
return 0;
}

Modificați programul anterior așa încât să afișeze 3 mesaje pe 3


rânduri diferite. Folosiți caracterul special '\n' pentru a marca
trecerea la rând nou.

Eventual puteti utiliza operatorul de afisare din C++: <<

10/1/2017 Web: http://www.disciplinele.ml/ 54


Exercitii propuse (cont)
2.Scrieţi un program care citeşte două numere intregi de la tastatură şi afişează suma lor.

#include <stdio.h>
#include <stdlib.h>
int main(){
int nr1, nr2;
int suma;
printf("Introduceti primul nr:");
scanf("%d", &nr1);
printf("Introduceti al doilea nr:");
scanf("%d", &nr2);
suma = nr1+nr2;
printf("Suma este %d.", suma);
system("pause");
return 0;
}

a) Modificați programul anterior așa încât să citească de la tastatură 3 numere întregi și


să afișeze suma lor.
10/1/2017 Web: http://www.disciplinele.ml/ 55
Exercitii propuse (cont)
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. Variabilele vor fi de tip float, iar
specificatorii de format din printf si scanf vor fi %f.

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. Variabilele vor fi de tip float, iar
specificatorii de format din printf si scanf vor fi %lf.

d) Modificați programul anterior așa încât să calculeze rezultatul împărțirii a


două numere întregi (deîmpărțit va fi primul număr, împarțitor 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 %.

10/1/2017 Web: http://www.disciplinele.ml/ 56


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 din săptămână corespunzătoare.

10/1/2017 Web: http://www.disciplinele.ml/ 57


Exercitii propuse (cont)
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 .

10/1/2017 Web: http://www.disciplinele.ml/ 58