Sunteți pe pagina 1din 14

Seminar9

Limbajul C
&
Matrice part. II
I. Aspecte teoretice
1. Software folosit la seminar: Visual Studio 2010.
Alt compilator pentru rularea programelor: Dev C++
http://dev-c.soft32.com/free-download/?lp=dsa&tg=ro&kw=_cat
%3Asoft32.com&mt=b&ad=33378748619&pl=&ds=s

Exemplu de program C:
#include <stdio.h> /* contine declaratiile functiilor de intrare/iesire */
#include <conio.h>
int main()
/* program principal */
{
int i;
printf("Introduceti un nr:");
scanf("%d",&i);
/* citire numar introdus la tastatura */
printf("%d", i); /* afiare numr citit */
getch(); /*asteapta o tasta pentru a inchide fereastra in care au fost afisate
datele*/
return 0;
}

1. Generalitati
1

Tipurile de date n C
Dup modul de alocare a
memoriei

Dup numrul de valori


memorate

Tipuri existente
ntregi
Reale

Simple

Caracter
Statice

Masiv
Structurate

Articol
Fiier
Pointer

Dinamice

Simple

Referin

Tipuri simple, predefinite


Grupa
Tipul
de dat

Lungime
Domeniu de valori
(octei)

unsigned char

ntreg

Real

Mod de reprezentare

0..255 (0..28-1)
Codul ASCII al caracterului.
Poate fi prelucrat ca un caracter
sau ca un ntreg cu/fr semn.

[signed] char

-128..127 (-27..27-1)

unsigned [int]

0..65535

Virgul fix aritmetic

[signed] [int]

-32768..32767

Virgul fix algebric

unsigned long

0..232-1

Virgul fix aritmetic

[signed] long [int]

-231..231-1

Virgul fix algebric

float

3.4*10-38..3.4*1038

Virgul mobil simpl precizie

double

1.7*10-308.. 1.7*10308

Virgul mobil dubl precizie

long double

10

3.4*10-4932..3.4*104932 Virgul mobil extra precizie

Expresii
o Operatorii de atribuire
o Operatorii aritmetici
o Operatorii logici i relaionali
o Operatorii la nivel de bit
o Operatorul virgul
o Operatorul de conversie explicit
o Operatorul dimensiune
o Operatorii paranteze
o Operatorul condiional
Semnificaie operaie

Operator

Schimbare semn

Pstrare semn (nici un efect, nu este folosit)

Decrementare (post sau pre)

--

Incrementare (post sau pre)

++

Adunare

Scdere

nmulire

mprire

mprire ntreag (ctul)

mprire ntreag (restul)

Semnificaie operaie

Operator

Negare

i logic

&&

Sau logic
Sau exclusiv logic

Semnificaie operaie

||
Nu exist

Operator

Mai mare

>

Mai mare sau egal

>=

Mai mic

<

Mai mic sau egal

<=

Egal

==

Diferit

!=

/n - linie noua
/t tab
/a bell (sunet de durata si frecventa standard)

2. Structura general a unui program.


- un program in C/C++ se compune din una sau mai multe funcii
- una dintre acestea este functia principala ea defineste adresa de lansare a programului
- fiecare functie are un nume. Cea principala se numeste main
3

3. Directive de precompilare.
a) Ex.: #include <stdio.h>
Liniile care incep cu "#" se numesc directive de preprocesare (precompilare). Acestea comunica cu
preprocesorul. Aceasta directiva "#include" determina preprocesorul sa includa o copie a fisierului
header "stdio.h" in acest punct al codului. Parantezele unghiulare din "<stdio.h>" indica ca acest fisier se
gaseste in biblioteca C. Am inclus acest fisier deoarece acesta contine informatii despre functiile de
citire si scriere (printf(), scanf()).
b) int main(),
(sau void main())
Fiecare program are o functie numita "main", care se executa intai. Parantezele ce urmeaza dupa "main"
indica compilatorului ca aceasta este o functie.
4. Definirea constantelor simbolice.
a) Se pot defini nume pentru constantele care sunt folosite des fara a mai fi nevoie de alocarea repetata a
memoriei ca la variabile. Se foloseste directiva de precompilare # .
Exemplu:
#define constanta valoare
Exemplu de definire de constante:
#define alfa 150
#define NEWLINE '\n'
b) Declararea constantelor folosind cuvantul const
Cu acest prefix se poate declara o constanta de un anumit tip.
Exemplu:
const int latime = 100;
const char tabulator = '\t';
Sunt tratate ca si variabile normale cu exceptia ca valoarea lor nu poate fi schimbata dupa definire.

5. Declarararea variabilelor.

Variabile
- globale - pot fi folosite oriunde in cadrul programului (chiar si in functii)
- locale pot fi folosite doar in cadrul functiei sau blocului in care au fost declarate.
Exemple de declarari:
int a;
float mynumber;
int a, b, c; //echivalent cu
int a;
int b;
int c;
signed int NrLocuri Parcare; //echivalent cu
int NrLocuri Parcare;
6 Initializarea la declarare.
type identifier = initial_value ;
Exemplu
int a = 0;
Siruri (strings)
variabile ce pot stoca valori nenumerice care sunt mai lungi decat un caracter.
Suportul oferit pentru siruri se afla in bliblioteca string
Un sir se initializeaza folosind ghilimele (exp: string sir = abcd)
7. Constante (expresii cu valoare fixa)
Ex: a = 5; // 5 este o constanta literal
Constantele literali se impart in :
a) numerali intregi,
Ex:1776
707
- 273
Ex: 75
// decimal (baza 10)
0113
// octal (baza 8) se pune un zero la in ceputul numarului
0x4b
// hexadecimal (baza 16) se pune un 0x la inceptul numarului

Constantele ca si variabilele au un anumit tip. Tipul implicit este integer. Acesta poate fi ajustat prin urmatoarele
modalitati:
75
// int
75u
// unsigned int
75l
// long
75ul
// unsigned long
b) numerali in virgula mobila (tip implicit: double)
Ex: 3.14159 // 3.14159 = pi
6.02e23 // 6.02 x 10^23 = nr. lui Avogadro
1.6e-19 // 1.6 x 10^-19 - numar foarte mic
3.0
// 3.0
3.14159L // long double
6.02e23f // float
c) caracter i siruri
'z' // caracter
'p' //caracter
"Hello world" // sir de caractere
"How do you do?" //sir de caractere
8. Implementarea structurilor fundamentale de control.
a) IF
if (expresion) statement
Exemplu:
if (x == 100)
printf ( "x este 100");
else
printf ("x nu este 100");

c) DO-WHILE
do statement while (condition);
Exemplu:
do {
------// corp instructiuni
} while (n != 0);

b) WHILE
while (expression) statement
Exemplu:
while (n>0) {
Printf (mesaj);
}

d) FOR
forma general:
for (expresion1; expresion2; expresion3)
statement;
Un caz particular al lui for este:
for (initialization; condition; increase) statement;

e) SWITCH - structura alternativ multipl ce permite alegerea unei instruciuni dintr-un grup, in funcie de valorile
pe care le poate lua un selector
switch (expresie)
{ case c_1:
case c_2:
....
case c_n:
[default:
}

instruciune_1;
instruciune_2;
instruciune_n;
instructiuni;]

Exemplu:
char litera;
printf (Tastati o litera intra a si c);
scanf (%c, &litera);
switch (litera)
{case a:
case A: printf (litera a sau A); break;
case b:
case B: printf (litera b sau B); break;
case c:
case C: printf (litera c sau C); break;
defaul: printf (ati tastat alta litera;
}
9. Descriptori de format
Functiile de intrare / iesire cu format cu urmatoarea structura a parametrilor:
(<sir descriptor>, <lista de intrare/iesire>)
Fiecrui element din lista de intrare/ieire a operaiei de citire/scriere trebuie s-i corespund un
descriptor de format n irul descriptor. Descriptorii de format se pun n coresponden cu elementele
listei de intrare/ieire de la stnga la dreapta.
Exemplu:
.......
int a,b:
printf(nr1 = %i, nr2 = %i, a, b);
.......

Tabel Semnificaia codurilor de conversie


Nr.crt.
Cod
Semnificaie
conversie
1
d
Zecimal cu semn (int)
2
i
Zecimal cu semn (int)
3
o
octal fr semn (int)
4
u
Zecimal far semn (int)
5
x
printf: hexazecimal fara semn (int) litere mici
scanf: hexazecimal (int)
6
X
printf: hexazecimal fara semn (int) litere mari
scanf: hexazecimal (int)
7
f
Virgul mobil [-]dddd.ddd (format matematic)
8
e
Virgul mobil [-]d.ddd.e[+/-] (format tiinific)
9
g
Ca i f sau e, depinde de precizie
10
E
Ca i e, utilizeaz litera E pentru exponent
11
G
Ca i g, utilizeaz litera E pentru exponent
12
c
Imprim un singur caracter
13
s
Imprim caractere pnla \0 (NULL)
14
l sau L
Poate s precead descriptorii d,o,x sau u, caz in care
se face conversia din int spre long; dac precede
descriptorul f, se face conversie din float spre double
15
%
Caracterul %

Observaii
ntregi
ntregi
ntregi
ntregi
ntregi
ntregi
virgul mobil
virgul mobil
virgul mobil
virgul mobil
virgul mobil
ntregi
iruri
ntregi
%%=>%

10. Funcii de scriere/citire cu format


Operaiile de citire/scriere cu format, se realizeaz folosind urmtoarele funcii din biblioteca stanfard
stdio.h: printf si scanf
a) funcia printf
printf(<sir_descriptor>, <expresie1>, <expresie2>...);
- apelul funciei transfer valori care vor fi afisate
- execut scriere datelor pe unitatea de ieire (implicit pe monitor)
- returneaz caracterele afiate in caz de succes i -1 in caz de eroare
- parametrul <sir_descriptor> poate conne caractere care se afiseaz ca atare i descriptori de format
care definesc conversiile care se aplic asupra obiectelor precizate.
- n irul ce definete formatul pot fi incluse secvene escape constituite din caracterul backslash si un alt
catacter (de ex. \n, \t, \a, etc)
Exemple:
1. printf (abc);
printf (%s, abc);
Se va afisa acelai lucru
abc
abc

2. n=10;
printf (Numarul este: \n %d , n);
...
Se va afisa:
Numarul este:
10

b) funcia scanf
scanf(<sir_descriptor>, <adresa1>, <adresa2>...);
- apelul funciei transfer adrese ale variabilelor ale cror valori se vor citi
- funcia execut citirea datelor de la unitatea standard de intrare (implicit tastatur) si returneaz
campurile corect procesate
- <sir_descriptor> poate conine, n afara codurilor de conversie, caractere care vor trebui introduse ca
atare de la tastatur n cadrul cmpului respectiv (ex: daca sirul descriptor conne x=%d, atunci de la
tastatur trebuie introdus x=<valoare>)
Exemple:
scanf (%i %i, &x, &y) -> numere separate prin spatiu
scanf (%i ,%i, &x, &y) -> numere separate prin virgula

11. Functia getch


- funcia getch() este definit in biblioteca conio.h si este destinat citirii de la tastatura a unui caracter
ns fr ecou;
- nu are parametrii;
- returneaza codul ascii al caracterului citit;
Folosirea acestei funcii poate reprezenta o soluie pentru a vizualiza rezultatele afisate pe ecran.
Aplelarea funciei se realizeaz fr ecou pe ecran, astfel nct se va atepta apsarea unei taste pentru
nchiderea ferestrei in care au fost afiate rezultatele (consola).

II. Probleme
1. Scrieti programul C care numara cate elemente negative sunt intr-un vector.
Exemplu:
Dati lungimea vectorului:4
p[0]= -1
p[1]= -2
p[2]= 3
p[3]= 4
rezNumarare = 2
Indicatii:
a) se vor include bibliotecile:
#include<stdio.h>
#include<conio.h>
b) in functia main:
- declarari de variabile
int p[10];
int i,n, rezNumarare;
-se citesc datele de intrare
printf("Dati lungimea vectorului:");
scanf ("%d", &n);
for (i=0;i<n;i++){
printf("p[%d]=", i);
scanf("%d", &p[i]);
}
- algoritmul de calcul
rezNumarare=0;
for (i=0;i<n;i++)
if (p[i]<0) rezNumarare=rezNumarare+1;
- afisarea rezultatului
printf("rezNumarare = %d\n", rezNumarare);
- mentinerea rezultatului pe ecran pana la apasarea unei taste
getch();

10

2. Scrieti programul C care sa calculeze produsul vectorial a doi vectori.


Exemplu:
Dati lungimea vectorilor:3
p[0]=1
p[1]=2
p[2]=3
q[0]=1
q[1]=2
q[2]=3
rez[0]= 1
rez[1]= 4
rez[2]= 9
Indicatii:
a. Biblioteci (#include <>)
#include<stdio.h>
#include<conio.h>
b. Functia main
int main ()
{
//codul sursa pentru program (vezi punctele c,d,e,f)
getch();
return 0;
}
c. Tipuri de date si declarari
int p[10], q[10], rez[10];
int i,n;
d. Citirea datelor de intrare: lungimea vectorilor (n) si elementele lor
printf("Dati lungimea vectorilor:");
scanf ("%d", &n);
for (i=0;i<n;i++)
{
printf("p[%d]=", i);
scanf("%d", &p[i]);
}
for (i=0;i<n;i++)
{
printf("q[%d]=", i);
scanf("%d", &q[i]);
11

}
e. algoritmul de calcul
for (i=0;i<n; i++)
rez[i]= p[i]* q[i];
f. afisarea rezultatului
for (i=0;i<n;i++)
printf("rez[%d]= %d\n", i,rez[i]);

3. Screti programul C care determina minimul si maximul dintr-o matrice dreptunghiulara.


Exemplu:
Dati nr de linii:3
Dati nr de coloane:3
Dati elementele matricei:
mat[0][0]=9
mat[0][1]=8
mat[0][2]=7
mat[1][0]=6
mat[1][1]=5
mat[1][2]=4
mat[2][0]=3
mat[2][1]=2
mat[2][2]=1
mat[0][0]=9 mat[0][1]=8 mat[0][2]=7
mat[1][0]=6 mat[1][1]=5 mat[1][2]=4
mat[2][0]=3 mat[2][1]=2 mat[2][2]=1
Max = 9
Min = 1
Indicatie
- bilioteci (stdio.h, conio.h)
- in main:
- declarare variabile intregi: mat[10][10], i, j, n , m , min, max;
- citire date de intrare : nr de linii (m) , nr. de coloane (n), matricea (mat)
printf("Dati elementele matricei:\n");
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{ printf ("mat[%d][%d]=",i,j);
scanf ("%d", &mat[i][j]);
}
- afisare matrice
12

for (i=0;i<m;i++)
{ for (j=0;j<n;j++)
printf ("mat[%d][%d]=%d\t",i,j, mat[i][j]);
printf ("\n");
}
- algoritm de calcul:
o initializare min si max cu primul element din matrice
o se parcurge matricea si se verifica daca a[i][j] este mai mare/mic decat max/min. Daca da,
atunci max/min ia valoarea mat[i][j]
- se afiseaza valorile finale ale lui max si min

4. Sa se scrie programul C care realizeaza adunarea a doua matrice.


Exemplu
Dati nr de linii:2
Dati nr de coloane:2
Dati elementele primei matrice:
mat1[0][0]=1
mat1[0][1]=2
mat1[1][0]=3
mat1[1][1]=4
mat1[0][0]=1
mat1[1][0]=3

mat1[0][1]=2
mat1[1][1]=4

Dati elementele celei de-a doua matrice:


mat2[0][0]=1
mat2[0][1]=2
mat2[1][0]=3
mat2[1][1]=4
mat2[0][0]=1
mat2[1][0]=3

mat2[0][1]=2
mat2[1][1]=4

matrez[0][0]=2 matrez[0][1]=4
matrez[1][0]=6 matrez[1][1]=8
Indicatii
- biblioteci (stdio.h, conio.h)
- in main:
- declarare variabile intregi: mat1[10][10],mat2[10][10], matrez[10][10], i, j, n , m;
- date de intreare : nr. de linii (m), nr. de coloane (m), matricea 1 si 2.
- algoritmul de calcul pentru matricea rezultat matrez.
- afisare matrice rezultat.
13

5. Fie o matrice de dimensiuni mxn, reprezentand consumurile de energie pentru fabricarea a m


produse intr-o perioada de n zile. Sa se scrie programul C care afiseaza produsele care au
inregistrat consumuri constante pe intreaga perioada.
Exemplu
Dati nr. de produse (linii):3
Dati nr. de zile (coloane):3
Dati elementele primei matrice:
mat[0][0]=1
mat[0][1]=2
mat[0][2]=3
mat[1][0]=4
mat[1][1]=4
mat[1][2]=4
mat[2][0]=8
mat[2][1]=8
mat[2][2]=8
mat[0][0]=1
mat[1][0]=4
mat[2][0]=8

mat[0][1]=2
mat[1][1]=4
mat[2][1]=8

mat[0][2]=3
mat[1][2]=4
mat[2][2]=8

Produsele care au inregistrat consumuri constante sunt: 2 3


Indicatie:
- se verifica ipoteza c toate consumurile inregistrate in cele n zile pentru acelasi produs sunt egale
cu valoarea inregistrata in prima zi de consum. Produsele care respecta ipoteza sunt copiate intrun vector. La final acest vector este afisat pe ecran.
- bliblioteci: stdio.h, conio.h.
- in main:
- declaratii variabile intregi: mat[10][10],i, j, n , m , ct[10], l;
- date de intrare: nr de produse (linii) - m, nr. de zile (coloane) n, elementele matrice mat
- afisarea matricei mat
- algoritm de calcul
l=0;
for (i=0;i<m;i++)
{ j=l;
while (j<n && mat[i][j] = = mat[i][0]) j++;
if (j==n) { ct[l]=i;
l++;
}
}
- afisare rezultat
daca (l>0) atunci { SCRIE ("\n Produsele care au inregistrat consumuri constante sunt: ")
for (i=0;i<l;i++) printf("%d", ct[i]+1);
}
altfel SCRIE ("\n Nu exista produse care au inregistrat consumuri constante:");
14