PC Lab4
PC Lab4
Operatori aritmetici
Operatorii aritmetici folosiți în limbajul C sunt:
• + adunarea a doua numere;
• - scăderea a doua numere;
• * înmulțirea a doua numere;
• / împărțirea a doua numere (rezultatul împărțirii pentru numere reale, câtul împărțirii
pentru numere întregi);
• % modulo (restul împărțirii a doua numere întregi);
• ++ incrementarea (mărirea unei valori cu o unitate);
• -- decrementarea (micșorarea unei valori cu o unitate);
#include <stdio.h>
int main (void)
{
int a = 54;
int mod;
mod = a % 10;
printf ("Restul impartirii lui %d la 10 este %d\n",a,mod);
return 0;
}
1
Ideea de adevărat sau fals sta la baza conceptelor de operatori logici si relaționali. În C
adevărat înseamnă orice valoare deferita de 0, iar fals este 0. Expresiile care folosesc operatori
relaționali si logici returnează 0 pentru fals si 1 pentru adevărat.
2
Indiferent de scopul în care sunt utilizați operatorii, maniera în care sunt folosiți este în
general aceeași. În cele ce urmează, se vor descrie pe scurt principiile de baza ale utilizării lor.
Observație: Operatorii la nivel de bit nu modifica valoarea operanzilor (se comporta ca si
operatorii aritmetici obișnuiți), astfel o operație n << 2 va rezulta într-un nou număr, fără a
modifica valoarea variabilei n. Pentru a modifica valoarea variabilei n trebuie sa avem o
atribuire:
n = n << 2;
Operatorii de deplasare (<< si >>) realizează deplasarea biților din operandul stâng cu
atâtea poziții câte sunt indicate de operandul drept.
Deplasarea la stânga (<<) completează la dreapta cu 0 (biții din stânga se vor pierde),
iar la dreapta numărului se completează cu 0.
Exemplu:
În cazul deplasării la dreapta (>>), biții din dreapta se pierd, iar în stânga se introduc biți
de 0, în caz ca numărul era de tip fără semn (unsigned) sau biți egali cu bitul de semn (cel mai
din stânga bit) în cazul numerelor de tip cu semn.
Exemplu:
unsigned int a= 32768;/*1000 0000 0000 0000*/
a=a>>3; /*0001 0000 0000 0000*/
Exemplu:
3
Întrucât întregul a este cu semn, prin complementare bitul de semn a luat valoarea 1 si s-a
obținut un număr negativ.
Declararea constantelor
În limbajul C, constantele se pot declara în doua moduri:
• folosind cuvântul cheie const;
• folosind directiva #define;
Declararea unei valori constante se poate face folosind cuvântul cheie const, astfel:
Prin aceasta declarare, variabila ’c’ ia valoarea 14 si NU i se mai poate modifica aceasta
valoare. O variabila declarata folosind const nu se poate folosi pentru precizarea lungimii unui
sir.
Directiva #define
Directiva define este o directiva preprocesor, utilizata pentru a face un program mai ușor
de realizat/parcurs.
Declararea unei directive preprocesor începe cu simbolul # si nu se terminata cu ';'. Ea
poate apărea oriunde într-un program, dar afectează numai liniile care urmează declarării ei. În
mod uzual, directivele preprocesor sunt scrise la începutul programului. În general, directivele
preprocesor sunt scrise cu majuscule.
Consideram următoarele exemple:
#define TRUE 1
#define FALSE 0
#define NULL 0
#define AND &
#define OR |
#define EQUALS ==
gata = TRUE;
Exemplu: modificarea valorii lui LIMIT de la 100 la 10.000 – se face prin înlocuirea liniei:
4
#define LIMIT 100
cu linia:
#define LIMIT 10000
Daca nu s-ar fi folosit acest mod de definire a constantei LIMIT, atunci ar fi trebuit sa se
modifice peste tot in program 100 cu 10000.
Macroinstrucțiuni
Exemplu:
afiseaza (b)
cu
printf ("%.2f \n",n1);
float x;
...
x = RAD2 * 15;
...
Ulterior, în program, nu se pot atribui valori constantelor simbolice.
Instrucțiunea if
Instrucțiunea decizionala if permite executarea condiționată a unei secvențe de program
în funcție de valoarea unei expresii. Sintaxa acestei instrucțiuni este următoarea:
5
if (expresie)
instructiune_1;
else
instructiune_2;
if (expresie)
{
instructiune_1_1;
instructiune_1_2;
}
else
{
instructiune_2_1;
instructiune_2_2;
}
6
Când se evaluează o expresie, operatorii se evaluează în ordinea crescătoare a precedentei
(primul operator evaluat este cel cu cea mai mica valoare pe coloana precedenta). Trebuie făcuta
distincție între operatorii logici && (SI), || (SAU) si operatorii pe biți & (SI la nivel de biți), |
(SAU la nivel de biți).
Secvența următoare de cod ilustrează acest lucru:
int a = 1; /* 01 in binar */
int b = 2; /* 10 in binar */
int x = a & b; /* SI la nivel de bit, x ia valoarea 0 */
int y = a && b; /* SI logic, y ia o valoare diferita de 0 */
/* expresia se interpretează in felul următor: y ia o valoare diferita de zero daca a este diferit de
zero SI b este diferit de zero. */
#include <stdio.h>
int main (void)
{
float a, b, x;
printf ("Coeficientul lui x=");
scanf ("%f", &a);
printf ("Termenul liber=");
scanf ("%f", &b);
if (a == 0)
{
if (b != 0)
printf ("Nu are solutii \n");
else
printf ("X este orice numar real \n");
}
else
{
x = -b / a;
printf ("X = %f", x);
7
}
return 0;
}
Exemplu: Sa se scrie un program C care sa verifice daca trei numere reale citite de la tastatura
pot reprezenta lungimile laturilor unui triunghi:
#include <stdio.h>
int main (void)
{
float a, b, c;
printf ("Introduceti cele 3 lungimi ale laturilor: \n");
scanf ("%f %f %f", &a, &b, &c);
if ((a < (b + c))&&(b < (a + c))&&(c < (a + b)) )
printf ("Cele trei segmente pot forma un triunghi ! \n");
else
printf ("Cele trei segmente nu pot forma triunghi ! \n");
return 0;
}
Operatorul conditional
Operatorul condițional ?: permite simplificarea scrierii unor expresii condiționale în care
se selectează una din doua valori, în funcție de o condiție logica. Sintaxa acestuia este
următoarea:
Aceasta expresie va returna valoarea val_1 în cazul în care condiție este o expresie
adevărata (diferita de zero) si val_2 în cazul în care condiție este o expresie falsa (egala cu zero).
int a = 2;
int b = 5;
int c = 3;
int m;
m = (a > b) ? a : b;
m = (m > c) ? m : c;
printf ("maximul este: %d", m);
Utilizând macrodefiniţiile, același exemplu se poate scrie într-o forma mai eleganta:
8
int b = 5;
int c = 3;
int m;
m = max (a, b);
m = max (m, c);
printf ("maximul este: %d", m);
Instrucțiunea switch
Instrucțiunea switch permite selectarea unei alternative din mai multe posibilităţi în
funcție de valoarea unei variabile sau expresii de tip întreg. Sintaxa este următoarea:
switch (expresie)
{
case valoare_1: instructiune_11;
instructiune_12;
instructiune_13;
break;
case valoare_2: instructiune_21;
instructiune_22;
break;
case valoare_N: instructiune_N;
break;
default: instructiune_M;
break;
}
Selectorul expresie trebuie sa fie de tip întreg. Toate valorile din care se face selecția,
valoare_1 până la valoare_N trebuie sa fie întregi. Ele trebuie sa fie si distincte.
Daca expresie este egala cu valoare_1, execuția continua cu instructiunile care apar pe
aceasta ramura (instructiune_11, instructiune_12, instructiune_13) si continua pâna la întâlnirea
unei instrucțiuni break sau până când se încheie blocul switch.
Daca expresie este egala cu valoare_2, se executa instructiune_21, instructiune_22 etc.
Daca expresie nu este egala cu nici una dintre valorile valoare_1 până la valoare_N, se
executa instrucțiunile de sub eticheta default. Aceasta eticheta este opțională.
Exemplu: Programul următor afișează un calificativ în funcție de nota unui student citita de la
tastatura.
#include <stdio.h>
int main (void)
{
int nota;
printf ("Nota= ");
scanf ("%d", ¬a);
switch (nota)
{
9
case 1:
case 2:
case 3:
case 4:
printf ("Repetent \n");
break;
case 5:
case 6:
case 7:
printf ("Slab \n");
break;
case 8:
case 9:
printf ("Bine \n");
break;
case 10:
printf ("Foarte bine \n");
break;
default:
printf ("Valoarea introdusa nu este o nota corecta!");
break;
}
return 0;
}
Probleme propuse:
1. Sa se scrie un program în C care sa rezolve o ecuație de gradul 2 (ax2 + bx + c = 0), cu
coeficienții a, b, c reali introduși de la tastatura.
2. Să se scrie un program C care citeşte 2 numere de la tastatură şi verifică dacă sunt divizibile cu 3.
Dacă sunt divizibile se va face suma dintre ele, dacă nu produsul.
3. Sa se scrie un program care citește doua numere reale de la tastatura si apoi afișează un meniu
interactiv cu următoarele opțiuni:
1) Suma numerelor introduse
2) Diferența numerelor introduse
3) Produsul numerelor introduse
4) Raportul numerelor introduse
5) Exit
Optiunea dvs: _
10