You are on page 1of 46

Shprehjet dhe

funksionet
matematikore
Dr. Ardiana Topi
Çështjet kryesore
Tipet kryesore të të dhënave, vazhdim…
Shprehjet, krijimi dhe vlerësimi i shprehjeve në C++.
Konvertimi implicid dhe explicid
Funksionet matematikore
Numrat rastësorë
Tipet e dhënave të numrave me presje
notuese (Floating-Point)

• Tipet e të dhënave me presje notuese janë:


float
double
long double

• Ato mund të ruajnë të dhëna si:


12.45 -3.8

• Të gjithë numrat me presje notuese janë


numra me shenjë (signed)
Shembull: Tipet e dhënave të numrave me
presje notuese

• Mund të paraqiten si:


Fixed point (decimal) notation:
31.4159 0.0000625
E notation:
3.14159E1 6.25e-5
• By default janë vlera double
• Mund të kthehen në float
(3.14159f) ose long double
(0.0000625L)
Tipi i të dhënave të bool
• Paraqet vlerat të cilat mund të jenë
true ose false
• variablate tipit bool ruhen si small
integers
• false paraqitet nga 0, true nga 1:

bool allDone = true; allDone finished


bool finished = false;

1 0
Madhësia e një tipi i të dhënash
• Operatori sizeof përdoret për dhënë madhësinë e çdo tipi të
dhënash apo variabli.

double amount;
cout << "A double is stored in "
<< sizeof(double) << "bytes\n";
cout << "Variable amount is stored in "
<< sizeof(amount)
<< "bytes\n";
• C++ 11 solli një mënyrë alternative të deklarimit të një
Deklarimi i variabli duke përdorur fjalën kyce auto dhe një vlerë
inicializuese .
variableve
me keyword-in • Fjala kyce auto i tregon kompiluesit të përcaktojë
tipit e të dhënave të variablit duke u nisur nga vlera
inicializuese.
auto
Shprehjet

1 2 3
Ne kemi parë që një Për ta bërë këtë, një Një shprehje është një
program është një program përcakton disa entitet me një vlerë që
manipulues vlerash. entitete të vogla të mund të ndryshojë
Programet marrin vlera, i quajtura shprehje. gjendjen e kujtesës
manipulojne ato dhe
krijojne vlera të reja.
Shprehjet
Operatorët aritmetikë
SYMBOL OPERATION EXAMPLE VALUE OF
ans
• Operatorët aritmetikë përdoren për kryerjen e + addition ans = 7 + 3; 10
llogaritjeve numerike
- subtraction ans = 7 - 3; 4
• C++ ka operatorë unarë, binarë dhe trenarë:
• unary (1 operand) -5
* multiplication ans = 7 * 3; 21
• binary (2 operands) 13 - 7 / division ans = 7 / 3; 2
• ternary (3 operands) exp1 ? exp2 : % modulus ans = 7 % 3; 1
exp3
Shprehjet primare

• Një shprehje primare është një shprehje e thjeshtë pa operator.


• Një literal në një program është një shprehje primare; ka një vlerë, por nuk ka efekt anësor. P.sh:
• false,
• ‘A’
• “Hello”
• 234
• Shprehjet ne kllapa jane shprehje primare:
• (x+3)*5
• 12/(x+2)
Shprehjet
unare
• Një shprehje unare është një shprehje e përbërë nga
një operator i aplikuar në një vlerë të vetme (i quajtur int x=4;
operand), i cili duhet të jetë një shprehje primare. +x;
• Në një shprehje unare operatori vjen përpara -x;
operandit.
• Operatori plus nuk e ndryshon vlerën e operandit të
tij.
• Operatori minus ndryshon vlerën e operandit të tij.
Nëse vlera është fillimisht pozitive, operatori e
ndryshon atë në negative dhe anasjelltas.
Shprehjet
multiplicative
• Një shprehje
multiplicative është një
shprehje binare në të cilën
ekzistojnë dy operandë:
majtas dhe djathtas. Janë
tre operatorë që krijojnë
shprehje multiplikative, siç
tregohet në figurën:
shumëzimi, pjesëtimi dhe
mbetja.
Shprehjet additive
• Një shprehje additive është një shprehje binare në të cilën ekzistojnë dy operandë: operandët e majtë dhe të djathtë.
• Kemi dy shprehje additive: mbledhje dhe zbritje
Shprehjet e vlerëdhënies
Shprehjet me një operator
Konstantet

• Një konstante është një variabël përmbajtja e të cilit


nuk mund të ndryshohet gjatë ekzekutimit të
programit.
• Përdoret për paraqitjen e vlerave konstante me emra
përshkrues:
const double TAX_RATE = 0.0675;
const int NUM_STATES = 50;
• Shpesh emërtohet me shkronja të mëdha
• cin konverton të dhënat në tipin e të dhënave që
Objekti cin & përputhet me variablin:

futja e disa vlerave


njekohësisht nga int height;
cout << "How tall is the room? ";
tastjera cin >> height;
• Mund të përdoret për të futur më shumë se një vlerë:
cin >> height >> width;
• Vlera e futura nga tastiera duhet të ndahen me hapësira.
Rendi është i rëndësishëm: vlera e parë e futur shkon te
variabli i parë, etj.
Shembull:
Leximi i disa
vlera
njëkohësisht
Shembull:
Leximi i
vlerave të
tipeve të
ndryshme
njëkohësisht
Shprehjet matematikore

• Duke përdorur operatorë matematikorë mund të krijojmë shprehje komplekse


matematikore.
• Një shprehje mund të jetë një literal, një variabël ose një kombinim
matematikor i konstanteve dhe ndryshoreve
• Mund të përdoret shenja =, cout, deklarata të tjera:

area = 2 * PI * radius;
cout << "border is: " << 2*(l+w);
Rradha e veprimeve matematikore

• Në një shprehje me më shumë se një


operator, vlerësoni në këtë renditje:
• − (unary negation), in order, left to right
• * / % in order, left to right
• + −, in order, left to right
Shprehjet algjebrike

Shumëzimi kërkon një operator:

Area = l * w;
Mund të nevojiten kllapa për të ruajtur
rendin e operacioneve:
y 2  y1 shkruhet si:
m
x 2  x1
m  y2  y1 /  x2  x1 ;
Operacionet kryhen ndërmjet operandëve të të njëjtit tip.
Nëse operandët nuk janë të të njëjtit tip, C++ do të konvertojë njërin në tipeve
Konvertimet mund të ndikojnë në rezultatet e llogaritjeve!

Konvertimet
Konvertimet

1. Çfarë ndodh kur aplikojmë një operator aritmetik në të dhëna joaritmetike p.sh. me te dhëna
tipit boolean apo char? Për shembull, çfarë ndodh nëse mbledhim dy të dhëna të tipit boolean
ose kur shumëzojmë dy të dhëna të tipit char?
2. Çfarë ndodh kur përdoren operatorë binarë të llojeve të ndryshme ? Cili është tipi i vlerës së
kthimit?
3. Për t'iu përgjigjur këtyre pyetjeve, duhet të diskutojmë dy procese të ndryshme:
I. konvertimin implicit
II. konvertimin eksplicit
4. Gjuha C++ ofron një mjet për të testuar tipin e çdo shprehjeje siç tregohet më poshtë:
typeid(expresion).name()
Konvertimi implicit

• Sa herë që përdorim një operacion/veprim mbi një tip të dhënash për të cilin ai operacion nuk
është i përcaktuar, përpiluesi C++ kryen konvertimin implicit përpara se të na japë rezultatin.
• Konvertim implicit nënkupton ndryshimin e tipit të operandit(ve) me një tip tjetër të dhënash mbi
të cilin mund të zbatohet operacioni/veprimi.
• Procesi i konvertimit kryhet me dy hapa:
1. promovimi i tipit implicid(promovimi i tipit të operandit në një madhësi më të madhe) dhe
2. ndryshimi i tipit (ndryshimi i tipit të njërit operand në tipin e operandit tjeter për t'i bërë
ato të të njëjtit tip).
• Konvertimi implicit bëhet automatikisht nga kompiluesi.
Promovimi implicit
• Promovimi i implicid aplikohet automatikisht në çdo operand për ta bërë atë të
përshtatshëm për një operacion aritmetik.
• Kjo bëhet për dy arsye:
1. kur tipi i operandit nuk është i përshtatshëm për një veprim aritmetik (boolean dhe
karakter).
2. kur nuk ka asnjë operator aritmetik të përcaktuar për tipin (short dhe float) sepse
nëse aplikojmë një operator aritmetik në një vlerë të short ose float, rezultati mund
të mos përshtatet në një short ose float (mendoni shumëzimin e dy të dhënave te
tilla).
3. Për të shmangur këto probleme, përpiluesi zbaton pesë rregulla për promovimin
implicid.
Promovimi
implicit
Ndryshimi implicit i tipit të të dhënave
• Pas promovimit implicit të secilit operand sipas rregullave që
diskutuam më sipër, kompiluesi mund ose nuk mund të kryejë
ndryshim implicit të tipit.
• Ndryshimi implicit i tipit ndodh kur dy operandët janë të tipeve të
ndryshme; pas ndryshimit, të dy operandët janë të të njëjtit tip.
• Nëse operacioni është unar, nuk ka nevojë për konvertim të
implicit;
• Nëse operacioni është binar, mund të nevojitet ndryshimi implicit
i tipit për të bërë tipet e të dy operandëve të njëjtë.
• // Implicit type conversion of mixed types, no side effect.
• #include <iostream>
• #include <typeinfo>
• using namespace std;

int main ( ) {
• int x = 123;
• long y = 140;
• double z = 114.56;
• // Check the type and value of expression x + y
• cout << "Type of x + y: " << typeid (x + y).name ()<<endl;
• cout << "Value of x + y: " << x + y << endl << endl;

// Check the type and value of expression x + y + z
• cout << "Type of x + y + z: " << typeid (x + y + z).name ()<< endl;
• cout << "Value of x + y + z: " << x + y + z << endl;
• return 0;
• }
• Në disa operacione, në të cilat një vlerë
supozohet të shkojë në një destinacion të një
tipi të paracaktuar, ne nuk mund të
ndryshojmë tipin e destinacionit sepse ai
tashmë është i përcaktuar.
Shprehje • Për shembull, kjo ndodh kur i caktojmë një

me efekte vlerë një variabli të një tipi tjetër. Në këto


raste, përpiluesi kryen ndryshim implicid të
tipit. Përpiluesi ndryshon tipin e burimit për t'u
anësore përshtatur me tipin e destinacionit.
• Për shembull, nëse i caktojmë një vlerë me
pikë lundruese një numri të plotë, kompiluesi
shkurton vlerën e variablit burim dhe ia cakton
pjesës integrale variablit destinacion.
• #include <iostream>
• #include <typeinfo>
• using namespace std;

int main ( ){
• int x;
• double y;
• // Assignment
• x = 23.67; y = 130;
• / Checking type and value of x
• cout << "Type of x = 23.67: " << typeid (x = 23.67).name
()<<endl;
• cout << "Value of x after assignment: " << x << endl << endl;
• // Checking type and value of x
• cout << "Type of y = 130: " << typeid (y = 130).name ()<<endl;
• cout << "Value of y after assignment: " << y << endl;
• return 0;
• }
Overflow & Underflow

• Ndodh kur një variabli i caktohet një vlerë që është shumë e madhe
(overflow) ose shumë e vogël (underflow.
• Variabli përmban vlerë që është 'mbështjellë rreth' grup vlerash të
mundshme.
• Sisteme të ndryshme mund të shfaqin një mesazh paralajmërimi/gabim, të
ndalojnë programin ose të vazhdojnë ekzekutimin duke përdorur vlerën e
gabuar.
Konvertimi explicit

• Ndonjëherë ne kemi nevojë ose duam të ndryshojmë tipin e një operandi në


mënyrë eksplicite.
• Kjo mund të bëhet duke përdorur konvertimin e tipit eksplicit, një proces i
quajtur casting.
• Casting në C++ bëhet ë disa mënyra. Njëra nga mënyrat është nëpërmjet:
static_cast.
• static_cast <type> (expression)
m = static_cast<double>(y2-y1)/(x2-x1);
Shembull:
Formatimi i Output-it

• Ne mund të kontrollojmë mënyrën se si shfaqet output-i për të dhënat numerike apo


alfanumerike (stringjet):
• size (madhësia)
• position (pozicion)
• number of digit(numri i shifrave)
• Formatimi i outputit kërkon header file iomanip
• setw(x): printon minimalisht x hapesira. Përdor më shumë hapësira nëse nuk është e mjaftueshëm
• fixed: use decimal notation for floating-point values
• setprecision(x): when used with fixed, print floating-point value using x digits
after the decimal. Without fixed, print floating-point value using x significant digits
• showpoint: always print decimal for floating-point values
Shembull
Shembull: Formatimi i output-it
Karakteret dhe
stringjet

• Përdorimi i cin me operatorin


>> për futjen e stringjeve mund të
shkaktojë probleme:
• cin injoron hapësirën boshe,
tabs apo line breaks.
• Për të zgjidhur këtë problem,
mund të përdorni një funksion C+
+ të quajtur getline.
Karakteret dhe
stringjet

• Për të lexuar një karakter të vetëm


përdorni cin :
char ch;
cout << ”Press any key";
cin >> ch;
• Për të lexuar karakterin tjetër të
futur, madje edhe hapësirën e
bardhë përdorni:
cin.get(ch);
Funksionet e Bibliotekës Matematikore

sin Sine
cos Cosine
• Për të përdorur funksionet
matematikore duhet cmath header file tan Tangent

• Funksionet kryesore janë: sqrt Square root


log Natural (e) log
abs Absolute value (takes and returns an int)
Numrat rastësor (Random Numbers)

• Kerkojne cstdlib header file


• rand(): returns a random number (int)
between 0 and the largest int the compute
holds. Yields same sequence of numbers
each time program is run.
• srand(x): initializes random number
generator with unsigned int x
Numrat rastesor (Random Numbers)

Shembull: Gjenerimi i një numri të plotë të


• Gjenerimi i numrave te rastesishem kerkon rastësishëm në rangun 0-100:
perdorimin: #include <random>
• Duhet te krijoni objektet e mëposhtme:
• Një motor me numra të rastësishëm për random_device myEngine;
të gjeneruar një sekuencë të
rastësishme bit-esh. uniform_int_distribution<int> randomInt(0, 100);
• Një objekt shpërndarjeje (distribution int number = randomInt(myEngine);
object )për të formatuar bitet në numra
të një tipi specifik të të dhënave, brenda
një diapazoni të caktuar.
Shembull: Simulimi i zareve
Pyejtje ?

You might also like