Funksionet e librarise Math

 

6.3  Funksionet e librarise Math    fq 210

Perdoren per te kryer veprime te ndryshme matematike.

 

Per te perdorur funksionet e librarise math duhet perfshire ne program libraria standarte <cmath>          

#include <cmath>   

Funksioni

Pershkrimi

Shembulli

ceil( x )

Rrumbullakos  x ne numrin e plote me te vogel jo me pak se x

ceil( 9.2 ) = 10.0

ceil( -9.8 ) =-9.0

cos( x )

Kosinusi i x (x ne radiane)

cos( 0.0 )= 1.0

exp( x )

funksioni eksponencial ex

exp( 1.0 )= 2.71828

exp( 2.0 ) = 7.38906

fabs( x )

Vlera absolute e x

fabs( 5.1 )= 5.1

fabs( 0.0 )= 0.0

fabs( -8.76 )= 8.76

floor( x )

Rrumbullakos x ne numrin me te madh jo me te madh se x

floor( 9.2 ) = 9.0

floor( -9.8 ) = -10.0

fmod( x, y )

Mbetja e x/y si numer me presje

fmod( 2.6, 1.2 ) = 0.2

log( x )

Ln(x) baza e

log( 2.718282 ) = 1.0

log( 7.389056 ) = 2.0

log10( x )

Logaritmi i x    (baza 10)

log10( 10.0 ) = 1.0

log10( 100.0 ) = 2.0

pow( x, y )

x ne fuqi y ( xy )

pow( 2, 7 ) = 128

pow( 9, .5 ) = 3

sin( x )

Sinusi i x (x ne radiane)

sin( 0.0 ) = 0

sqrt( x )

Rrenja katrore e x (ku x nje numer jo negativ)

sqrt( 9.0 ) = 3.0

tan( x )

Tangenti i x (x ne radiane)

tan( 0.0 ) = 0

6.4  Ndertimi i nje funksioni  fq 211

                  

Si ndertohet nje funksion?

 

  1. Koka e funksionit (deklarimi)
  2. {
  3. trupi
  4. }

Vete koka e funksionit perbehet nga disa pjese:

 

1.tipi i kthimit qe mund te jete int, long, float, double bool, char etj ose void qe tregon se funksioni nuk kthen vlere.

 

  1. emri i funksionit (duhet te jete identifikues

 i vlefshem ne c++, jo space, jofjalekyce, jo numer ne fillim, jo simbole te tjera pervec _)

  1. (
  2. argumentat nese ka (informacioni qe kerkon nje funksion)
  3. )

 

Kemi disa lloje funksionesh:

 

1.Funksionet pa argumenta qe nuk kthejne vlere.

2.Funksionet me argumenta qe nuk kthejne vlere.

3.Funksionet pa argumenta qe  kthejne vlere.

4.Funksionet me argumenta qe kthejne vlere.

Ndertimi i nje funksioni pa parametra qe nuk kthen vlere:

void emri_funx ()

{

veprime;

}

 

   emri_funx();

 

Thirrja e nje funksioni pa parametra qe nuk kthen vlere:

// 1.Funksionet pa argumenta qe nuk kthejne vlere.

#include <iostream>

using namespace std;

 

void afisho()

{

   cout << "Pershendetje"<< endl;

}

 

int main()

{

    afisho();//thirrja e funx afisho()

afisho();

afisho();

   system("pause");

return 0;

}

#include <iostream>

using namespace std;

 

void afisho()

{

int a = 5,b = 7,c;

c = a+b;

   cout << "c = "<< c<<endl;

}

int main()

{

 afisho(); //thirrja e funx afisho()

 afisho();

 afisho();  

system("pause");

return 0;

}

2.Funksionet me argumenta qe nuk kthejne vlere.

 

Parametrat jane informacioni qe i duhet nje funksioni per te kryer veprimet e tij.

 

Parametrat deklarohen brenda kllapave te funksionit.

tipi_kthimit funksioni(tipi emri, tipi emri,etj)

EDHE SIKUR TIPI TE JETE I NJEJTE

 

// katrori i nje numri

#include <iostream>

using namespace std;

void square( int);  // prototipi i funksionit

int main()

{  

int x;

cout<<"Jepni nje numer"<<endl;

cin >> x;

     square( x ) ;

     square( x+1) ;

     square( 52) ;

     system ("pause");

   return 0;

}

 

void square( int y )

{

   cout<<"Katrori ="<< k<<endl;

}

6.4 .Funksionet me argumenta qe  kthejne vlere. fq 211

 

Nese vlera e llogaritur nga nje funksion nuk nevojitet vetem per t'u afishuar por me te duhet te kryhen veprime te metejshme atehere funsioni duhet t'i ktheje vlere funksionit therrites.

Nje funksion qe kthen vlere duhet te kete patjeter ne rreshtin e fundit nje instruksion return vlera;

 

ku vlera mund te jete:

  1. konstante
  2. variabel
  3. shprehje

 

Tipi i kthimit te nje funksioni qe kthen vlere duhet te korrespondoje me tipin e vleres qe ai kthen.

 

Si thirret nje funksion qe kthen vlere?

Thirrja e ketyre funksioneve perfaqeson vleren e kthyer, e cila:

  1. mund te afishohet
  2. mund t'i jepet nje variabli
  3. mund te perdoret ne kushte te ndryshme logjike ose veprime aritmetike.

 

Rregulla te pergjithshme per funksionet:

  1.  Nese nuk vendosim tipin e kthimit ne deklarimin(koken) e nje funksioni kemi gabim sintakse.
  2.  Nese nuk vendoset instruksioni return ne nje funksion qe kthen vlere mund te kemi gabim logjik .
  3.  Vendosja e instruksionit return vlera; ne nje funksion qe nuk kthen vlere eshte gabim sintakse.
  4.  Deklarimi i parametrave (argumentave) ne formen(int a,b) eshte gabim sintakse. Tipi duhet vendosur per cdo argument.
  5.  Vendosja e ; ne fund te deklarimit te funksionit eshte gabim sintakse.
  6.  Ri-deklarimi i nje variabli lokal i cili eshte deklaruar nje here si argument eshte gabim sintakse.
  7.  Ndertimi i trupit te nje funksioni brenda nje funksioni tjeter eshte gabim sintakse.
  8.  Tipet dhe rendi i argumentave duhet te korrespondojne tek prototipi , thirrja dhe deklarimi i funksionit perndryshe kemi gabim.
  9.  Nese ne ndonje rast duhet te dilet nga nje funksion qe nuk kthen vlere shkruajme instruksionin:   return;
  10.  Nese prototipi i nje funksioni F1() vendoset brenda nje funksioni tjeter F2() atehere funksioni F1() do te njihet vetem nga funksioni F2() dhe jo nga funksionet e tjere te programit.

 

// Shembull: katrori i nje numri duke perdorur funksionet qe kthejne vlere.

 

#include <iostream>

using namespace std;

int square( int );   // function prototype

 

int main()

{  

int x=5;int y;

cout<<"Jepni nje numer"<<endl;

cin >> x;

  y=square( x )+2*x+3;

cout<<"y = "<<y<<endl;

     system ("pause");

   return 0;

}

// Funksion me argument qe  kthen vlere

 

int square( int y )

{

  int k = y *y;

  return k;

}

  Tipet e te dhenave

EMRI                     RANGU I VLERAVE

int                        System dependent

         

unsigned int                  System dependent

__int8                             –128 to 127

__int16                           –32,768 to 32,767

__int32                           –2,147,483,648 to 2,147,483,647

__int64                           –9,223,372,036,854,775,808 to                           9,223,372,036,854,775,807

 

char                     –128 to 127

unsigned char               0 to 255

short                    –32,768 to 32,767

         

unsigned short              0 to 65,535

long                      –2,147,483,648 to 2,147,483,647

unsigned long                0 to 4,294,967,295

enum                    Same as int

float                     3.4E +/- 38 (7 digits)

double                           1.7E +/- 308 (15 digits)

long double                   1.2E +/ - 4932 (19

Tema 6.6 Header Files fq 218

 

Cdo librari standarte ka nje "skedar koke " qe permban gjithe prototipet e funksioneve qe permban kjo librari.

 

* Perfundojne me prapashtesen .h (formati i vjeter)

* Mund te krijojme vete librari me funksionet qe deshirojme dhe te shtojme ne fillim te programit

 

#include "Libraria_jone.h"

 

* Kete librari mund ta perdorim sa here te duam ne programet tona.

Tema 6.7 Gjenerimi i numrave te rastit  fq 220

 

Funksioni qe ben te mundur gjenerimin e numrave te rastesishem (pseudo-random) nga kompjuteri eshte funksioni rand() i cili deklarohet ne librarine <cstdlib>

 

Per te perdorur kete funksion duhet shtuar ne fillim te programit

#include<cstdlib>

ose #include<stdlib.h> //per visual c++

 

Funksioni rand zgjedh nje numer te rastit nga 0 ne NR_MAX = 32767

 

Nje difekt  i funksionit rand eshte se ne ekzekutime te ndryshme zgjedh gjithmone te njejtet numra.

 

Per kete arsye para perdorimit te tij duhet perdorur funksioni srand() i cili inicializon gjeneruesin e numrave random.

Ky funx merr si argument nje numer te cilin mund ta japim nga tastiera.

psh:

 

int n;

cin>>n;

srand(n);

 

Nese ne dy ekzekutime te ndryshme funksioni srand merr te njejtin argument funksioni rand do te zgjedhe te njejtat vlera.

 

Per te bere te mundur qe funksioni srand() ne ekzekutime te ndryshme te marre gjithmone argumenta te ndryshem (Pra qe te mos e japim ne nga tastiera) perdorim instruksionin:

srand(time(0));

ose

srand(time(NULL));

ku time(0) jep numrin aktual te sekondave ne kohen e ekzekutimit e cila ndryshon automatikisht ne ekzekutime te ndryshme (sipas ores se kompjuterit).

 

Per kete duhet shtuar ne fillim te programit edhe libraria <ctime>

 

#include<ctime>

ose #include<time.h> tek visual c++

 

// Shembull

#include <iostream>

#include <iomanip>

#include <cstdlib>

#include <ctime>

using namespace std;

int main()

{

int s;

/*cin>>s;

srand(s);*/

srand(time(0));

   for ( int i = 1; i <= 20; i++ ) {

   cout << setw( 10 ) << ( 1 + rand() % 6 );

 

      if ( i % 5 == 0 )

         cout << endl;

   }

system("pause");

   return 0;

}

 

Tema 6.8 Rast studimi: Nje loje shanci. Perdorimi i "enum" fq 225

 

"enum"  eshte nje tip i percatuar nga vete perdoruesi (user-defined type) qe konsiston ne nje bashkesi konstantesh te emertuara qe njihen si numerues.

Shembull:

// Fig. 6.11

#include <iostream>

#include <cstdlib>

#include <ctime>

using namespace std;

int hedhZaret( void );  //prototipi i funksionit

 

int main()

{

   enum Gjendja { VAZHDON, FITON, HUMBET };

   int Shuma, piket;

   Gjendja Gjendja_lojes;

 

   srand( time( NULL ) );

   Shuma = hedhZaret();        // hedhja e pare

 

   switch ( Shuma ) {

      case 7:

            case 11:                  // fiton ne hedhjen e pare

         Gjendja_lojes = FITON;

         break;

      case 2:

             case 3:

             case 12:                 // humbet ne hedhjen e pare

         Gjendja_lojes = HUMBET;

         break;

      default:                 // ruhen piket

         Gjendja_lojes = VAZHDON;

         piket = Shuma;

         cout << "Piket jane " << piket << endl;

         break;                // opspionale 

   }

 

   while ( Gjendja_lojes == VAZHDON ) {    // hidhet zari perseri

      Shuma = hedhZaret();

 

      if ( Shuma == piket )       // fiton nese hedh te njejtin numer sa piket e ruajtura

         Gjendja_lojes = FITON;

      else

         if ( Shuma == 7 )          // humbet nese hidhet 7

            Gjendja_lojes = HUMBET;

   }

 

   if ( Gjendja_lojes == FITON )

      cout << "Lojtari fiton" << endl;

   else

      cout << "Lojtari humbet" << endl;

system("pause");

   return 0;

}

 

int hedhZaret( void )

{

   int zari1, zari2, shuma_zareve;

 

   zari1 = 1 + rand() % 6;

   zari2 = 1 + rand() % 6;

   shuma_zareve = zari1 + zari2;

   cout << "Lojtari hodhi zaret " << zari1

        << " + " << zari2

        << " = " << shuma_zareve << endl;

 

   return shuma_zareve;

}

Tema 6.9 Klasat e ruajtjes (fq 229)

 

Cdo identifikues ne program ka atributa te tjera pervec  tipit, emrit, madhesise dhe vleres. Keto jane klasat e ruajtjes, scope-i , dhe lidhja (linkage)

 

- Klasa e ruajtjes se nje identifikuesi percakton periudhen gjate se ciles identifikuesi ekziston ne memorje.

 

- scope eshte fusha e veprimit te nje variabli ose pjesa e programit ne te cilen i referohemi nje variabli.

 

- Linkage percakton per nje program me shume skedare(multiple-file-program)  nese identifikuesi njihet ne skedarin aktual apo edhe ne ndonje skedar tjeter.

 

C++ permban 5 specifikues te klasave te ruajtjes:

auto, register, extern, mutable ,static.

 

- auto - eshte menyra eksplicite e deklarimit te nje variabli (automatik).

auto double x;

- extern- eshte menyra eksplicite e deklarimit te nje variabli global pra jashte cdo funksioni.

 

-register- ben te mundur qe variabli te ruhet ne regjistra per te mos okupuar memorjen.

 

for (register int i = 0; i<10 ; i++)

 

- static- ben te mundur qe variabli te inicializohet vetem ne thirrjen e pare te funksionit kurse ne thirrjet e tjera variabli ruan vleren e mbetur nga thirrja e kaluar e funksionit.

 

- mutable - perdoret tek klasat dhe i lejon anetaret e klases te deklaruar const qe te mbeten te modifikueshem.

Tema 6.10  Rregullat SCOPE    fq 232

 

Me scope do te kuptojme fushen e veprimit te nje variabli ose bllokun e instruksioneve ku njihet ai variabel.

 

Llojet e scope-ve jane:

  1. Global namespace scope - variablat globale qe njihen gjate gjithe programit. Ata deklarohen jashte cdo funksioni.

 

  1. Function scope

Te vetmin identifikues me kete lloj scope jane Labels. P.sh struktura goto. Labels mund te perdoren kudo ne funksionin ku jane deklaruar por jo jashte tij.

 

  1. Local scope

variabli njihet vetem brenda bllokut ku eshte deklaruar.

 

  1. Function-prototype scope

variablat njihet vetem ne instruksionin e prototipit te funksionit, ata injorohen nga kompilatori.

Funksionet therritese (Rekursiviteti) fq 253

 

Nje funksion quhet rekursiv nese ai therret vetveten.

 

Problemet qe zgjidhen me rekursivitet kane disa te perbashketa:

Zakonisht perdoret nje funksion rekursiv i cili di te zgjidhe vetem rastin me te thjeshte qe quhet "rasti baze"

 Nese funksioni do te thirret me rastin baze ai do te ktheje thjesht nje vlere. Nese funksioni thirret me nje problem me te komplikuar ai ndahet ne dy pjese:

 

1: rasti baze - qe funksioni di ta zgjidhe dhe kthen nje vlere.

2: rasti rekursiv i cili eshte si problemi fillestar por me shkalle veshtiresie me te zvogeluar.

Edhe ne kete rast funksioni do te kete return por brenda shprehjes se kthyer ai therret vetveten.

 

Funksioni perfundon ekzekutimin e tij kur pas shume zvogelimesh te rastit rekursiv vjen radha e rastit baze dhe ne ate moment dilet nga funksioni.

 

Ka shume probleme qe mund te zgjidhen shume me thjesht me ane te rekursivitetit sesa ne menyren perseritese  (me cikle).

Nje shembull i thjeshte i demostrimit te rekursivitetit eshte faktoriali:

 

             n! = n*(n-1)*(n-2)* . . . * 1

 

psh: 5! = 5*4*3*2*1

          = 5*(4*3*2*1)

          = 5*4!

 

Ne rastin e pergjithshem :

          n! = n * (n-1)!

 

Pra rasti baze: 0! = 1! = 1

dhe rasti rekursiv  n! = n * (n-1)!

 

Pra funksioni therret vetveten me nje numer me pak deri sa te arrihet ne rastin baze.

 

Pra 5! = 5 * 4!

       = 5 * 4 * 3!

       = 5 * 4 * 3 * 2!

       = 5 * 4 * 3 * 2 * 1!

       = 5 * 4 * 3 *2 * 1

// Fig. 3.14: fig03_14.cpp

// Zgjidhja rekursive e faktorialit

#include <iostream>

#include <iomanip>

using namespace std;

unsigned long faktorial( unsigned long );

 

int main()

{

   for ( int i = 0; i <= 10; i++ )

      cout << setw( 2 ) << i << "! = "

      << faktorial(i)<< endl;

system("pause");

   return 0;

}

// funksioni rekursiv

unsigned long faktorial(unsigned long number )

{

   if ( number <= 1 )  // rasti baze

      return 1;

   else                // rasti rekursiv

      return number * faktorial( number - 1 );

}

3.18 Argumentat e paracaktuar (default)

Nese ne prototipin e funksionit u japim vlere n parametrave atehere ai funksion mund te thirret me asnje, nje, dy .... ose n argumenta.

 

Nese funksioni thirret me numer me te vogel argumentash se numri i pergjithshem atehere vlerat e tjera do te merren automatikisht nga vlerat e paracaktuara ne prototipin e tij.

 

Psh: Prototipi i funksionit defaultFunction() do te shkruhej:

int defaultFunction( int x = 1, int y = 2, int z = 3 );

Shembull:

 

// Fig. 3.23: fig03_23.cpp

// Perdorimi i argumentave te paracaktuar

#include <iostream>

using namespace std;

int Vellimi_kutise( int gjeresi = 1, int gjatesi = 1, int lartesi = 1 );

 

int main()

{

   cout << "Vellimi i paracaktuar i kutise eshte: " << Vellimi_kutise()

              << "\n\nThe Vellimi i kutise me gjeresi 10,\n"

        << "gjatesi 1 dhe lartesi 1 is: " << Vellimi_kutise( 10 )

        << "\n\nVellimi i kutise me gjeresi 10,\n"

        << "gjatesi 5 and lartesi 1 eshte: " << Vellimi_kutise( 10, 5 )

        << "\n\nVellimi i kutise me gjeresi 10,\n"

        << "gjatesi 5 dhe lartesi 2 eshte: " << Vellimi_kutise( 10, 5, 2 )

        << endl;

system("pause");

   return 0;

}

 

// Llogarit vellimin e kutise

int Vellimi_kutise( int gjeresi, int gjatesi, int lartesi )

{

   return gjeresi * gjatesi * lartesi;

}

3.19   Unary Scope Resolution Operator (operatori unar i zgjedhjes se scope-it)

                           

Shenohet me simbolin ::

 

Perdoret per te kapur (aksesuar) variablin global nese kemi dy variabla me te njejtin emer njeri lokal tjetri global. Nese variablat jane me emra te ndryshem nuk eshte i nevojshem perdorimi i ketij operatori.

 

// Perdorimi i operatori unar i zgjedhjes se scope-it ::

#include <iostream>

#include <iomanip>

using namespace std;

 const int a = 125;

 

int main()

{

   const int a = 15;

 

   cout <<"  Vlera e variablit lokal a = " << a

        << "\nVlera e variablit global a = " << ::a << endl;

system("pause");

   return 0;

}

3.20 OVERLOADING (Mbingarkimi i funksioneve)

Nese ne nje program kemi dy ose me shume funksione me te njejtin emer atehere kemi te bejme me "overloading". Kompilatori i dallon funksionet nga numri i argumentave. Nese numri i argumentave eshte i njejte atehere i dallon nga tipi i argumentave.

Dy funksione te mbingarkuar mund te kene edhe tip kthimi te njejte.

 

Nese kemi dy funksione me numer e tipe te njejta argumentash por me tipe kthimi te ndryshme atehere nuk kemi te bejme me overloading por me gabim sintakse.

 

Keto lloje funksionesh mund te perdoren per te kryer veprime te njejta per tipe te ndryshme . Psh: Shembulli i meposhtem llogarit dhe afishon katrorin e nje numri sido qe ta japim me presje(double) ose te plote (int).

// Fig. 3.25: fig03_25.cpp

// Overloading

#include <iostream>

using namespace std;

 

int Katrori( int x ) { return x * x; }

 

double Katrori( double y ) { return y * y; }

 

int main()

{

   cout << "Katrori i numrit integer 7 eshte "

<< Katrori( 7 )

        << "\nKatrori i numrit double 7.5 eshte "

<< Katrori( 7.5 )

        << endl;   

system("pause");

   return 0;

}