SlideShare a Scribd company logo
Universiteti i Prishtinës
Fakulteti i Inxhinierisë Elektrike dhe Kompjuterike




                   Agni H. Dika




                  Prishtinë 2007
Libri të cilin e keni në dorë së pari u dedikohet studentëve të
Fakultetit të Inxhinierisë Elektrike dhe Kompjuterike në Prishtinë. Por, ai
mund të përdoret edhe nga të interesuar tjerë për programim me
kompjuter.
      Njësitë mësimore në libër janë organizuar ashtu që materiali i
përfshirë brenda tyre të jetë sa më i afërt për të gjithë ata të cilët fillojnë të
punojnë me kompjuter. Për këtë qëllim, gjatë shpjegimit të algoritmeve
janë shfrytëzuar shembuj të ndryshëm, duke filluar nga ato elementare.
      Në libër, çdo algoritmi i shoqërohet edhe programi përkatës i
shkruar në gjuhën programuese C++, ashtu që përmes ekzekutimit në
kompjuter, të jetë edhe më i qartë funksionimi i tyre. Lexuesit të cilët nuk
kanë njohuri mbi gjuhën programuese C++, pa asnjë pengesë mund t'i
kapërcejnë programet që paraqiten në libër.

                                                                Autori
Paraqitja analitike 2
      Paraqitja grafike 4
  Testimi i algoritmeve 7
Përcjellja në kompjuter 9
2 Algoritmet




    Grumbulli i veprimeve me një radhë të fiksuar, të cilët ndërmerren gjatë
zgjidhjes së një problemi të caktuar, quhet algoritëm.
    Në jetën e përditshme, për zgjidhjen e problemeve të ndryshme, njeriu krijon
algoritme përkatëse, duke shfrytëzuar dijen e grumbulluar. Por, me kohë,
algoritmet që përsëriten fiksohen në ndërdije dhe sipas nevojës shfrytëzohen si të
gatshme. Kështu, p.sh., ardhja para rrugëkryqit, çdo këmbësori i imponon
përdorimin e algoritmit, i cili mund të përshkruhet përmes tekstit të dhënë në
Fig.1.1.

        Nëse në rrugëkryq është vendosur semafori
      dhe ai punon, rruga mund të kalohet në
      vendëkalim pasi të paraqitet ngjyra e
      gjelbër. Nëse në rrugëkryq nuk ka semafor,
      ose ai nuk punon, rruga mund të kalohet në
      vendkalim kur nuk ka automjete, duke shikuar
      majtas dhe djathtas.


                  Fig.1.1 Algoritmi logjik për kalimin e rrugëkryqit
    Varësisht nga operacionet që përdoren gjatë përpilimit, algoritmet mund të
grupohen në algoritme logjike dhe algoritme numerike. Derisa algoritmet
logjike mbështeten në operacione dhe konkluzione logjike, ashtu siç shihet në
shembullin e algoritmit të dhënë më sipër, në algoritmet numerike shfrytëzohen
operacionet dhe shprehjet aritmetikore.


Paraqitja analitike
    Në formë më të lirë, paraqitja analitike e algoritmeve duket ashtu siç është
dhënë në shembullin e algoritmit për kalimin e rrugëkryqit, në Fig.1.1. Kjo formë
e paraqitjes së algoritmeve, nëse përdoret gjatë zgjidhjes së problemeve të
komplikuara, mund të jetë e paqartë dhe e papërcaktuar plotësisht.
    Në praktikë përdoret forma analitike e paraqitjes së algoritmeve e shprehur
përmes një numri hapash, të cilët kryhen sipas një radhe të fiksuar plotësisht.
Kështu, shembulli i algoritmit të dhënë në Fig.1.1, i paraqitur në 10 hapa, do të
duket si në Fig.1.2.
Paraqitja e algoritmeve 3

   1.  Fillimi
   2.  A ka semafor?
        Nëse JO, hapi i 6.
   3. A punon semafori?
        Nëse JO, hapi i 6.
   4. A është paraqitur ngjyra e gjelbër?
        Nëse PO, hapi i 9.
   5. Duhet pritur. Hapi i 4.
   6. Shiko majtas e djathtas
   7. A ka automjete?
        Nëse JO, hapi i 9.
   8. Duhet pritur. Hapi i 6.
   9. Kalo rrugën në vendëkalim
   10. Fundi.
             Fig.1.2 Forma analitike e algoritmit për kalimin e rrugëkryqit
    Hapat e veçantë të këtij algoritmi kryhen me radhë prej fillimi, derisa nuk
urdhërohet kapërcimi në një hap të caktuar. Kështu, p.sh., nëse në rrugëkryq ka
semafor dhe paraqitet ngjyra e gjelbër, vargu i hapave nëpër të cilët do të kalohet
gjatë ekzekutimit të algoritmit të dhënë është: 1, 2, 3, 4, 9 dhe 10. Por, në
kushtet e kulturës së komunikacionit në hapësirat tona, kur shpesh ndodh që
automjetet e kalojnë rrugëkryqin kur në semafor është e ndezur drita e kuqe, më
e sigurt për këmbësorin është nëse hapi i katërt i algoritmit shkruhet kështu:

   4.    A është paraqitur ngjyra e gjelbër?
          Nëse PO, hapi i 6.

ashtu që para se të kalohet rrugëkryqi, pavarësisht se për këmbësor është
paraqitur ngjyra e gjelbër, duhet të shikohet mos ndoshta kalon ndonjë automjet.
Kështu, për rastin e përmendur më sipër, kur në rrugëkryq ka semafor dhe është
paraqitur ngjyra e gjelbër, vargu i hapave nëpër të cilët kalohet është: 1, 2, 3, 4,
6, 7, 9 dhe 10.
    Tek algaritmet numerike hapat e veçantë janë më të qartë, sepse konsistojnë
në operacione dhe në shprehje matematikore.
4 Algoritmet

    Shembull        Algoritmi numerik për llogaritjen e vlerës së funksionit:

                            ⎧ x2        për x < 0.9
                            ⎪
                        y = ⎨ 2x        për x = 0.9
                            ⎪x − 3      për x > 0.9
                            ⎩

                    nëse dihet vlera e variablës x.

   1.     Fillimi.
   2.     Merre vlerën e variablës x
   3.     A është x<0.9, ose x=0.9, ose x>0.9?
           Nëse x<0.9, hapi i 4.
           Nëse x=0.9, hapi i 5.
           Nëse x>0.9, hapi i 6.
   4.     y=x2. Hapi i 7.
   5.     y=2x. Hapi i 7.
   6.     y=x-3. Hapi i 7.
   7.     Shtype vlerën e variablës y
   8.     Fundi.
                               Fig.1.3 Algoritmi numerik
    Algoritmi i dhënë është shkruar duke pasur parasysh zgjidhjen e këtij
problemi me kompjuter, gjë që vlen edhe për të gjithë algoritmet të cilat janë
dhënë në pjesën vijuese të librit. Gjatë ekzekutimit të këtij algoritmi, nëse për
variablën x merret vlera 4.7, do të kalohet nëpër hapat: 1, 2, 3, 6, 7 dhe 8.
    Tek algoritmet e përbëra paraqitja e detajizuar e hapave të veçantë të
algoritmit e komplikon shumë dhe e bën të paqartë strukturën logjike të
algoritmit. Prandaj, si zgjidhje imponohet nevoja e paraqitjes së algoritmit në disa
hapa të përgjithësuar, përkatësisht të përpilimit të algoritmit të përgjithësuar. Pastaj,
për çdo hap të veçantë, mund të përpilohet edhe algoritmi i detajizuar.


Paraqitja grafike
    Gjatë paraqitjes analitike të algoritmeve, nëse kemi të bëjmë edhe me
algoritme relativisht të komplikuara, vështirë se mund të ndiqet rrjedhja e
procesit llogaritës. Në praktikë, algoritmet paraqiten përmes skemave grafike, për
vizatimin e të cilave përdoren disa figura gjeometrike, përkatësisht blloqe të formave të
ndryshme.
    Forma gjeometrike e blloqeve që shfrytëzohen gjatë përpilimit të skemave
grafike e tregon edhe natyrën e operacioneve që kryhen brenda tyre. Disa nga
Paraqitja e algoritmeve 5

blloqet elementare që përdoren gjatë vizatimit të skemave grafike janë dhënë në
Fig.1.4.


     Blloku          Përdorimi


     Fillimi         Tregon fillimin e algoritmit

                     Lexohen vlerat e variablave të shënuara
                     në bllok

                     Shtypen vlerat e variablave të shënuara
                     në bllok

                     Kryhen veprimet ose llogaritjet, duke
                     shfrytëzuar shprehjet e shënuara në bllok


                     Përcaktohet degëzimi i veprimeve të
       ose           mëtejme, duke pasur parasysh kushtet e
                     shënuara në bllok



      Fundi          Tregon fundin e algoritmit


                             Fig.1.4 Blloqet elementare
    Me leximin e vlerave të variablave të shënuara në bllok nënkuptohet marrja e
vlerave përkatëse përmes njësisë hyrëse dhe vendosja e tyre në kujtesën e
kompjuterit. Kurse përmes shtypjes vlerat e variablave merren nga kujtesa e
kompjuterit dhe shtypen në njësinë dalëse të tij.
    Skemat grafike të vizatuara duke shfrytëzuar blloqe të formave të ndryshme,
shpesh quhen edhe bllok-diagrame, siç do të quhen edhe në pjesën vijuese të librit.

    Shembull      Algoritmi për llogaritjen e sipërfaqes s dhe perimetrit p të
                  katërkëndëshit kënddrejtë, me brinjët a dhe b.
6 Algoritmet

a. Forma analitike

1.    Fillimi.
2.    Merri vlerat e brinjëve: a, b
3.    s=a⋅b
4.    p=2⋅(a+b)
5.    Shtypi vlerat e llogaritura: s, p
6.    Fundi.
                                         Fig.1.5
b. Forma grafike
                                      Fillimi           1

                                         a,b            2

                                        s=a⋅b           3

                                     p=2⋅(a+b)          4

                                         s,p            5

                                        Fundi           6

                                         Fig.1.6

     Shembull        Bllok-diagrami i algoritmit për kalimin e rrugëkryqit, i cili u
                     dha në formë analitike në Fig.1.2.
Paraqitja e algoritmeve 7


                          Fillimi       1
                                                                                      8
                                             Jo                              Duhet
             2         A ka semafor
                                                                             pritur
                              Po
             3                                 Jo
                    A punon semafori                    Shiko majtas
                                                                             6
                                 Po                      e djathtas
    Duhet             5
    pritur                                        7                              Po
                                                        A ka automjete
                   A është paraqitur                             Jo
                                                    4
        Jo          drita e gjelbër
                           Po
           Kalo rrugën në vendkalim                     9

                            Fundi       10

                 Fig.1.7 Bllok-diagrami i algoritmit për kalimin e rrugëkryqit
    Nga shembujt e dhënë shihet se paraqitja e algoritmeve përmes bllok-
diagrameve jep një dukshmëri shumë më të madhe të veprimeve që kryhen
brenda blloqeve, si dhe në krejt algoritmin.


Testimi i algoritmeve
    Me qëllim të kontrollimit të saktësisë së funksionimit të algoritmeve që
përpilohen, duhet të bëhet testimi i tyre, duke marrë vetëm vlerat me të cilat
përfshihen të gjitha rastet e mundshme të shfrytëzimit të tyre. Në këtë mënyrë,
me punë minimale vërtetohet sjellja reale e algoritmeve para përdorimit praktik
të tyre.

    Shembull          Testimi i algoritmit numerik të dhënë në Fig.1.3, duke e
                      përpiluar fillimisht bllok-diagramin përkatës.
8 Algoritmet

a. Bllok-diagrami
                                      Fillimi           1

                                           x            2

                                <                       >      3
                                       x < 0.9
                                         -
                                         >
                                               =
                        y=x2      4      y=2x      5        y=x-3   6


                                           y       7

                                        Fundi      8

                                        Fig.1.8
  Me qëllim që testimi i bllok-diagramit të rrjedhë me një procedurë standarde,
mund të shfrytëzohet një tabelë për testim, p.sh., si ajo që është dhënë në Fig.1.9.

b. Testimi - për x=4.7

                                         Vlerat numerike
Hapi     Blloku         Urdhri                                           Rezultati
                                              merren
                                                                        Fillimi i
  1            1     Fillimi                        -
                                                                        algoritmit
  2            2     Lexo: x    Prej njësisë hyrëse                     x=4.7
  3            3     Pyet:x≤0.9 x → 2                                   >
  4            6     y=x-3      x → 2                                   y=4.7-3=1.7
                                                                        Shtypet
  5            7     Shtyp: y         y → 3                             numri 1.7
                                                                        Fundi i
  6            8     Fundi                          -
                                                                        algoritmit

                                        Fig.1.9
    Në tabelë, me shkurtesat x→2 dhe y→3 duhet nënkuptuar se vlera
numerike e variablës x merret nga hapi i 2, kurse ajo e variablës y - nga hapi i 3.
    Gjithnjë, mes Fillimit dhe Fundit të algoritmit, gjegjësisht bllok-diagramit,
ekziston një rrugë e mbyllur, e cila, varësisht nga vlerat hyrëse, kalon nëpër pjesë të
ndryshme të bllok-diagramit, ose një numër të ndryshëm herësh në pjesë të
caktuara të tij.
Paraqitja e algoritmeve 9

c. Rruga - për x=4.7


                                                   1

                                                   2

                                                         3


                              4                5                6

                                               7

                                               8

                                   Fig.1.10
     Testimi i algoritmit do të jetë komplet vetëm nëse, duke kaluar nëpër të
gjitha rrugët e mundshme, vërtetohet funksionimi i saktë i tij.
     Algoritmet nëpër blloqet e bllok-diagramit përkatës të të cilëve mund të
kalohet vetëm njëherë, p.sh. si ai që është dhënë në Fig.1.6, quhen algoritme
lineare. Kurse, algoritmet te bllok-diagramet e të cilëve paraqiten më shumë degë,
p.sh. ashtu siç është ai i dhënë në Fig.1.8, quhen algoritme të degëzuara.


Përcjellja në kompjuter
    Përkthimi i algoritmeve në një formë të kuptueshme për kompjuterin bëhet
duke i shkruar programet përkatëse në një gjuhë programuese. Meqë aktualisht njëra ndër
gjuhët programuese më të popullarizuara është gjuha C, përkatësisht versioni i saj
C++, në pjesën vijuese të librit, përveç paraqitjeve grafike të algoritmeve, do të
jepen edhe programet përkatëse në këtë gjuhë.

    Shembull       Programi i cili është shkruar në bazë të bllok-diagramit të
                   dhënë në Fig.1.8.
10 Algoritmet

// Programi Prg1_8
#include <iostream>
using namespace std;
int main()
{
      double x,y;
      cout << "Vlera e variablës x=";
      cin >> x;
      if (x < 0.9)
         y=x*x;
      else
         if (x == 0.9)
            y=2*x;
         else
            y=x-3;
      cout << "Rezultati y="
           << y
           << "n";
      return 0;
}

    Gjatë ekzekutimit të programit, nëse pas mesazhit:

Vlera e variablës x=

përmes tastierës kompjuterit i jepet vlera 4.7, në ekran do të shtypet vlera e
variablës y, kështu:

Rezultati y=1.7

gjë që i përgjigjet vlerës së fituar në tabelën e Fig.1.9.
Shumat e zakonshme 12
Shumat e çfarëdoshme 20
12 Algoritmet




     Gjatë zgjidhjeve të problemeve të ndryshme, shpesh herë nevojitet të
mblidhen anëtarët e një serie numrash. Në matematikë kjo mbledhje realizohet
duke shtuar një nga një anëtarët e serisë, gjë që mund të shfrytëzohet edhe gjatë
zgjidhjes së këtij problemi me kompjuter. Për shtimin automatik të anëtarëve të
serisë, në algoritëm duhet të shfrytëzohet një unazë e mbyllur, para së cilës vlera
fillestare e shumës merret zero.


Shumat e zakonshme
     Si raste më të thjeshta të llogaritjes së shumave merren mbledhjet e numrave
natyrorë, katrorëve ose kubeve të këtyre numrave, numrave natyrorë tek ose çift
etj.

    Shembull       Shuma e numrave natyrorë mes 3 dhe n, nëse është dhënë
                   vlera e variablës n.


                               n
    s = 3 + 4 + ... + n =     ∑i
                              i=3
Llogaritja e shumës 13

a. Bllok-diagrami                                b. Rruga - për n=5

                    Fillimi       1                                        1

                       n          2                                        2

                     s=0          3                                        3

                     i=3          4                                        4


                    s=s+i         5                                        5

                    i=i+1         6                                        6

               Po
                    i ≤ n         7                                        7
                        Jo
                      s           8                                        8

                    Fundi         9                                        9

                    Fig.2.1                                  Fig.2.2
    Në bllok-diagram është shfrytëzuar shprehja i=i+1, gjë që është e
palogjikshme në matematikë. Por, këtu me shprehjen e barazimit kompjuterit i
urdhërohet:

        Llogarite vlerën numerike të shprehjes në anën e
        djathtë dhe jepja variablës në anën e majtë të
        barazimit!

     Nga kjo shihet se me shprehjen i=i+1 së pari variabla i rritet për 1 dhe
pastaj rezultati i fituar ruhet përsëri te kjo variabël, përkatësisht me shprehjen e
dhënë kompjuteri e nënkupton rritjen për 1 të vlerës së variablës i.
     Algoritmet, si ai që është dhënë përmes bllok-diagramit në Fig.2.1, te të cilët
pjesë të caktuara të tyre përsëriten brenda një unaze të mbyllur, quhen algoritme
ciklike. Përfundimi i cikleve të përsëritjes së unazës, përcaktohet me kushtin për
dalje nga unaza, i cili në shembullin konkret, lidhet me raportin e vlerave të
variablave i dhe n. Kështu, në momentin kur plotësohet kushti i>n, përsëritja e
ekzekutimit të unazës ndërpritet, përkatësisht dilet nga unaza.
14 Algoritmet

c. Testimi - për n=5

                                    Vlerat numerike
Hapi     Blloku        Urdhëri                                     Rezultati
                                         merren
                                                             Fillimi i
  1          1         Fillimi                  -
                                                             algoritmit
                                   prej njësisë
  2          2         Lexo: n                               n=5
                                   hyrëse
  3          3         s=0                 -                 s=0
  4          4         i=3                 -                 i=3
  5          5         s=s+i       s → 3, i → 4              s=0+3=3
  6          6         i=i+1       i → 4                     i=3+1=4
  7          7         Pyet:i≤n    i → 6, n → 2              Po
  8          5         s=s+i       s → 5, i → 6              s=3+4=7
  9          6         i=i+1       i → 6                     i=4+1=5
 10          7         Pyet:i≤n    i → 9, n → 2              Po
 11          5         s=s+i       s → 8, i → 9              s=7+5=12
 12          6         i=i+1       i → 9                     i=5+1=6
 13          7         Pyet:i≤n    i → 12, n → 2             Jo
                                                             Shtypet numri
 14          8         Shtyp:s     s → 11                    12
                                                             Fundi i
 15          9         Fundi                    -
                                                             algoritmit
                                      Fig.2.3
    Vlera numerike e një variable, e cila nevojitet në një hap të caktuar, merret në
hapin ku ajo variabël takohet së pari, nëse kthehemi pas në rrugën e kaluar.
Kështu, p.sh., në tabelën e Fig.2.3, vlerat e variablave s dhe i në hapin e 11 janë
marrë nga hapat 8 e 9, sepse, nëse prej hapit të 11 kthehemi pas, në kolonën e
fundit të tabelës, variabla i së pari takohet në hapin e 9, kurse variabla s - në
hapin e 8. Shigjeta → e cila përdoret për të treguar se në cilin hap merren vlerat
e nevojshme numerike, duhet të lexohet prej hapit.
    Gjatë testimit në tabelën e mësipërme, shtimi i anëtarëve të serisë së numrave
natyrorë, në hapat e veçantë rrjedh ashtu siç është treguar në Fig.2.4.
Llogaritja e shumës 15


                                      Vlera fillestare(3)
                          s = 0 + 3 + 4 + 5

                                  5
                                       8
                                           11

                                       Fig.2.4
d. Programi

// Programi Prg2_1
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double s;
  cout << "Vlera e variablës n=";
  cin >> n;
  s=0;
  i=3;
  do
  {
     s=s+i;
     i=i+1;
  }
  while (i<=n);
  cout << "Shuma e numrave natyrorë s="
        << s
        << "n";
  return 0;
}

    Nëse programi ekzekutohet për n=5, rezultati që shtypet në ekran është:

Shuma e numrave natyrorë s=12

gjë që përputhet me rezultatin i cili është fituar gjatë testimit përmes tabelës në
Fig.2.3.
    Anëtarët e vargut mund të jenë numra me një ligjshmëri të caktuar,
përkatësisht nuk do të thotë se mes vete duhet të dallohen për vlerën 1. Për
gjetjen e shumës së anëtarëve të vargjeve të tilla shfrytëzohen algoritme të
16 Algoritmet

ngjashme me ato që u dhanë më sipër, duke pasur kujdes vetëm në ligjshmërinë e
gjenerimit të anëtarëve të vargut.

    Shembull         Shuma e kubeve të numrave natyrorë çiftë mes 2 dhe n, nëse
                     është dhënë vlera e variablës n.


                                 n
    s = 23 + 43 + ... =          ∑ i3
                                 i=2
                               (çift)


a. Bllok-diagrami                        b. Rruga - për n=9


                     Fillimi

                        n

                       s=0

                       i=2


                      s=s+i3

                      i=i+2

                Po
                      i ≤ n
                          Jo
                        s
                      Fundi

                     Fig.2.5                            Fig.2.6
   Rezultati që fitohet gjatë rrugës së kaluar është:

             vlera fillestare
     s = 0 + 23 + 43 + 63 + 83 = 800
Llogaritja e shumës 17

c. Programi

// Programi Prg2_5
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double s;
  cout << "Vlera e variablës n=";
  cin >> n;
  s=0;
  i=2;
  do
  {
     s=s+i*i*i;
     i=i+2;
  }
  while (i<=n);
  cout << "Shuma s="
        << s
        << "n";
  return 0;
}

    Pas ekzekutimit të programit të dhënë për n=9, si rezultat në ekran do të
shtypet:

Shuma s=800

ashtu siç u tregua më sipër.


    Detyra        Të llogaritet shuma:

                  a.   e numrave natyrorë çiftë mes 2 dhe n;
                  b.   e numrave natyrorë tekë mes 1 dhe n;
                  c.   e katrorëve të numrave natyrorë mes 4 dhe n;
                  d.   e rrënjëve katrore të numrave natyrorë tekë mes 3
                        dhe n,

                  nëse dihet vlera e variablës n.
18 Algoritmet

     Shprehjet e shumave përkatëse do të duken:

a.

                                    n
     s = 2 + 4 + 6 + ... =         ∑i
                                   i=2
                                 (çift)
b.

                           n
     s = 1 + 3 + 5 + ... = ∑ i
                         i=1
                        (tek)
c.

                                           n
     s = 42 + 52 + 62 + ... + n2 =        ∑ i2
                                          i =4
d.

                                   n
     s = 3 + 5 + 7 + ... = ∑ i
                                   i =3
                                 (tek)


   Anëtarët e serive mund të formohen edhe duke shfrytëzuar ligjshmëri më
komplekse të raporteve të numrave natyrorë.

     Shembull       Shuma e prodhimit të numrave natyrorë tekë e çiftë - të
                    njëpasnjëshëm, mes vlerave 1 dhe n, nëse dihet vlera e
                    variablës n.


                                               n
     s = 1 ⋅ 2 + 3 ⋅ 4 + 5 ⋅ 6 + ... =         ∑ i ⋅ (i + 1)
                                            i =1
                                          (tek)
Llogaritja e shumës 19

a. Bllok-diagrami                                 b. Rruga - për n=8

                    Fillimi

                        n

                      s=0

                      i=1


                s=s+i⋅(i+1)

                     i=i+2

               Po
                     i ≤ n
                        Jo
                        s

                     Fundi

                     Fig.2.7                          Fig.2.8
   Shuma që fitohet gjatë rrugës së kaluar, për n=8 është:

    s = 1 ⋅ 2 + 3 ⋅ 4 + 5 ⋅ 6 + 7 ⋅ 8 = 100

    Detyra          Të llogaritet shuma:

                    a. e pjesëtimit të numrave natyrorë tekë me katrorët e
                    numrave natyrorë çiftë - të njëpasnjëshëm, mes vlerave 1 dhe
                    n;
                    b. e katrorëve të numrave natyrorë tekë dhe e kubeve të
                    numrave natyrorë çiftë - të njëpasnjëshëm, mes vlerave 1 dhe
                    n,

                    nëse dihet vlera e variablës n.
20 Algoritmet

     Shprehjet e shumave të kërkuara duken:

a.

          1       3       5
     s=       +       +        + ...
          2       2
          2       4       62
b.

     s = 12 + 23 + 32 + 43 + ...



Shumat e çfarëdoshme
   Anëtarët e serive numerike mund të formohen si shprehje të çfarëdoshme
matematikore. Procedurat e gjetjes së shumave të tyre nuk do të ndryshojnë
aspak nga ato që u dhanë më sipër.

     Shembull             Llogaritja e vlerës së shumës:

                                        n +1               2
                                            ⎧     x⎫
                                s =      ∑ ⎨ 2i +  ⎬
                                        i=2 ⎩     3⎭
                                       (i ≠ 4)


                          nëse dihen vlerat e variablave n dhe x.
Llogaritja e shumës 21

a. Bllok-diagrami                       b. Rruga - për x=1 dhe n=5

              Fillimi

                x,n

                s=0

                i=2

                            Jo
               i ≠ 4
                       Po
                            2
                ⎧         x⎫
        s = s + ⎨2i +       ⎬
                ⎩         3⎭


               i=i+1

       Po
              i≤(n+1)
                   Jo
                 s

               Fundi

               Fig.2.9                                   Fig.2.10
   Vlera e shumës, që fitohet gjatë rrugës së kaluar në Fig.2.10, është:

                      2           2              2              2
        ⎧       1⎫ ⎧         1⎫ ⎧         1⎫ ⎧         1⎫
    s = ⎨2 ⋅ 2 + ⎬ + ⎨2 ⋅ 3 + ⎬ + ⎨2 ⋅ 5 + ⎬ + ⎨2 ⋅ 6 + ⎬ = 317.778
        ⎩       3⎭ ⎩         3⎭ ⎩         3⎭ ⎩         3⎭

c. Programi

// Programi Prg2_9
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int n,i;
  double x,s;
22 Algoritmet

    cout << "Vlerat hyrëse x dhe n: ";
    cin >> x
         >> n;
    s=0;
    i=2;
    do
    {
       if (i!=4)
          s=s+pow(2*i+x/3,2);
       i=i+1;
    }
    while (i<=n+1);
    cout << "Shuma s="
          << s
          << "n";
    return 0;
}

    Nëse programi ekzekutohet për vlerat hyrëse x=1 dhe n=5, si rezultat do të
shtypet:

Shuma s=317.778

ashtu siç u fitua edhe gjatë llogaritjes me dorë.

   Nga krejt kjo që u dha më sipër, si përfundim mund të nxirret se në rastin e
përgjithshëm, gjatë llogaritjes së shumës, shprehja për llogaritjen e shumës
brenda unazës së mbyllur shkruhet:


          s=s+(shprehja nën simbolin e shumës)


    Detyra         Të llogariten shumat:

                   a.
                              n +1
                        y = ∑ {x + 2k − 1}3 2
                              k =1
                   b.
                                           2
                               2n
                                 ⎧      i⎫
                        z =    ∑ ⎨i +    ⎬
                               i=2 ⎩    3⎭
                              (çift)
Llogaritja e shumës 23

                     c.
                                   n +2                j3
                                              ⎧ 1 ⎫
                           g =      ∑         ⎨        ⎬
                                   j= 1       ⎩ 2j + 3 ⎭
                                 (j≠ 3, , )
                                       45


                     nëse dihen vlerat e variablave n dhe x.


    Gjatë vizatimit të bllok-diagrameve përkatës, duhet pasur parasyshë shprehjet
e zbërthyera të shumave të dhëna, të cilat duken:
a.

     y = {x + 2 ⋅ 1 − 1}3 2 + {x + 2 ⋅ 2 − 1}3 2 + ... + {x + 2 ⋅ (n + 1) − 1}3 2
b.

                 2                  2                            2
         ⎧   2⎫   ⎧   4⎫         ⎧     2n ⎫
     z = ⎨2 + ⎬ + ⎨4 + ⎬ + ... + ⎨2n +    ⎬
         ⎩   3⎭   ⎩   3⎭         ⎩      3⎭
c.

                          13                     23                  63
         ⎧    1    ⎫             ⎧    1    ⎫            ⎧    1    ⎫
     g = ⎨         ⎬           + ⎨         ⎬          + ⎨         ⎬       + ...
         ⎩2 ⋅ 1 + 3⎭             ⎩2 ⋅ 2 + 3⎭            ⎩2 ⋅ 6 + 3⎭


    Shumat mund të paraqiten edhe brenda shprehjeve të funksioneve të
ndyshme. Gjatë kësaj, së pari llogariten vlerat e shumave dhe pastaj, duke
shfrytëzuar këto vlera, llogariten edhe vlerat e funksioneve.


     Shembull        Llogaritja e vlerës së funksionit:

                                                            i3
                              x m+n−1 ⎧ 2⎫
                           y = + 2 ∑ ⎨x + ⎬
                              3    i=1 ⎩ i⎭

                     nëse dihen vlerat e variablave m, n dhe x.
24 Algoritmet

a. Bllok-diagrami                                       b. Rruga - për x=1, m=3, n=1

                    Fillimi
                                           m +n+1
                                                    ⎧     2⎫
                                                               i 3

                     x,m,n
                                      s=    ∑ ⎨x + ⎬
                                            i =1
                                                    ⎩     i⎭


                      s=0

                      i=1


                                i3
                         ⎧    2⎫
              s = s + ⎨x +        ⎬
                         ⎩    i⎭

                     i=i+1
              Po
                i≤(m+n-1)
                             Jo
                         x
                    y=     + 2⋅s
                         3
                         y

                     Fundi

                     Fig.2.11                                          Fig.2.12
    Për vlerat hyrëse që janë marrë si shembull gjatë vizatimit të rrugës në
Fig.2.12, vlera e llogaritur e funksionit është:

          1       ⎡⎧   2⎫
                         13
                              ⎧   2⎫
                                    23
                                         ⎧   2⎫ ⎤
                                               33
    y =     + 2 ⋅ ⎢⎨1 + ⎬   + ⎨1 + ⎬   + ⎨1 + ⎬ ⎥
          3       ⎢⎩
                  ⎣    1⎭     ⎩   2⎭     ⎩   3⎭ ⎥ ⎦

c. Programi

// Programi Prg2_11
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
Llogaritja e shumës 25

    int m,n,i;
    double x,s,y;
    cout << "Vlerat hyrëse x,m dhe n: ";
    cin >> x
         >> m
         >> n;
    s=0;
    i=1;
    do
    {
       s=s+pow(x+2./i,i/3.);
       i=i+1;
    }
    while (i<=m+n-1);
    y=x/3+2*s;
    cout << "Vlera e funksionit y="
          << y
          << "n";
    return 0;
}

    Nëse pas ekzekutimit të programit, si vlera hyrëse përmes tastierës
kompjuterit i jepen vlerat x=1, m=3 dhe n=1, rezultati që shtypet në ekran
është:

Vlera e funksionit y=9.72597

   Shuma mund të paraqitet edhe te funksionet të cilat përcaktohen përmes më
shumë shprehjeve.

    Shembull      Llogaritja e vlerës së funksionit:

                          ⎧      n +1
                                                       për x ≤ 4.55
                          ⎪2x + 3 ∑ {j + 2x}
                                            2
                          ⎪      j= 1
                      y = ⎨
                          ⎪
                          ⎪ 3x2 + 2x − 1               për x > 4.55
                          ⎩

                  nëse dihen vlerat e variablave n dhe x.
26 Algoritmet


a. Bllok-diagrami

                                        Fillimi

                                           n,x
                                   Po                Jo
                                         x≤4.55


                             s=0

                             j=1

   n +1
s = ∑ {j + 2x}
             2

   j=1
                       s=s+{j+2x}2

                           j=j+1
                     Po
                           j≤(n+1)
                                   Jo

                          y=2x+3⋅s                 y=3x2+2x-1


                                            y

                                         Fundi

                                        Fig.2.13
     Nga bllok-diagrami i dhënë në Fig.2.13 shihet se këtu përveç strukturës
algoritmike të degëzuar, në njërën degë të algoritmit paraqitet edhe strukturë
algoritmike ciklike. Për të qenë algoritmi më i saktë, vlera e variablës n do të duhej
të lexohet në degën e majtë të bllokut për degëzim.
Llogaritja e shumës 27

b. Rruga - për n=3 dhe x=3.5




                               Fig.2.14
c. Programi

// Programi Prg2_13
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int n,j;
  double x,y,s;
  cout << "Vlerat hyrëse n dhe x: ";
  cin >> n
       >> x;
  if (x<=4.55)
    {
      s=0;
28 Algoritmet

        j=1;
        do
        {
                s=s+pow(j+2*x,2);
                j=j+1;
        }
        while (j<=n+1);
        y=2*x+3*s;
      }
    else
      y=3*pow(x,2)+2*x-1;
    cout << "Vlera e funksionit y="
         << y
         << "n";
    return 0;
}

    Nëse programi i dhënë ekzekutohet për vlerat hyrëse n=3 dhe x=3.5, si
rezultat në ekran do të shtypet:

Vlera e funksionit y=1105

    Detyra         Të llogariten vlerat e funksioneve:
                   a.
                                       n +1
                                              {
                        y = ax2 − bx + 4 ∑ i2 + 2a    }x b
                                       i =3
                   b.
                              x        3x
                        z =     + n +3
                                   ∑ {m + 2i}a
                              a
                                   i=2
                                 (çift)
                   c.
                          ⎧ 2x2 + 3x − 4              për x + 2 > a + 1
                          ⎪
                          ⎪
                        g=⎨
                                  +
                                       {
                          ⎪x2 − 2n∑m 3k + k2
                          ⎪
                                                  }   për x + 2 ≤ a + 1
                          ⎩      k =2


                   nëse dihen vlerat e variablave a, b, m, n dhe x.

    Brenda shprehjes së një funksioni, njëkohësisht mund të paraqiten disa
shuma, të cilat duhet të llogariten para se kompjuterit t'i urdhërohet llogaritja e
vlerës së funksionit.
     Shembull      Llogaritja e vlerës së funksionit:
Llogaritja e shumës 29

                                                      m +2 i
                                         m
                                                          ⎛    ⎞
                                    + 3 ∑ (2i + b) − 4 ∑ ⎜ − b ⎟
                                  x
                            y =
                                  2    i =1           i=2 ⎝a   ⎠
                      nëse dihen m, a dhe b.
a. Bllok-diagrami                                  b. Rruga - për m=2, a=2, b=3, x=4
                Fillimi                        m
                                         d=    ∑ (2i + b )
                x,a,b,m                       i=1


                     d=0

                     i=1


               d=d+(2i+b)

                    i=i+1
           Po
                     i≤ m
                          Jo

                     e=0

                     i=2


                    ⎛i   ⎞
            e = e + ⎜ − b⎟
                    ⎝a   ⎠

                    i=i+1
          Po
                  i≤ m+2
                        Jo
                    x
             y=       + 3d - 4e                m+2
                                                  ⎛   i⎞
                    2                     e=    ∑ ⎜ − b⎟
                                               i = 2⎝        ⎠
                                                      a
                      y

                    Fundi
               Fig.2.15                                               Fig.2.16
   Vlera e funksionit, e cila llogaritet gjatë rrugës së kaluar më sipër, është:
30 Algoritmet


                                                ⎧⎛ 2  ⎞   ⎛3   ⎞   ⎛4   ⎞⎫
            + 3 {(2 ⋅ 1 + 3) + (2 ⋅ 2 + 3)} − 4 ⎨⎜ − 3⎟ + ⎜ − 3⎟ + ⎜ − 3⎟⎬
          4
    y =
          2                                     ⎩⎝2   ⎠   ⎝2   ⎠   ⎝2   ⎠⎭
c. Programi
// Programi Prg2_15
#include <iostream>
using namespace std;
int main()
{
  int m,i;
  double a,b,x,y,d,e;
  cout << "Vlerat hyrëse x,a,b dhe m: ";
  cin >> x
       >> a
       >> b
       >> m;
  d=0;
  i=1;
  do
  {
     d=d+(2*i+b);
     i=i+1;
  }
  while (i<=m);
         e=0;
         i=2;
         do
            {
                  e=e+(i/a-b);
                  i=i+1;
            }
         while (i<=m+2);
  y=x/3+3*d-4*e;
  cout << "Vlera e funksionit y="
        << y
        << "n";
  return 0;
}
    Nëse programi ekzekutohet për vlerat e variablave të cilat janë shfrytëzuar
gjatë testimit të bllok-diagramit, rezultati që shtypet në ekran është:
Vlera e funksionit y=55.3333
   Funksioni mund të ketë më shum vlera, nëse në shprehjen e shumës, e cila
merr pjesë në funksion, figurojnë parametra që ndryshojnë.
Llogaritja e shumës 31


    Shembull         Llogaritja e vlerës së funksionit:
                                      m +1
                         g = 2m − 3 ∑ (ki + b)
                                      i=2
                         për k = 1,2,..., m
                     nëse janë dhënë vlerat e variablave m dhe b.

a. Bllok-diagrami                                      b. Rruga - për m=2 dhe b=3.5

                    Fillimi

                      m,b

                      k=1             m +1
                                  s = ∑ (k ⋅ i + b )
                                      i=2

                      s=0

                      i=2


              s=s+(ki+b)

                     i=i+1
            Po
                    i≤(m+1)
                          Jo

                    g=2m-3s

                      k,g

                     k=k+1

            Po
                     k ≤m
                         Jo
                     Fundi

                    Fig.2.17                                            Fig.2.18

   Vlerat që llogariten gjatë rrugës së kaluar janë:
32 Algoritmet


    k = 1       g = 2 ⋅ 2 − 3 ⋅ {(1 ⋅ 2 + 3.5) + (1 ⋅ 3 + 3.5)}
    k = 2       g = 2⋅2 − 3⋅    {(2 ⋅   2 + 3.5) + (2 ⋅ 3 + 3.5)}

c. Programi

// Programi Prg2_17
#include <iostream>
using namespace std;
int main()
{
  int m,k,i;
  double b,s,g;
  cout << "Vlerat hyrëse b dhe m: ";
  cin >> b
      >> m;
  for (k=1;k<=m;k++)
  {
    s=0;
    for (i=2;i<=m+1;i++)
         s=s+(k*i+b);
    g=2*m-3*s;
    cout << "k="
          << k
          << "   g="
          << g
          << "n";
  }
  return 0;
}

    Për vlerat hyrëse m=2 dhe b=3.5, pas ekzekutimit të programit, si rezultat
në ekran shtypen dy vlera, kështu:

k=1      g=-32
k=2      g=-47

sepse komanda cout, e cila gjendet brenda unazës së variablës k, ekzekutohet
vetëm dy herë, gjë që shihet edhe gjatë testimit të bllok-diagramit në Fig.2.18.
Prodhimet e zakonshme 34
Prodhimet e çfarëdoshme 37
34 Algoritmet




    Prodhimi i anëtarëve të një serie numerike gjendet ngjajshëm si edhe shuma e
tyre. Por, për dallim nga shuma, gjatë llogaritjes së prodhimit vlera fillestare
merret 1, kurse brenda unazës së mbyllur në rast të përgjithshëm shkruhet:


         p=p⋅(shprehja nën simbolin e prodhimit)




Prodhimet e zakonshme
   Prodhimet elementare të cilat takohen në praktikë janë ato të llogaritjes së
prodhimit të numrave natyrorë, katrorëve ose kubeve të tyre, prodhimit të
numrave natyrorë tekë ose çiftë etj.

    Shembull      Prodhimi i numrave natyrorë mes 2 dhe n, nëse është dhënë
                  vlera e variablës n.


                                    n
    p = 2 ⋅ 3 ⋅ 4 ⋅ 5 ⋅ ... ⋅ n =   ∏i
                                    i=2
Llogaritja e prodhimit 35

a. Bllok-diagrami                         b. Rruga - për n=3
                    Fillimi       1                                       1

                       n          2                                       2

                      p=1         3                                       3

                      i=2         4                                       4


                     p=p⋅i        5                                       5

                    i=i+1         6                                       6

             Po
                    i ≤ n         7                                       7
                        Jo
                      p           8                                       8

                    Fundi         9                                       9

                     Fig.3.1                             Fig.3.2
c. Testimi - për n=3
                                      Vlerat numerike
Hapi     Blloku        Urdhëri                                       Rezultati
                                           merren
                                                               Fillimi i
  1          1         Fillimi                    -
                                                               algoritmit
                                      prej njësisë
  2          2         Lexo: n                                 n=3
                                      hyrëse
   3         3         p=1                    -                p=1
   4         4         i=2                    -                i=2
   5         5         p=p ⋅i         p → 3, i → 4             p=1 ⋅2=2
   6         6         i=i+1          i → 4                    i=2+1=3
   7         7         Pyet:i≤n       i → 6, n → 2             Po
   8         5         p=p ⋅i         p → 5, i → 6             p=2 ⋅3=6
   9         6         i=i+1          i → 6                    i=3+1=4
  10         7         Pyet:i≤n       i → 9, n → 2             Jo
  11         8         Shtyp:p        p → 8                    Shtypet numri 6
                                                               Fundi i
  12         9         Fundi                      -
                                                               algoritmit

                                        Fig.3.3
36 Algoritmet

    Llogaritja e vlerës së prodhimit, në hapat e veçantë të testimit, rrjedh kështu:


                                           Vlera fillestare(3)
                               p = 1 ⋅ 2 ⋅ 3

                                       5
                                            8

                                        Fig.3.4
d. Programi

// Programi Prg3_1
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double p;
  cout << "Vlera e variablës n=";
  cin >> n;
  p=1;
  i=2;
  do
  {
     p=p*i;
     i=i+1;
  }
  while (i<=n);
  cout << "Prodhimi p="
        << p
        << "n";
  return 0;
}

    Nëse gjatë ekzekutimit të programit, përmes tastierës kompjuterit i jepet
vlera n=3, rezultati që shtypet në ekran është:

Prodhimi p=6

gjë që fitohet edhe gjatë testimit të algoritmit, ashtu siç është treguar në Fig.3.4.
Llogaritja e prodhimit 37

     Detyra               Të llogaritet prodhimi:

                          a. i numrave natyrorë çiftë mes 4 dhe n;
                          b. i katrorëve të numrave natyrorë tekë mes 3 dhe n;
                          c. i shumës së numrave natyrorë tekë e çiftë - të
                          njëpasnjëshëm mes 1 dhe n;
                          d. i katrorëve të numrave natyrorë tekë dhe i kubeve të
                          numrave natyrorë çiftë - të njëpasnjëshëm mes 1 dhe n,

                          nëse dihet vlera e variablës n.



     Shprehjet e prodhimeve të kërkuara duken kështu:

a.
     p = 4 ⋅ 6 ⋅ 8 ⋅...
b.
     p = 32 ⋅ 52 ⋅ 72 ⋅ ...
c.
     p =(1 + 2)⋅(3 + 4)⋅(5 + 6)⋅...
d.
     p = 12 ⋅ 23 ⋅ 32 ⋅ 43 ⋅ ...


Prodhimet e çfarëdoshme
    Procedura që zbatohet gjatë llogaritjes së prodhimit të anëtarëve të serive të
çfarëdoshme, është e ngjashme me ate që përdoret për llogaritjen e shumës së
serive përkatëse.

     Shembull             Llogaritja e vlerës numerike të shprehjes:

                                        m +1
                                          ⎛         2⎞
                          g = 3x + 4    ∏ ⎜i +       ⎟
                                       i=2 ⎝        x⎠
                                      (çift)


                          nëse janë dhënë vlerat e variablave m dhe x.




a. Bllok-diagrami                                        b. Rruga - për m=8 dhe x=1.5
38 Algoritmet


         Fillimi

              x,m

              p=1

              i=2


               ⎛   2⎞
       p = p ⋅ ⎜i + ⎟
               ⎝   x⎠

          i=i+2

  Po
         i≤(m+1)
                  Jo
         g=3x+4p

              g

          Fundi

          Fig.3.5                                      Fig.3.6
   Vlera që llogaritet gjatë rrugës së kaluar është:

                      ⎧⎛      2 ⎞ ⎛        2 ⎞ ⎛        2 ⎞ ⎛        2 ⎞⎫
    g = 3 ⋅ 1.5 + 4 ⋅ ⎨⎜ 2 +     ⎟ ⋅ ⎜4 +     ⎟ ⋅ ⎜6 +     ⎟ ⋅ ⎜8 +     ⎟⎬
                      ⎩⎝     1.5 ⎠ ⎝      1.5 ⎠ ⎝      1.5 ⎠ ⎝      1.5 ⎠⎭

c. Programi

// Programi Prg3_5
#include <iostream>
using namespace std;
int main()
{
  int m,i;
  double x,p,g;
  cout << "Vlerat hyrëse x dhe m: ";
  cin >> x
      >> m;
Llogaritja e prodhimit 39

    p=1;
    i=2;
    do
    {
       p=p*(i+2/x);
       i=i+2;
    }
    while (i<=m+1);
    g=3*x+4*p;
    cout << "Vlera e funksionit g="
          << g
          << "n";
    return 0;
}

    Për vlerat hyrëse x=1.5 dhe m=8, rezultati që shtypet në ekran është:

Vlera e funksionit g=4871.66

   Prodhimi, njëlloj si edhe shuma, mund të paraqitet brenda shprehjeve te
funksioneve të cilat përcaktohen me më shumë shprehje.

    Shembull        Llogaritja e vlerës numerike të funksionit:

                          ⎧ 2x + 3n − 1            për x > n + 2
                          ⎪
                          ⎪
                          ⎪ x − 2n +2⎛ k 2 + x ⎞
                          ⎪       ∏⎜           ⎟   për x < n + 2
                        d=⎨      k=1⎝        3⎠
                          ⎪
                          ⎪ 2x
                          ⎪e + 3                   për x = n + 2
                          ⎪
                          ⎩

                    nëse janë dhënë vlerat e variablave n dhe x.




a. Bllok-diagrami
40 Algoritmet



                                      Fillimi

                                          n,x

                               <          < (n+2)    >
                                     x    -
                                          >
                                                =
                  p=1

                  k=1


                    ⎛     x⎞
            p = p ⋅ ⎜ k2 + ⎟
                    ⎝     3⎠

                k=k+1
          Po
                k≤(n+2)
                        Jo
                d=x-2p                d=e2x+3              d=2x+3n-1


                                            d

                                         Fundi

                                         Fig.3.7
        Versioni më i saktë i bllok-diagramit mund të vizatohet duke e vendosur
bllokun për leximin e variablës n në degën e majtë të degëzimit që është
vendosur në fillim të tij, sepse variabla në fjalë shfrytëzohet vetëm në këtë pjesë.




b. Rruga - për n=2 dhe x=3
Llogaritja e prodhimit 41




                            Fig.3.8
c. Programi

// Programi Prg3_7
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int n,k;
  double x,p,d;
  cout << "Vlerat hyrëse n dhe x: ";
  cin >> n
      >> x;
  if (x<(n+2))
    {
42 Algoritmet

        p=1;
        for (k=1;k<=n+2;k++)
             p=p*(k*k+x/3);
        d=x-2*p;
      }
    else
      if (x==n+2)
         d=exp(2*x)+3;
      else
         d=2*x+3*n-1;
    cout << "Rezultati d="
         << d
         << "n";
    return 0;
}

    Nëse programi i dhënë ekzekutohet për vlerat hyrëse n=2 dhe x=3, në ekran
do të shtypet:

Rezultati d=-3397

   Brenda shprehjes së një funksioni mund të paraqiten edhe më shumë
prodhime të anëtarëve të serive, të cilat duhet të llogariten para se prej
kompjuterit të kërkohet llogaritja e vlerës së vetë funksionit.

    Shembull      Llogaritja e vlerës së funksionit:

                                  m +1            m +n
                      z = 3a + 2 ∏ (2i + a) −      ∏ (i + b)
                                  i =1             i=2
                                                 (çift)


                  nëse janë dhënë vlerat e variablave m, n, a dhe b.
Llogaritja e prodhimit 43

a. Bllok-diagrami                 b. Rruga - për m=2, n=7, a=3 dhe b=1

                     Fillimi

                     m,n,a,b

                       e=1

                       i=1


                    e=e⋅(2i+a)

                      i=i+1
               Po
                     i≤(m+1)
                            Jo
                       f=1

                       i=2


                    f=f⋅(i+b)

                      i=i+2

             Po
                     i≤(m+n)
                             Jo
                    z=3x+2e-f

                        z

                      Fundi

                       Fig.3.9                           Fig. 3.10
44 Algoritmet

    Vlera e funksionit, e cila llogaritet gjatë rrugës së kaluar në Fig.3.10, është:

              z = 3 ⋅ 3 + 2 ⋅ {(2 ⋅ 1 + 3) ⋅ (2 ⋅ 2 + 3) ⋅ (2 ⋅ 3 + 3)}
                                                 e
                           − {(2 + 1) ⋅ (4 + 1) ⋅ (6 + 1) ⋅ (8 + 1)}
                                                f
c. Programi

// Programi Prg3_9
#include <iostream>
using namespace std;
int main()
{
  int m,n,i;
  double a,b,e,f,z;
  cout << "Vlerat hyrëse m,n,a dhe b: ";
  cin >> m
       >> n
       >> a
       >> b;
  e=1;
  for (i=1;i<=m+1;i++)
       e=e*(2*i+a);
  f=1;
  i=2;
  do
  {
     f=f*(i+b);
     i=i+2;
  }
  while (i<=m+n);
  z=3*a+2*e-f;
  cout << "Vlera e funksionit z="
        << z
        << "n";
  return 0;
}

    Nëse programi ekzekutohet për vlerat e variablave hyrëse, të cilat janë
shfrytëzuar gjatë vizatimit të rrugës së kaluar, si rezultat në ekran shtypet:

Vlera e funksionit z=-306

    Detyra             Të llogariten vlerat e funksioneve:
Llogaritja e prodhimit 45

a.

                m+n
             + 2 ∏ {k + 3x}a 2
           x
     y =
           2    k =1
                  (k ≠ 3)


b.

            m
     g = 3 ∏ {x + 2j}2 −
                                   1
                             n
           j= 2
                            ∏ (k + 1)
                            k =2


c.
       ⎧ n
       ⎪ ∏(i + 3)        për x 2 + 1 ≤ 7
       ⎪ i=2
       ⎪ çift)
        (
     t=⎨
       ⎪
               m +2
       ⎪x
       ⎪ 2 − 4 ∏(2i + 1) për x + 1 > 7
                              2
       ⎩       i=1


nëse janë dhënë vlerat e variablave m, n dhe x.
Algoritmet C++
48 Algoritmet




    Brenda shprehjeve të funksioneve mund të paraqiten njëkohësisht shuma dhe
prodhime të anëtarëve të serive. Në këto raste, llogaritja rrjedh plotësisht njëlloj
si edhe kur në shprehje paraqiten disa shuma ose disa prodhime.

    Shembull         Llogaritja e vlerës numerike të shprehjes:

                                 x    m+n             n
                           y =     + 3 ∑ (2i + n) − 2 ∏ (k + x)
                                 2    i =1           k =2
                                     (tek)


                     nëse janë dhënë vlerat e variablave m, n dhe x.



a. Bllok-diagrami                            b. Rruga - për m=2, n=3 dhe x=1

                    Fillimi

                     m,n,x

                      s=0

                      i=1


                s=s+(2i+n)

                     i=i+2
             Po
                    i≤(m+n)
                           Jo
                       A                                          B
Shuma dhe prodhimi 49


                          A                                       B


                         p=1

                         k=2


                    p=p⋅(k+x)

                        k=k+1

              Po
                        k ≤n
                               Jo
                        x
                   y=     + 3s − 2p
                        2

                          y

                        Fundi

                         Fig.4.1                             Fig.4.2
   Vlera që llogaritet gjatë rrugës së kaluar në Fig.4.2 është:

            + 3 ⋅ { 2 ⋅ 1 + 3) + (2 ⋅ 3 + 3) + (2 ⋅ 5 + 3)
                                                         }
          1
    y =           (
          2
            − 2 ⋅ { 2 + 1) ⋅ (3 + 1)
                  (                 }

c. Programi

// Programi Prg4_1
#include <iostream>
using namespace std;
int main()
{
  int m,n,i,k;
  double s,p,x,y;
  cout << "Vlerat hyrëse m,n dhe x: ";
  cin >> m
       >> n
       >> x;
  s=0;
50 Algoritmet

    i=1;
    do
    {
       s=s+(2*i+n);
       i=i+2;
    }
    while (i<=m+n);

    p=1;
    for (k=2;k<=n;k++)
      p=p*(k+x);

    y=x/2+3*s-2*p;
    cout << "Vlera e funksionit y="
         << y
         << "n";
    return 0;
}

    Pas ekzekutimit të programit të dhënë, për vlerat e shfrytëzuara gjatë
vizatimit të rrugës së kaluar në Fig.4.2, rezultati që shtypet në ekran është:

Vlera e funksionit y=57.5

   Shuma dhe prodhimi mund të paraqiten njëkohësisht edhe në rastet kur
funksionet përcaktohen me më shumë shprehje.

    Shembull       Llogaritja e vlerës numerike të funksionit:

                         ⎧       n +1
                         ⎪ 2x − 3 ∑(i + x)         për x + 1 < 4.5
                         ⎪       i=2
                         ⎪
                         ⎪ 2
                         ⎪4x + 3x + 1               për x + 1 = 4.5
                       g=⎨
                         ⎪
                         ⎪x      m ⎛     x⎞
                         ⎪ + 4 ∏ ⎜k + ⎟             për x + 1 > 4.5
                         ⎪2     k=1 ⎝    3⎠
                         ⎪     (k≠3)
                         ⎩

                   nëse janë dhënë vlerat e variablave m, n dhe x.
Shuma dhe prodhimi 51

a. Bllok-diagrami


                                   Fillimi

                                     m,n,x

                           <                         >
                                   x+1 < 4.5
                                       -
                                       >

            s=0                             =                       p=1

            i=2                                                     k=1
                                                                               Po
                                                                 k = 3
        s=s+(i+x)
                                                                      Jo
                                                                    ⎛   x⎞
           i=i+1                                              p = p⋅⎜k + ⎟
                                                                    ⎝   3⎠
   Po
          i≤(n+1)
                    Jo                                           k=k+1

                                                         Po
                                                                 k ≤ m
                                                                          Jo
                                                                    x
         g=2x-3s                 g=4x2+3x+1                    g=     + 4p
                                                                    2

                                        d

                                     Fundi
                                      Fig.4.3
        Këtu, versioni më i saktë i bllok-diagramit do të vizatohej nëse blloqet
për leximin e variablave m dhe n vendosen në degën e majtë dhe të djathtë
(përkatësisht), sepse vetëm në këto degë shfrytëzohen.
52 Algoritmet

b. Rruga - për m=4, n=4 dhe x=2




                                     Fig.4.4
   Gjatë rrugës së kaluar në Fig.4.4, meqë plotësohet kushti x+1<4.5, vlera e
funksionit llogaritet përmes shprehjes së parë ku figuron shuma, kështu:

    g = 2 ⋅ 2 − 3 ⋅ { 2 + 2) + (3 + 2) + (4 + 2) + (5 + 2)
                    (                                    }
                                      s
Shuma dhe prodhimi 53

c. Programi

// Programi Prg4_3
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int m,n,i,k;
  double s,p,x,g;
  cout << "Vlerat hyrëse m,n dhe x: ";
  cin >> m
       >> n
       >> x;
  if (x+1<4.5)
  {
    s=0;
    for (i=2;i<=n+1;i++)
         s=s+(i+x);
    g=2*x-3*s;
  }
  else
    if (x+1==4.5)
        g=4*pow(x,2)+3*x+1;
    else
    {
      p=1;
      for (k=1;k<=m;k++)
           if (k!=3)
              p=p*(k+x/3);
      g=x/2+4*p;
    }
  cout << "Vlera e llogaritur g="
        << g
        << "n";
  return 0;
}

    Nëse ekzekutohet programi i dhënë dhe përmes tastierës i jepen vlerat e
shfrytëzuara gjatë vizatimit të rrugës së kaluar, në ekran do të shtypet rezultati:

Vlera e llogaritur g=-62
54 Algoritmet


    Detyra      Të llogariten vlerat e funksioneve:

                a.
                                  n+1
                                                              x + 1
                     y = x + 2    ∑ (i +     3)2 −        m
                                  i=1
                                 (tek)                   ∏ (i + 1)
                                                         i=2



                b.

                         ⎧x      n
                         ⎪ + 3 ∏ (2i + 1)                për 2x > m
                         ⎪2     i =1
                         ⎪
                     z = ⎨
                         ⎪ x − 2 n (k + x)
                         ⎪3        ∑                 për 2x ≤ m
                         ⎪        k =1
                         ⎩      (k ≠ 3, )
                                       4


                c.
                                                     m
                                                 2 ∏ (k + 1)
                                         1        k =2
                     v = e2x +    m
                                             −     n
                                 ∑ (i + 1)       3 ∑ (k + 3)2
                                 i =1             k =1


                nëse janë dhënë vlerat e variablave m, n dhe x.
Faktorieli i zakonshëm 56
    Faktorieli çift dhe tek 64
   Faktorieli brenda shumës 66
Faktorieli brenda prodhimit 81
56 Algoritmet




    Në praktikë shpesh herë përdoren edhe vlera të faktorielëve të ndryshëm.
Llogaritja e faktorielit është përafërsisht e njëjtë me llogaritjen e prodhimit, sepse
vlera fillestare e faktorielit merret 1. Por, këtu duhet pasur kujdes në një dallim
esencial të shprehjes e cila shkruhet brenda unazës në të cilën llogaritet faktorieli,
sepse ajo gjithnjë e ka formën:


          F=F⋅i


ku i është një numërator.


Faktorieli i zakonshëm
    Procedura për llogaritjen e faktorielit të zakonshëm, kur ai gjindet jashtë
shprehjeve të shumave, prodhimeve ose edhe shprehjeve tjera, është e njëjtë me
llogaritjen e prodhimit të numrave natyrorë.

    Shembull       Llogaritja e vlerës numerike të faktorielit:

                      F=n!

                   nëse është dhënë vlera e variablës n.



                                     n

    F = 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ n =       ∏i
                                    i=1



   Brenda unazës përmes së cilës realizohet shumëzimi i numrave natyrorë mes
1 dhe n, shprehja për llogaritjen e faktorielit shkruhet ashtu siç u tha më sipër.

   F = F ⋅ i

ku përmes variablës i gjenerohen të gjithë numrat natyror mes 1 dhe n.
a. Bllok-diagrami                             b. Rruga - për n=3
Llogaritja e faktorielit 57



                     Fillimi      1                                     1

                        n         2                                     2

                       F=1        3                                     3

                       i=1        4                                     4


                       F=F⋅i      5                                     5

                     i=i+1        6                                     6

                Po
                     i ≤ n        7                                     7
                         Jo
                       F          8                                     8

                     Fundi        9                                     9

                     Fig. 5.1                           Fig.5.2

c. Testimi - për n=3

                                      Vlerat numerike
Hapi     Blloku        Urdhëri                                Rezultati
                                           merren
                                                        Fillimi i
  1         1          Fillimi               -
                                                        algoritmit
                                  prej njësisë
  2         2          Lexo: n                          n=3
                                  hyrëse
  3         3          F=1                -             F=1
  4         4          i=1                -             i=1
  5         5          F=F ⋅i     F → 3, i → 4          F=1 ⋅1=1
  6         6          i=i+1      i → 4                 i=1+1=2
  7         7          Pyet:i≤n   i → 6, n → 2          Po
  8         5          F=F ⋅i     F → 5, i → 6          F=1 ⋅2=2
  9         6          i=i+1      i → 6                 i=2+1=3
 10         7          Pyet:i≤n   i → 9, n → 2          Po
 11         5          F=F ⋅i     F → 8, i → 9          F=2 ⋅3=6
 12         6          i=i+1      i → 9                 i=3+1=4
 13         7          Pyet:i≤n   i → 12, n → 2         Jo
58 Algoritmet

    14        8       Shtyp:F        F → 11                    Shtypet vlera 6
                                                               Fundi i
    15        9       Fundi                        -
                                                               algoritmit

                                         Fig.5.3
     Vlera e faktorielit që fitohet gjatë procedurës së testimit është:

                                        Vlera fillestare(3)
                            F = 1 ⋅ 1 ⋅ 2 ⋅ 3

                                    5
                                         8

                                             11

                                         Fig.5.4
d. Programi

// Programi Prg5_1
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double F;
  cout << "Vlera hyrëse n: ";
  cin >> n;
  F=1;
  for (i=1;i<=n;i++)
       F=F*i;
  cout << "Faktorieli F="
        << F
        << "n";
  return 0;
}

    Nëse programi i dhënë ekzekutohet për vlerën hyrëse n=3, rezultati që
shtypet në ekran është:

Faktorieli F=6

gjë që përputhet me vlerën e fituar gjatë testimit.
Llogaritja e faktorielit 59

    Njëlloj gjendet edhe vlera e faktorielit për shprehjet e ndryshme, rezultati i të
cilave është një numër natyror.

    Shembull        Llogaritja e vlerës numerike të faktorielit:

                       F=(2m+n)!

                    nëse janë dhënë vlerat e variablave m dhe n.



                                             2m + n

    F = 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ (2m + n) =          ∏i
                                              i=1
a. Bllok-diagrami                                     b. Rruga - për m=1 dhe n=2

                    Fillimi

                      m,n

                      F=1

                      i=1


                     F=F⋅i

                     i=i+1

              Po
                    i≤(2m+n)
                            Jo
                        F

                     Fundi

                     Fig.5.5                                   Fig.5.6

c. Programi

// Programi Prg5_5
#include <iostream>
using namespace std;
60 Algoritmet

int main()

{
    int m,n,i;
    double F;
    cout << "Vlerat hyrëse m dhe n: ";
    cin >> m
         >> n;
    F=1;
    for (i=1;i<=2*m+n;i++)
         F=F*i;
    cout << "Faktorieli F="
          << F
          << "n";
    return 0;
}

    Nëse gjatë ekzekutimit të programit, si vlera hyrëse përmes tastierës jepen
vlerat m=1 dhe n=2, në ekran do të shtypet:

Faktorieli F=24

ku vlera 24 i përgjigjet 4!.
    Procesi i llogaritjes do të ketë një cikël më pak, nëse gjatë llogaritjes së
faktorielit të një numri më të madhë se 1 nisemi prej vlerës fillestare F=1 dhe
vlera e variablës merret i=2. Ngjashëm, kur llogaritet faktorieli i një numri më
të madh se 2, procesi i llogaritjes do të zvogëlohet për dy cikle, nëse merret F=2
dhe i=3.
    Nëse faktorieli paraqitet brenda shprehjeve të funksioneve, veprohet njëlloj
si edhe te shumat e prodhimet, përkatësisht së pari llogaritet vlera e faktorielit
dhe pastaj vlera e funksionit.

    Shembull      Llogaritja e vlerës numerike të funksionit:

                          ⎧ m + 1)! + 3x − 4 për x + m > 5
                          (
                          ⎪
                      y = ⎨0                 për x + m = 5
                          ⎪
                          (3n + 2)! - x  2
                                             për x + m < 5
                          ⎩

                  nëse janë dhënë vlerat e variablave m, n dhe x.
Llogaritja e faktorielit 61



a. Bllok-diagrami


                                   Fillimi

                                    m,n,x

                               <           <       >
                                   (x+m)   -
                                           >   5

                    F=1                    =                   F=1

                    i=1                                        i=1


                    F=F⋅i                                     F=F⋅i

                i=i+1                                        i=i+1
          Po                                           Po
               i≤(3n+2)                                      i≤(m+1)
                          Jo                                         Jo
                y=F-x2                y=0                   y=F+3x-4


                                       y

                                    Fundi

                                    Fig. 5.7
62 Algoritmet

b. Rruga - për m=2, n=1 dhe x=5




                                      Fig.5.8
   Vlera që llogaritet gjatë rrugës së kaluar është:

    y = 1⋅2⋅3+ 3⋅5 −4
              F

c. Programi

// Programi Prg5_7
#include <iostream>
#include <cmath>
using namespace std;
int main()
Llogaritja e faktorielit 63

{
    int m,n,i;
    double F,x,y;
    cout << "Vlerat hyrëse m,n dhe x: ";
    cin >> m
         >> n
         >> x;
    if (x+m<5)
    {
      F=1;
      for (i=1;i<=3*n+2;i++)
           F=F*i;
      y=F-pow(x,2);
    }
    else
      if (x+m==5)
          y=0;
      else
      {
        F=1;
        for (i=1;i<=m+1;i++)
             F=F*i;
        y=F+3*x-4;
      }
    cout << "Vlera e funksionit y="
          << y
          << "n";
    return 0;
}

    Nëse programi ekzekutohet për vlerat hyrëse që janë shfrytëzuar gjatë
vizatimit të rrugës në Fig.5.8, si rezultat në ekran do të shtypet:

Vlera e funksionit y=17

gjë që fitohet ashtu siç u tregua edhe më sipër.
    Që algoritmi për llogaritjen e faktorielit të jetë plotësisht i saktë, në te mund
të parashihet edhe rasti kur duhet të llogaritet vlera 0!=1.

    Detyra         Të llogariten vlerat e funksioneve:

                   a.
                             x
                        y=     −(3n + m + 1)!
                             2
64 Algoritmet

                 b.

                          ⎧3x + 2                     për x < m
                          ⎪
                          ⎪
                      z = ⎨
                          ⎪ + 1)! +    x
                          (m                           për x ≥ m
                          ⎪
                          ⎩         (m + n)!
                 c.

                      ⎧ e2x − 3x2 + (4n)!         për x + 3 < n
                      ⎪
                      ⎪
                      ⎪
                      ⎪(n + 1)!-2x                për x + 3 = n
                  g = ⎨
                      ⎪
                      ⎪
                      (n! ) +
                            2    1
                                                  për x + 3 > n
                      ⎪        (2n)!
                      ⎪
                      ⎩

                 nëse janë dhënë vlerat e variablave m, n dhe x.




Faktorieli çift dhe tek
   Në matematikë përdoret edhe faktorieli i cili fitohet vetëm me shumëzimin e
numrave natyrorë çiftë, ose të numrave natyrorë tekë.

    Shembull     Llogaritja e vlerës numerike të faktorielit çift:

                      F = (2n)!!

                 nëse është dhënë vlera e variablës n.



                                     2n
   F = 2 ⋅ 4 ⋅ 6 ⋅ ... ⋅ 2n =       ∏i
                                    i=2
                                   (çift)
Llogaritja e faktorielit 65

a. Bllok-diagrami                c. Rruga - për n=3

                     Fillimi

                        n

                       F=1

                       i=2


                      F=F⋅i

                     i=i+2

                Po
                     i≤(2n)
                            Jo
                        F

                     Fundi

                     Fig.5.9                    Fig.5.10
c. Programi

// Programi Prg5_9
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double F;
  cout << "Vlera hyrëse n: ";
  cin >> n;
  F=1;i=2;
  do
  {
     F=F*i;
     i=i+2;
  }
  while (i<=2*n);
  cout << "Faktorieli çift F="
        << F
        << "n";
  return 0;
66 Algoritmet

}

    Për vlerën hyrëse n=3, rezultati që shtypet në ekran është:

Faktorieli çift F=48

   Plotësisht njëlloj llogaritet edhe vlera e faktorielit tek. Kështu, p.sh., nëse
kërkohet vlera e faktorielit:

    F=(2n-1)!!

në bazë të përkufizimit përkatës matematikor kjo vlerë llogaritet:

                                             2n − 1
    F = 1 ⋅ 3 ⋅ 5 ⋅ ... ⋅ (2n − 1) =         ∏i
                                             i=1
                                            (tek)

gjë që nuk është aspak rëndë të realizohet përmes bllok-diagramit.



Faktorieli brenda shumës
   Faktorielët mund të paraqiten brenda shprehjeve të shumave, ose edhe
brenda funksioneve të ndryshme.

    Shembull       Llogaritja e vlerës numerike të funksionit:

                                  n
                                      ⎡        i⎤
                       y = 3x − 2 ∑ ⎢ n + 2)! + ⎥
                                      (
                                 i =1 ⎣        3⎦

                   nëse janë dhënë vlerat e variablave x dhe n.



              ⎧⎡          1⎤ ⎡            2⎤         ⎡          n ⎤⎫
    y = 3x − 2⎨⎢ n + 2)! + ⎥ + ⎢ n + 2)! + ⎥ + ... + ⎢ n + 2)! + ⎥ ⎬
               (               (                     (
              ⎩⎣          3⎦ ⎣            3⎦         ⎣          3 ⎦⎭

    Meqë, siç shihet edhe më sipër, vlera e faktorielit është konstante brenda të
gjithë anëtarëve të serisë që mblidhen, atë duhet llogaritur së pari, për ta
shfrytëzuar pastaj gjatë procesit të gjetjes së shumës.
Llogaritja e faktorielit 67

a. Bllok-diagrami                b. Rruga - për n=2 dhe x=3

                    Fillimi

                      x,n       F=(n+2)!


                      F=1

                      i=1


                     F=F⋅i

                     i=i+1
              Po
                    i≤(n+2)
                           Jo

                      s=0

                      i=1


                       ⎛   i⎞
               s = s + ⎜F + ⎟
                       ⎝   3⎠

                     i=i+1
              Po
                     i ≤ n
                          Jo

                    y=3x-2s           n
                                         ⎛ i⎞
                                 s = ∑ ⎜F + ⎟
                                    i = 1⎝
                                           3⎠
                       y

                     Fundi

                     Fig.5.11                             Fig.5.12

c. Programi
68 Algoritmet


// Programi Prg5_11
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double x,y,F,s;
  cout << "Vlerat hyrëse x dhe n: ";
  cin >> x
       >> n;
  F=1;
  for (i=1;i<=n+2;i++)
       F=F*i;
  s=0;
  for (i=1;i<=n;i++)
       s=s+(F+i/3.);
  y=3*x-2*s;
  cout << "Vlera e funksionit y="
        << y
        << "n";
  return 0;
}

    Nëse programi i dhënë ekzekutohet për vlerat e shfrytëzuara gjatë vizatimit
të rrugës në Fig.5.12, rezultati që shtypet në ekran do të duket:

Vlera e funksionit y=-89

   Faktorieli brenda shumës mund të mos ketë vlerë konstante, përkatësisht të
mos varet nga vlera e variablës e cila i përcakton anëtarët e serisë që mblidhen.

    Shembull      Llogaritja e vlerës numerike të funksionit:

                                  n
                                     ⎡        i⎤
                      y = 3x − 2 ∑ ⎢ i + 2)! + ⎥
                                     (
                                i = 1⎣        3⎦

                  nëse janë dhënë vlerat e variablave x dhe n.


              ⎧⎡    1⎤ ⎡      2⎤         ⎡          n ⎤⎫
    y = 3x − 2⎨⎢3! + ⎥ + ⎢4! + ⎥ + ... + ⎢ n + 2)! + ⎥ ⎬
                                         (
              ⎩⎣    3⎦ ⎣      3⎦         ⎣          3 ⎦⎭
Llogaritja e faktorielit 69

   Nga shprehja e dhënë më sipër shihet se vlera e faktorielit nuk është
konstante, por ajo ndryshon për çdo i, gjë që e imponon nevojën e llogaritjes së
kësaj vlere brenda unazës për llogaritjen e shumës. Meqë në anëtarin e parë i cili
merr pjesë në mbledhje figuron 3!, vlera fillestare e faktorielit duhet të merret
2!=2 dhe pastaj të shumëzohet me (i+2).

a. Bllok-diagrami                               b. Rruga - për n=2 dhe x=3

              Fillimi

                x,n

                s=0

                F=2

                i=1


            F=F⋅(i+2)

                   ⎛   i⎞
           s = s + ⎜F + ⎟
                   ⎝   3⎠

               i=i+1

      Po
               i ≤ n
                     Jo
              y=3x-2s

                 y

               Fundi

              Fig.5.13                                     Fig.5.14




c. Programi
70 Algoritmet


// Programi Prg5_13
#include <iostream>
using namespace std;
int main()
{
  int n,i;
  double x,y,F,s;
  cout << "Vlerat hyrëse x dhe n: ";
  cin >> x
       >> n;
  s=0;
  F=2;
  for (i=1;i<=n;i++)
  {
    F=F*(i+2);
    s=s+(F+i/3.);
  }
  y=3*x-2*s;
  cout << "Vlera e funksionit y="
        << y
        << "n";
  return 0;
}
    Pas ekzekutimit të programit të dhënë, p.sh. për vlerat hyrëse të shfrytëzuara
gjatë vizatimit të rrugës së kaluar, rezultati që shtypet në ekran është:

Vlera e funksionit y=-53

    Gjetja e ligjshmërisë për ta fituar vlerën aktuale të faktorielit, duke
shfrytëzuar vlerën paraprake të tij, në rast të përgjithshëm e komplikon punën e
shkruarjes së programit për llogaritjen e vlerës së faktorielit. Më thjesht është
nëse brenda unazës së shumës çdo vlerë e faktorielit llogaritet prej fillimit, pa
menduar aspak se a mund të thjeshtohet llogaritja, nëse shfrytëzohet vlera e
faktorielit e cila është llogaritur paraprakisht.

    Shembull      Llogaritja e vlerës numerike të funksionit:

                                   n
                               − 3 ∑ [ 2i + 1)! − x]
                             x
                       y =            (
                             2    i =1


                  nëse janë dhënë vlerat e variablave x dhe n.
y =
    x
      − 3⋅   {[ ⋅ 1
              (2      + 1)! - x   ]   + [ ⋅ 2 + 1)! - x
                                        (2                ]   + ... + [ ⋅ n + 1)! - x
                                                                      (2                ]}
    2
Llogaritja e faktorielit 71


a. Bllok-diagrami
                                  Fillimi

                                    x,n

                                    s=0

                                    i=1
                                                      F=(2i+1)!


                                    F=1

                                    j=1


                                   F=F⋅j

                                   j=j+1
                          Po
                                 j≤(2i+1)
                                          Jo

                                 s=s+[F-x]

                                   i=i+1
                            Po
                                   i ≤ n
                                       Jo
                                     x
                                 y = − 3s
                                     2

                                     y

                                   Fundi

                                   Fig.5.15
    Nëse vizatohet rruga e kaluar në këtë rast, numri i vijave te pjesa e bllok-
diagramit për llogaritjen e faktorielit do të jetë i madh, sepse llogaritja përsëritet
prej fillimit për çdo vlerë të variablës i.
b. Programi
72 Algoritmet

// Programi Prg5_15
#include <iostream>
using namespace std;
int main()
{
  int n,i,j;
  double x,y,s,F;
  cout << "Vlerat hyrëse x dhe n: ";
  cin >> x
       >> n;
  s=0;
  for (i=1;i<=n;i++)
  {
    F=1;
    for (j=1;j<=2*i+1;j++)
         F=F*j;
    s=s+(F-x);
  }
  y=x/2-3*s;
  cout << "Vlera e funksionit y="
        << y
        << "n";
  return 0;
}

    Nëse programi ekzekutohet për vlerat hyrëse x=3 dhe n=2, rezultati që
shtypet në ekran duket:

Vlera e funksionit y=-358.5

   Plotësisht njëlloj rrjedh llogaritja e faktorielëve, kur ata figurojnë brenda
anëtarëve të serive për të cilët gjenden prodhimet.
   Gjatë llogaritjes së faktorielit çift ose tek, kur ata figurojnë nën shenjën e
shumës ose të prodhimit, duhet pasur kujdes të veçantë.

    Shembull       Llogaritja e vlerës numerike të funksionit:

                                    n +1
                       y = 3x + 4 ∑ [ 2i + 1)!! + i]
                                    (
                                    i =1


                   nëse janë dhënë vlerat e variablave x dhe n.


    y = 3x + 4{ [3!! + 1] + [5!! + 2] + ... + [2 n + 1) ! + (n + 1) }
                                               (      !            ]
Llogaritja e faktorielit 73


a. Bllok-diagrami              b. Rruga - për x=2 dhe n=2

                    Fillimi

                      x,n

                      s=0

                      i=1

                      F=1

                      j=3


                     F=F⋅j

                   s=s+[F+i]

                     j=j+1

                     i=i+1
              Po
                    i≤(n+1)
                         Jo
                    y=3x+4s

                       y

                     Fundi

                    Fig.5.16                       Fig.5.17

c. Programi

// Programi Prg5_16
#include <iostream>
using namespace std;
int main()

{
74 Algoritmet

    int n,i,j;
    double x,y,s,F;
    cout << "Vlerat hyrëse x dhe n: ";
    cin >> x
         >> n;
    s=0;
    i=1;
    F=1;
    j=3;
    do
    {
       F=F*j;
       s=s+(F+i);
       j=j+2;
       i=i+1;
    }
    while (i<=n+1);
    y=3*x+4*s;
    cout << "Vlera e llogaritur y="
          << y
          << "n";
    return 0;
}

    Rezultati që do të shtypet në ekran, nëse ekzekutohet programi i dhënë për
vlerat e variablave hyrëse, të cilat janë marrë gjatë vizatimit të rrugës së kaluar në
Fig.5.17, është:

Vlera e llogaritur y=522

    Në një shprehje të funksionit mund të ndodhë të nevojitet llogaritja
alternative e faktorielit çift dhe tek.

    Shembull       Llogaritja e vlerës numerike të funksionit:

                                  n
                                      ⎡   x⎤
                       g = 2a + 3 ∑ ⎢i!! + ⎥
                                 i =1 ⎣   2⎦

                   nëse janë dhënë vlerat e variablave a, x dhe n.
Llogaritja e faktorielit 75

                 ⎧⎡      x⎤   ⎡     x⎤           ⎡      x⎤ ⎫
    g = 2a + 3 ⋅ ⎨ ⎢1!! + ⎥ + ⎢2!! + ⎥ + ... +   ⎢n!! + 2 ⎥ ⎬
                 ⎩⎣      2⎦   ⎣     2⎦           ⎣        ⎦⎭

a. Bllok-diagrami                  b. Rruga - për a=5, x=2 dhe n=4

                 Fillimi

                    a,x,n

                     s=0

                     i=1

                     F=1

                     j=i


                    F=F⋅j

                    j=j-2
            Po
                    j > 1
                          Jo
                     ⎛   x⎞
             s = s + ⎜F + ⎟
                     ⎝   2⎠

                    i=i+1

           Po
                    i ≤ n
                         Jo
                 y=2a+3s


                      y

                    Fundi

                 Fig.5.18                 Fig.5.19
76 Algoritmet

c. Programi

// Programi Prg5_18
#include <iostream>
using namespace std;
int main()
{
  int n,i,j;
  double a,x,y,s,F;
  cout << "Vlerat e variablave a, x dhe n: ";
  cin >> a
       >> x
       >> n;
  s=0;
  for (i=1;i<=n;i++)
  {
    F=1;
    j=i;
    do
    {
        F=F*j;
        j=j-2;
    }
    while (j>1);
    s=s+(F+x/2);
  }
  y=2*a+3*s;
  cout << "Vlera e llogaritur y="
        << y
        << "n";
  return 0;
}

    Pas ekzekutimit të programit për vlerat e variablave hyrëse, të cilat janë
shfrytëzuar gjatë vizatimit të rrugës së kaluar në Fig.5.19, në ekran fitohet:

Rezultati y=64

    Detyra         Të llogariten vlerat e funksioneve:

                   a.
                                    n +2                 2
                              3x         ⎡         i⎤
                        y =      + 4 ∑ ⎢ 2i + 3)! + ⎥
                                         (
                               a    i = 2⎣         b⎦
Llogaritja e faktorielit 77


                  b.

                           ⎧ n + 1)!
                           (                             për x < (a + b)
                           ⎪
                           ⎪
                           ⎪ m ⎡              a⎤
                           ⎪ 3 ∑ ⎢ 2i + 1)!! + ⎥
                                  (                      për x = (a + b)
                       g = ⎨ i =1 ⎣           i⎦
                           ⎪
                           ⎪
                           ⎪(2n)!!                       për x > (a + b)
                           ⎪
                           ⎩

                  nëse janë dhënë vlerat e variablave a, b, x, m dhe n.



    Në shprehjet e funksioneve njëkohësisht mund të paraqiten shuma,
prodhime dhe faktoriele, të cilat llogariten duke u mbështetur në algoritmet
elementare përkatëse.

    Shembull      Llogaritja e vlerës numerike të funksionit:

                            m −1                                (m + 1)!
                                              2m
                                                  ⎡   ⎤
                       z = 3 ∑ [k + a]2 − 4
                                                     i
                                              ∏ ⎢ + 3⎥ +
                            k =1              i=2 ⎣ 2 ⎦  x + 2
                                            (çift)


                  nëse janë dhënë vlerat e variablave x, a dhe m.




   z = 3⋅   { [1 + a]2 + [2 + a]2 + ... + [(m + 1) + a]2 }
           ⎧ ⎡2      ⎤ ⎡4      ⎤     ⎡ 2m    ⎤⎫
        − 4⎨ ⎢ + 3⎥ ⋅ ⎢ + 3⎥ ⋅ ... ⋅ ⎢    + 3⎥ ⎬
           ⎩ ⎣2      ⎦ ⎣2      ⎦     ⎣ 2     ⎦⎭
          1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ (m + 1)
        +
                    x + 2
78 Algoritmet


a. Bllok-diagrami                        b. Rruga - për x=3, a=0.5 dhe m=3


              Fillimi
                                  m -1

                x,a,n
                             s=   ∑ [k + a]2
                                  k=1


                 s=0

                 k=1


            s=s+[k+a]2

                k=k+1

       Po
              k≤(m-1)
                        Jo

                 p=1

                 i=2

                                     2m ⎡ i  ⎤
                    ⎡i   ⎤    p=      ∑ ⎢ + 3⎥
            p = p ⋅ ⎢ + 3⎥
                    ⎣2   ⎦           i=2
                                         ⎣ 2 ⎦
                                   (çift)
                i=i+2
       Po
                i ≤ 2m
                     Jo

                    A                                              B
Llogaritja e faktorielit 79


                   A                                     B


                 F=1

                 i=1


                F=F⋅i             F=(n+1)!

               i=i+1

      Po
              i≤(m+1)
                    Jo

                             F
        z = 3 ⋅s − 4⋅ p +
                            x+2

                   z

               Fundi

                       Fig.5.20                   Fig.5.21
c. Programi

// Programi Prg5_20
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  const double x=3,a=0.5;
  const int m=3;
  int i,k;
  double s,p,F,z;
  s=0;
  for (k=1;k<=m-1;k++)
       s=s+pow(k+a,2);
  p=1;
  i=2;
  do
  {
     p=p*(i/2.+3);
80 Algoritmet

      i=i+2;
    }
    while (i<=2*m);
    F=1;
    for (i=1;i<=m+1;i++)
         F=F*i;
    z=3*s-4*p+F/(x+2);
    cout << "Rezultati z="
          << z
          << "n";
    return 0;
}

    Nëse programi ekzekutohet për vlerat hyrëse të deklaruara si konstante,
rezultati që shtypet në ekran është:

Rezultati z=-449.7

    Detyra        Të llogariten vlerat numerike të funksioneve:

                  a.

                                  n +1
                               + 2 ∑ [ 2i)!! + 3] − [ n + 2)!] 2
                             x
                       f =             (            (
                             3    i =1
                                  (i ≠ 3)
                  b.

                           ⎧              n
                           ⎪(n + 1)! + 3 ∏ [k + 1]         për (a + x) < b
                           ⎪             k =1
                           ⎪            (tek)
                           ⎪
                           ⎪(2n + 1)!! + 2a - b            për (a + x) = b
                           ⎪
                       g = ⎨
                           ⎪
                           ⎪(2n)!! + x                     për (x + a) > b
                           ⎪          2
                           ⎪
                           ⎪
                           ⎪
                           ⎩

                  nëse janë dhënë vlerat e variablave a, b, x dhe n.
Llogaritja e faktorielit 81


Faktorieli brenda prodhimit
    Faktorielët mund të paraqiten edhe brenda anëtarëve të serive për të cilat
kërkohet prodhimi. Gjatë përpilimit të algoritmeve përkatëse, në këto raste
shfrytëzohen procedura plotësisht të njëjta si edhe te shumat.

    Shembull      Llogaritja e vlerës numerike të funksionit:

                                     n
                                         ⎡         i⎤
                      y = 3x + 2 ∏       ⎢ + 1)! + 3 ⎥
                                         (i
                                    i =1 ⎣           ⎦
                                  (i ≠ 2, )
                                         3


                  nëse janë dhënë vlerat e variablave x dhe n.




                     ⎧   ⎡     1⎤ ⎡        4⎤            ⎡         n + 1⎤ ⎫
        y = 3x + 2 ⋅ ⎨   ⎢2! + 3 ⎥ ⋅ ⎢5! + 3 ⎥ ⋅ ... ⋅   ⎢ + 1)! +
                                                         (n               ⎬
                     ⎩   ⎣       ⎦ ⎣         ⎦           ⎣           3 ⎥⎭
                                                                        ⎦
82 Algoritmet

a. Bllok-diagrami
                          Fillimi

                             x,n

                             p=1

                             i=1

                                          Po
                             i=2
                                Jo
                                          Po
                             i=3
                                Jo
                             F=1

                             j=1


                            F=F⋅j

                            j=j+1
                    Po
                           j≤(i+1)
                                   Jo
                                 ⎡   i⎤
                         p = p ⋅ ⎢F + ⎥
                                 ⎣   3⎦


                            i=i+1

                    Po
                            i ≤ n
                                 Jo
                          y=3x+2p


                               y

                            Fundi

                           Fig.5.22
Llogaritja e faktorielit 83

b. Rruga - për x=2 dhe n=4




                             Fig.5.23
84 Algoritmet

c. Programi

// Programi Prg5_22
#include <iostream>
using namespace std;
int main()
{
  int n,i,j;
  double x,y,p,F;
  cout << "Vlerat hyrëse x dhe n: ";
  cin >> x
       >> n;
  p=1;
  for (i=1;i<=n;i++)
       if ((i==2) || (i==3))
       {
       }
       else
       {
           F=1;
           for (j=1;j<=i+1;j++)
                F=F*j;
           p=p*(F+i/3.);
       }
  y=3*x+2*p;
  cout << "Vlera e llogaritur y="
         << y
         << "n";
  return 0;
}

    Nëse programi ekzekutohet për vlerat hyrëse të shfrytëzuara gjatë vizatimit të
rrugës së kaluar, në ekran do të fitohet rezultati:

Vlera e llogaritur y=572.222

    Detyra        Të llogariten vlerat e funksioneve:

                  a.

                             x      m
                                       ⎡   x⎤
                       f =     − 3 ∏ ⎢k!! + ⎥
                             2    k =1 ⎣   2⎦
Llogaritja e faktorielit 85


b.

         ⎧      m +1 i
                     ⎡    ⎤
         ⎪3x + 2 ∑ ⎢ + 3⎥                   për x ≠ a
         ⎪      i =1 ⎣2   ⎦
         ⎪
     g = ⎨
                                      2
         ⎪ ax       m
                        ⎡          x⎤
         ⎪e   + 3 ∏ ⎢   (2j + 3)! - ⎥        për x = a
         ⎪         j= 2 ⎣          a⎦
         ⎩       (çift)


c.

               m +2 i      2 m ⎡ 2   a⎤
           1        ⎡   ⎤
     h =     − ∑ ⎢ + 4i⎥ −   ∏ ⎢j ) − ⎥
                                  (!
           3   i =1 ⎣ 3 ⎦  3 j= 1 ⎣  j⎦
              (i ≠ 3, )
                     5


nëse janë dhënë vlerat e variablave x, a dhe m.
Vektorët   90
              Matricat 134
Fushat tridimensionale 217
88 Algoritmet




     Grumbulli i numrave të vendosur në një hapësirë në bazë të parimeve të
caktuara, quhet fushë numerike. Kur pozicionet e numrave në hapësirën e fushës
numerike përcaktohen nga një madhësi, për fushën thuhet se është njëdimensionale
dhe quhet vektor. Nëse për përcaktimin e pozicioneve të numrave përdoren dy
madhësi, fusha numerike është dydimensionale dhe quhet matricë. Kurse, kur pozita
e numrave në fushë përcaktohet përmes më shumë madhësive, për fushën thuhet
se është shumëdimensionale.
     Për t'i kuptuar më mirë fushat numerike, do ta marrim si shembull
grumbullin e notave të 5 nxënësve të parë, në regjistrin e notave të një klase, i
cili është dhënë në Fig.6.1.

                                         1              2              3                4       5        6           7              8
  Numri rendor




                                         Gjuha amtare

                                                        Gjuha e huaj

                                                                       Matematika




                                                                                                                     Programimi
                                                                                                         Biologjia




                                                                                                                                  Edukata
                                                                                                Fizika




                                                                                                                                  fizike
                 Emri
                                                                                        Kimia




  1              Agroni                  5              5              5                5       5        5           5              5
  2              Ardiani                 5              5              5                4       4        4           5              5
  3              Arianisa                5              5              5                5       5        5           5              5
  4              Arta                    5              5              5                5       5        5           5              5
  5              Besa                    5              5              4                4       4        5           5              4

                               Fig.6.1 Notat e nxënësve të një klase
    Këtu, grumbulli i notave të një nxënësi është fushë njëdimensionale dhe e
paraqet vektorin e notave të tij. Kështu, p.sh., vektori i notave të Ardianit është:

                       1   2   3     4           5      6              7            8
                 A =   5   5   5     4           4      4              5            5

Notat në këtë vektor nuk janë shënuar arbitrarisht, sepse çdo pozicioni në te i
përgjigjet nota e një lënde të caktuar.
Fushat numerike 89

    Grumbulli i notave të nxënësve, të cilat janë shënuar në tabelën e dhënë në
Fig.6.1:

                     1     2     3    4   5   6    7    8
                1    5     5     5    5   5   5    5    5
                2    5     5     5    4   4   4    5    5
         B =    3    5     5     5    5   5   5    5    5
                4    5     5     5    5   5   5    5    5
                5    5     5     4    4   4   5    5    4

paraqetë fushë dydimensionale dhe e formon matricën e notave të tyre.
    Nga shembulli i dhënë më sipër shihet se te vektorët e notave të nxënësve,
notat shënohen në bazë të lëndëve, përkatësisht numrave rendorë të tyre. Kurse,
te matrica e notave të nxënësve, vendosja e notave në fushat e veçanta bëhet në
bazë të nxënësve dhe lëndëve, ose numrave rendorë të tyre.
    Në rastin e përgjithshëm, kur kemi të bëjmë me m-nxënës dhe n-lëndë,
vektori i notave të nxënësit mund të paraqitet kështu:

                1    2    ...    n
        A = a1      a2 ... an

ose shkurt A(n), ku a1, a2, ..., an janë anëtarët e vektorit. Matrica e notave të
nxënësve është:

                    j=1   2     ...   n
               i=1 b11 b12 ... b1n
                2   b21 b22 ... b2n
        B = ... ... ... ... ...
                m   bm1 bm2 ... bmn

dhe shkurt shënohet B(m,n), ku b11, b12, ..., bm1, bm2,..., bmm janë anëtarët e
matricës.
    Numrat të cilët i shoqërojnë anëtarët e vektorit, ose të matricës, quhen
indekse. Kështu, p.sh., indeksi i notës së matematikës te vektorët e notave të
nxënësve është 3, kurse anëtari i këtij vektori për notën e Artës është a3=5.
Te matrica, p.sh., anëtari b53=4 i përgjigjet notës së Besës nga lënda e
matematikës.
90 Algoritmet


Vektorët
   Mbushja e vektorëve me vlera numerike, përkatësisht operimi me vlerat e
anëtarëve të veçantë të tyre bëhet duke i shfrytëzuar indekset përkatës.

Përcaktimi i vektorëve
    Vlerat numerike të anëtarëve të vektorëve kompjuterit mund t'i jepen përmes
leximit si numra të gatshëm, ose ato mund të llogariten në bazë të ligjshmërisë së
dhënë.

    Shembull         Formimi i vektorit A(n), duke i llogaritur anëtarët ai të tij
                     kështu:

                           ai=3i+1

                     nëse dihet vlera e variablës n.

a. Bllok-diagrami                                  b. Rruga - për n=5

                    Fillimi

                       n

                      i=1

                    ai=3i+1

                     i,ai

                     i=i+1

             Po
                     i ≤ n
                         Jo
                     Fundi

                      Fig.6.2                             Fig.6.3
        Në gjuhën C++ indekset e anëtarëve të vektorëve dhe matricave fillojnë
me vlerën 0. Për këtë arsye, në pjesën vijuese, gjatë shkruarjes së programeve,
indekset fillestare dhe kufijt e tyre do të zvogëlohen për një, krahasuar me vlerat
përkatëse në bllok-diagrame.
Fushat numerike 91

c. Programi

// Programi Prg6_2
#include <iostream>
using namespace std;
int main()
{
  int const n=5;
  int i,A[n];
  for (i=0;i<n;i++)
  {
    A[i]=3*i+1;
    cout << "A["
         << i
         << "]="
         << A[i]
         << "n";
  }
  return 0;
}

   Pas ekzekutimit të programit, anëtarët e vektorit do të shtypen në ekran
kështu:

A[0]=1
A[1]=4
A[2]=7
A[3]=10
A[4]=13

    Anëtarët e vektorit mund edhe të llogariten, duke shfrytëzuar shprehje të
çfarëdoshme.

    Shembull        Formimi i vektorit A(n), duke llogaritur anëtarët ai të tij
                    kështu:

                               x     i
                        ai =     + 3 ∑ (j + 2i)
                               3    j= 1


                    nëse janë dhënë vlerat e variablave x dhe n.



a. Bllok-diagrami                                 b. Rruga - për x=1 dhe n=3
92 Algoritmet


               Fillimi

                    n,x

                    i=1


                    s=0

                    j=1


              s=s+(j+2i)

                j=j+1
       Po
                j ≤ i
                          Jo
                     x
              a =      + 3s
                i    2

                    i,ai

                i=i+1

        Po
                i ≤ n
                    Jo
                Fundi

                Fig.6.4                                               Fig.6.5
   Vlerat e llogaritura gjatë rrugës së kaluar:

    a1 =
         1
           + 3⋅       { [1   + 2 ⋅ 1] }
         2
    a2 =
         1
           + 3⋅       { [1   + 2 ⋅ 2] + [2 + 2 ⋅ 2] }
         2
    a3 =
         1
           + 3⋅       { [1   + 2 ⋅ 3] + [2 + 2 ⋅ 3] + [3 + 2 ⋅ 3] }
         2
c. Programi
Fushat numerike 93


// Programi Prg6_4
#include <iostream>
using namespace std;
int main()
{
  int const n=3,
      x=1;
  int i,j;
  double s,A[n];
  for (i=0;i<n;i++)
  {
    s=0;
    for (j=1;j<=i;j++)
         s=s+(j+2*i);
    A[i]=x/2.+3*s;
    cout << "A["
          << i
          << "]="
          << A[i]
          << "n";
  }
  return 0;
}

    Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është:

A[0]=0.5
A[1]=9.5
A[2]=33.5

    Vektorët mund të formohen edhe duke shfrytëzuar anëtarët e vektorëve të
tjerë.

    Shembull      Formimi i vektorit B(n), duke shfrytëzuar vlerat e anëtarëve
                  të vektorit të dhënë A(n), në bazë të ligjshmërisë:

                      bi = i + 2ai − 1
                                 2
94 Algoritmet

a. Bllok-diagrami                 b. Rruga - për     A=      3   5   -2   8


                   Fillimi

              n,(ai,i=1,n)

                     i=1

               bi=i+2ai2-1

                    i,bi

                    i=i+1

              Po
                    i ≤ n
                        Jo
                    Fundi

                   Fig.6.6                         Fig.6.7
   Në bllok-diagram, me (ai,i=1,n) shënohet shkurt vargu i anëtarëve të
vektorit, përkatësisht a1, a2, ... , an.

c. Programi

// Programi Prg6_6
#include <iostream>
using namespace std;
int main()
{
  int const n=4;
  int i,A[n]={3,5,-2,8},B[n];
  for (i=0;i<n;i++)
  {
    B[i]=i+2*(A[i]*A[i])-1;
    cout << "B["
         << i
         << "]="
         << B[i]
         << "n";
  }
  return 0;
}
Fushat numerike 95

    Pas ekzekutimit të programit, anëtarët e vektorit të formuar do të shtypen në
ekran kështu:

B[0]=17
B[1]=50
B[2]=9
B[3]=130

   Vektorët mund të formohen edhe duke shfrytëzuar vlerat numerike të
anëtarëve të disa vektorëve njëkohësisht.

    Shembull        Formimi i vektorit G(k), duke shfrytëzuar vlerat e anëtarëve
                    të vektorëve A(n) dhe B(m), kështu:

                     G =    B     A



a. Bllok-diagrami

                                           Fillimi

                                m,n,(ai,i=1,n),(bi,i=1,m)

                                             i=1

                                      Po             Jo
                                            i ≤ m

                                 gi=bi                gi=ai-m


                                            i,gi

                                            i=i+1
                                  Po
                                           i≤(m+n)
                                                Jo
                                            Fundi

                                           Fig.6.8
96 Algoritmet

b. Rruga

        A =     9   -3

        B =     6   -2   8




                             Fig.6.9
c. Programi

// Programi Prg6_8
#include <iostream>
using namespace std;
int main()
{
  int const m=3,n=2;
  int A[n]={9,-3},
      B[m]={6,-2,8},
      i,G[m+n];
  for (i=0;i<m+n;i++)
  {
    if (i<m)
       G[i]=B[i];
Fushat numerike 97

      else
         G[i]=A[i-m];
      cout << "G["
           << i
           << "]="
           << G[i]
           << "n";
    }
    return 0;
}

    Anëtarët e vektorit të formuar G, pas ekzekutimit të programit të dhënë, në
ekran do të shtypen kështu:

G[0]=6
G[1]=-2
G[2]=8
G[3]=9
G[4]=-3



Operacionet aritmetikore
   Në praktikë shpesh herë kryhen operacione të ndryshme aritmetikore mbi
anëtarët e një vektori, si dhe mes anëtarëve të dy ose më shum vektorëve.

    Shembull      Formimi i vektorit B(n), nga anëtarët përkatës të vektorit të
                  dhënë A(n), duke shumëzuar anëtarëve negativë me vlerat e
                  indekseve të tyre, kurse anëtarët pozitivë - me vlerën e
                  konstantes së dhënë x.
98 Algoritmet

a. Bllok-diagrami
                                          Fillimi

                                       x,n,(ai,i=1,n)

                                              i=1

                                   Po                    Jo
                                             ai < 0

                             bi=i⋅ai                     bi=x⋅ai


                                             i,bi

                                             i=i+1
                                  Po
                                             i ≤ n
                                                 Jo
                                             Fundi

                                             Fig.6.10

b. Rruga e kaluar - për x=2 dhe        A =    6      9   -3   4    -2




                                          Fig.6.11
Fushat numerike 99

    Vlerat që llogariten gjatë rrugës së kaluar janë:

    b1 = x ⋅ a1
    b2 = x ⋅ a2
    b3 = 3 ⋅ a3
    b4 = x ⋅ a4
    b5 = 5 ⋅ a5

c. Programi

// Programi Prg6_10
#include <iostream>
using namespace std;
int main()
{
  int const x=2,n=5;
  int A[n]={6,9,-3,4,-2},i,B[n];
  for (i=0;i<n;i++)
  {
    if (A[i]<0)
       B[i]=i*A[i];
    else
       B[i]=x*A[i];
    cout << "B["
         << i
         << "]="
         << B[i]
         << "n";
  }
  return 0;
}

    Nëse programi i dhënë ekzekutohet, vlerat e vektorit B të cilat shtypen në
ekran, janë:

B[0]=12
B[1]=18
B[2]=-6
B[3]=8
B[4]=-8

    Vlerat e anëtarëve të vektorit mund të përcaktohen edhe përmes llogaritjeve
të ndryshme më komplekse.
    Shembull       Formimi i vektorit Z(m), nga anëtarët e vektorit të dhënë
100 Algoritmet

                    F(m), duke ua shtuar anëtarëve të veçantë vlerat e shumave:
                            ⎧fi + i         për i ≥ 3
                            ⎪
                            ⎪
                       zi = ⎨ i
                            ⎪ ∑ fj2
                                            për i < 3
                            ⎪j= 1
                            ⎩


a. Bllok-diagrami
                                             Fillimi

                                           m,(fi,i=1,m)

                                                i=1

                                       Po                   Jo
                                               i < 3

                                    s=0

                                    j=1


                                 s=s+fj2

                                  j=j+1

                            Po
                                  j ≤ i
                                      Jo
                                   zi=s                     zi=fi+i

                                               i,zi

                                               i=i+1

                                      Po
                                               i ≤ m
                                                       Jo
                                               Fundi

                                               Fig.6.12
Fushat numerike 101

b. Rruga - për m=5 dhe F=   3   2   -1   6     -4




                                    Fig.6.13
102 Algoritmet

    Gjatë rrugës së kaluar në Fig.6.13 anëtarët e vektorit Z(n) llogariten kështu:
    z1 = f1
          2

    z2   =    2
             f1   + f22

    z3   =   f3   + 3
    z4   =   f4   + 4
    z5   =   f5   + 5

c. Programi
// Programi Prg6_12
#include <iostream>
using namespace std;
int main()
{
  int const m=5;
  int F[m]={3,2,-1,6,-4},i,j,s,Z[m];
  for (i=0;i<m;i++)
  {
    if (i<2)
    {
       s=0;
       for (j=0;j<=i;j++)
            s=s+F[j]*F[j];
       Z[i]=s;
    }
    else
       Z[i]=F[i]+i;
    cout << "Z["
         << i
         << "]="
         << Z[i]
         << "n";
  }
  return 0;
}
    Vektori Z, që formohet pas ekzekutimit të programit, për vlerat e vektorit F
të cilat janë shfrytëzuar gjatë rrugës së kaluar në Fig.6.13, është:

Z[1]=9
Z[2]=13
Z[3]=1
Z[4]=9
Z[5]=0
Fushat numerike 103

   Operacionet aritmetikore mund të zbatohen edhe mbi anëtarët e më shumë
vektorëve njëkohësisht.

    Shembull        Formimi i vektorit G(m), duke shumëzuar katrorët e
                    anëtarëve përkatës të vektorit A(m) me vlerat absolute të
                    anëtarëve me indeks të njëjtë të vektorit B(m). Njëkohësisht,
                    anëtarët e vektorit G(m), të cilët janë më të mëdhenj se
                    numri i dhënë x, duhet të pjesëtohen me indeksin përkatës.



a. Bllok-diagrami

                                        Fillimi

                            x,m,(ai,i=1,m),(bi,i=1,m)

                                          i=1


                                      gi=ai2⋅|bi|

                                                    Po
                                         gi > x
                                        Jo
                                                    gi=gi/i


                                          i,gi

                                         i=i+1

                                Po
                                         i ≤ m
                                             Jo
                                         Fundi

                                        Fig.6.14
104 Algoritmet

b. Rruga - për x=20 dhe A=   -1   7    5     2


                        B = 2     -3   8     -4




                                  Fig.6.15
c. Programi

// Programi Prg6_14
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const x=20,m=4;
  int A[m]={-1,7,5,2},
      B[m]={2,-3,8,4},i;
  double G[m];
  for (i=0;i<m;i++)
Fushat numerike 105


    {
        G[i]=A[i]*A[i]*abs(B[i]);
        if (G[i]>x)
           G[i]=G[i]/i;
        cout << "G["
             << i
             << "]="
             << G[i]
             << "n";
    }
    return 0;
}

    Pas ekzekutimit të programit të dhënë për vlerat e shfrytëzuara gjatë vizatimit
të rrugës në Fig.6.15, vlerat e anëtarëve të vektorit G, të cilat shtypen në ekran,
janë:

G[0]=2
G[1]=147
G[2]=100
G[3]=16

Shuma dhe prodhimi
    Gjatë llogaritjeve të ndryshme praktike, shpesh herë shfrytëzohet, p.sh.,
shuma, ose prodhimi, ose shuma e katrorëve, ose shuma e kubeve, përkatësisht
shumë kombinime të tjera të mbledhjes, të zbritjes, të shumëzimit dhe të
pjesëtimit të anëtarëve të vektorëve.

    Shembull      Mbledhja e anëtarëve pozitiv dhe e katrorëve të anëtarëve
                  negativ të vektorit të dhënë A(n).
106 Algoritmet


a. Bllok-diagrami

                              Fillimi

                           n,(ai,i=1,n)

                                s=0

                                i=1

                         Po                Jo
                              ai < 0

                    s=s+ai2                s=s+ai


                               i=i+1

                      Po
                               i ≤ n
                                      Jo
                                 s

                               Fundi

                              Fig.6.16
Fushat numerike 107

b. Rruga - për A =      7   -2    4    6    -3




                                         Fig.6.17

   Shuma e cila llogaritet gjatë rrugës së kaluar është:

   s = 7 + (-2)2 + 4 + 6 + (-3) 2


c. Programi

// Programi Prg6_16
#include <iostream>
using namespace std;
int main()
{
  int const n=5;
  int A[n]={7,-2,4,6,-3},i,s;
  s=0;
  for (i=0;i<n;i++)
108 Algoritmet


    {
        if (A[i]<0)
           s=s+A[i]*A[i];
        else
           s=s+A[i];
    }
       cout << "Shuma e kërkuar s="
            << s
            << "n";
    return 0;
}

    Nëse ekzekutohet programi i dhënë, si rezultat në ekran do të shtypet vlera:

Shuma e kërkuar s=30

   Ngjashëm, vlerat e anëtarëve të vektorëve mund të shfrytëzohen për gjetjen e
prodhimeve të ndryshme.

    Shembull      Prodhimi i anëtarëve të vektorit A(n) të cilët kanë vlerë
                  absolute më të madhe se 5 dhe më të vogël se 12, duke
                  shtypur anëtarët që nuk marrin pjesë në prodhim si dhe
                  indekset e tyre.
Fushat numerike 109


b. Bllok-diagrami                     b. Rruga - për A =    7    19   8   -2 10


                Fillimi

            n,(ai,i=1,n)

                     p=1

                     i=1

                               Jo
                    ai > 5
                          Po
                               Jo
                ai < 12
                      Po
                    p=p⋅ai          i,ai


                    i=i+1
          Po
                    i ≤ n
                         Jo
                      p

                    Fundi

                Fig.6.18                                   Fig.6.19

    Vlera që llogaritet gjatë rrugës së kaluar është:

             Vlera fillestare
    p = 1 ⋅ 7 ⋅ 8 ⋅ 10


Njëkohësisht, shtypen edhe indekset dhe vlerat e anëtarëve të cilët janë jashtë
kufijve të dhënë:
                       2      19
                       4      -2
110 Algoritmet

c. Programi
// Programi Prg6_18
#include <iostream>
using namespace std;
int main()
{
  int const n=5;
  char t[20]="--------------";
  int A[n]={7,19,8,-2,10},i,p;
  p=1;
  cout << " i       A[i]"
       << "n"
       << t
       << "n";
  for (i=0;i<n;i++)
  {
    if ((A[i]>5) && (A[i]<12))
       p=p*A[i];
    else
       cout << " "
            << i
            << "       "
            << A[i]
            << "n";
  }
  cout << t
       << "n"
       << "Prodhimi p="
       << p
       << "n";
  return 0;
}
    Për vlerat e shfrytëzuara gjatë rrugës së kaluar në Fig.6.19, si rezultat në ekran
shtypet:

  i    A[i]
--------------
  1     19
  3     -2
--------------
Prodhimi p=560

   Anëtarët e vektorëve mund të shfrytëzohen edhe brenda shprehjeve të
ndryshme për llogaritjen e shumave ose të prodhimeve, përmes indekseve
përkatëse.
Fushat numerike 111


    Shembull        Llogaritja e vlerës së shprehjes:

                              ⎧
                              ⎪3x + 4 ∏ ( ai + 2)
                                      n
                                                                 për x < 0.55
                              ⎪      i =1
                              ⎪
                          y = ⎨

                              ⎪           ∑ i (
                              ⎪ e2x − 2 n a2 − x        )        për x ≥ 0.55
                              ⎪           i=2
                              ⎩         (çift)


                    ku me ai nënkuptohen anëtarët e vektorit të dhënë A(n).



a. Bllok-diagrami
                                             Fillimi

                                          n,(ai,i=1,n),x

                                     Po                           Jo
                                             x < 0.55
                               p=1                                     s=0

                               i=1                                     i=2


                          p=p⋅(|ai|+2)                           s=s+(ai2-x)

                             i=i+1                                     i=i+2

                     Po                                     Po
                              i ≤ n                                    i ≤ n
                                     Jo                                        Jo
                            y=3x+4p                                y=e2x-2s


                                                  y

                                              Fundi

                                             Fig.6.20
112 Algoritmet

b. Rruga - për x = 0.2 dhe A=    6    4    -9




                                Fig.6.21
c. Programi

// Programi Prg6_20
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const n=3;
  int A[n]={6,4,-9},i;
  double s,p,x,y;
  cout << "Vlera e variablës x=";
  cin >> x;
Fushat numerike 113

    if (x<0.55)
    {
        p=1;
        for (i=0;i<n;i++)
             p=p*(abs(A[i])+2);
        y=3*x+4*p;
    }
    else
    {
        s=0;
        i=2;
        do
        {
           s=s+A[i]*A[i]-x);
           i=i+2;
      }
      while (i<=n);
      y=exp(2*x)-2*s;
    }
    cout << "Vlera e llogaritur y="
           << y
           << "n";
    return 0;
}

    Rezultati që shtypet në ekran, për vlerat numerike që janë shfrytëzuar gjatë
vizatimit të rrugës së kaluar në Fig.6.21, është:

Vlera e llogaritur y=2112.6

Numërimi i anëtarëve të caktuar
   Për t'i numëruar anëtarët e caktuar brenda vektorit, të gjithë anëtarët e tij
duhet të krahasohen me kushtet e përcaktuara për numërim.

    Shembull       Numri n i anëtarëve me vlerë numerike negative, në vektorin
                   e dhënë A(m).



    Këtu, vlera fillestare e numëratorit n duhet të merret zero. Pastaj, sa herë që
gjendet ndonjë anëtar me vlerë numerike negative, vlera e numëratorit n rritet
për një, kurse për anëtarët e tjerë kjo madhësi nuk ndryshohet.
114 Algoritmet

a. Bllok-diagrami             b. Rruga - për   A=      3   -2   7   -4   5
              Fillimi

          m,(ai,i=1,m)

                 n=0

                 i=1

                         Jo
               ai < 0
                    Po
               n=n+1


               i=i+1

        Po
               i ≤ m
                   Jo
                    n

               Fundi

              Fig.6.22                              Fig.6.23

c. Programi

// Programi Prg6_22
#include <iostream>
using namespace std;
int main()
{
  int const m=5;
  int A[m]={3,-2,7,-4,5},i,n;
  n=0;
  for (i=0;i<m;i++)
       if (A[i]<0)
          n=n+1;
  cout << "Anëtarë negativë n="
        << n
        << "n";
  return 0;
}
Fushat numerike 115

    Rezultati që shtypet në ekran, për vlerat e shfrytëzuara gjatë vizatimit të
bllok-diagramit në Fig.6.23, pas ekzekutimit të programit të dhënë, është:

Anëtarë negativë n=2

gjë që shihet edhe nga rruga e vizatuar, kur nëpër bllokun në të cilin rritet
numëratori n kalohet vetëm dy herë.

   Numërimi mund të bëhet edhe duke shtruar më shumë kushte njëkohësisht.

    Shembull         Numërimi k i anëtarëve negativë të vektorit F(m), por të
                     cilët për nga vlera absolute janë më të mëdhenj se numri
                     pozitiv x.


a. Bllok-diagrami            b. Rruga - për x=3 dhe A=       -7     4   -5 -1     6

            Fillimi

       x,m,(fi,i=1,m)

              k=0

              i=1

                          Jo
              fi<0
                     Po
                          Jo
             |fi|>x
                  Po
             k=k+1


             i=i+1
       Po
             i ≤ m
                  Jo
               k

             Fundi

          Fig.6.24                                       Fig.6.25
c. Programi
116 Algoritmet


// Programi Prg6_24
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const m=5,x=3;
  int F[m]={-7,4,-5,-1,6},i,k;
  k=0;
  for (i=0;i<m;i++)
       if ((F[i]<0) && (abs(F[i])>x))
          k=k+1;
  cout << "Numri i kërkuar k="
        << k
        << "n";
  return 0;
}

    Pas ekzekutimit të programit të dhënë, për vlerat hyrëse të shfrytëzuara gjatë
vizatimit të rrugës së kaluar në Fig.6.25, si rezultat në ekran shtypet:

Numri i kërkuar k=2

meqë vetëm dy vlera numerike i plotësojnë dy kushtet e shtruara (-7 dhe -5).

   Bllok-diagrami mund të përpilohet edhe ashtu që brenda tij njëkohësisht të
bëhen disa numërime.

    Shembull        Numri p i anëtarëve pozitivë dhe numri n i anëtarëve
                    negativë brenda vektorit A(m).




a. Bllok-diagrami                b. Rruga - për A=     2   -3    -7   4    1
Fushat numerike 117


                Fillimi

              m,(ai,i=1,m)

                  p=0

                  n=0

                  i=1

          Po                 Jo
                 ai < 0

      n=n+1                  p=p+1


                 i=i+1

       Po
                 i ≤ m
                        Jo
                  n,p

                 Fundi
                 Fig.6.26                       Fig.6.27
c. Programi
// Programi Prg6_26
#include <iostream>
using namespace std;
int main()
{
  int const m=5;int A[m]={2,-3,-7,4,1},i,p,n;
  p=0;n=0;
  for (i=0;i<m;i++)
       if (A[i]<0)
          n=n+1;
       else
          p=p+1;
  cout << "Anëtarë pozitiv p="
        << p
        << "n";
  cout << "Anëtarë negativ n="
        << n
        << "n";
  return 0;
118 Algoritmet

}
    Për vlerat e shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.6.27, pas
ekzekutimit të programit, si rezultat shtypet:
Anëtarë pozitivë p=3
Anëtarë negativë n=2
    Gjatë procedurës së numërimit të anëtarëve të vektorit mund të kërkohet që
njëkohësisht të shtypen anëtarët që i plotësojnë, ose anëtarët që nuk i plotësojnë kushtet
e numërimit.

    Shembull           Numëri k i anëtarëve të vektorit A(n) me vlera absolute
                       mes vlerave 3 dhe 8, duke shtypur njëkohësisht anëtarët me
                       vlera jashtë këtij diapazoni, si dhe indekset përkatëse.

a. Bllok-diagrami                 b. Rruga - për     A=       5    2     4     9     -7

             Fillimi

         n,(ai,i=1,n)

                k=0

                i=1

                            Jo
               ai>3
                       Po
                            Jo
               ai<8
                       Po
              k=k+1              i,ai


              i=i+1
       Po
              i ≤ n
                   Jo
                k

              Fundi

            Fig.6.28                                              Fig.6.29

c. Programi
// Programi Prg6_28
Fushat numerike 119

#include <iostream>
using namespace std;
int main()
{
  int const n=5;int A[n]={5,2,4,9,-7},i,k;
  k=0;
  for (i=0;i<n;i++)
  {
       if ((A[i]>3) && (A[i]<8))
          k=k+1;
       else
          cout << "i="
               << i
               << " A["
               << i
               << "]="
               << A[i]
               << "n";
  }
  cout << "Numri i kërkuar k="
        << k
        << "n";
  return 0;
}
    Nëse ekzekutohet programi i dhënë për vlerat hyrëse të shfrytëzuara gjatë
vizatimit të rrugës së kaluar në Fig.6.29, në ekran do të shtypen së pari indekset
dhe vlerat e anëtarëve të cilët nuk i plotësojnë kushtet:
i=1 A[1]=2
i=3 A[3]=9
i=4 A[4]=-7
dhe pastaj edhe numri i anëtarëve që i plotësojnë kushtet:
Numri i kërkuar k=2
    Detyra         Të gjendet:

                   a. sa anëtarë të vektorit të dhënë Y(n), përnga vlera
                   absolute janë numra më të mëdhenj se numri pozitiv x;

                   b. numri i anëtarëve në vektorin e dhënë T(m), të cilët janë
                   më të mëdhenj se x e më të vegjël se y, ku x>y.
Algoritmet C++
120 Algoritmet



Gjetja e anëtarëve të caktuar
    Shpeshherë, gjatë zgjidhjes së problemeve të ndryshme me kompjuter,
nevojiten vlera të caktuara brenda fushave numerike, siç është, p.sh., anëtari me
vlerë numerike minimale, ose anëtari me vlerë numerike maksimale. Procesi i
gjetjes së tyre fillon me përvetësimin e vlerës fillestare të një variable ndihmëse,
tek e cila do të ruhet vlera e kërkuar. Si vlerë fillestare e variablës ndihmëse
merret kryesisht anëtari i parë në vektor, ose vlera e saj formohet nga ky anëtar i
vektorit. Pastaj, krahasohen me vlerën e variablës ndihmëse të gjithë anëtarët e
tjerë të vektorit. Sa herë që gjatë krahasimit vlera e anëtarit të vektorit, e cila
krahasohet, është më e afërt me vlerën e kërkuar, ajo vlerë ruhet te variabla
ndihmëse. Në fund, pasi të krahasohen të gjithë anëtarët e vektorit, variabla
ndihmëse e përmban vlerën e kërkuar.

    Shembull        Gjetja e vlerës maksimale x në vektorin e dhënë A(n).


a. Bllok-diagrami                b. Rruga - për    A=      3       7   5   9


             Fillimi

          m,(ai,i=1,m)

                 x=a1

                 i=2

                           Po
              x ≥ ai
                    Jo
               x=ai

              i=i+1
        Po
              i ≤ m
                   Jo
                x

              Fundi

             Fig.6.30                                   Fig.6.31
Fushat numerike 121

c. Testimi – për A=       3     7    5      9

                                     Vlerat numerike
Hapi Blloku           Urdhëri                             Rezultati
                                         merren
                                                     Fillimi i
  1           1   Fillimi                           -
                                                     algoritmit
                  Lexo: m           prej njësisë     m=4, a1 =3, a2 =7,
  2           2
                  (ai ,i=1,m)       hyrëse           a3 =7, a4 =9
 3            3   x=a1              a1 →2            x=3
 4            4   i=2                       -        i=2
 5            5   Pyet: x≥ai        x→3, i→4, ai →2  Jo
 6            6   x=ai              i→4, ai →2       X=7
 7            7   i=i+1             i→4,             i=2+1=3
 8            8   Pyet:i≤m          i→7, m→2         Po
 9            5   Pyet: x≥ai        x→6, i→7, ai →2  Po
 10           7   i=i+1             i→7,             i=3+1=4
 11           8   Pyet:i≤m          i→10, m→2        Po
 12           5   Pyet: x≥ai        x→6, i→10, ai →2 Jo
 13           6   x=ai              i→10, ai →2      x=9
 14           7   i=i+1             i→10,            i=4+1=5
 15           8   Pyet:i≤m          i→14, m→2        Jo
 16           9   Shtyp:x           x→13             Shtypet numri 9
                                                     Fundi i
 17       10      Fundi                     -
                                                     algoritmit

                                         Fig.6.32
d. Programi

// Programi Prg6_30
#include <iostream>
using namespace std;
int main()
{
  int const m=4;
  int A[m]={3,7,5,9},i,x;
  x=A[0];
  for (i=1;i<m;i++)
  {
    if (x>=A[i])
    {
    }
    else
122 Algoritmet

       x=A[i];
    }
    cout << "Numri më i madh x="
         << x
         << "n";
    return 0;
}
    Pas ekzekutimit të programit, për vlerat hyrëse të shfrytëzuara për testimin e
bllok-diagramit, rezultati që shtypet në ekran është:

Numri më i madh x=9

   Gjatë gjetjes së vlerës së caktuar, si vlerë fillestare mund të merret edhe
anëtari i fundit në vektor.

    Shembull        Gjetja e anëtarit me vlerë numerike më të vogël v për nga
                    vlera absolute, në vektorin e dhënë G(n).


a. Bllok-diagrami                b. Rruga - për   A=     -7    3      -6   4     -8


               Fillimi

           n,(gi,i=1,n)

                 v=|gn|

                 i=n-1

                            Po
               v ≤ |gi|
                     Jo
                v=|gi|

                 i=i-1
         Po
                 i > 0
                      Jo
                   v

                 Fundi

              Fig.6.33                                     Fig.6.34
Fushat numerike 123

c. Programi

// Programi Prg6_33
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const n=5;
  int G[n]={-7,3,-6,4,-8},i,v;
  v=abs(G[n-1]);
  i=n-2;
  do
  {
     if (v<=abs(G[i]))
     {
     }
     else
        v=abs(G[i]);
     i--;
  }
  while (i>0);
  cout << "Vlera më e vogël v="
        << v
        << "n";
  return 0;
}

    Për vlerat numerike të shfrytëzuara gjatë vizatimit të rrugës së kaluar në
bllok-diagramin e dhënë në Fig.6.34, si rezultat shtypet:

Vlera më e vogël v=3

     Si vlerë fillestare gjatë gjetjes së anëtarit të caktuar në vektor mund të merret
edhe vlera e cilitdo anëtar brenda vektorit. Por, gjatë kësaj duhet gjetur
ligjshmërinë se si të bëhet krahasimi i të gjitha vlerave të vektorit me vlerën e
variablës ndihmëse.
     Përveç vlerës së anëtarit të caktuar, mund të kërkohet edhe pozita e tij në
vektor, përkatësisht indeksi i tij.

    Shembull       Gjetja e anëtarit me vlerë numerike më të madhe t për nga
                   vlera absolute, si dhe pozita përkatëse k në vektorin e dhënë
                   Z(n).
124 Algoritmet

a. Bllok-diagrami                 b. Rruga - për   A=    4   -7    2   9   -5


                Fillimi

              n,(zi,i=1,n)

                 t=|z1|

                    k=1

                    i=2

                             Jo
                t < |zi|
                       Po
                 t=|zi|

                    k=i

                 i=i+1
          Po
                 i ≤ n
                      Jo
                  k,t

                 Fundi

                Fig.6.35                                Fig.6.36

c. Programi

// Programi Prg6_35
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const n=5;
  int Z[n]={4,-7,2,9,-5},i,t,k;
  t=abs(Z[0]);
  k=0;
  for (i=1;i<n-1;i++)
Fushat numerike 125

    {
        if (t<abs(Z[i]))
        {
           t=abs(Z[i]);
           k=i;
        }
    }
    cout << "Vlera më e madhe ... t="
         << t
         << "n";
    cout << "Indeksi ............ k="
         << k
         << "n";
    return 0;
}

    Nëse programi i dhënë ekzekutohet për vlerat e anëtarëve të vektorit Z të
shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.6.36, rezultati që shtypet në
ekran është:

Vlera më e madhe ... t=9
Indeksi ............ k=3

    Brenda një vektori mund të gjendet edhe anëtari i caktuar nga grumbulli i
vlerave numerike të anëtarëve të cilët plotësojn kushte të fiksuara paraprakisht.
Kështu, p.sh., mund të gjendet anëtari më i madh (më i vogël) në grumbullin e
anëtarëve pozitivë (negativë) të vektorit, duke i marrë si vlera reale, ose si vlera
absolute etj.

    Shembull       Gjetja e anëtarit me vlerë numerike më të madhe d për nga
                   vlera absolute, në grumbullin e anëtarëve negativë të vektorit
                   A(n).
126 Algoritmet

a. Bllok-diagrami
                       Fillimi

                    n,(ai,i=1,n)

                         i=1
                                          X             Y
                                  Po
                        ai < 0
                             Jo                   d=|ai|
                        i=i+1
                                                  k=i+1
                 Po
                        i ≤ n
                                                                  Jo
                             Jo                    ak<0
                                                        Po
                                                                  Jo
                                                  d>|ak|
                                                        Po        d=|ak|


                                                  k=k+1
                                           Po
                                                  k ≤ n
                                                             Jo
                       Mesazhi                      d

                        Fundi

                                       Fig.6.37
    Pjesa X e bllok-diagramit të dhënë në Fig.6.37 shfrytëzohet për përcaktimin e
vlerës fillestare të variablës d, në të cilën si rezultat do ruhet vlera e kërkuar e
vektorit. Në këtë pjesë, variablës d i shoqërohet vlera e anëtarit negativ, i cili
gjendet në procesin e kërkimit, që fillon prej anëtarit të parë të vektorit.
    Në pjesën Y, pasi paraprakisht është përcaktuar vlera fillestare e variablës d,
procedura e krahasimit dhe e gjetjes së vlerës absolute më të madhe në
grumbullin e anëtarëve negativë fillon prej anëtarit k=i+1, ku i është indeksi i
anëtarit të parë negativ në vektor, i cili fitohet në pjesën X të bllok-diagramit.
Fushat numerike 127

b. Rruga - për   A =   3   9   -2   6     -7   5




                               Fig.6.38
c. Programi

// Programi Prg6_37
#include <iostream>
#nclude <cmath>
using namespace std;
int main()
{
  int const n=6;
  int A[n]={3,-9,2,-6,7,-15},i,d,k;
  i=0;
128 Algoritmet

     do
     {
          if (A[i]<0)
             goto Y;
          i++;
     }
     while (i<n);
     cout << "Nuk ka asnjë vlerë negative"
          << "n";
     goto F;
Y:
     d=abs(A[i]);
     for (k=i+1;k<n;k++)
     {
         if (A[k]<0)
            if (d>abs(A[k]))
            {
            }
            else
                d=abs(A[k]);
     }
     cout << "Vlera e gjetur d="
          << d
          << "n";
F:
     return 0;
}

    Programi i dhënë është shkruar ashtu që për nga struktura t'i ngjajë bllok-
diagramit. Nëse gjatë kërkimit në pjesën X nuk gjendet asnjë anëtar negativ, është
paraparë që si rezultat të shtypet mesazhi përkatës:

Nuk ka asnjë vlerë negative

    Për vlerat e marra gjatë vizatimit të rrugës së kaluar në Fig.6.38 rezultati që
shtypet në ekran është:

Vlera e gjetur d=7

sepse, prej dy vlerave negative (-2 dhe -7), numri i dytë është më i madh si
vlerë absolute.



     Detyra        Në vektorin e dhënë F(n), të gjendet:
Fushat numerike 129


                  a. anëtari me vlerë numerike më të vogël v, si dhe indeksi
                  përkatës k;

                  b. anëtari më i madh, në grupin e vlerave numerike, të cilat
                  sillen mes vlerave x dhe y, nëse x<y.




Radhitja e anëtarëve
  Anëtarët e vektorit të dhënë A(n) mund të radhiten sipas madhësisë, në
(n-1)-hapa, kështu:

   Hapi i parë    (i=1)                  a 1 krahasohet me a 2 ,a3 ,...,an
   Hapi i dytë    (i=2)                  a 2 krahasohet me a 3 ,a4 ,...,an
    .............                        ...........
   Hapi i fundit (i=n-1)                 a n-1 krahasohet me a n .

Në çdo hap të ndërmarrë fiksohet vlera numerike e një anëtari të vektorit, kurse
ngelin të pandryshuara vlerat numerike të anëtarëve që janë fiksuar në hapat
paraprakë. Gjatë krahasimit të dy anëtarëve, për ndërrimin e vendeve të tyre
shfrytëzohet një variabël ndihmëse, duke pasur parasysh radhën e cila është
treguar në Fig.6.39, ku b është variabla ndihmëse, kurse ai dhe aj janë anëtarët,
vlerat e të cilëve i ndërrojnë vendet mes vete.

                                            2
                                ai                      aj

                                     1              3
                                            b


                                         Fig.6.39



    Shembull      Radhitja sipas madhësisë e vlerave numerike të anëtarëve të
                  vektorit A(n), prej vlerës më të vogël.
130 Algoritmet

a. Bllok-diagrami                    b. Rruga - për   A=   7   2      8   3


                    Fillimi

               n,(ai,i=1,n)

                      i=1

                     j=i+1

                                Po
                     ai≤aj
                          Jo
                     b=ai

                     ai=aj

                      aj=b


                     j=j+1

              Po
                      j≤n
                         Jo
                     i=i+1

              Po
                     i≤ n-1
                         Jo
                   (ai,i=1,n)

                     Fundi

                     Fig.6.40                              Fig.6.41
c. Programi

// Programi Prg6_40
#include <iostream>
using namespace std;
int main()
{
  int const n=4;
Fushat numerike 131

    int A[n]={7,2,8,3},i,j,b;
    for (i=0;i<n-1;i++)
      for (j=i+1;j<n;j++)
      {
          if (A[i]<=A[j])
          {
          }
          else
          {
             b=A[i];
             A[i]=A[j];
             A[j]=b;
          }
      }
    cout << "A=[ ";
    for (i=0;i<n;i++)
    cout << A[i]
         << " ";
    cout << "]"
         << "n";
    return 0;
}

   Këtu, meqë si shembull është marrë vektori me n=4 anëtarë, radhitja do të
kryhet në 3-hapa. Vlerat e anëtarëve të vektorit në fund të çdo hapi janë:

    Hapi i parë (i=0):                    2    7      8    3
    Hapi i dytë (i=1):                    2    3      8    7
    Hapi i tretë (i=2):                   2    3      7    8

Vlerat e fiksuara në fund të hapit të tretë janë vlerat e radhitura të vektorit sipas
madhësive, prej më të voglit kah më i madhi, dhe rezultati që shtypet pas
ekzekutimit të programit është:

A=[     2   3       7     8    ]

   Bllok-diagrami i dhënë në Fig.6.40 gjegjësisht programi përkatës, vlen edhe
nëse vektori përmban vlera numerike negative.
   Anëtarët e vektorit mund të radhiten edhe në bazë të vlerave absolute.

    Shembull            Radhitja sipas vlerave absolute të anëtarëve të vektorit A(n),
                        prej vlerës më të madhe.

a. Bllok-diagrami                    b. Rruga - për       A=   3   -7   5   -4
132 Algoritmet


                 Fillimi

              n,(ai,i=1,n)

                   i=1

                  j=i+1

                               Jo
                 |ai|≥|aj|
                          Po
                   b=ai

                  ai=aj

                   aj=b


                  j=j+1

          Po
                   j≤n
                      Jo
                  i=i+1

          Po
                  i≤ n-1
                     Jo
               (ai,i=1,n)

                  Fundi

                  Fig.6.42          Fig.6.43

c. Programi

// Programi Prg6_42
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
Fushat numerike 133

    int const n=4;
    int A[n]={3,-7,5,-4},i,j,b;
    for (i=0;i<n-1;i++)
      for (j=i+1;j<n;j++)
      {
           if (abs(A[i])>=abs(A[j]))
           {
           }
           else
           {
              b=A[i];
              A[i]=A[j];
              A[j]=b;
           }
      }
    cout << "A=[ ";
    for (i=0;i<n;i++)
        cout << A[i]
             << " ";
    cout << "]"
          << "n";
    return 0;
}

   Si rezultat, pas ekzekutimit të programit të dhënë në ekran, do të shtypet
vektori me vlerat e radhitura brenda tij, kështu:

A=[    -7    5    -4    3    ]

meqë është kërkuar radhitja në bazë të vlerave absolute.

    Detyra        Të radhiten sipas madhësisë anëtarët e vektorit të dhënë
                  G(m):

                  a. prej më të madhit kah më i vogli;

                  b. si vlera absolute, prej më të voglit kah më i madhi.
134 Algoritmet


Matricat
   Gjatë punës me matrica, për t'i shfrytëzuar anëtarët e vendosur në fushat e
veçanta të tyre, përdoren indekset e rreshtave dhe të kolonave përkatëse.

Përcaktimi i matricave
   Vlerat e anëtarëve të matricave kompjuterit mund t'i jepen si vlera të gatshme
hyrëse, ose duke i llogaritur ato në bazë të procedurës së dhënë.

    Shembull      Formimi i matricës A(m,n), duke i llogaritur anëtarët aij të
                  saj kështu:

                              ⎧ 2i + 3j    për i < j
                              ⎪
                      aij   = ⎨i + j       për i = j
                              ⎪ 3i − j2    për i > j
                              ⎩

                  nëse dihen dimensionet e matricës.
Fushat numerike 135

a. Bllok-diagrami

                                           Fillimi

                                              m,n

                                              i=1


                                              j=1

                                      <                  >
                                            i < j
                                              >-
                                                 =
                          aij=2i+3j        aij=i+j           aij=3i-j2


                                            j=j+1

                                Po
                                             j ≤ n
                                                    Jo
                                            i=i+1

                                Po
                                             i ≤ m
                                                    Jo
                                          ⎛ a ,i=1,m ⎞
                                          ⎜ ij j=1,n ⎟
                                          ⎝          ⎠

                                            Fundi

                                            Fig.6.44




b. Rruga - për m=2, n=3
136 Algoritmet




                          Fig.6.45
c. Programi

// Programi Prg6_44
#include <iostream>
using namespace std;
int main()
{
  int const m=2,n=3;
  int i,j,A[m][n];
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
      if (i<j)
Fushat numerike 137

           A[i][j]=2*i+3*j;
        else
           if (i==j)
               A[i][j]=i+j;
           else
               A[i][j]=3*i-j*j;
    cout << "Matrica e formuar"
         << "n";
    for (i=0;i<m;i++)
    {
        for (j=0;j<n;j++)
             cout << A[i][j]
                  << " ";
        cout << "n";
    }
    return 0;
}

    Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është:

Matrica e formuar
   0   3   6
   3   2   8

   Ligjshmëritë për llogaritjen e anëtarëve të matricave, përkatësisht për
formimin e tyre, mund të jenë të ndryshme.

    Shembull        Formimi i matricës R(m,n), duke llogaritur anëtarët e saj
                    kështu:

                               ⎧ i + j+ 1
                               ⎪3 ∑ (k + 2i − 3j)    për i < j
                               ⎪
                       rij   = ⎨ k =1
                               ⎪
                               ⎪ (i + j)!
                               ⎩                     për i ≥ j




a. Bllok-diagrami
138 Algoritmet

                                          Fillimi

                 i+j+1                       m,n
           s=     ∑(k + 2i − 3j)
                 k =1                        i=1

                                             j=1

                                    Po                   Jo           F=(i+j)!
                                           i < j


                             s=0                               F=1

                             k=1                               k=1


                        s=s+(k+2i-3j)                         F=F⋅k

                            k=k+1                             k=k+1
                    Po                                  Po
                          k ≤ i+j+1                           k ≤ i+j
                                   Jo                               Jo
                           rij=3s                             rij=F


                                           j=j+1

                                           j ≤ n

                                           i=i+1

                                           i ≤ n


                                         ⎛ r ,i=1,m ⎞
                                         ⎜ ij j=1,n ⎟
                                         ⎝          ⎠

                                           Fundi

                                           Fig.6.46
Fushat numerike 139

    Këtu, nuk është vizatuar edhe rruga që kalohet në bllok-diagram për vlera të
caktuara të dimensioneve të matricës m dhe n, meqë numri i tyre është i madhë,
gjë që do të praktikohet edhe në shumicën e shembujve të pjesës vijuese të librit.

b. Programi

// Programi Prg6_46
#include <iostream>
using namespace std;
int main()
{
     int const m=2,n=3;
     int i,j,k,s,f,R[m][n];
     for (i=0;i<m;i++)
         for (j=0;j<n;j++)
              if (i<j)
              {
                s=0;
                for (k=1;k<=(i+j+1);k++)
                     s=s+(k+2*i-3*j);
                R[i][j]=3*s;
              }
              else
              {
                f=1;
                for (k=1;k<=(i+j);k++)
                     f=f*k;
                R[i][j]=f;
              }
     cout << "Matrica e formuar"
           << "n";
     for (i=0;i<m;i++)
     {
           for (j=0;j<n;j++)
           {
                cout.width(5);
                cout << R[i][j];
           }
           cout << "n";
     }
     return 0;
}
140 Algoritmet


  Nëse ekzekutohet programi i dhënë për matricën me dimensione m=2 dhe
n=3, rezultati që shtypet në ekran është:

Matrica e formuar
    1   -9 -36
    1    2 -18

    Detyra       Të formohet matrica katrore G(m,m), duke përcaktuar
                 elementet e saj kështu:

                 a.                        j=1   2    3   ...   m
                                     i=1    1    5    5   ...   5
                                      2    -3    1    5   ...   5
                               G =    3    -3    -3   1   ...   5
                                     ... ... ... ... ... ...
                                      m    -3    -3   -3 ...    1

                 b.
                                           j=1   2    3   ...   m
                                     i=1    0    2    3   ...   m
                                      2     2    0    3   ...   m
                               G =    3     2    2    0   ...   m
                                     ... ... ... ... ... ...
                                      m    2     2    2   ...   0




   Matricat mund të formohen edhe duke shfrytëzuar vlerat e anëtarëve të
vektorëve të dhënë.
Fushat numerike 141

    Shembull        Formimi i matricës katrore A(m,m), duke shfrytëzuar
                    anëtarët e vektorit të dhënë D(m), kështu:
                                           j=1         2       3       ...    m
                                     i=1    d1     d1 +2 d1 +3 ... d1 +m
                                      2    d2 +8       d2    d2 +3 ... d2 +m
                               A =    3    d3 +8 d3 +8         d3      ... d3 +m
                                     ... ... ... ... ... ...
                                      m    dm +8 dm +8 dm +8 ...              dm


a. Bllok-diagrami                                           Fillimi

                                                       m,(di,i=1,m)

                                                              i=1


                                                              j=1

                                                   <                      >
                                                            i < j
                                                               -
                                                               >
                                                                 =
                                     aij=di+j               aij=di            aij=di+8


                                                            j=j+1

                                             Po
                                                             j ≤ m
                                                                    Jo
                                                            i=i+1

                                             Po
                                                             i ≤ m
                                                                    Jo
                                                        ⎛ a ,i=1,m ⎞
                                                        ⎜ ij j=1,m ⎟
                                                        ⎝          ⎠

                                                            Fundi

                                                            Fig.6.47
142 Algoritmet

    Siç shihet edhe nga bllok-diagrami, për i<j duhet të mbushen anëtarët mbi
diagonalen kryesore, kurse kur është i>j kemi të bëjmë me anëtarët nën
diagonalen kryesore.
b. Programi
// Programi Prg6_47
#include <iostream>
using namespace std;
int main()
{
  int const m=5;
  int D[m]={3,-7,4,9,-2};
  int i,j,A[m][m];
  for (i=0;i<m;i++)
       for (j=0;j<m;j++)
           if (i<j)
              A[i][j]=D[i]+j;
           else
              if (i==j)
                   A[i][j]=D[i];
              else
                   A[i][j]=D[i]+8;
  cout << "Matrica e formuar"
        << "n";
  for (i=0;i<m;i++)
  {
     for (j=0;j<m;j++)
     {
         cout.width(5);
         cout << A[i][j];
     }
     cout << "n";
  }
  return 0;
}

    Rezultati që shtypet në ekran pas ekzekutimit të programit të dhënë është:
Matrica e formuar
      3       4       5       6       7
      1     -7      -5      -4      -3
     12     12        4       7       8
     17     17      17        9     13
      6       6       6       6     -2
    Me vlerat e anëtarëve të vektorit, përveç diagonales kryesore që u tregua në
shembullin e mësipërm, mund të mbushet edhe një rresht, ose një kolonë e
caktuar e matricës.
Fushat numerike 143

    Shembull        Formimi i matricës G(m,m), duke i shfrytzëzuar edhe
                    anëtarët e vektorit B(m):
                                         j=1   2    3   ...     m
                                    i=1 b1     1    1   ...     1
                                     2   b2    2    2   ...     2
                              G =    3   b3    3    3   ...     3
                                    ... ... ... ... ... ...
                                     m   bm    m    m   ...     m

a. Bllok-diagrami
                                                        Fillimi

                                                    m,(bi,i=1,m)

                                                          i=1


                                                          j=1

                                               Po                      Jo
                                                          j=1

                                          gij=bj                       gij=i


                                                         j=j+1

                                               Po
                                                         j ≤ m
                                                                Jo
                                                         i=i+1

                                               Po
                                                         i ≤ m
                                                                Jo
                                                     ⎛ g ,i=1,m ⎞
                                                     ⎜ ij j=1,m ⎟
                                                     ⎝          ⎠

                                                         Fundi
                                                        Fig.6.48
144 Algoritmet

b. Programi

// Programi Prg6_48
#include <iostream>
using namespace std;
int main()
{
  int const m=5;
  int B[m]={9,2,-4,6,-5};
  int i,j,G[m][m];
  for (i=0;i<m;i++)
      for (j=0;j<m;j++)
           if (j==0)
               G[i][j]=B[i];
           else
               G[i][j]=i;
  cout << "Matrica e formuar"
        << "n";
  for (i=0;i<m;i++)
  {
      for (j=0;j<m;j++)
      {
           cout.width(5);
           cout << G[i][j];
      }
      cout << "n";
  }
  return 0;
}

    Nëse programi i dhënë ekzekutohet, si rezultat në ekran do të fitohet:

Matrica e formuar
    9    0    0              0       0
    2    1    1              1       1
   -4    2    2              2       2
    6    3    3              3       3
   -5    4    4              4       4
Fushat numerike 145


    Detyra       Të formohet matrica katrore A(m,m), nëse anëtarët e
                 vektorit të dhënë R(m) brenda matricës vendosen kështu:

                 a.                                     b.

                 a.                                 b.
                            j=1   2   ...   n                      j=1   2    ...   n
                      i=1             R                      i=1
                        2                                     2
                                                                         -5         R
                 A = ...              3             A = ...
                        m                                     m

                 kurse pjesët e tjera të matricës mbushen me numrat e dhënë.




   Formimi i matricave mund të mbështetet edhe në shfrytëzimin e anëtarëve të
matricave të tjera.

    Shembull     Formimi i matricës Z, duke shfrytëzuar anëtarët e matricës
                 A(m,m), kështu:


                                          j=1   2   ...       m    m+1
                                  i=1
                                      2
                                                    A               4
                              Z = ...
                                      m
                                  m+1               9               0
146 Algoritmet

a. Bllok-diagrami
                           Fillimi

                                 i=1,m
                         m,⎛ aij,j=1,m ⎞
                           ⎜           ⎟
                           ⎝           ⎠

                              i=1


                              j=1

                            zij=aij

                             j=j+1

                    Po
                             j ≤ m
                                    Jo
                            zi,m+1=4

                             i=i+1

                    Po
                             i ≤ m
                                    Jo
                              j=1

                            zm+1,j=9

                             j=j+1

                    Po
                             j ≤ m
                                    Jo
                           zm+1,m+1=0

                         ⎛ z ,i=1,m +1⎞
                         ⎜ ij j=1,m +1 ⎟
                         ⎝             ⎠

                             Fundi

                             Fig.6.49
Fushat numerike 147

b. Programi

// Programi Prg6_49
#include <iostream>
using namespace std;
int main()
{
  int const m=4;
  int A[m][m]={ {3,5,-4,2},
                 {6,9,-2,8},
                 {1,-3,7,4},
                 {2,0,-5,3}
              };
  int i,j,Z[m+1][m+1];

    for (i=0;i<m;i++)
    {
        for (j=0;j<m;j++)
             Z[i][j]=A[i][j];
        Z[i][m]=4;
    }
    for (j=0;j<m;j++)
        Z[m][j]=9;
    Z[m][m]=0;
    cout << "Matrica e formuar"
          << "n";
    for (i=0;i<=m;i++)
    {
        for (j=0;j<=m;j++)
        {
             cout.width(5);
             cout << Z[i][j];
        }
        cout << "n";
    }
    return 0;
}
    Pas ekzekutimit të programit, rezultati që shtypet në ekran është:

Matrica e formuar
    3    5   -4              2       4
    6    9   -2              8       4
    1   -3    7              4       4
    2    0   -5              3       4
    9    9    9              9       0
148 Algoritmet

    Algoritmi për formimin e matricës Z mund të realizohet edhe ndryshe, duke
paraparë mbushjen e të gjitha pjesëve të saj brenda unazave për indekset i dhe
j, të cilat ndryshohen mes vlerave 1 dhe m+1, ashtu siç është treguar në vijim.

a. Bllok-diagrami
                                         Fillimi

                                               i=1,m
                                       m,⎛ aij,j=1,m ⎞
                                         ⎜           ⎟
                                         ⎝           ⎠

                                            i=1


                                            j=1

                                 Po                      Jo
                                           i=m+1
                 Po               Jo                     Po              Jo
                       j=m+1                                   j=m+1

               zij=0            zij=9                  zij=4           zij=aij



                                           j=j+1

                                Po
                                          j≤ m+1
                                               Jo
                                           i=i+1

                                Po
                                          i≤ m+1
                                                  Jo
                                       ⎛ z ,i=1,m +1 ⎞
                                       ⎜ ij j=1,m +1 ⎟
                                       ⎝             ⎠

                                           Fundi

                                           Fig.6.50
Fushat numerike 149

b. Programi

// Programi Prg6_50
#include <iostream>
using namespace std;
int main()
{
      int const m=4;
      int A[m][m]={ {3,5,-4,2},
                       {6,9,-2,8},
                       {1,-3,7,4},
                       {2,0,-5,3}
                    };
      int i,j,Z[m+1][m+1];
      for (i=0;i<=m;i++)
          for (j=0;j<=m;j++)
               if (i==m)
                  if (j==m) Z[i][j]=0;
                  else        Z[i][j]=9;
               else
                  if (j==m) Z[i][j]=4;
                  else        Z[i][j]=A[i][j];
      cout << "Matrica e formuar"
            << "n";
      for (i=0;i<=m;i++)
      {
          for (j=0;j<=m;j++)
          {
                  cout.width(5);
                  cout << Z[i][j];
          }
          cout << "n";
      }
      return 0;
}

    Detyra    Duke shfrytëzuar anëtarët e matricës X(m,m), të formohet
              matrica R, kështu:
              a.                                  b.


                          0        X          R =   1         X        2
                    R =

                          5        -9
150 Algoritmet

     Gjatë formimit të matricave, pjesë të caktuara të tyre mund të mbushen edhe
me vlerat e matricave të njohura, p.sh., siç është matrica njësi, ose matrica zero
etj.

    Shembull      Formimi i matricës T, kështu:

                                               j=1 ...    n
                                       i=1
                                        .
                                                     E
                                        :
                                    T = n
                                       n+1
                                        .
                                                     0
                                        :
                                        2n

                  ku E(n,n) është matrica njësi, kurse O(n,n) është matrica
                  zero.
Fushat numerike 151

a. Bllok-diagrami
                                             Fillimi

                                                 n

                                                i=1


                                                j=1

                                  Po                       Jo
                                               i ≤ n

                     Jo                 Po
                            i=j

                    tij=0              tij=1                    tij=0


                                               j=j+1

                                  Po
                                               j ≤ n
                                                   Jo
                                               i=i+1

                                  Po
                                               i ≤ 2n
                                                      Jo
                                         ⎛ t ,i=1,2n ⎞
                                         ⎜ ij j=1,n ⎟
                                         ⎝           ⎠

                                               Fundi

                                               Fig.6.51
b. Programi

// Programi Prg6_51
#include <iostream>
using namespace std;
int main()
{
  int const n=5;
  int i,j,T[2*n][n];
152 Algoritmet


    for (i=0;i<(2*n);i++)
      for (j=0;j<n;j++)
          if (i<n)
              if (i==j)
                 T[i][j]=1;
              else
                 T[i][j]=0;
          else
              T[i][j]=0;

    cout << "Matrica e formuar"
         << "n";
    for (i=0;i<(2*n);i++)
    {
      for (j=0;j<n;j++)
      {
          cout.width(3);
          cout << T[i][j];
      }
      cout << "n";
    }
    return 0;
}

    Rezultati që shtypet në ekran pas ekzekutimit të programit të dhënë është:

Matrica     e formuar
  1 0       0 0 0
  0 1       0 0 0
  0 0       1 0 0
  0 0       0 1 0
  0 0       0 0 1
  0 0       0 0 0
  0 0       0 0 0
  0 0       0 0 0
  0 0       0 0 0
  0 0       0 0 0
Fushat numerike 153


   Detyra       Të formohet matrica R, kështu:

                a.                    j=1 ...    m   m+1 ... 2m
                               i=1
                                2
                            R = .           E             0
                                :
                                m


                b.                     j=1 ... m+1
                               i=1
                                2
                            R = .          5         E
                                :
                                m


                ku E(m,m) është matrica njësi, kurse O(m,m) është matrica
                zero.


   Matricat mund të formohen edhe duke shfrytëzuar njëkohësisht më shum
matrica, me vlera të çfarëdoshme.

   Shembull     Formimi i matricës D nga anëtarët e matricave A(m,m) dhe
                B(m,m), kështu:


                                      j=1 ...    m   m+1 ... 2m
                               i=1
                                2
                            D = .           A             B
                                :
                                m
154 Algoritmet

a. Bllok-diagrami
                                Fillimi

                               i=1,m ⎞ ⎛    i=1,m ⎞
                       m,⎛ aij,
                         ⎜           ⎟,⎜ b ,      ⎟
                         ⎝     j=1,m ⎠ ⎝ ij j=1,m ⎠

                                   i=1


                                   j=1

                         Po                     Jo
                                  j≤ m

                    dij=aij                   dij=bi,j-m


                                 j=j+1

                         Po
                                 j ≤ 2m
                                         Jo
                                 i=i+1

                         Po
                                  i≤ m
                                         Jo
                              ⎛ d ,i=1,m ⎞
                              ⎜ ij j=1,2m ⎟
                              ⎝           ⎠

                                 Fundi

                                 Fig.6.52

b. Programi
// Programi Prg6_52
#include <iostream>
using namespace std;
int main()
{
  int const m=3;
  int A[m][m]={ {4,7,3},
                 {-2,3,9},
Fushat numerike 155

                    {8,-4,2}
                 };
    int B[m][m]={ {-2,9,1},
                    {4,8,3},
                    {6,1,7}
                 };
    int i,j,D[m][2*m];
    for (i=0;i<m;i++)
        for (j=0;j<(2*m);j++)
             if (j<m)
                 D[i][j]=A[i][j];
             else
                 D[i][j]=B[i][j-m];
    cout << "Matrica e formuar"
          << "n";
    for (i=0;i<m;i++)
    {
        for (j=0;j<(2*m);j++)
        {
             cout.width(4);
             cout << D[i][j];
        }
      cout << "n";
    }
    return 0;
}
  Pas ekzekutimit të programit të dhënë, rezultati që shtypet në ekran është:
Matrica e formuar
   4    7     3 -2         9     1
  -2    3     9      4     8     3
   8 -4       2      6     1     7
156 Algoritmet


    Detyra       Të formohet matrica G, duke shfrytëzuar anëtarët e matricave
                 A(m,n) dhe B(m,n), kështu:
                 a.                         b.



                             A                             A          B
                                                 G =
                   G =                 3
                                                               -6
                             B




    Kur në formimin e matricës përdoren më shum matrica, mbushja e saj në
bllok-diagram mund të realizohet duke shfrytëzuar pjesë të veçanta për çdo
matricë, ose përmes një tërësie të përbërë për të gjitha matricat.

    Shembull     Formimi i matricës R, duke shfrytëzuar anëtarët e matricave
                 F(m,n) dhe G(l,k), kështu:


                                       j=1 ...   n     n+1 ... n+k
                                 i=1

                                .           F              0
                                :
                            R = m
                               m+1

                                  .         0              G
                                  :
                                 m+l


                 ku me 0 është shënuar matrica zero.
Fushat numerike 157

a. Bllok-diagrami
                                       Fillimi

                                       m,n,l,k

                               ⎛ f ,i=1,m ⎞,⎛ g ,i=1,l ⎞
                               ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟
                               ⎝          ⎠⎝           ⎠

                                          i=1


                                          j=1

                               Po                       Jo
                                          i≤ m
                Po              Jo                     Po                Jo
                        j≤ n                                  j≤ n

              rij=fij          rij=0                  rij=0          rij=gi-m,j-n



                                         j=j+1

                               Po
                                        j≤ n+k
                                             Jo
                                         i=i+1

                               Po
                                        i≤ m+l
                                                 Jo
                                     ⎛ r ,i=1,m +l ⎞
                                     ⎜ ij j=1,n+k ⎟
                                     ⎝             ⎠

                                         Fundi

                                        Fig.6.53
b. Programi

// Programi Prg6_53
#include <iostream>
using namespace std;
int main()
158 Algoritmet

{
    int const m=3,n=4,l=4,k=3;
    int F[m][n]={ {4,7,3,5},
                    {-2,3,9,2},
                    {8,-4,2,7}
                 };
    int G[l][k]={ {-2,9,1},
                    {4,8,3},
                    {6,1,7},
                    {-9,4,2}
                 };
    int i,j,R[m+l][n+k];
    for (i=0;i<m+l;i++)
      for (j=0;j<n+k;j++)
           if (i<m)
               if (j<n)
                  R[i][j]=F[i][j];
               else
                  R[i][j]=0;
           else
               if (j<n)
                  R[i][j]=0;
               else
                  R[i][j]=G[i-m][j-n];
    cout << "Matrica e formuar"
          << "n";
    for (i=0;i<m+l;i++)
    {
        for (j=0;j<n+k;j++)
        {
             cout.width(4);
             cout << R[i][j];
        }
        cout << "n";
    }
    return 0;
}

    Rezultati që do të shtypet në ekran, nëse ekzekutohet programi i dhënë,
është:
Matrica e formuar
     4    7      3      5     0     0     0
   -2     3      9      2     0     0     0
     8 -4        2      7     0     0     0
     0    0      0      0 -2        9     1
Fushat numerike 159

    0      0        0   0    4      8     3
    0      0        0   0    6      1     7
    0      0        0   0   -9      4     2

   Këtu, siç u theksua edhe më sipër, mund të zbatohet procedura e mbushjes
parciale të matricës. Kështu, nëse, p.sh., mbushet së pari pjesa e majtë e matricës
dhe pastaj pjesa e djathtë e saj, algoritmi përkatës do të duket si në vijim.

a. Bllok-diagrami
                                         Fillimi

                                         m,n,l,k

                                 ⎛ f ,i=1,m ⎞,⎛ g ,i=1,l ⎞
                                 ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟
                                 ⎝          ⎠⎝           ⎠

                                              i=1


                                              j=1

                                  Po                      Jo
                                              i≤ m

                             rij=fij                      rij=0


                                           j=j+1

                                 Po
                                              j≤ n
                                                     Jo
                                           i=i+1

                                 Po
                                          i≤ m+l
                                                     Jo
                                               A
160 Algoritmet


                                            A


                                           i=1


                                          j=n+1

                                 Po                       Jo
                                           i≤ m

                              rij=0                    rij=gi-m,j-n


                                          j=j+1

                                 Po
                                          j≤ n+k
                                                  Jo
                                          i=i+1

                                 Po
                                          i≤ m+l
                                                  Jo
                                      ⎛ r ,i=1,m +l ⎞
                                      ⎜ ij j=1,n+k ⎟
                                      ⎝             ⎠

                                          Fundi

                                         Fig.6.54
b. Programi

   Pjesa e programit për mbushjen e matricës me vlera, e cila ndryshon nga
programi që u dha më sipër, duket si në vijim.

// Programi Prg6_54
.......................................
      for (i=0;i<m+l;i++)
          for (j=0;j<n;j++)
              if (i<m)
                  R[i][j]=F[i][j];
               else
                  R[i][j]=0;
      for (i=0;i<m+l;i++)
Fushat numerike 161

          for (j=n;j<n+k;j++)
              if (i<m)
                 R[i][j]=0;
              else
                 R[i][j]=G[i-m][j-n];
.............................................


     Nëse matricat që përdoren për mbushje kanë vlera të caktuara, gjatë
vendosjes së vlerave në matricë duhet pasur kujdes në indekset e anëtarëve të
cilët shfrytëzohen për mbushje.

    Shembull      Formimi i matricës F, duke shfrytëzuar anëtarët e matricave
                  A(m,n), B(m,k), C(l,n) dhe D(l,k), kështu:

                                         j=1 ...    n   n+1 ... n+k
                                  i=1
                                   .
                                   .           A              B
                                   .
                               F = m
                                  m+1
                                   .
                                   .           C              D
                                   .
                                  m+l
162 Algoritmet


a. Bllok-diagrami
                                        Fillimi

                                        m,n,l,k

                               ⎛ a ,i=1,m ⎞,⎛ b ,i=1,m ⎞
                               ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟
                               ⎝          ⎠⎝           ⎠

                               ⎛ c ,i=1,l ⎞,⎛ d ,i=1,l ⎞
                               ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟
                               ⎝          ⎠⎝           ⎠

                                             i=1


                                             j=1

                                Po                         Jo
                                            i≤ m
                 Po              Jo                       Po                  Jo
                       j≤ n                                        j≤ n

             fij=aij          fij=bi,j-n              fij=ci-m,j          fij=di-m,j-n



                                           j=j+1

                               Po
                                           j≤ n+k
                                               Jo
                                           i=i+1

                               Po
                                           i≤ m+l
                                               Jo
                                      ⎛ f ,i=1,m +l ⎞
                                      ⎜ ij j=1,n+ k ⎟
                                      ⎝             ⎠

                                           Fundi

                                           Fig.6.55
Fushat numerike 163


b. Programi
// Programi Prg6_55
#include <iostream>
using namespace std;
int main()
{
  int const m=3,n=2,l=2,k=3;
  int A[m][n]={ {4,7},
                 {-2,5},
                 {8,3}};
  int B[m][k]={ {-1,9,6},
                 {2,3,8},
                 {4,1,5}
              };
  int C[l][n]={ {1,2},
                 {3,4}
              };
  int D[l][k]={ {5,4,3},
                 {2,1,0}
              };
  int i,j,F[m+l][n+k];
  for (i=0;i<m+l;i++)
      for (j=0;j<n+k;j++)
           if (i<m)
              if (j<n)
                  F[i][j]=A[i][j];
              else
                  F[i][j]=B[i][j-n];
           else
              if (j<n)
                  F[i][j]=C[i-m][j];
              else
                  F[i][j]=D[i-m][j-n];
  cout << "Matrica e formuar"
       << "n";
  for (i=0;i<m+l;i++)
  {
      for (j=0;j<n+k;j++)
      {
           cout.width(4);
           cout << F[i][j];
    }
    cout << "n";
  }
164 Algoritmet

    return 0;
}
    Pas ekzekutimit të programit, matrica F e shtypur në ekran duket kështu:

Matrica e formuar
   4   7 -1    9                6
  -2   5   2   3                8
   8   3   4   1                5
   1   2   5   4                3
   3   4   2   1                0

    Detyra            Të formohet matrica F, duke shfrytëzuar anëtarët e matricave
                      A(m,n) dhe B(k,l), si dhe matricën njësi E dhe matricën
                      zero 0, ashtu siç është treguar më poshtë.


                 a.

                                        E       A
                               F=
                                        B       0

                 b.

                                         0      E
                               F=
                                        A       0

                 c.

                                        E       0
                               F=
                                         0      E

                 d.

                                        A       E
                               F=
                                        B       0
Algoritmet C++
Fushat numerike 165



 Operacionet aritmetikore
    Mbi anëtarët e matricave mund të zbatohen operacionet elementare
aritmetikore.

Mbledhja dhe zbritja
   Mblidhen vetëm matricat të cilat kanë dimensione të barabarta. Operacioni i
mbledhjes kryhet duke i mbledhur anëtarët në pozicionet e njëjta të dy matricave,
përkatësisht anëtarët me indekse të njëjtë.

    Shembull      Gejtja e shumës C(m,n) të matricave A(m,n) dhe
                  B(m,n).



                        a11 a12 ... a1n           b11 b12 ... b1n
                        a21 a22 ... a2n           b21 b22 ... b2n
         C = A+B =                           +                       =
                        ... ... ... ...           ... ... ... ...
                        am1 am2 ... amn           bm1 bm2 ... bmn

                        a11 +b11 a12 +b12   ...   a1n +b1n
                        a21 +b21 a22 +b22   ...   a2n +b2n
                    =
                         ...      ...       ...    ...
                        am1 +bm1 am2 +bm2   ...   amn +bmn

                          c11 =a11 +b11
                          c12 =a12 +b12
                          .........
                          cij =aij +bij
                          .........
                          cmn =amn +bmn
166 Algoritmet

a. Bllok-diagrami
                                 Fillimi

                                 i=1,m         i=1,m
                       m,n,⎛ aij,j=1,n ⎞,⎛ bij,j=1,n ⎞
                           ⎜           ⎟⎜            ⎟
                           ⎝           ⎠⎝            ⎠

                                    i=1


                                    j=1


                                cij=aij+bij

                                   j=j+1

                         Po
                                   j ≤ n
                                          Jo
                                   i=i+1

                         Po
                                   i ≤ m
                                          Jo
                                ⎛ c ,i=1,m ⎞
                                ⎜ ij j=1,n ⎟
                                ⎝          ⎠

                                   Fundi

                                   Fig.6.56
c. Programi

// Programi Prg6_56
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {4,7,8,-6,9},
                 {1,-2,5,4,6},
                 {8,3,2,-1,0},
                 {-3,5,8,4,1}
              };
  int B[m][n]={ {-1,6,9,6,4},
Fushat numerike 167

                         {2,3,7,4,-8},
                         {4,3,2,-1,5},
                         {9,-2,6,4,1}
                 };
    int i,j,C[m][n];
    for (i=0;i<m;i++)
        for (j=0;j<n;j++)
             C[i][j]=A[i][j]+B[i][j];
    cout << "Matrica e formuar"
          << "n";
    for (i=0;i<m;i++)
    {
        for (j=0;j<n;j++)
        {
             cout.width(4);
             cout << C[i][j];
        }
        cout << "n";
    }
    return 0;
}

    Duke pasur parasysh vlerat hyrëse për matricat A dhe B, të cilat kompjuterit i
janë dhënë si konstante, rezultati që shtypet në ekran pas ekzekutimit të
programit është:

Matrica e       formuar
   3 13         17   0 13
   3   1        12   8 -2
  12   6         4 -2   5
   6   3        14   8  2

    Operacioni i zbritjes kryhet plotësisht njëlloj si edhe mbledhja, që do të thotë se
shfrytëzohet algoritmi, përkatësisht programi i njëjtë.


Shumëzimi
    Matrica shumëzohet me vektorë nëse numri i kolonave të matricës është i
barabartë me numrin e anëtarëve të vektorit. Rezultati që fitohet pas shumëzimit
të matricës me vektorë është vektor, i cili do të ketë aq anëtarë sa ka rreshta
matrica.
168 Algoritmet

    Shembull     Prodhimi T(m) i matricës A(m,n) me vektorin B(n).




                      a11 a12 ... a1n                b1
                      a21 a22 ... a2n                b2
          T = A⋅B =                           ⋅              =
                      ... ... ... ...                ...
                      am1 am2 ... amn                bn


                       a11 ⋅b1 +a12 ⋅b2 +...+a1n ⋅bn
                       a21 ⋅b1 +a22 ⋅b2 +...+a2n ⋅bn
                  =
                                    ...
                       am1 ⋅b1 +am2 ⋅b2 +...+amn ⋅bn

                 t1 =a11 ⋅b1 +a12 ⋅b2 +...+a1n ⋅bn
                 t2 =a21 ⋅b1 +a22 ⋅b2 +...+a2n ⋅bn
                 ......................
                                                            n
                 ti =ai1 ⋅b1 +ai2 ⋅b2 +...+ain ⋅bn        = ∑ a ij ⋅ b j
                                                           j=1
                 ......................
                 tm =am1 ⋅b1 +am2 ⋅b2 +...+amn ⋅bn
Fushat numerike 169

a. Bllok-diagrami
                         Fillimi

                            m,n

                     ⎛ a ,i=1,m ⎞
                     ⎜ ij j=1,n ⎟
                     ⎝          ⎠

                     (bi,i=1,n)

                            i=1


                            s=0

                            j=1


                         s=s+aij⋅bj

                           j=j+1

                    Po
                           j≤ n
                               Jo
                           ti=s

                           i=i+1

                    Po
                           i≤ m
                            Jo
                     (ti,i=1,m)

                           Fundi

                          Fig.6.57




b. Programi
170 Algoritmet


// Programi Prg6_57
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,5,8,-1,4},
                  {7,-4,9,2,1},
                  {6,2,1,5,-7},
                  {2,4,6,-8,3}
               };
  int B[n]={-1,6,9,6,4};
  int i,j,s,T[m];
  for (i=0;i<m;i++)
  {
      s=0;
      for (j=0;j<n;j++)
      s=s+A[i][j]*B[j];
      T[i]=s;
  }
  cout << "Vektori i prodhimit"
       << "n";
  cout << "T=[ ";
  for (i=0;i<m;i++)
      cout << T[i]
            << " ";
  cout << "]"
       << "n";
  return 0;
}
   Pas ekzekutimit të programit të dhënë, rezultati i prodhimit në ekran shtypet
kështu:
Vektori i prodhimit
T=[ 109 66 17 40 ]

    Detyra        Të gjendet:

                  a. matrica Y(m,n) si prodhim i matricës X(m,n) me
                  konstanten k;

                  b. vektori F(n) si prodhim i vektorit A(m) me matricën
                  B(m,n).
Fushat numerike 171


    Dy matrica shumëzohen, nëse numri i kolonave të matricës së parë është i
barabartë me numrin e rreshtave të matricës së dytë. Shumëzimi i dy matricave e
jep si rezultat matricën tek e cila ruhet numri i rreshtave të matricës së parë dhe
numri i kolonave të matricës së dytë.

    Shembull       Gjetja e matricës C(m,n) si prodhim i matricës A(m,k)
                   me matricën B(k,n).


                       a11 a12 ... a1k             b11 b12 ... b1n
                       a21 a22 ... a2k             b21 b22 ... b2n
         C = A⋅B =                            ⋅
                       ... ... ... ...             ... ... ... ...
                       am1 am2 ... amk             bk1 bk2 ... bkn

                 c11 =a11 ⋅b11 +a12 ⋅b21 +...+a1k ⋅bk1
                 c12 =a11 ⋅b12 +a12 ⋅b22 +...+a1k ⋅bk2
                 ........................
                                                          k
                 c1k =a11 ⋅b1n +a12 ⋅b2n +...+a1k ⋅bkn = ∑ ail ⋅ b
                                                        l=1        lj
                 ........................
                 cij =ai1 ⋅b1j +ai2 ⋅b2j +...+aik ⋅bkj
                 ........................
                 cmn =am1 ⋅b1n +am2 ⋅b2n +...+amk ⋅bkn
172 Algoritmet


a. Bllok-diagrami
                             Fillimi

                              m,n,k

                    ⎛ a ,i=1,m ⎞,⎛ b ,i=1,k ⎞
                    ⎜ ij j=1,k ⎟ ⎜ ij j=1,n ⎟
                    ⎝          ⎠⎝           ⎠

                               i=1

                               j=1

                               s=0

                               l=1

                            s=s+ail⋅blj

                              l=l+1
                       Po
                               l≤ k
                                  Jo
                              cij=s

                              j=j+1
                       Po
                               j≤ n
                                  Jo
                              i=i+1
                       Po
                               i≤ m
                                  Jo
                          ⎛c , i=1,m ⎞
                          ⎜ ij j=1,n ⎟
                          ⎝          ⎠

                              Fundi

                              Fig.6.58

b. Programi
Fushat numerike 173


// Programi Prg6_58
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5,k=3;
  int A[m][k]={ {3,5,8},
                  {7,-4,9},
                  {6,2,1},
                  {2,4,6}
               };
  int B[k][n]={ {-1,6,9,6,4},
                  {2,6,8,4,-3},
                  {5,3,-2,5,9}
               };
  int i,j,l,s,C[m][n];
  for (i=0;i<m;i++)
       for (j=0;j<n;j++)
       {
           s=0;
           for (l=0;l<k;l++)
               s=s+A[i][l]*B[l][j];
           C[i][j]=s;
       }
  cout << "Matrica e prodhimit C"
        << "n";
  for (i=0;i<m;i++)
  {
       for (j=0;j<n;j++)
       {
           cout.width(5);
           cout << C[i][j];
       }
       cout << "n";
  }
  return 0;
}

  Rezultati që fitohet në ekran pas ekzekutimit të programit të dhënë është:

Matrica e    prodhimit C
  47 72      51 78 69
  30 45      13 71 121
   3 51      69 49 27
  36 54      38 58 50
174 Algoritmet




Ekuacionet matricore
    Duke u mbështetur në rregullat e ekzekutimit të operacioneve elementare
aritmetikore të dhëna më sipër, mund të formohen ekuacione matricore.

    Shembull      Llogaritja e anëtarëve të matricës R(m,k), nga matricat
                  X(m,k), Y(k,n) dhe Z(m,n), përmes ekuacionit
                  matricor:

                      R=X⋅Y-Z



    Nga shprehja e ekuacionit të dhënë shihet se së pari duhet llogaritur anëtarët
e prodhimit X⋅Y dhe pastaj, përmes zbritjes përkatëse, gjendet rezultati R i
ekuacionit matricor.
Fushat numerike 175



a. Bllok-diagrami
                                    Fillimi

                                     m,n,k

                    ⎛ x ,i=1,m ⎞,⎛ y ,i=1,k ⎞,⎛ z ,i=1,m ⎞
                    ⎜ ij j=1,k ⎟ ⎜ ij j=1,n ⎟ ⎜ ij j=1,n ⎟
                    ⎝          ⎠⎝           ⎠⎝           ⎠

                                      i=1

                                      j=1

                                      s=0

                                      l=1

                                                              k
                                   s=s+ail⋅blj          s=    ∑ a il ⋅ b lj
                                                             l =1

                                     l=l+1
                              Po
                                      l≤ k
                                          Jo
                                   rij=s-zij

                                     j=j+1
                              Po
                                      j≤ n
                                         Jo
                                     i=i+1
                              Po
                                      i≤ m
                                         Jo
                                 ⎛ z ,i=1,m ⎞
                                 ⎜ ij j=1,n ⎟
                                 ⎝          ⎠

                                     Fundi

                                     Fig.6.59
176 Algoritmet

b. Programi
// Programi Prg6_59
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5,k=3; int i,j,l,s,R[m][n];
  int X[m][k]={ {3,5,8},
                  {7,-4,9},
                  {6,2,1},
                  {2,4,6}};
  int Y[k][n]={ {-1,6,9,6,4},
                  {2,6,8,4,-3},
                  {5,3,-2,5,9}};
  int Z[m][n]={ {3,4,6,2,-1},
                  {9,1,3,-5,2},
                  {7,-2,1,4,8},
                  {-2,5,3,1,4}};
  for (i=0;i<m;i++)
       for (j=0;j<n;j++)
       {
           s=0;
           for (l=0;l<k;l++)
               s=s+X[i][l]*Y[l][j];
           R[i][j]=s-Z[i][j];
       }
  cout << "Matrica e rezultatit R"
        << "n";
  for (i=0;i<m;i++)
  {
       for (j=0;j<n;j++)
       {
           cout.width(4);
           cout << R[i][j];
       }
       cout << "n";
  }
  return 0;
}

   Zgjidhja e ekuacionit do të shtypet në ekran si matricë:

Matrica e        rezultatit R
  44 68          45 76 70
  21 44          10 76 119
  -4 53          67 45 19
  38 49          35 57 46
Fushat numerike 177


Anëtarët në vektor
    Duke shfrytëzuar anëtarët e matricave, mund të formohen vektorë të
ndryshëm. P.sh., me qëllim të sortimit sipas madhësisë të anëtarëve të matricës
së dhënë, vlerat e tyre mund të vendosen në vektorë, p.sh., duke shkuar sipas
rreshtave të matricës. Pastaj, sortimi i vlerave të anëtarëve të vektorit bëhet ashtu
siç u tregua më parë.
    Shembull        Vendosja e anëtarëve të matricës A(m,n) në vektorin
                    Z(m⋅n).
a. Bllok-diagrami
                                            Fillimi

                                            ⎛     i = 1,m ⎞
                                      m, n, ⎜ aij,
                                            ⎝     j= 1,n ⎟⎠

                                              k=0

                                              i=1


                                              j=1

                                             k=k+1

                                             zk=aij

                                             j=j+1

                                       Po
                                              j≤ n
                                                 Jo
                                             i=i+1

                                       Po
                                              i≤ m
                                                 Jo
                                          (zi,i=1,k)

                                             Fundi

                                            Fig.6.60
178 Algoritmet

   Këtu, numëratori k shfrytëzohet për përcaktimin e indeksit të pozitës në
vektor të anëtarëve të veçantë të matricës.

b. Programi

// Programi Prg6_60
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=3;
  int A[m][n]={ {3,-4,6},
                 {-9,1,2},
                 {7,-8,1},
                 {-2,5,-3}
              };
  int i,j,k,Z[m*n];
  k=-1;
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
      {
           k=k+1;
           Z[k]=A[i][j];
      }
  cout << "Z=[";
  for (i=0;i<=k;i++)
  {
      cout.width(3);
      cout << Z[i];
  }
  cout << " ]n";
  return 0;
}

    Vektori që shtypet në ekran pas ekzekutimit të programit të dhënë është:

Z=[    3 -4      6 -9    1    2   7 -8      1 -2     5 -3     ]

    Mbushja e vektorit mund të bëhet vetëm me anëtarë të matricës që kanë vlera
të caktuara.

    Shembull      Mbushja e vektorit Z me anëtarët e matricës A(m,n) që
                  kanë vlera negative.
Fushat numerike 179

    Për caktimin e pozitave të anëtarëve që marrin pjesë në formimin e vektorit
duhet të shfrytëzohet një numërator, p.sh. k, i cili në këtë rast rritet për 1 sa
herë që gjendet anëtar me vlerë numerike negative. Vlera përfundimtare e
numëratorit, vetëm nëse të gjithë anëtarët e matricës janë numra negativë, do të
jetë e barabartë me numrin e anëtarëve të matricës.

a. Bllok-diagrami
                                           Fillimi

                                           ⎛     i = 1,m ⎞
                                     m, n, ⎜ aij,
                                           ⎝     j= 1,n ⎟⎠

                                             k=0

                                             i=1


                                             j=1

                                                       Jo
                                           aij < 0
                                                Po
                                            k=k+1

                                            zk=aij

                                            j=j+1

                                      Po
                                             j≤n
                                                Jo
                                            i=i+1

                                     Po
                                             i≤m
                                                 Jo
                                          (zi,i=1,k)

                                            Fundi

                                            Fig.6.61

b. Programi
180 Algoritmet


// Programi Prg6_61
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=3;
  int A[m][n]={ {3,-4,6},
                 {-9,1,2},
                 {7,-8,1},
                 {-2,5,-3}
              };
  int i,j,k,Z[m*n];
  k=-1;
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
           if (A[i][j]<0)
           {
              k=k+1;
              Z[k]=A[i][j];
           }
  cout << "Z=[";
  for (i=0;i<=k;i++)
  {
      cout.width(3);
      cout << Z[i];
  }
  cout << " ]n";
  return 0;
}

    Rezultati që shtypet në ekran pas ekzekutimit të programit, për shembullin e
vlerave të matricës A, do të duket kështu:

Z=[ -4 -9 -8 -2 -3 ]

   Me vlerat e ndyshme të matricave mund të mbushen njëkohësisht disa
vektorë.

    Shembull      Mbushja e vektorëve F dhe G me anëtarë pozitivë dhe
                  negativë të matricës A(m,n).
Fushat numerike 181

   Këtu, për secilin vektor duhet të shfrytëzohet një numërator i veçantë i
anëtarëve të matricës të cilët janë vendosur në vektorin përkatës.

a. Bllok-diagrami
                                              Fillimi

                                               ⎛     i = 1,m ⎞
                                         m, n, ⎜ aij,
                                               ⎝     j= 1,n ⎟⎠

                                                 x=0

                                                 y=0

                                                 i=1


                                                 j=1

                                       Po                        Jo
                                               aij < 0

                              x=x+1                                   y=y+1

                              fx=aij                                  gy=aij



                                               j=j+1

                                    Po
                                               j ≤ n
                                                       Jo
                                               i=i+1

                                    Po
                                               i ≤ m
                                                       Jo
                                            (fi,i=1,x)

                                            (gi,i=1,y)

                                               Fundi

                                               Fig.6.62
b. Programi
182 Algoritmet


// Programi Prg6_62
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=3; int i,j,x,y,F[m*n],G[m*n];
  int A[m][n]={ {3,-4,6},
                  {-9,1,2},
                  {7,-8,1},
                  {-2,5,-3}};
  x=-1;y=-1;
  for (i=0;i<m;i++)
       for (j=0;j<n;j++)
           if (A[i][j]<0)
           {
               x=x+1; F[x]=A[i][j];
           }
           else
           {
               y=y+1; G[y]=A[i][j];
           }
  cout << "F=[";
  for (i=0;i<=x;i++)
  {
       cout.width(3);
       cout << F[i];
  }
  cout << " ]n";
  cout << "G=[";
  for (i=0;i<=y;i++)
  {
       cout.width(3);
       cout << G[i];
  }
  cout << " ]n";
  return 0;
}
   Vektorët të cilët shtypen në ekran pas ekzekutimit të programit të dhënë
duken kështu:

Z=[ -4 -9 -8 -2 -3 ]
G=[ 3 6 1 2 7 1                   5 ]

   Vlerat e anëtarëve të matricave mund të vendosen në vektor edhe të
ndryshuar në bazë të një ligjshmërie të caktuar.

    Shembull      Mbushja e vektorit F me katrorët e anëtarëve pozitivë të
Fushat numerike 183

                    matricës A(m,n), por të cilët janë më të vegjël se numri
                    pozitiv x.

a. Bllok-diagrami
                                             Fillimi

                                               ⎛      i = 1,m ⎞
                                      m, n, x, ⎜ a ij,
                                               ⎝      j= 1,n ⎟⎠

                                                k=0

                                                i=1


                                                j=1

                                                            Jo
                                             aij > 0
                                                      Po
                                                            Jo
                                             aij < x
                                                  Po
                                              k=k+1

                                              fk=aij2

                                              j=j+1

                                    Po
                                              j ≤ n
                                                      Jo
                                              i=i+1

                                    Po
                                              i ≤ m
                                                      Jo
                                           (fi,i=1,k)

                                              Fundi

                                              Fig.6.63
184 Algoritmet

b. Programi

// Programi Prg6_63
#include <iostream>
using namespace std;
int main()
{
  int const x=6,m=4,n=3;
  int A[m][n]={ {3,-4,6},
                 {-9,1,2},
                 {7,-8,4},
                 {-2,5,-3}
              };
  int i,j,k,F[m*n];
  k=-1;
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
           if ((A[i][j]>=0) && (A[i][j]<x))
           {
              k=k+1;
              F[k]=A[i][j]*A[i][j];
           }
  cout << "F=[";
  for (i=0;i<=k;i++)
  {
      cout.width(3);
      cout << F[i];
  }
  cout << " ]n";
  return 0;
}

    Rezultati i programit të dhënë në ekran shtypet kështu:

F=[     9     1     4 16 25 ]

     Vektorët mund të mbushen edhe duke i shfrytëzuar anëtarët e matricës të
cilët gjenden në rreshtat ose në kolonat e caktuara të matricës.

    Shembull         Mbushja e vektorit F me sinuset e anëtarëve pozitivë të
                     matricës A(m,n), por të cilët gjenden në rreshtat çiftë.


a. Bllok-diagrami
Fushat numerike 185

                                  Fillimi

                                  ⎛     i = 1,m ⎞
                            m, n, ⎜ aij,
                                  ⎝     j= 1,n ⎟⎠

                                    k=0

                                    i=2


                                    j=1

                                               Jo
                                   aij > 0
                                       Po
                                   k=k+1

                                 fk=sin(aij)

                                   j=j+1

                            Po
                                    j≤n
                                       Jo
                                   i=i+2

                            Po
                                    i≤m
                                        Jo
                                 (fi,i=1,k)

                                   Fundi

                                   Fig.6.64
b. Programi

// Programi Prg6_64
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const m=4,n=3;
  int A[m][n]={ {3,-5,6},
186 Algoritmet

                        {-9,1,2},
                        {7,-8,4},
                        {-2,5,-3}
                 };
    int i,j,k;
    double F[m*n];
    k=-1;
    i=1;
    do
    {
         for (j=0;j<n;j++)
             if (A[i][j]>=0)
             {
                 k=k+1;
                 F[k]=sin(A[i][j]);
             }
        i=i+2;
    }
    while (i<=m);
    cout << "F=[";
    for (i=0;i<=k;i++)
    {
         cout.precision(3);
         cout.width(7);
         cout << F[i];
    }
    cout << " ]n";
    return 0;
}

   Vektori që formohet përmes programit të dhënë, në ekran do të shtypet
kështu:

F=[    0.841      0.909 -0.959 ]

ku tre anëtarët e vektorit në fakt janë sinuset e vlerave numerike 1, 2 dhe 5, të
anëtarëve pozitivë të matricës A të cilët gjenden në rreshtat çiftë.

Veprime të tjera
     Përveç veprimeve të përmendura më sipër, për pjesë të caktuara të matricës,
siç janë rreshtat, kolonat, pjesa mbi, në ose nën diagonalen kryesore të matricës,
ose për komplet matricën, mund të gjendet shuma, prodhimi, të numërohen ose
të gjenden anëtarë të caktuar etj.
Fushat numerike 187


Shuma dhe prodhimi
   Procedura e llogaritjes së shumës ose e prodhimit të anëtarëve të matricës
nuk dallon nga ajo që zbatohet te vektorët, me përjashtim të asaj se këtu
operohet me dy indekse.
    Shembull         Llogaritja e shumës së anëtarëve të matricës A(m,n).
    s = a11 + a12 + ... + a1n
       + a21 + a22 + ... + a2n
       + ..................
       + a m1 + a m2 + ... + a mn
          m    n
      = ∑ ∑ aij
         i = 1j= 1
                                                Fillimi
a. Bllok-diagrami                                     i = 1,m ⎞
                                                ⎛
                                          m, n, ⎜ aij,
                                                ⎝     j= 1,n ⎟⎠

                                                   s=0

                                                   i=1


                                                   j=1


                                                s=s+aij

                                                 j=j+1

                                           Po
                                                  j≤n
                                                     Jo
                                                 i=i+1

                                           Po
                                                  i≤m
                                                     Jo
                                                    s

                                                 Fundi

                                                Fig.6.65
188 Algoritmet

b. Programi

// Programi Prg6_65
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,6,7,2},
                  {-9,1,2,5,8},
                  {7,-8,4,3,9},
                  {6,5,-3,4,8}
               };
  int i,j,s;
  s=0;
  for (i=0;i<m;i++)
       for (j=0;j<n;j++)
           s=s+A[i][j];
  cout << "Shuma s="
        << s
        << "n";
  return 0;
}

    Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është:

Shuma s=55

dhe numri i fituar e paraqet shumën e të gjithë anëtarëve të matricës.
    Për matricën e dhënë mund të llogaritet shuma ose prodhimi i pjesëve të
caktuara të matricës, gjë që përcaktohet përmes zgjedhjes së indekseve përkatëse.

    Shembull        Llogaritja e shumës s të anëtarëve në rreshtat e matricës
                    A(m,n).




a. Bllok-diagrami
Fushat numerike 189


                              Fillimi

                               ⎛     i = 1,m ⎞
                         m, n, ⎜ aij,
                               ⎝     j= 1,n ⎟⎠

                                 i=1

                                 s=0


                                 j=1

                                 aij

                              s=s+aij

                                j=j+1

                         Po
                                j≤n
                                       Jo
                                  s

                                i=i+1

                         Po
                                 i≤m
                                    Jo
                                Fundi

                                Fig.6.66
b. Programi

// Programi Prg6_66
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,6,7,2},
                {-9,1,2,5,8},
                {7,-8,4,3,9},
190 Algoritmet

                              {6,5,-3,4,8}
                         };
    int i,j,s;
    for (i=0;i<m;i++)
    {
        s=0;
        for (j=0;j<n;j++)
        {
             cout.width(4);
             cout << A[i][j];
             s=s+A[i][j];
        }
        cout << "    s="
              << s
              << "n";
    }
    return 0;
}

   Nëse ekzekutohet programi i dhënë, për vlerat e matricës së marrë si
shembull, rezultati që shtypet në ekran është:

     3 -5 6         7     2     s=13
    -9 1 2          5     8     s=7
     7 -8 4         3     9     s=15
     6 5 -3         4     8     s=20

   Njëkohësisht mund të llogariten edhe më shumë vlera për pjesë të caktuara të
matricës, siç janë, p.sh., anëtarët mbi diagonalë, në diagonalë ose nën diagonalë.

     Shembull           Llogaritja e shumës s të anëtarëve mbi diagonalen kryesore
                        dhe prodhimit p të anëtarëve në diagonalen kryesore të
                        matricës A(m,m).




a. Bllok-diagrami
Fushat numerike 191

                                Fillimi

                                ⎛     i = 1,m ⎞
                             m, ⎜ aij,
                                ⎝     j= 1,m ⎟⎠

                                   s=0

                                   p=1

                                   i=1


                                   j=1

                        Po
                                  i < j
                                         Jo
                                                  Jo
                                  i = j
                                      Po
              s=s+aij            p=p⋅aij


                                  j=j+1

                        Po
                                  j ≤ m
                                         Jo
                                  i=i+1

                        Po
                                  i ≤ m
                                         Jo
                                   s,p

                                  Fundi

                                  Fig.6.67




b. Programi
192 Algoritmet

// Programi Prg6_67
#include <iostream>
using namespace std;
int main()
{
  int const m=5;
  int A[m][m]={ {4,3,5,-7,1},
                  {-5,6,4,9,2},
                  {3,-4,7,6,1},
                  {8,3,-2,5,9},
                  {6,4,8,-3,7}
               };
  int i,j,s,p;
  s=0;
  p=1;
  for (i=0;i<m;i++)
       for (j=0;j<m;j++)
           if (i<j)
              s=s+A[i][j];
           else
               if (i==j)
                   p=p*A[i][j];
  cout << "Shuma      s="
        << s
        << "n"
        << "Prodhimi p="
        << p
        << "n";
  return 0;
}
   Pas ekzekutimit të programit, për vlerat e anëtarëve të matricës, e cila është
marrë si shembull, rezultati që shtypet në ekran është:
Shuma        s=33
Prodhimi p=5880

Numërimi i anëtarëve të caktuar
   Brenda një matrice mund të numërohen anëtarë të caktuar të matricës, p.sh.,
anëtarët negativë, pozitivë, më të mëdhenj ose më të vegjël se vlera të dhëna etj.
    Shembull       Numërimi i anëtarëve pozitivë x, negativë y dhe zero z, në
                   matricën e dhënë A(m,n).


a. Bllok-diagrami
Fushat numerike 193

                                   Fillimi

                                    ⎛     i = 1,m ⎞
                              m, n, ⎜ aij,
                                    ⎝     j= 1,n ⎟⎠

                                      x=0

                                      y=0

                                      z=0

                                      i=1


                                      j=1

                         Po
                                    aij > 0
                                            Jo
                                                 Jo
                                   aij < 0
                                          Po
                 x=x+1              y=y+1             z=z+1


                                    j=j+1

                         Po
                                    j ≤ n
                                        Jo
                                    i=i+1

                         Po
                                    i ≤ m
                                            Jo
                                    x,y,z

                                    Fundi

                                    Fig.6.68

b. Programi
// Programi Prg6_68
#include <iostream>
194 Algoritmet

using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,6,7,2},
                 {-9,1,0,-7,8},
                 {0,-8,4,3,9},
                 {6,5,-3,0,8}
              };
  int i,j,x,y,z;
  x=0;y=0;z=0;
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
           if (A[i][j]>0)
              x=x+1;
           else
              if (A[i][j]<0)
                  y=y+1;
              else
                  z=z+1;
  cout << "Anëtarë pozitivë x="
       << x
       << "n"
       << "Anëtarë negativë y="
       << y
       << "n"
       << "Anëtarë zero       z="
       << z
       << "n";
  return 0;
}
   Për shembullin e matricës së marrë në program, pas ekzekutimit të
programit, numrat e kërkuar do të shtypen kështu:
Anëtarë pozitivë x=12
Anëtarë negativë y=5
Anëtarë zero             z=3
   Numërimi i anëtarëve mund të zbatohet edhe në pjesë të veçanta të matricës.
    Shembull     Numërimi i anëtarëve pozitivë x dhe negativë y në rreshtat e
                 veçantë të matricës A(m,n), pa anëtarët me vlerë zero.



a. Bllok-diagrami
Fushat numerike 195

                                 Fillimi

                                  ⎛     i = 1,m ⎞
                            m, n, ⎜ aij,
                                  ⎝     j= 1,n ⎟⎠

                                    i=1

                                    x=0

                                    y=0

                                    j=1

                       Po                      Jo                  Po
                                  aij > 0           aij < 0
                                                    Jo
                  x=x+1                                           y=y+1


                                    aij

                                  j=j+1

                       Po
                                   j≤n
                                          Jo
                                    x,y

                                  i=i+1

                       Po
                                   i≤m
                                          Jo
                                  Fundi

                                   Fig.6.69




b. Programi

// Programi Prg6_69
#include <iostream>
using namespace std;
196 Algoritmet

int main()
{
  int const m=4,n=5;
  int A[m][n]={ {1,-8,-5,7,2},
                  {-6,0,-4,3,-8},
                  {4,-8,0,3,2},
                  {-1,0,-3,9,0}
               };
  int i,j,x,y;
  for (i=0;i<m;i++)
  {
      x=0;
      y=0;
      for (j=0;j<n;j++)
      {
           if (A[i][j]>0)
               x=x+1;
           else
               if (A[i][j]<0)
                   y=y+1;
           cout.width(3);
           cout << A[i][j];
      }
    cout << "     x="
         << x
         << " y="
         << y
         << "n";
  }
  return 0;
}

    Për shembullin e matricës së marrë në program, rezultati që shtypet në ekran
është:

     1 -8 -5     7 2       x=3     y=2
    -6 0 -4      3 -8      x=1     y=3
     4 -8 0      3 2       x=3     y=1
    -1 0 -3      9 0       x=1     y=2

     Anëtarët e caktuar mund të numërohen edhe vetëm në një pjesë të matricës.

     Shembull      Numërimi i anëtarëve nën diagonalen kryesore të matricës
                   A(m,m), të cilët janë më të mëdhenj se 2 dhe më të vegjël
                   se 7.
Fushat numerike 197



a. Bllok-diagrami

                               Fillimi

                               ⎛     i = 1,m ⎞
                            m, ⎜ aij,
                               ⎝     j= 1,m ⎟⎠

                                  n=0

                                  i=2


                                  j=1

                                                 Jo
                                 aij > 2
                                        Po
                                                 Jo
                                 aij < 7
                                     Po
                                 n=n+1


                                 j=j+1

                       Po
                                j ≤ i-1
                                        Jo
                                 i=i+1

                       Po
                                 i ≤ m
                                        Jo
                                    n

                                 Fundi

                                Fig.6.70
b. Programi

// Programi Prg6_70
#include <iostream>
using namespace std;
198 Algoritmet

int main()
{
  int const m=5;
  int A[m][m]={ { 4, 3, 5,-7, 1},
                  {-5, 6, 4, 9, 2},
                  { 3, 9, 7, 6, 1},
                  { 1,-3,-2, 5, 9},
                  { 6, 5, 8, 4, 7}
               };
  int i,j,n;
  n=0;
  for (i=1;i<m;i++)
       for (j=0;j<=i-1;j++)
       {
            if ((A[i][j]>2) && (A[i][j]<7))
               n=n+1;
       }
  cout << "Numri i kërkuar n="
         << n
         << "n";
  return 0;
}

    Pas ekzekutimit të programit, për shembullin e matricës së marrë, rezultati që
shtypet në ekran është:

Numri i kërkuar n=4

Gjetja e vlerës së caktuar
    Plotësisht njëlloj si te vektorët, edhe te matricat mund të gjendet anëtari i
caktuar, siç është, p.sh., anëtari minimal, ose anëtari maksimal etj. Procedura e
gjetjes edhe këtu fillon me përvetësimin e një vlere fillestare të një variable
ndihmëse, tek e cila në fund merret edhe rezultati i kërkuar. Si vlerë fillestare
rregullisht merret anëtari i parë në matricë, ose kjo vlerë formohet nga ky anëtar i
matricës.

    Shembull        Gjetja e vlerës minimale z në matricën A(m,n).



a. Bllok-diagrami
Fushat numerike 199

                                         Fillimi

                                         ⎛     i = 1,m ⎞
                                   m, n, ⎜ aij,
                                         ⎝     j= 1,n ⎟⎠

                                          z=a11

                                           i=1


                                           j=1

                                                     Jo
                                         aij < z
                                                Po
                                         zk=aij


                                          j=j+1
                                    Po
                                          j≤n
                                              Jo
                                          i=i+1

                                   Po
                                          i≤m
                                                Jo
                                            z

                                          Fundi

                                         Fig.6.71

    Këtu, për i=1 dhe j=1 do të krahasohet anëtari i parë i matricës me
vetveten, gjë që imponohet si krahasim i domosdoshëm, meqë nëse merret i=1
dhe j=2, për vlerat e tjera të variablës i, gjatë krahasimit do të kapërcehen
anëtarët e kolonës së parë të matricës.




b. Programi
200 Algoritmet


// Programi Prg6_71
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,6,7,2},
                 {-9,1,2,5,8},
                 {7,-8,4,3,9},
                 {6,5,-3,4,8}
              };
  int i,j,z;
  z=A[0][0];
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
           if (A[i][j]<z)
              z=A[i][j];
  cout << "Vlera minimale z="
       << z
       << "n";
  return 0;
}

   Rezultati që shtypet në ekran pas ekzekutimit të programit është:

Vlera minimale z=-9

   Në matricë, përveç anëtarit të caktuar, mund të gjendet edhe pozita e tij,
përkatësisht indekset përkatëse.

    Shembull      Anëtari më i madh për nga vlera absolute x si dhe pozita e
                  tij, përkatësisht indekset f dhe g, në matricën e dhënë
                  A(m,n).
Fushat numerike 201

a. Bllok-diagrami

                              Fillimi

                               ⎛     i = 1,m ⎞
                         m, n, ⎜ aij,
                               ⎝     j= 1,n ⎟⎠

                              x=|a11|

                                 f=1

                                 g=1

                                 i=1


                                 j=1

                                             Jo
                              |aij| > x
                                   Po
                              x=|aij|

                                 f=i

                                 g=j

                               j=j+1
                    Po
                                j≤n
                                       Jo
                               i=i+1

                    Po
                                i≤m
                                       Jo
                               f,g,x

                               Fundi

                               Fig.6.72
b. Programi
202 Algoritmet

// Programi Prg6_72
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,8,7,2},
                 {-4,1,2,5,8},
                 {7,-9,4,3,2},
                 {6,5,-3,4,7}
              };
  int i,j,f,g,x;
  x=abs(A[0][0]);
  f=1;g=1;
  for (i=0;i<m;i++)
      for (j=0;j<n;j++)
           if (abs(A[i][j])>x)
           {
              x=abs(A[i][j]);
              f=i;
              g=j;
           }
  cout << "Vlera maksimale absolute x: "
       << x
       << "n"
       << "Pozita ............... f,g: "
       << f
       << ","
       << g
       << "n";
  return 0;
}

   Pas ekzekutimit të programit, për shembullin e matricës së marrë në
program, rezultati që shtypet në ekran është:

Vlera maksimale absolute x: 9
Pozita ............... f,g: 2,1

    Anëtari i caktuar mund të gjendet edhe për çdo rresht ose kolonë, si dhe për
pjesë të caktuar të matricës.

    Shembull      Anëtari më i madh për çdo rresht të matricës A(m,n).
Fushat numerike 203



a. Bllok-diagrami

                              Fillimi

                               ⎛     i = 1,m ⎞
                         m, n, ⎜ aij,
                               ⎝     j= 1,n ⎟⎠

                                 i=1

                                x=ai1

                                 j=1

                                            Jo
                               aij > x
                                      Po
                                x=aij


                                 aij

                               j=j+1

                    Po
                                j≤n
                                       Jo
                                  x

                               i=i+1

                    Po
                                i≤m
                                       Jo
                               Fundi

                                Fig.6.73




b. Programi
204 Algoritmet

// Programi Prg6_73
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,8,7,2},
                  {-4,1,2,6,-3},
                  {7,-9,4,3,2},
                  {9,5,-3,4,1}
               };
  int i,j,x;
  for (i=0;i<m;i++)
  {
      x=A[i][1];
      for (j=0;j<n;j++)
      {
           if (A[i][j]>x)
               x=A[i][j];
           cout.width(3);
           cout << A[i][j];
      }
      cout << "     x="
            << x
            << "n";
  }
  return 0;
}

     Pas ekzekutimit të programit, rezultati në ekran duket kështu:

     3 -5 8         7 2      x=8
    -4 1 2          6 -3     x=6
     7 -9 4         3 2      x=7
     9 5 -3         4 1      x=9

     Vlera e caktuar mund të gjendet edhe vetëm në një pjesë të matricës.

     Shembull        Anëtari më i madh mbi diagonalën kryesore x dhe nën
                     diagonalen kryesore y, të matricës së dhënë A(m,n).




a. Bllok-diagrami
Fushat numerike 205


                                       Fillimi

                                        ⎛     i = 1,m ⎞
                                  m, n, ⎜ aij,
                                        ⎝     j= 1,n ⎟⎠

                                         x=a12

                                         y=a21

                                          i=1


                                          j=1

                                                     Jo
                                         i ≠j
                                                Po
                             Po                      Jo
                                         i<j
              Jo                                                     Jo
                   aij > x                                aij > y
                         Po                                     Po
                   x=aij                                  y=aij


                                        j=j+1

                             Po
                                         j≤ n
                                                Jo
                                        i=i+1

                             Po
                                         i≤ m
                                                Jo
                                          x,y

                                        Fundi

                                        Fig.6.74



b. Programi
206 Algoritmet


// Programi Prg6_74
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {3,-5,8,7,2},
                 {-4,1,2,6,-3},
                 {7,-9,6,3,4},
                 {9,5,-3,4,1}
              };
  int i,j,x,y;
  x=A[0][1];
  y=A[1][0];
  for (i=0;i<m;i++)
    for (j=0;j<n;j++)
        if (i!=j)
            if (i<j)
               if (A[i][j]>x)
                   x=A[i][j];
               else
                   {
                   }
            else
               if (A[i][j]>y)
                   y=A[i][j];
               else
                   {
                   }
  cout << "Mbi diagonale x="
       << x
       << "n"
       << "Nën diagonale y="
       << y
       << "n";
  return 0;
}

    Pas ekzekutimit të programit të dhënë, rezultati në ekran shtypet kështu:

Mbi diagonale x=8
Nën diagonale y=9
Fushat numerike 207

    Detyra        Në matricën e dhënë A(m,n), të gjendet:

                  a. anëtari me vlerë numerike më të madhe;

                  b. anëtari me vlerë absolute më të vogël si dhe pozita e tij në
                  matricë;

                  c. anëtari më i vogël për çdo kolonë;

                  d. anëtari më i madh në çdo rresht tek;

                  e. anëtari më i vogël për nga vlera absolute në kolonat çiftë
                  të matricës;

                  f. anëtari më i madh për çdo rresht, duke marrë vetëm vlerat
                  të cilat gjenden mbi diagonalen kryesore.




    Në matricë mund të gjenden edhe vlerat mesatare të anëtarëve të matricës,
anëtarëve në rreshtat ose në kolonat e veçanta, anëtarëve mbi, në ose nën
diagonalen kryesore etj.


    Shembull      Vlerat mesatare x të rreshtave të veçantë të matricës
                  A(m,n).



          1 n
    x =      ∑ aij , për i = 1,2,..., m.
          n j= 1
208 Algoritmet

a. Bllok-diagrami

                         Fillimi

                          ⎛     i = 1,m ⎞
                    m, n, ⎜ aij,
                          ⎝     j= 1,n ⎟⎠

                            i=1


                            s=0

                            j=1


                         s=s+aij

                            aij

                          j=j+1

                    Po
                           j≤ n
                                  Jo
                                  s
                          x =
                                  n

                             x

                          i=i+1

                    Po
                          i≤ m
                              Jo
                          Fundi

                          Fig.6.75
Fushat numerike 209

b. Programi

// Programi Prg6_75
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5;
  int A[m][n]={ {7,3,4,9,5},
                  {6,1,2,4,8},
                  {7,6,4,1,2},
                  {9,5,3,8,7}
               };
  int i,j;
  double s,x;
  for (i=0;i<m;i++)
  {
      s=0;
      for (j=0;j<n;j++)
      {
           s=s+A[i][j];
           cout.width(3);
           cout << A[i][j];
      }
      x=s/n;
      cout << "     x="
            << x
            << "n";
  }
  return 0;
}

   Rezultati i programit të dhënë, pas ekzekutimit të tij, në ekran do të shtypet
kështu:

    7   3     4   9   5     x=5.6
    6   1     2   4   8     x=4.2
    7   6     4   1   2     x=4
    9   5     3   8   7     x=6.4
210 Algoritmet



    Detyra        Për matricën A(m,m), të gjendet vlera mesatare:

                  a. e të gjithë anëtarëve;

                  b. e anëtarëve pozitivë;

                  c. e vlerave absolute të anëtarëve negativë;

                  d. e anëtarëve të diagonales kryesore;

                  e. e anëtarëve mbi diagonalen kryesore;

                  f. e anëtarëve nën diagonalen kryesore;

                  g. e kolonave të veçanta.




Fshirja e rreshtave dhe e kolonave
    Gjatë zgjidhjes së problemeve të ndryshme, duke shfrytëzuar matricat,
shpesh herë në matrica duhet fshirë rreshta, kolona, ose rreshta e kolona
njëkohësisht. Problemi kryesor këtu qëndron në zhvendosjen lart të rreshtave që
gjenden pas rreshtit që fshihet, përkatësisht zhvendosjen majtë të kolonave që
gjenden pas kolonës që fshihet.


    Shembull      Formimi i matricës B(m-1,n) nga anëtarët e matricës
                  A(m,n), pasi në të të fshihet rreshti i l-të.
Fushat numerike 211

a. Bllok-diagrami

                                       Fillimi

                                          ⎛     i = 1,m ⎞
                                 m, n, l, ⎜ aij,
                                          ⎝     j= 1,n ⎟⎠

                                          i=1


                                          j=1

                             Po                         Jo
                                          i<l

                       bij=aij                          bij=ai+1,j


                                         j=j+1

                             Po
                                         j≤ n
                                             Jo
                                         i=i+1

                             Po
                                        i ≤ m-1
                                              Jo
                                    ⎛     i = 1,m -1⎞
                                    ⎜ bij,j= 1,n ⎟
                                    ⎝               ⎠

                                         Fundi

                                         Fig.6.76
b. Programi

// Programi Prg6_76
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5,l=2;
  int A[m][n]={ {7,-3,4,-9,5},
                {6,1,-2,4,-8},
                {-7,6,-4,1,2},
212 Algoritmet

                    {9,-5,3,8,-6}
                 };
    int i,j,B[m][n];
    for (i=0;i<m-1;i++)
        for (j=0;j<n;j++)
             if (i<1)
                 B[i][j]=A[i][j];
             else
                 B[i][j]=A[i+1][j];
    cout << "Matrica B"
          << "n";
    for (i=0;i<m-1;i++)
    {
        for (j=0;j<n;j++)
        {
             cout.width(3);
             cout << B[i][j];
        }
        cout << "n";
    }
    return 0;
}

   Nëse ekzekutohet programi i dhënë, pas fshirjes së rreshtit të dytë në
matricën A, matrica që fitohet do të duket kështu:

     Matrica B
     7 -3 4 -9 5
    -7 6 -4 1 2
     9 -5 3 8 -6

     Plotësisht njëlloj veprohet edhe gjatë fshirjes së kolonës në matricë.

     Shembull       Formimi i matricës B(m,n-1) nga anëtarët e matricës
                    A(m,n), pasi në të të fshihet kolona e k-të.




a. Bllok-diagrami
Fushat numerike 213

                                       Fillimi

                                          ⎛     i = 1,m ⎞
                                 m, n, k, ⎜ aij,
                                          ⎝     j= 1,n ⎟⎠

                                          j=1


                                          i=1

                             Po                        Jo
                                          j<k

                       bij=aij                          bij=ai,j+1


                                         i=i+1

                             Po
                                         i≤ m
                                                Jo
                                         j=j+1

                             Po
                                        j ≤ n-1
                                                Jo
                                    ⎛     i = 1,m ⎞
                                    ⎜ bij,j= 1,n-1⎟
                                    ⎝             ⎠

                                         Fundi

                                         Fig.6.77
b. Programi

// Programi Prg6_77
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5,k=2;
  int A[m][n]={ {7,-3,4,-9,5},
                 {6,1,-2,4,-8},
                 {-7,6,-4,1,2},
                 {9,-5,3,8,-6}
              };
214 Algoritmet

    int i,j,B[m][n];
    for (j=0;j<n-1;j++)
        for (i=0;i<m;i++)
             if (j<k)
                 B[i][j]=A[i][j];
             else
                 B[i][j]=A[i][j+1];
    cout << "Matrica B"
          << "n";
    for (i=0;i<m;i++)
    {
        for (j=0;j<n-1;j++)
        {
             cout.width(3);
             cout << B[i][j];
        }
        cout << "n";
    }
    return 0;
}

   Matrica që formohet pas fshirjes së kolonës k=2 përmes programit të dhënë
më sipër, në ekran do të shtypet kështu:

     Matrica B
     7 -3 -9 5
     6 1 4 -8
    -7 6 1 2
     9 -5 8 -6

   Nëse fshihen njëkohësisht rreshti dhe kolona e caktuar në matricën e dhënë,
duhet të zhvendosen rreshtat dhe kolonat të cilat gjenden pas atyre që fshihen.

     Shembull       Formimi i matricës B(m-1,n-1) nga anëtarët e matricës
                    A(m,n), pasi në të të fshihet rreshti i l-të dhe kolona e k-
                    të.




a. Bllok-diagrami
Fushat numerike 215

                                         Fillimi

                                              i=1,m ⎞
                                m,n,k,l,⎛ aij,
                                        ⎜           ⎟
                                        ⎝     j=1,n ⎠

                                            i=1


                                            j=1

                                Po                         Jo
                                            i<l
                Po               Jo                       Po                 Jo
                        j<k                                        j<k

              bij=aij         bij=ai,j+1              bij=ai+1,j         bij=ai+1,j+1



                                           j=j+1

                               Po
                                           j≤ n-1
                                               Jo
                                           i=i+1

                               Po
                                           i≤ m-1
                                               Jo
                                      ⎛ b ,i=1,m −1 ⎞
                                      ⎜ ij j=1,n−1 ⎟
                                      ⎝             ⎠

                                           Fundi

                                           Fig.6.78




b. Programi
216 Algoritmet

// Programi Prg6_78
#include <iostream>
using namespace std;
int main()
{ int const m=4,n=5,l=1,k=2;
  int A[m][n]={ {7,-3,4,-9,5},
                  {6,1,-2,4,-8},
                  {-7,6,-4,1,2},
                  {9,-5,3,8,-6}
               };
  int i,j,B[m-1][n-1];
  for (i=0;i<n-1;i++)
      for (j=0;j<m;j++)
           if (i<1)
               if (j<k)
                   B[i][j]=A[i][j];
               else
                   B[i][j]=A[i][j+1];
           else
               if (j<k)
                   B[i][j]=A[i+1][j];
               else
                   B[i][j]=A[i+1][j+1];
  cout << "Matrica B"
        << "n";
  for (i=0;i<m-1;i++)
  {
      for (j=0;j<n-1;j++)
      {
           cout.width(3);
           cout << B[i][j];
      }
      cout << "n";
  }
  return 0;
}
    Nëse ekzekutohet programi i dhënë, matrica e cila fitohet pas fshirjes së
rreshtit l=1 dhe k=2 të matricës A, duket kështu:

   Matrica B
   7 -3 -9 5
 -7 6 1 2
   9 -5 8 -6
   Algoritmet për fshirjen e njëkohshme të më shumë rreshtave, ose të më
shumë kolonave në matricë, do të jenë të ngjashme me ato që u dhanë më sipër.
Fushat numerike 217


    Detyra         Formimi i matricës B nga anëtarët e matricës A(m,n), pasi
                   në të të fshihen:

                   a. x-rreshta, duke filluar prej rreshtit të l-të;

                   b. y-kolona, duke filluar prej kolonës së k-të;

                   c. x-rreshta dhe y-kolona, duke filluar prej rreshtit të l-të
                   dhe kolonës së k-të.



        Këtu, para se të fillojë fshirja duhet të kontrollohet se a ka për fshirje x-
rreshta dhe y-kolona, prej rreshtit të l-të dhe kolonës së k-të.



Fushat tridimensionale
    Gjatë zgjidhjes së problemeve me kompjuter përdoren edhe fusha
shumëdimensionale. Kështu, p.sh., operimi me të dhëna, të cilat përcaktohen
përmes tri madhësive të ndryshme, thjeshtohet dukshëm, nëse shfrytëzohen
fusha tridimensionale.
    Në algoritme, me fushat tridimensionale operohet duke i shikuar ato si
grumbuj matricash, ku me dimensionin e tretë të tyre përcaktohet numri i
matricës në strukturën tridimensionale të fushës, ashtu siç shihet në Fig.6.79.
218 Algoritmet

                 k

                                     j                  j=1 2 ... n
      a111 a121 ... a1n1                            i=1 a111 a121 ... a1n1

      a211 a221 ... a2n1                              2   a211 a221 ... a2n1
A =                                          =                                  +
      ... ... ... ...                               ... ... ... ... ...

      am11 am21 ... amn1                              m   am11 am21 ... amn1
                                                                    k=1
       i

           j=1       2   ...    n                             j=1   2     ...   n
      i=1 a112 a122 ... a1n2                          i=1 a11l a12l ... a1nl
       2 a212 a222 ... a2n2                               2   a21l a22l ... a2nl
 +                                    +    ...    +
      ... ... ... ... ...                             ... ... ... ... ...
       m am12 am22 ... amn2                               m   am1l am2l ... amnl
                     k=2                                              k=l
                               Fig.6.79 Fusha tridimensionale

      Shembull       Formimi i fushës tridimensionale C(m,n,2), nga anëtarët e
                     matricave A(m,n) dhe B(m,n).
Fushat numerike 219


a. Bllok-diagrami

                                 Fillimi

                                i=1,m ⎞ ⎛    i=1,m ⎞
                    m,n,l,⎛ aij,
                          ⎜           ⎟,⎜ b ,      ⎟
                          ⎝     j=1,n ⎠ ⎝ ij j=1,n ⎠

                                    k=1


                                    i=1


                                    j=1

                        Po                        Jo
                                   k=1

                    cijk=aij                   cijk=bij


                                  j=j+1

                        Po
                                   j≤ n
                                          Jo
                                  i=i+1

                        Po
                                   i≤ m
                                      Jo
                                  k=k+1

                        Po
                                   k≤l
                                          Jo
                             ⎛        k = 1,l ⎞
                             ⎜                ⎟
                             ⎜ cijk , i = 1,m ⎟
                             ⎜        j = 1,n ⎟
                             ⎝                ⎠

                                  Fundi

                                  Fig.6.80
220 Algoritmet

b. Programi

// Programi Prg6_80
#include <iostream>
using namespace std;
int main()
{
  int const m=4,n=5,l=2;
  int A[m][n]={ { 4,-2, 3, 7, 1},
                 { 2, 5,-9, 1,-5},
                 { 6, 4, 2, 9, 3},
                 { 6,-2, 1, 8,-4}
              };
  int B[m][n]={ { 1, 3,-4,-6, 2},
                 { 6, 5,-2, 4,-8},
                 {-2, 3,-7, 1, 8},
                 { 9,-6, 2, 1, 7}
              };
  int i,j,k,C[m][n][l];
  for (k=0;k<l;k++)
      for (i=0;i<m;i++)
           for (j=0;j<n;j++)
               if (k==0)
                   C[i][j][k]=A[i][j];
               else
                   C[i][j][k]=B[i][j];

   cout << "     Fusha C"
         << "n";
   for (k=0;k<l;k++)
   {
       cout << " k="
              << k
              << "n";
       for (i=0;i<m;i++)
       {
            for (j=0;j<n;j++)
            {
                  cout.width(3);
                  cout << C[i][j][k];
            }
            cout << "n";
       }
       cout << "n";
   }
   return 0;
Fushat numerike 221

}

    Fusha tridimensionale, e cila formohet përmes programit të dhënë, në ekran
do të shtypet kështu:

    Fusha C

    k=0
    4 -2 3          7 1
    2 5 -9          1 -5
    6 4 2           9 3
    6 -2 1          8 -4

     k=1
     1 3 -4 -6 2
     6 5 -2 4 -8
    -2 3 -7 1 8
     9 -6 2 1 7


   Plotësisht njëlloj si edhe gjatë punës me matrica, mund të operohet edhe me
anëtarët e fushave tridimensionale.

     Shembull        Llogaritja e shumës s të katrorëve të anëtarëve negativë të
                     fushës tridimensionale A(m,n,l).




a. Bllok-diagrami
222 Algoritmet


                        Fillimi

                       ⎛        k = 1,l ⎞
                       ⎜                ⎟
                 m,n,l,⎜ aijk , i = 1,m ⎟
                       ⎜        j = 1,n ⎟
                       ⎝                ⎠

                           s=0

                           k=1


                           i=1


                           j=1

                                      Jo
                         aijk < 0
                                 Po
                        s=s+aijk2


                         j=j+1
                 Po
                          j≤ n
                                 Jo
                         i=i+1

                 Po
                          i≤ m
                             Jo
                         k=k+1

                 Po
                          k≤l
                                 Jo
                            s

                         Fundi

                         Fig.6.81
b. Programi
Fushat numerike 223


// Programi Prg6_81
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const m=3,n=4,l=2;
  int A[m][n][l]={      {{3,5},{-2,4},{5,2},{-7,-1}},
                        {{-4,9},{6,1},{-2,7},{4,8}},
                        {{7,3},{6,-5},{8,1},{-2,9}}
                   };
  int i,j,k;
  double s;
  s=0;
  for (k=0;k<l;k++)
       for (i=0;i<m;i++)
            for (j=0;j<n;j++)
                 if (A[i][j][k]<0)
                    s=s+A[i][j][k]*A[i][j][k];
  cout << "Fusha A"
         << "n";
  for (k=0;k<l;k++)
  {
       cout << " k="
             << k
             << "n";
       for (i=0;i<m;i++)
       {
            for (j=0;j<n;j++)
            {
                 cout.width(3);
                 cout << A[i][j][k];
            }
            cout << "n";
       }
       cout << "n";
  }
  cout << "Shuma s="
        << s
        << "n";
  return 0;
}
224 Algoritmet

    Pas ekzekutimit të programit të dhënë, fusha e lexuar A si dhe shuma e
katrorëve të anëtarëve negativë të saj në ekran do të shtypen kështu:

   Fusha A

  k=0
  3 -2 5 -7
 -4 6 -2 4
  7 6 8 -2

   k=1
   5 4       2 -1
   9 1       7 8
   3 -5      1 9

Shuma s=103


    Detyra          Për fushën tridimensionale A(m,n,l), të gjendet shuma:

                    a. e kubeve të anëtarëve të saj;

                    b. e anëtarëve të saj, të pjesëtuar me shumën e indekseve
                    përkatëse;

                    c. e anëtarëve të diagonales së saj;

                    d. e anëtarëve me indeks të parë tek e indeks të tretë çift;

                    e. e anëtarëve me të tri indekset tek;

                    f. e anëtarëve pozitivë, por me indeks të tretë tek.


   Për gjetjen e anëtarit të caktuar, edhe te fushat tridimensionale mund të
veprohet plotësisht njëlloj si edhe te vektorët ose matricat.

    Shembull        Gjetja e anëtarit më të madh për nga vlera absolute e, në
                    fushën tredimensionale A(m,n,l).
Fushat numerike 225

a. Bllok-diagrami
                           Fillimi

                          ⎛        k = 1,l ⎞
                          ⎜                ⎟
                    m,n,l,⎜ aijk , i = 1,m ⎟
                          ⎜        j = 1,n ⎟
                          ⎝                ⎠

                           e=|a111|

                              k=1


                              i=1


                              j=1

                                         Jo
                           |aijk| > e
                                    Po
                           e=|aijk|


                            j=j+1
                    Po
                             j≤ n
                                    Jo
                            i=i+1

                    Po
                             i≤ m
                                Jo
                            k=k+1

                    Po
                             k≤l
                                    Jo
                               e

                            Fundi

                            Fig.6.82
226 Algoritmet

b. Programi

// Programi Prg6_82
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int const m=3,n=4,l=2;
  int A[m][n][l]={      {{3,-9},{-2,3},{4,2},{-5,-1}},
                        {{-4,8},{6,1},{-2,7},{-4,-8}},
                        {{7,3},{6,-5},{8,1},{-2,1}}
                   };
  int i,j,k,e;
  e=abs(A[0][0][0]);
  for (k=0;k<l;k++)
      for (i=0;i<m;i++)
           for (j=0;j<n;j++)
                 if (abs(A[i][j][k])>e)
                    e=abs(A[i][j][k]);
  cout << "Fusha A"
        << "n";
  for (k=0;k<l;k++)
  {
      cout << " k="
             << k
             << "n";
      for (i=0;i<m;i++)
      {
           for (j=0;j<n;j++)
           {
                 cout.width(3);
                 cout << A[i][j][k];
           }
           cout << "n";
      }
      cout << "n";
  }
  cout << "Vlera absolute më e madhe e="
        << e
        << "n";
  return 0;
}
Fushat numerike 227


   Për vlerat numerike të anëtarëve të fushës tridimensionale, që është marr si
shembull në program, rezultati që shtypet në ekran është:

   Fusha A

  k=0
  3 -2 4 -5
 -4 6 -2 -4
  7 6 8 -2

  k=1
 -9 3       2 -1
  8 1       7 -8
  3 -5      1 1

Vlera absolute më e madhe e=9


    Edhe te fushat tridimensionale mund të numërohen anëtarët e caktuar,
plotësisht njëlloj si edhe te matricat ose vektorët.

    Shembull        Numri i anëtarëve pozitivë p brenda fushës tridimensionale
                    A(m,n,l), por të cilët gjenden mes vlerave 5 dhe 9, duke i
                    shtypur njëkohësisht anëtarët negativë dhe indekset e tyre.




a. Bllok-diagrami
228 Algoritmet

                               Fillimi

                              ⎛        k = 1,l ⎞
                              ⎜                ⎟
                        m,n,l,⎜ aijk , i = 1,m ⎟
                              ⎜        j = 1,n ⎟
                              ⎝                ⎠

                                  p=0

                                  k=1


                                  i=1


                                  j=1

                        Po
                                aijk < 0
                                        Jo
                                             Po               Po
                                aijk > 5           aijk < 9

                                     Jo            Jo
                 k,i,j,aijk                                   p=p+1


                                j=j+1
                        Po
                                 j≤ n
                                        Jo
                                i=i+1
                        Po
                                i≤ m
                                    Jo
                                k=k+1
                        Po
                                 k≤l
                                    Jo
                                  p

                                Fundi

                                 Fig.6.83
Fushat numerike 229

b. Programi

// Programi Prg6_83
#include <iostream>
using namespace std;
int main()
{
      int const m=3,n=4,l=2;
      int A[m][n][l]={ {{3,-9},{-2,3},{4,2},{-5,-1}},
                         {{-4,8},{6,1},{-2,7},{-4,-8}},
                         {{7,3},{6,-5},{8,1},{-2,1}}};
      int i,j,k,p;
      p=0;
      cout << "          k       i       j   A[i][j][k]"
            <<"n";
      for (k=0;k<l;k++)
           for (i=0;i<m;i++)
               for (j=0;j<n;j++)
                    if (A[i][j][k]<0)
                       {
                         cout << "t"
                              << k
                              << "t"
                              << i
                              << "t"
                              << j
                              << "t"
                              << A[i][j][k]
                              << "t";
                       }
                  else
                       if (A[i][j][k]>5 && A[i][j][k]<9)
                           p=p+1;
      cout << "Numri i kërkuar p="
            << p
            << endl;
      return 0;
}

   Rezultati që shtypet në ekran, pas ekzekutimit të programit të dhënë, është:

              k        i            j     A[i][j][k]
              0        0            1         -2
              0        0            3         -5
              0        1            0         -4
              0        1            2         -2
              0        1            3         -4
              0        2            3         -2
230 Algoritmet

        1               0           0              -9
        1               0           3              -1
        1               1           3              -8
        1               2           1              -5
Numri i kërkuar         p=6

ku në pjesën e parë janë shtypur indekset dhe vlerat e anëtarëve negativë të
fushës, kurse p=6 është numri i anëtarëve pozitivë të fushës të cilët gjenden mes
vlerave 5 dhe 9.


    Detyra        Në fushën tridimensionale A(m,n,l) të gjendet:

                  a. numri i anëtarëve pozitivë;

                  b. numri i anëtarëve më të mëdhenj se vlera x, por të
                  ndryshëm nga vlera y;

                  c. shuma e anëtarëve pozitivë;

                  d. prodhimi i anëtarëve më të vegjël se vlera x;

                  e. anëtari me vlerë minimale, për çdo vlerë të indeksit të
                  tretë.
Algoritmet C++
232 Algoritmet




    Në praktikë, vlerat numerike të funksioneve të ndryshme llogariten duke
shfrytëzuar seri të pafundme. Por, meqë realisht nuk mund të shkohet në
pafundësi, llogaritjet ndërpriten duke marrë parasyshë një numër të caktuar
anëtarësh të serive, me çka fitohen vlerat e përafërta të funksioneve.

    Shembull        Llogaritja e vlerës së përafërt s të shumës:

                         ∞
                             1
                        ∑     2i
                        i =1 i


                    duke marrë parasysh vetëm anëtarët të cilët janë më të
                    mëdhenj se numri i dhënë ε.

a. Bllok-diagrami
                                   Fillimi

                                          ε
                                        s=0

                                        i=1

                                      1               Jo
                                        2i
                                              >ε
                                    i
                                              Po            s
                                              1
                                    z=           2i
                                             i             Fundi

                                     s=s+z

                                        i,z

                                     i=i+1


                                          Fig.7.1
Vlerat e serive të pafundme 233

    Algoritmet e tillë te të cilët paraprakisht nuk dihet se sa herë do të përsëritet
një pjesë e caktuar e tyre, quhen edhe algoritme iterative.

b. Programi

// Programi Prg7_1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      const double e=0.0000001;
      float i;
      double z,s;
      s=0;
      i=1;
      while ((1/pow(i,2*i)) > e)
      {
            z=1/pow(i,2*i);
            s=s+z;
            cout.precision(0);
            cout.width(5);
            cout <<i;
            cout.precision(7);
            cout.width(12);
            cout.setf(ios::fixed, ios::floatfield);
            cout <<z;
            cout << "n";
            i=i+1;
      }
      cout << "Shuma s="
           << s
           <<"n";
      return 0;
}
    Në program, fuqizimi është llogaritur përmes funksionit pow, te i cili,
argumenti i parë e paraqet madhësin që fuqizohet, kurse fuqia shënohet si
argument i dytë.
    Rezultati që do të shtypet në ekran, pas ekzekutimit të programit të dhënë,
duket kështu:

      1       1.0000000
      2       0.0625000
      3       0.0013717
      4       0.0000153
      5       0.0000001
234 Algoritmet

Shuma s=1.0638871
ku në kolonën e dytë janë shtypur anëtarët e serisë së pafundme të cilët marrin
pjesë në llogaritjen e vlerës së shumës.
    Gjatë llogaritjes së vlerave përmes serive të pafundme, llogaritja mund të
ndërpritet në një numër të caktuar anëtarësh të serisë, i cili zgjidhet lirisht.

    Shembull        Llogaritja e vlerës së përafërt s të shumës:

                         ∞
                                    x
                        ∑ (−1)i
                                  3i − 2
                        i =1


                    duke marrë parasysh k-anëtarët e parë të serisë.


a. Bllok-diagrami
                                              Fillimi

                                                 x,k

                                                 s=0

                                                 i=1


                                           z = (− 1)
                                                   i     x
                                                       3i - 2

                                                s=s+z

                                                 i,z

                                                i=i+1

                                      Po
                                                i≤k
                                                  Jo
                                                  s

                                                Fundi

                                               Fig.7.2
Vlerat e serive të pafundme 235


b. Programi

// Programi Prg7_2
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
      int const x=2,k=5;
      int i;
      double z,s;
      s=0;
      for (i=1;i<=k;i++)
      {
            z=pow((-1.),i)*x/(3*i-2);
            s=s+z;
            cout.width(5);
            cout <<i;
            cout.precision(7);
            cout.width(13);
            cout.setf(ios::fixed, ios::floatfield);
            cout <<z;
            cout << "n";
      }
      cout << "Shuma s="
           << s
           << "n";
      return 0;
}

   Në program, për llogaritje të fuqizimit është shfrytëzuar funksioni pow,
përmes së cilit (-1) ngritet në fuqinë i. Rezultati që fitohet në ekran, për vlerat
k=5 dhe x=2, do të duket kështu:

    1   -2.0000000
    2    0.5000000
    3   -0.2857143
    4    0.2000000
    5   -0.1538462
Shuma s=-1.7395604

    Kushti për ndërprerejen e shtimit të anëtarëve gjatë llogaritjeve përmes serive
të pafundme mund të jetë edhe ndonjë vlerë e cila llogaritet nga vlera e anëtarit
që shtohet.
236 Algoritmet



    Shembull        Llogaritja e vlerës së përafërt s të shumës:

                         ∞
                             ⎛        π ⎞
                        ∑ ⎜1     +       ⎟
                        i =1 ⎝       5i4 ⎠

                    duke marrë parasysh vetëm anëtarët, logaritmi natyror i të
                    cilëve është më i madh se numri i dhënë ε.


a. Bllok-diagrami
                                         Fillimi

                                             π
                                           s=0

                                           i=1


                                     ⎛        π ⎞      Jo
                                 ln⎜ 1 +
                                   ⎜             ⎟>ε
                                                 ⎟
                                     ⎝       5i4 ⎠
                                                 Po           s
                                                 π
                                     z = 1+       4
                                                            Fundi
                                                 5i

                                          s=s+z

                                           i,z

                                          i=i+1


                                             Fig.7.3
Vlerat e serive të pafundme 237



b. Programi

// Programi Prg7_3
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      const double e=0.001,pi=3.1415926,x=2;
      float i;
      double z,s;
      s=0;
      i=1;
      while (log(1+pi/(5*pow(i,4))) > e)
      {
            z=1+pi/(5*pow(i,4));
            s=s+z;
            cout.precision(0);
            cout.width(5);
            cout <<i;
            cout.precision(5);
            cout.width(10);
            cout.setf(ios::fixed, ios::floatfield);
            cout <<z;
            cout << "n";
            i=i+1;
      }
      cout << "Shuma s="
           << s
           <<"n";
      return 0;
}

   Rezultati që shtypet në ekran, nëse ekzekutohet programi i dhënë, duket
kështu:

    1   1.62832
    2   1.03927
    3   1.00776
    4   1.00245
    5   1.00101
Shuma s=5.67881
238 Algoritmet

ku në kolonën e dytë janë shtypur anëtarët e serisë, të cilët i shtohen vlersës së
shumës.



   Seritë e pafundme shfrytëzohen gjatë llogaritjes së vlerave të funksioneve të
ndryshme trigonometrike.

    Shembull         Llogaritja e vlerës së përafërt s e funksionit sin(x),
                     përmes serisë së pafundme:

                          ∞
                                     x2i + 1
                         ∑ (−1)i   (2i + 1)!
                         i =0


                     nëse gabimi relativ i lejuar është ε.



   Gabimi relativ llogaritet përmes shprehjes:

           Sv − Sp
    r =
             Sv

ku janë:

   Sp - shuma parciale paraprake
   Sv - shuma parciale vijuese.
Vlerat e serive të pafundme 239




a. Bllok-diagrami
Fillimi

                                         x,ε

                                         s=0

240 Algoritmet                           i=0

                                         Sp=s

                                         F=1
Fig.7.4
b. Programi                              j=1

// Programi
Prg7_4                                 F=F⋅j                F=(2i+1)!
#include
<iostream>                             j=j+1
#include
<cmath>                       Po
#include                             j≤(2i+1)
<iomanip>                                      Jo
using namespace
std;                                                 2i+1
                               s = s + (- 1)
                                           i     x
int main()
{                                               (2i + 1)!
      const
double                                   Sv=s
e=0.0001,x=0.75
;
                                         Sv − Sp
      int i,j;                      r=
      double                               Sv
s,Sp,Sv,r,F;
      s=0;                               i,r
      i=0;
      do
      {                                i=i+1

                               Po
        Sp=s;                         r≥ε
                 F=1;
                                          Jo
           for                      s,sin(x)
(j=1;j<=2*i+1;j
++)                                    Fundi

F=F*j;

                 s=s+pow((-1.),i)*pow(x,2*i+1)/F;
                 Sv=s;
                 r=fabs((Sv-Sp)/Sv);

                 cout.width(4);
                 cout <<i;
                 cout.precision(6);
                 cout.width(10);
                 cout.setf(ios::fixed, ios::floatfield);
Vlerat e serive të pafundme 241

         cout <<r;
         cout << "n";

          i=i+1;
    }
    while (r>=e);

    cout << "Vlera e përafërt s="
         << s
         <<"n"
         << "Vlera e saktë sin="
         << sin(x)
         <<"n";
    return 0;
}
242 Algoritmet

   Nëse ekzekutohet programi, rezultati që shtypet në ekran është:

   0       1.000000
   1       0.103448
   2       0.002901
   3       0.000039
Vlera      e përafërt s=0.681639
Vlera      e saktë sin=0.681639

     Në pjesën e parë të rezultatit janë shtypur vlerat e variablës i dhe gabimi
absolut r për çdo i, i cili, siç shihet, shkon gjithnjë duke u zvogëluar. Kurse në
dy rreshtat e fundit, së pari është shtypur shuma s e vlerës së përafërt të sinusit,
dhe pastaj edhe vlera e funksionit sin(x), e llogaritur përmes funksionit sin,
i cili gjendet në kuadër të bibliotekës së funksioneve të gjuhës C++. Siç shihet,
vlera e llogaritur përmes serisë së pafundme dhe ajo e llogaritur duke shfrytëzuar
funksionin sin, për saktësinë e kërkuar, janë të barabarta.

   Vlerat e serive të pafundme mund të llogariten edhe duke e pasur parasysh
gabimin e lejuar relativ.

    Shembull       Llogaritja e vlerës së përafërt s e serisë së pafundme:

                        ∞
                              x
                       ∑
                       i =1   i3

                   nëse gabimi absolut i lejuar është ε.


   Gabimi absolut llogaritet përmes shprehjes:

    a = Sv − Sp

ku janë:

   Sp - shuma parciale paraprake
   Sv - shuma parciale vijuese.
Vlerat e serive të pafundme 243

a. Bllok-diagrami
                                  Fillimi

                                     x,ε

                                    s=0

                                    i=1

                                    Sp=s
                                           x
                                  s = s+     3
                                           i

                                    Sv=s

                                  a=|Sv-Sp|

                                    i,a

                                   i=i+1
                             Po
                                    a≥ε
                                       Jo
                                     s

                                   Fundi

                                   Fig.7.5
b. Programi

// Programi Prg7_5
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      const double x=2,e=0.01;
      float i;
      double s,Sp,Sv,a;
      s=0;
      i=1;
      do
      {
244 Algoritmet

                 Sp=s;
                 s=s+x/pow(i,3);
                 Sv=s;
                 a=fabs(Sv-Sp);
                 cout.precision(0);
                 cout.width(4);
                 cout <<i;
                 cout.precision(6);
                 cout.width(10);
                 cout.setf(ios::fixed, ios::floatfield);
                 cout <<a;
                 cout << "n";
                 i=i+1;
        }
        while (a>=e);
        cout << "Vlera e llogaritur s="
             << s
             <<"n";
        return 0;
}

    Rezultati që fitohet në ekran pas ekzekutimit të programit të dhënë është:

   1     2.000000
   2     0.250000
   3     0.074074
   4     0.031250
   5     0.016000
   6     0.009259
Vlera    e llogaritur s=2.380583

   Në kolonën e dytë të rezultateve të dhëna më sipër janë shtypur vlerat e
gabimit absolut a në iteracionet e veçanta, përkatësisht për çdo vlerë të variablës
i.

    Detyrë        Të llogaritet vlera e përafërt z e funksionit ex, përmes serisë
                  së pafundme:

                        ∞
                              x
                       ∑
                       i =1   i3

                  nëse gabimi relativ i lejuar është ε.
Algoritmet C++
246 Algoritmet




   Gjatë llogaritjeve të ndryshme, kur kemi të bëjmë me vlera komplekse,
operohet veç me pjesën reale dhe veç me atë imagjinare.

    Shembull        Llogaritja e shumës së anëtarëve kompleksë të vektorit
                    Z(n), nëse anëtarët e pjesës reale dhe të pjesës imagjinare
                    janë dhënë përmes vektorëve X(n) dhe Y(n).




           n
   s =    ∑ zi
          i =1
           n
      =   ∑ (xi   + jyi)
          i =1
           n         n
      =   ∑ xi    + j ∑ yi   = a + jb
          i =1      i =1
Numrat kompleksë 247

a. Bllok-diagrami

                            Fillimi

                    n,(xi,i=1,n),(yi,i=1,n)

                                a=0

                                b=0

                                i=1


                            a=a+xi

                            b=b+yi

                            i,xi,yi

                               i=i+1
                       Po
                               i≤n
                                  Jo
                                a,b

                               Fundi

                            Fig.8.1

b. Programi

// Programi Prg8_1
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
      int const n=5;
      int a,b,i;
      int X[n]={3,7,4,2,-8};
      int Y[n]={6,-9,5,8,1};
      a=0;
      b=0;
      cout << "    i  X   Y"
248 Algoritmet

            << "n";
       cout << "-------------"
            << "n";
       for (i=0;i<n;i++)
       {
           a=a+X[i];
           b=b+Y[i];
           cout << setw(4) << i
                 << setw(4) << setiosflags(ios::right)<<X[i]
                 << setw(4) << setiosflags(ios::right)<<Y[i]
                 << "n";
       }
       cout << "Shuma reale .... a="
            << a
            << "n"
            << "Shuma imagjinare b="
            << b
            << "n";
       return 0;
}

   Për vlerat e vektorit kompleks Z(n), përkatësisht komponentes reale X(n)
dhe komponentes imagjinare Y(n), të cilat janë marrë si shembull, pas
ekzekutimit të programit në ekran do të shtypen këto rezultate:

   i   X   Y
-------------
   1   3   6
   2   7 -9
   3   4   5
   4   2   8
   5 -8    1
Shuma reale .... a=8
Shuma imagjinare b=11


    Për llogaritjen e prodhimit të anëtarëve të një vektori kompleks duhet
shfrytëzuar formën eksponenciale të shprehjes së anëtarëve përkatës të vektorit.
Numrat kompleksë 249


    Shembull                   Llogaritja e prodhimit të anëtarëve kompleksë të vektorit
                               Z(n), nëse anëtarët e pjesës reale dhe të pjesës imagjinare
                               janë dhënë përmes vektorëve X(n) dhe Y(n).



            n
    P=     ∏(xi + jy i)
           i=1

       =
             n
                   (
               ∏ ρi ⋅ ejϕi          )
           i=1
           (                   )(              )
       = ρ1 ⋅ ejϕ1 ⋅ ρ 2 ⋅ ejϕ2 ⋅...⋅ ρ n ⋅ ejϕn    (     )
                               n
               n           j   ∑   ϕi
       =   ∏ ρi ⋅ e i=1                 = α ⋅ ejβ
           i=1
       = α ⋅ cos β + jα ⋅ sin β
       = a + jb

ku janë:
                       n
           α =         ∏ ρi
                     i =1
                    n
           β=       ∑ ϕi
                   i=1


           a = α ⋅ cos β ,

           b = α ⋅ sin β


           ρi =            xi2 + yi2
                     y
           ϕi = arctg i
                     xi
250 Algoritmet



a. Bllok-diagrami

                              Fillimi

                    n,(xi,i=1,n),(yi,i=1,n)

                                 α=1

                                 β=0

                                 i=1


                            ρi = x i + y i
                                   2     2


                                   y
                         ϕi = arctg i
                                   xi


                               α=α⋅ρ i

                                β=β⋅ϕ i

                               i,xi,yi

                               i=i+1
                       Po
                                i≤ n
                                   Jo
                              a=α⋅cosβ

                              b=α⋅sinβ

                                 a,b

                               Fundi

                                Fig.8.2
Numrat kompleksë 251




b. Programi

// Programi Prg8_2
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      int const n=5;
      int i;
      double X[n]={3,7,4,2,-8};
      double Y[n]={6,-9,5,8,1};
      double a,b,Alfa,Beta,Ro[n],Fi[n];
      Alfa=1;
      Beta=0;
      cout << "    i   X  Y"
           << "n";
      cout << "-------------"
           << "n";
      for (i=0;i<n;i++)
      {
         Ro[i]=sqrt(pow(X[i],2)+pow(Y[i],2));
         Fi[i]=atan(Y[i]/X[i]);
         Alfa=Alfa*Ro[i];
         Beta=Beta+Fi[i];
         cout << setw(4) << i
              << setw(4) << setiosflags(ios::right)<< X[i]
              << setw(4) << setiosflags(ios::right)<< Y[i]
              << "n";
      }
      a=Alfa*cos(Beta);
      b=Alfa*sin(Beta);
      cout << "Pjesa reale .... a="
           << a
           << "n"
           << "Pjesa imagjinare b="
           << b
           << "n";
      return 0;
}

    Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran do të duket
si në vijim.
252 Algoritmet



   i   X   Y
-------------
   0   3   6
   1   7 -9
   2   4   5
   3   2   8
   4 -8    1
Pjesa reale .... a=-21570
Pjesa imagjinare b=24390

    Për llogaritjen e shumës ose të prodhimit të funksioneve trigonometrike, ose
edhe të funksioneve të tjera, duhet gjetur rrugë që shprehjet të zbërthehen në
pjesën reale dhe në pjesën imagjinare të tyre.

    Shembull          Llogaritja e shumës:

                                 n
                           s=    ∑ sin zi
                                i =1


                      ku zi janë anëtarët kompleksë të vektorit Z(n), kurse
                      anëtarët e pjesës reale dhe të pjesës imagjinare të tij janë
                      dhënë përmes vektorëve X(n) dhe Y(n).

           n
    s=     ∑ sin zi
          i=1
           n
      =    ∑ sin(xi + jyi)
          i=1
           n ej xi +jyi) − e −j xi +jyi)
              (               (
      =    ∑
          i=1            2j
           eyi + e −yi
           n                      n eyi − e −yi
      =    ∑           sin xi + j ∑             cos xi
        i=1    2                 i=1    2
      = a + jb

ku janë:

           n eyi + e −yi
   a= ∑                  sin xi
          i=1    2

           n eyi − e −yi
   b= ∑                  cos xi
          i=1    2
Numrat kompleksë 253


a. Bllok-diagrami
                              Fillimi

                    n,(xi,i=1,n),(yi,i=1,n)

                                    a=0

                                    b=0

                                    i=1

                                  yi        − yi
                              e        +e
                     a =a+                         sin x i
                                       2
                                  yi        − yi
                              e        −e
                     b = b+                        cos x i
                                       2

                              i,xi,yi

                                  i=i+1
                       Po
                                   i≤n
                                     Jo
                                    a,b

                                  Fundi

                                  Fig.8.3
b. Programi

// Programi Prg8_3
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      int const n=5;
      int i;
      double X[n]={3,7,4,2,-8};
      double Y[n]={6,-9,5,8,1};
254 Algoritmet

        double a=0,b=0;
        cout << "    i   X  Y"
             << "n";
        cout << "-------------"
             << "n";
        for (i=0;i<n;i++)
        {
           a=a+(exp(Y[i])+exp(-Y[i]))/2*sin(X[i]);
           b=b+(exp(Y[i])-exp(-Y[i]))/2*cos(X[i]);
           cout << setw(4) << i
                << setw(4) << setiosflags(ios::right)<<X[i]
                << setw(4) << setiosflags(ios::right)<<Y[i]
                << "n";
        }
        cout << "Pjesa reale .... a="
             << a
             << "n"
             << "Pjesa imagjinare b="
             << b
             << "n";
        return 0;
}

    Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është:

   i   X   Y
-------------
   1   3   6
   2   7 -9
   3   4   5
   4   2   8
   5 -8    1
Pjesa reale .... a=3987.87
Pjesa imagjinare b=-3923.09

    Detyra        Nëse anëtarët e vektorit Z(n) janë numra kompleksë dhe
                  pjesët reale dhe imagjinare të tyre jepen përmes vektorëve
                  X(n) dhe Y(n), të llogariten vlerat:

                            n
                      p=   ∏ coszi
                           i=1

                           n
                      s=   ∑ ln zi
                           i=1
Numrat kompleksë 255
Algoritmet C++
256 Algoritmet




    Me tabelimin e vlerave numerike të funksioneve nënkuptohet llogaritja e
vlerave të tyre, për vlera të ndryshme të variablave që paraqiten brenda
shprehjeve përkatëse.

    Shembull      Llogaritja e vlerave të funksionit:

                          ⎧ e2x + 1           për x ≤ 3
                          ⎪
                          ⎪
                      y = ⎨ n             2
                          ⎪      ⎛x     ⎞
                          ⎪∑ ⎝2  ⎜ + 2i ⎟     për x > 3
                          ⎩i = 1        ⎠

                  për vlera të ndryshme të variablës x mes a dhe b, duke
                  ndryshuar atë me hapin h.
Tabelimi i funksioneve 257

a. Bllok-diagrami

                                      Fillimi

                                      n,a,b,h

                                        x=a

                             Po                        Jo
                                       x≤3
                                                            s=0

                                                            i=1

                                                                        2
                                                             ⎛x     ⎞
                                                     s = s + ⎜ + 2i ⎟
                                                             ⎝2     ⎠
                                                            i=i+1

                                                 Po
                                                            i ≤ n
                                                                  Jo
                          2x+1
                    y=e                                     y=s

                                       x,y

                                      x=x+h

                                 Po
                                       x≤b
                                                Jo
                                      Fundi

                                      Fig.9.1
258 Algoritmet

b. Programi

// Programi Prg9_1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      const double a=2,b=5,h=0.5;
      int n=3,i;
      double x,y,s;
      cout << "Tabela e vlerave"
           << "n";
      cout << "   x          y"
           << "n";
      x=a;
      do
      {
            if (x<=3)
               y=exp(2*x+1);
            else
            {
               s=0;
               for (i=1;i<=n;i++)
                    s=s+pow(x/2+2*i,2);
               y=s;
            }
            cout.setf(ios::fixed);
            cout.precision(2);
            cout.width(6);
            cout << x;

                 cout.precision(4);
                 cout.width(12);
                 cout << y
                      << "n";
                 x=x+h;
        }
        while (x<=b);
    return 0;
}

    Rezultati që shtypet në ekran do të duket:

Tabela e vlerave
   x       y
  2.00 148.4132
  2.50 403.4288
Tabelimi i funksioneve 259

   3.00 1096.6332
   3.50 107.1875
   4.00 116.0000
   4.50 125.1875
   5.00 134.7500


   Tabela mund t'i përmbajë vlerat numerike të disa funksionve njëkohësisht.

    Shembull         Llogaritja e vlerave numerike të funksioneve:

                           y = 3x2 + 2x − 1
                                 1
                           z =
                               2 − x
                           v = 3 ln(x − 1)
                           t = ex + 2 sin x

                     për vlera të ndryshme të variablës x mes a dhe b, duke
                     ndryshuar vlerën e saj me hapin h.


       Meqë për të gjitha vlerat e variablës x mund të llogariten vetëm funksionet
y dhe t, shprehjet e tyre janë vendosur menjëherë në fillim të bllok-diagramit.
Për funksionet e tjera, para se të llogariten vlerat e tyre, duhet kontrolluar vlerën
e variablës x, sepse funksioni v nuk mund të llogaritet, nëse x≤1, kurse vlera e
funksionit z është e padefinuar për x=2, gjë që shihet edhe në paraqitjen
vijuese:

                 y
                 z
                 v
                 t
                 x
                      -3     -2    -1    0     1      2     3
260 Algoritmet

a. Bllok-diagrami

                          Fillimi

                           a,b,h

                            x=a

                         y=3x2+2x-1

                         t=ex+2sin x
                                         Po
                            x≤1
                                Jo
                         v=3 ln(x-1)

                    Po
                            x=2
                                    Jo
                                1                             1
                          z=                            z=
                               2− x                          2− x

                         x,y,z,v,t            x,y,v,t   x,y,z,t


                           x=x+h
                    Po
                            x≤b
                               Jo
                           Fundi

                          Fig.9.2
Tabelimi i funksioneve 261

b. Programi

// Programi Prg9_1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
      const double a=-3,b=3,h=0.5;
      double x,y,z,v,t;
      cout << " x         y     z     v       t"
           << "n"
           << "----------------------------------"
           << "n";
      x=a;
      cout.setf(ios::fixed);
      cout.precision(2);
      do
      {
            y=3*pow(x,2)+2*x-1;
            t=exp(x)+2*sin(x);
            if (x<=1)
            {
               z=1/(2-x);
               cout << setw(5)
                    << x
                    << setw(8)
                    << y
                    << setw(6)
                    << z
                    << " Mungon"
                    << setw(7)
                    << t
                    << "n";
            }
            else
            {
               v=3*log(x-1);
               if (x==2)
               {
                  cout << setw(5)
                       << x
                       << setw(8)
                       << y
                       << " ----"
                       << setw(8)
                       << v
                       << setw(7)
262 Algoritmet

                               << t
                               << "n";
                    }
                    else
                    {
                       z=1/(2-x);
                       cout << setw(5)
                            << x
                            << setw(8)
                            << y
                            << setw(6)
                            << z
                            << setw(8)
                            << v
                            << setw(7)
                            << t
                            << "n";
                    }
                 }
                 x=x+0.5;
        }
        while (x<=b);
    return 0;
}

   Tabela e vlerave numerike, e cila fitohet në ekran pas ekzekutimit të
programit të dhënë, do të duket kështu:

  x       y     z      v       t
----------------------------------
-3.00   20.00 0.20 Mungon -0.23
-2.50   12.75 0.22 Mungon -1.11
-2.00    7.00 0.25 Mungon -1.68
-1.50    2.75 0.29 Mungon -1.77
-1.00    0.00 0.33 Mungon -1.32
-0.50   -1.25 0.40 Mungon -0.35
 0.00   -1.00 0.50 Mungon     1.00
 0.50    0.75 0.67 Mungon     2.61
 1.00    4.00 1.00 Mungon     4.40
 1.50    8.75 2.00    -2.08   6.48
 2.00   15.00 ----     0.00   9.21
 2.50   22.75 -2.00    1.22 13.38
 3.00   32.00 -1.00    2.08 20.37
Algoritmet C++
264 Algoritmet




    Në praktikë, përveç mesatares aritmetikore, përdoret edhe mesatarja gjeometrike,
si dhe mesatarja harmonike.

    Shembull            Llogaritja e mesatares aritmetikore, mesatares gjeometrike
                        dhe e mesatares harmonike, për anëtarët e vektorit X(n).



    Për llogaritjen e mesatareve në fjalë, përdoren shprehjet:

•   Mesatarja aritmetikore
          1 n
    a =      ∑ xi
          n i =1

•   Mesatarja gjeometrike

                n
    g = n   ∏ xi
            i =1


•   Mesatarja harmonike

                n
    h =     n
                    1
          ∑x
          i =1 i
Mesataret dhe devijimet 265

a. Bllok-diagrami
                          Fillimi

                     n,(xi,i=1,n)

                              s1=0

                               p=1

                              s2=0

                               i=1

                          s1=s1+xi

                             p=p⋅xi

                                          1
                         s =s +
                         2        2       x
                                              i

                             i=i+1
                    Po
                              i≤n
                                 Jo
                                s
                              a= 1
                                 n

                             g=   n   p

                                      n
                             h=
                                  s
                                      2

                             a,g,h

                             Fundi

                             Fig.10.1
266 Algoritmet

b. Programi

// Programi Prg10_1
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
      const int n=5;
      int X[n]={7,4,2,8,5},i;
      double s1=0,p=1,s2=0,a,g,h;
      for (i=0;i<n;i++)
      {
            s1=s1+X[i];
            p=p*X[i];
            s2=s2+1./X[i];
      }
      a=s1/n;
      cout << "Mesatarja aritmetikore a="
           << a;
      g=pow(p,1./n);
      cout << "nMesatarja gjeometrike g="
           << g;
      h=n/s2;
      cout << "nMesatarja harmonike    h="
           << h
           << "n";
  return 0;
}

   Për vlerat e anëtarëve të vektorit që është marra si shembull në program, pas
ekzekutimit të programit, si rezultat në ekran do të shtypet:

Mesatarja aritmetikore a=5.2
Mesatarja gjeometrike g=4.67789
Mesatarja harmonike    h=4.10557

    Duke shfrytëzuar vlerat e llogaritura të mesatareve, përmes shprehjeve
vijuese mund të gjenden edhe devijimet standarde përkatëse:

•   Devijimi aritmetikor

              1 n
    σ =          ∑ (xi − a)2
              n i =1
Mesataret dhe devijimet 267

•   Devijimi gjeometrik

           1 n
    ρ =       ∑ (xi − g)2
           n i =1

•   Devijmi absolut
          1 n
    δ =      ∑ xi − a
          n i =1

    Shembull          Llogaritja e devijimit standard aritmetikor, gjeometrik dhe
                      harmonik, për anëtarët e vektorit X(n).


a. Bllok-diagrami

                                            Fillimi

                                         n,(xi,i=1,n)

                                               s1=0

                                                p=1

                                               s2=0

                                                i=1

                                            s1=s1+xi

                                               p=p⋅xi

                                                        1
                                           s =s +
                                           2     2      x
                                                            i

                                               i=i+1
                                      Po
                                               i≤n
                                                  Jo

                                                 A
268 Algoritmet


                            A


                        a = s1 / n


                        g=np

                        h = n/s2

                         a,g,h

                          s3=0

                          s4=0

                          s5=0

                          i=1

                  s3=s3+(xi-a)2

                  s4=s4+(xi-g)2

                      s5=s5+|xi-a|

                         i=i+1
                 Po
                          i≤n
                             Jo
                       σ = s3 / n


                       ρ = s4 / n

                       δ = s5 / n

                          σ,ρ,δ

                         Fundi

                        Fig.10.2
Mesataret dhe devijimet 269



b. Programi

// Programi Prg10_2
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
      const int n=5;
      int X[n]={7,4,2,8,5},i;
      double s1=0,p=1,s2=0,a,g,h;
      double s3=0,s4=0,s5=0,Sigma,Ro,Delta;
      for (i=0;i<n;i++)
      {
            s1=s1+X[i];
            p=p*X[i];
            s2=s2+1./X[i];
      }
      a=s1/n;
      cout << "Mesatarja aritmetikore a="
           << a;
      g=pow(p,1./n);
      cout << "nMesatarja gjeometrike g="
           << g;
      h=n/s2;
      cout << "nMesatarja harmonike    h="
           << h;
      for (i=0;i<n;i++)
      {
            s3=s3+pow(X[i]-a,2);
            s4=s4+pow(X[i]-g,2);
            s5=s5+fabs(X[i]-a);
      }
      Sigma=sqrt(s3/n);
      cout << "nDevijimi aritmetikor Sigma="
           << Sigma;
      Ro=sqrt(s4/n);
      cout << "nDevijimi gjeometrik      Ro="
           << Ro;
      Delta=s5/n;
      cout << "nDevijimi absolut     Delta="
           << Delta
           << "n";
  return 0;
}
270 Algoritmet



   Pas ekzekutimit të programit të dhënë, rezultatet në ekran do të shtypen
kështu:

Mesatarja aritmetikore a=5.2
Mesatarja gjeometrike g=4.67789
Mesatarja harmonike    h=4.10557
Devijimi aritmetikor Sigma=2.13542
Devijimi gjeometrik     Ro=2.19832
Devijimi absolut     Delta=1.84
Integralet e njëfishta 272
 Integralet e dyfishta 277
272 Algoritmet




   Për llogaritjen e vlerës së integralit të caktuar, përdoret Metoda e Trapezit, ose
Metoda e Simpsonit.


Integralet e njëfishta
     Vlera e integralit të njëfishtë:

     b
     ∫ f x)dx
        (
     a


sipas Metodës së Trapezit llogaritet me shprehjen:

             ⎡ f a) + f b)       n −1             ⎤
                (      (
     T = h ⋅ ⎢             +     ∑ fa
                                   (      + i ⋅ h)⎥
             ⎢
             ⎣      2            i =1             ⎥
                                                  ⎦
ku
           b − a
     h =
             n

është hapi i integrimit, nëse zona e integrimit ndahet në n-pjesë.

     Shembull        Llogaritja e vlerës së integralit:

                         4
                         ∫ (x    + 1)dx
                             2

                         1


                     me metodën numerike të Trapezit.
Integrimi numerik 273

a. Bllok-diagrami
                               Fillimi

                               f(x)=x2+1

                                 n,a,b

                                    b-a
                               h=
                                        n
                                  s=0

                                  i=1


                             s=s+f(a+ih)

                                 i=i+1

                        Po
                                i ≤ n-1
                                     Jo

                      T = h⋅
                               ⎡ f(a)+ f(b) + s⎤
                               ⎢
                               ⎣     2         ⎥
                                               ⎦
                                    T

                                 Fundi

                                Fig.11.1
b. Programi

// Programi Prg11_1
#include <iostream>
using namespace std;
double f(double x);
int main()
{
      const int n=10;
      const double a=1,b=4;
      int i;
      double T,s,h;
      h=(b-a)/n;
      s=0;
      for (i=1;i<=n-1;i++)
274 Algoritmet

            s=s+f(a+i*h);
        T=h*((f(a)+f(b))/2+s);
        cout << "Vlera e integralit T="
             << T
             << "n";
    return 0;
}

// Nënprogrami
double f(double x)
{
  return x*x+1;
}

    Pas ekzekutimit të programit të dhënë, rezultati që shtypet në ekran është:

Vlera e integralit T=24.045

   Vlera e integralit llogaritet edhe përmes Metodës së Simpsonit, duke shfrytëzuar
shprehjen:

             ⎧                                      n −1         ⎫
          h ⎪                 n
                                                                 ⎪
    S =    ⋅ ⎨f a) + f b) + 4 ∑ f[a + (2i − 1) ] + 2 ∑ f[a + 2ih]⎬
               (      (                       h
          3 ⎪⎩               i =1                   i =1         ⎪
                                                                 ⎭

ku hapi i integrimit llogaritet kështu:

          b − a
    h =
           2n

nëse zona e integrimit ndahet në n-pjesë.

     Shembull      Llogaritja e vlerës së integralit:

                        4
                        ∫ (x    + 1)dx
                            2

                        1


                   me metodën numerike të Simpsonit.
Integrimi numerik 275


a. Bllok-diagrami

                                  Fillimi

                                 f(x)=x2+1

                                   n,a,b

                                       b-a
                                  h=
                                       2n
                                    s1=0

                                    s2=0

                                    i=1


                          s1=s1+f[a+(2i-1)h]

                               s2=s2+f(a+2ih)

                                   i=i+1

                          Po
                                i ≤ n-1
                                      Jo
                          s1=s1+f[a+(2n-1)h]


                    S=
                         h
                         3
                           {
                           ⋅ f(a)+ f(b)+ 4 ⋅ s + 2 ⋅ s
                                              1       2
                                                          }
                                       S
                                   Fundi

                                  Fig.11.2
276 Algoritmet


b. Programi

// Programi Prg11_2
#include <iostream>
using namespace std;
double f(double x);
int main()
{
      const int n=10;
      const double a=1,b=4;
      int i;
      double S,s1,s2,h;
      h=(b-a)/(2*n);
      s1=0;
      s2=0;
      for (i=1;i<=n-1;i++)
      {
          s1=s1+f(a+(2*i-1)*h);
          s2=s2+f(a+2*i*h);
      }
      s1=s1+f(a+(2*n-1)*h);
      S=h/3*(f(a)+f(b)+4*s1+2*s2);
      cout << "Vlera e integralit S="
            << S
            << "n";
  return 0;
}

// Nënprogrami
double f(double x)
{
  return x*x+1;
}

   Pas ekzekutimit të programit të dhënë, rezulati në ekran do të shtypet kështu:

Vlera e integralit S=24
Integrimi numerik 277


Integralet e dyfishta
   Për llogaritjen e vlerës së integralit të dyfishtë:

    bd
    ∫ ∫ f x, y)dx dy
         (
    ac


sipas Metodës së Trapezit, shfrytëzohet shprehja:

                ⎧1
    T = h ⋅ g ⋅ ⎨ [f a,c)+ f a,d)+ f b,c)+ f b,d)
                    (       (       (       (    ]
                ⎩4
           1 ⎡n −1                m −1                 ⎤
       +     ⎢ ∑ f xi,c)+ f xi,d)+ ∑ f a,y j)+ f b,y j)
                   (       (           (        (      ⎥
           2 ⎢i=1
             ⎣                    j=1                  ⎥
                                                       ⎦
         m-1 n-1      ⎫
                      ⎪
       + ∑ ∑ f(xi,y j)⎬
         j=1 i=1      ⎪
                      ⎭

ku janë:

    xi = a + ih
    yj = c + jd
        b − a
    h =
          n
        d − c
    g =
          m


    Shembull         Llogaritja e vlerës së integralit të dyfishtë:

                         24
                                  1
                         ∫∫                dx dy
                         1 3 (x   + y )2

                     me metodën numerike të Trapezit.
278 Algoritmet

a. Bllok-diagrami


                                       Fillimi

                                                    1
                                  f(x,y) =
                                                (x + y )2
                                     m,n,a,b,c,d

                                            b-a
                                      h=
                                                n

                                            d-c
                                       g=
                                                m

                    r=
                         1
                         4
                           [
                           ⋅ f(a,c)+ f(a,d)+ f(b,c)+ f(b,d) ]
                                        s1=0

                                         i=1


                                      xi=a+i⋅h

                               s1=s1+f(xi,c)+f(xi,d)

                                        i=i+1

                                Po
                                       i ≤ n-1
                                             Jo

                                            A
Integrimi numerik 279


                   A


               s2=0

                j=1


              yj=c+j⋅g

  s2=s2+f(a,yj)+f(b,y1)

               j=j+1

    Po
              j ≤ m-1
                    Jo
               s3=0

                i=1


                j=1


              yj=c+j⋅g

         s3=s3+f(xi,yi)

               j=j+1

    Po
              j ≤ m-1
                    Jo
               i=i+1

    Po
              i ≤ n-1
                    Jo
          ⎧
T = h ⋅g ⋅ ⎨ r +
          ⎩
                   1
                   2
                       [s
                        1
                            +s
                             2
                                 ] + s3 ⎫
                                        ⎬
                                        ⎭
                   T

               Fundi

              Fig.11.3
280 Algoritmet

b. Programi

// Programi Prg11_3
#include <iostream>
#include <cmath>
using namespace std;
double f(double x,double y);
int main()
{
      const int m=6,n=4;
      const double a=1,b=2,c=3,d=4;
      int i,j;
      double T,s1,s2,s3,r,h,g,xi,yj;
      h=(b-a)/n;
      g=(d-c)/m;
      r=(f(a,c)+f(a,d)+f(b,c)+f(b,d))/4;

                 s1=0;
                 for (i=1;i<=n-1;i++)
                 {
                       xi=a+i*h;
                       s1=s1+f(xi,c)+f(xi,d);
                 }

        s2=0;
        for (j=1;j<=m-1;j++)
        {
              yj=c+j*g;
              s2=s2+f(a,yj)+f(b,yj);
        }

                 s3=0;
                 for (i=1;i<=n-1;i++)
                 {
                       xi=a+i*h;
                       for (j=1;j<=m-1;j++)
                       {
                             yj=c+j*g;
                             s3=s3+f(xi,yj);
                       }
                 }

        T=h*g*(r+(s1+s2)/2+s3);

        cout << "Vlera e integralit T="
               << T
               << "n";
    return 0;
}
Integrimi numerik 281



// Nënprogrami
double f(double x,double y)
{
  return 1/pow(x+y,2);
}

    Rezultati që do të shtypet në ekran, nëse ekzekutohet programi i dhënë,
është:

Vlera e integralit T=0.0408994
Metoda Runge-Kutta 284
Metoda Kutta-Merson 287
284 Algoritmet




   Për zgjidhjen e ekuacioneve diferenciale lineare përdoren metoda të
ndryshme numerike. Këtu do të jepen metodat Runge-Kutta dhe Kutta-Merson.


Metoda Runge-Kutta
    Sipas metodës Runge-Kutta të rendit të katërt, për pikën (xi,yi), fillimisht
llogariten vlerat e koeficientëve:

    r1 = f(xi, yi ) ⋅ h
          ⎛      h        r ⎞
    r2 = f⎜ xi + , yi + 1 ⎟ ⋅ h
          ⎝      2         2⎠
          ⎛      h        r ⎞
    r3 = f⎜ xi + , yi + 2 ⎟ ⋅ h
          ⎝      2         2⎠
    r4 = f(xi + h, yi + r3 ) ⋅ h

përmes së cilëve pastaj gjendet pika vijuese (xi+1,yi+1), kështu:

    xi + 1 = xi + h

    yi + 1 = yi + {r1 + 2r2 + 2r3 + r4}
                  1
                  6

ku hapi i diferencimit llogaritet me shprehjen:

          x p − x0
    h =
             n

nëse kushtet fillestare merren (x0,y0) dhe zona e diferencimit [x0,xp]
ndahet në n-pjesë.

    Shembull         Zgjidhja e ekuacionit diferencial:

                          dy
                             = x2 + y
                          dx

                     përmes metodës Runge-Kutta, për kushtet fillestare x0=1 dhe
                     y0=1.
Diferencimi numerik 285

a. Bllok-diagrami
                                 Fillimi

                             f(x,y)=x2+y

                              n,x0,y0,xp
                                   x -x
                                    p       0
                              h=
                                        n
                                   x=x0

                                   y=y0

                                   i=1


                             r1=f(x,y)⋅h

                             ⎛      h           r1 ⎞
                      r = f⎜ x +        ,y +        ⎟⋅h
                       2
                             ⎝      2           2   ⎠

                             ⎛      h           r2 ⎞
                      r = f⎜ x +        ,y +        ⎟⋅h
                      3
                             ⎝      2           2   ⎠
                           r4=f(x+h,y+r3)⋅h


                    y=y+
                            1
                             (r + 2⋅r + 2⋅r + r
                            6 1      2     3   4
                                                          )
                                  x=x+h

                                  i,x,y

                                  i=i+1

                       Po
                                   i≤n
                                       Jo
                                  Fundi

                                 Fig.12.1
286 Algoritmet

b. Programi

// Programi Prg12_1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double f(double x,double y);
int main()
{
      const int n=10;
      const double x0=1,y0=1,xp=2;
      int i;
      double x,y,h,r1,r2,r3,r4;
      h=(xp-x0)/n;
      x=x0;y=y0;
      cout << "    i     x         y"
           << "n------------------------"
           << "n";
      cout.setf(ios::fixed);
      for (i=1;i<=n;i++)
      {
            r1=f(x,y)*h;
            r2=f(x+h/2,y+r1/2)*h;
            r3=f(x+h/2,y+r2/2)*h;
            r4=f(x+h,y+r3)*h;
            y=y+(r1+2*r2+2*r3+r4)/6;
            x=x+h;
            cout.width(4);
            cout << i;
            cout.precision(2);
            cout.width(8);
            cout << x;
            cout.precision(5);
            cout.width(11);
            cout << y
                 << "n";
      }
  return 0;
}

// Nënprogrami
double f(double x,double y)
{
  return pow(x,2)+y;
}
Diferencimi numerik 287

   Pas ekzekutimit të programit, rezultatet që shtypen në ekran duken:
   i     x          y
------------------------
   1    1.10    1.22103
   2    1.20    1.48842
   3    1.30    1.80915
   4    1.40    2.19095
   5    1.50    2.64233
   6    1.60    3.17271
   7    1.70    3.79251
   8    1.80    4.51324
   9    1.90    5.34761
  10    2.00    6.30968


Metoda Kutta-Merson
    Gjatë zgjidhjes së ekuacioneve diferenciale sipas metodës Kutta-Merson,
vlera e pikës vijuese të funksionit yi+1 caktohet duke shfrytëzuar vlerën e pikës
paraprake yi:
    yi + 1 = yi +
                     1
                       (k1 + 4k4 + k5 )
                     6
ku koeficientët e veçantë llogariten përmes shprehjeve:
    k1 = f(xi, yi ) ⋅ h
          ⎛      h        k ⎞
    k2 = f⎜ xi + , yi + 1 ⎟ ⋅ h
          ⎝      3         3⎠
          ⎛      h        k + k2 ⎞
    k3 = f⎜ xi + , yi + 1        ⎟ ⋅ h
          ⎝      3           6   ⎠
          ⎛      h        k1   3 ⎞
    k4 = f⎜ xi + , yi +       + k3 ⎟ ⋅ h
          ⎝      2         8   8 ⎠
          ⎛               k1   3         ⎞
    k5 = f⎜ xi + h , yi +     − k3 + 2k4 ⎟ ⋅ h
          ⎝                2   2         ⎠
Nëse kushtet fillestare merren (x0,y0) dhe zona e diferencimit [x0,xp]
ndahet në n-pjesë, hapi përkatës i diferencimit është:
          x p − x0
    h =
             n
    Shembull         Zgjidhja e ekuacionit diferencial:
                         dy 1
                           = xy
                         dx 2
                     përmes metodës Kutta-Merson, për kushtet fillestare x0=1 e
                     y0=1, si dhe xp=1 e n=10.
288 Algoritmet

a. Bllok-diagrami
                                           Fillimi

                                 f(x,y)= (x ⋅ y)/2

                                       n,x0,y0,xp

                                     h = (x p - x 0)/2

                                               x=x0

                                               y=y0

                                               i=1


                                      k1=f(x,y)⋅h

                                       ⎛        h          k1 ⎞
                            k = f⎜ x +              ,y +       ⎟⋅h
                             2
                                       ⎝        3          3   ⎠
                                 ⎛         h          ( k1 + k 2 ) ⎞
                       k = f⎜ x +              ,y +                ⎟⋅h
                        3
                                 ⎝         3               6       ⎠
                                 ⎛         h     k   3     ⎞
                      k = f⎜ x +             ,y + 1 + ⋅ k ⎟ ⋅ h
                        4
                                 ⎝         2      8 8    3
                                                           ⎠
                          ⎛          k   3              ⎞
                    k5 = f⎜ x + h,y + 1 − ⋅ k3 + 2 ⋅ k4 ⎟ ⋅ h
                          ⎝           2 2               ⎠

                            y = y +(k1 + 4k4 + k5)/6


                                               x=x+h

                                               i,x,y

                                               i=i+1

                             Po
                                               i≤n
                                                    Jo
                                               Fundi
                                           Fig.12.2
Diferencimi numerik 289

b. Programi
// Programi Prg12_2
#include <iostream>
#include <iomanip>
using namespace std;
double f(double x,double y);
int main()
{     const int n=10;
      const double x0=0,y0=1,xp=1;
      int i; double x,y,h,k1,k2,k3,k4,k5;
      h=(xp-x0)/n; x=x0;y=y0;
      cout << "    i     x         y"
           << "n------------------------" << "n";
      cout.setf(ios::fixed);
      for (i=1;i<=n;i++)
      {     k1=f(x,y)*h;
            k2=f(x+h/3,y+k1/3)*h;
            k3=f(x+h/3,y+(k1+k2)/6)*h;
            k4=f(x+h/2,y+k1/8+(3*k3)/8)*h;
            k5=f(x+h,y+k1/2-(3*k3)/2+2*k4)*h;
            y=y+(k1+4*k4+k5)/6;
            x=x+h;
            cout.width(4); cout << i;
            cout.precision(2); cout.width(8);
            cout << x;
            cout.precision(5); cout.width(11);
            cout << y << "n";
      }
  return 0;
}
// Nënprogrami
double f(double x,double y)
{
  return (x*y)/2;
}
   Pas ekzekutimit të programit, vlerat numerike të cilat fitohen si zgjidhje e
ekuacionit diferencial, në ekran do të shtypen kështu:
   i     x          y
------------------------
   1    0.10    1.00250
   2    0.20    1.01005
   3    0.30    1.02276
   4    0.40    1.04081
   5    0.50    1.06449
   6    0.60    1.09417
   7    0.70    1.13032
   8    0.80    1.17351
   9    0.90    1.22446
290 Algoritmet

  10      1.00   1.28403
Agni H. Dika
Fakulteti i Inxhinierisë Elektrike dhe Kompjuterike
                       Prishtinë




                ALGORITMET
                  njohuri themelore
             me programe në gjuhën C++




                       Lektor
                   Dr. Ilaz Metaj




                     Kopertina
                     AfiDesign




                      Shtypi
                      Adea
                     Prishtinë



                 Copyright © 2007

More Related Content

PDF
Gjuhe Programuese ushtrimet C++
PDF
Algoritmetcpp 130129160149-phpapp01
PDF
Bazat e programimit ne C++ (agni dika)
PPTX
Funksionet ne jeten e perditshme
PDF
Analiza e regresionit dhe korrelacionit
DOC
Ushtrime nga lenda e statistikes
PDF
Liber per Kimi 12 (me zgjedhje).pdf
PPT
Algoritmet
Gjuhe Programuese ushtrimet C++
Algoritmetcpp 130129160149-phpapp01
Bazat e programimit ne C++ (agni dika)
Funksionet ne jeten e perditshme
Analiza e regresionit dhe korrelacionit
Ushtrime nga lenda e statistikes
Liber per Kimi 12 (me zgjedhje).pdf
Algoritmet

What's hot (20)

PPTX
shkrimtaret e brezit te humbur
DOCX
Te drejtat e femijeve
DOCX
projekt: shkrimtaret bashkohor shqiptar dhe veprat e tyre
PPTX
Bisede Letrare (Katedralja e Parisit).pptx
PDF
Figurat letrare
PPTX
Siguria e fëmijëve në internet
DOCX
PROJEKT/KIMI •HEKURI SI ELEMENT KIMIK
PPTX
Projekt av
PDF
Jeronim De Rada
PPTX
Kongresi i manastirit
PDF
Filozofia gjate shekullit XVII
PPTX
Projekt "Letersi": Katedralja e Parisit - Viktor Hygo
PDF
provimi i lirimit 2018 matematike
PDF
Derivati dhe zbatimet
DOCX
Visual basic leksionet e mia
DOCX
Teatri ne Shqiperi
PPTX
Yndyrat dhe sheqernat
PPTX
Pasurite natyrore ne shqiperi
PPTX
matematika projekt
PPTX
Rruazoret
shkrimtaret e brezit te humbur
Te drejtat e femijeve
projekt: shkrimtaret bashkohor shqiptar dhe veprat e tyre
Bisede Letrare (Katedralja e Parisit).pptx
Figurat letrare
Siguria e fëmijëve në internet
PROJEKT/KIMI •HEKURI SI ELEMENT KIMIK
Projekt av
Jeronim De Rada
Kongresi i manastirit
Filozofia gjate shekullit XVII
Projekt "Letersi": Katedralja e Parisit - Viktor Hygo
provimi i lirimit 2018 matematike
Derivati dhe zbatimet
Visual basic leksionet e mia
Teatri ne Shqiperi
Yndyrat dhe sheqernat
Pasurite natyrore ne shqiperi
matematika projekt
Rruazoret
Ad

Similar to Algoritmet C++ (20)

PDF
Hyrje_Leksion_PDF-1.pdf
PPT
Programimi 1
PPTX
Informatika-bllokskemat.pptx
PDF
ushtrime matlab
PPTX
Programim - Shqip
PDF
Algoritmet
PPSX
Bazat themelore te programit Matlab
DOC
Teoria e grafeve
PDF
Llogaritjet
PPT
MATERIAL 7 METODA DIVIDE AND CONQUARE EE
PDF
Paraqitjet grafike
PDF
Tik klasa 12 viti shkollor 2011
DOCX
Syllabus shqip teknologjia digjitale_arsim_susuri
PDF
Bazat e-automatikes
PDF
Algoritmi dhe programimi , prezantime per shkolla te mesme
PPTX
geogebra.pptx
PPTX
geogebra
PDF
Bazat e te dhenave
PDF
Arrays in Java
PDF
Kjo është Matematika_ime_2_Plus_vetëm_esencë
Hyrje_Leksion_PDF-1.pdf
Programimi 1
Informatika-bllokskemat.pptx
ushtrime matlab
Programim - Shqip
Algoritmet
Bazat themelore te programit Matlab
Teoria e grafeve
Llogaritjet
MATERIAL 7 METODA DIVIDE AND CONQUARE EE
Paraqitjet grafike
Tik klasa 12 viti shkollor 2011
Syllabus shqip teknologjia digjitale_arsim_susuri
Bazat e-automatikes
Algoritmi dhe programimi , prezantime per shkolla te mesme
geogebra.pptx
geogebra
Bazat e te dhenave
Arrays in Java
Kjo është Matematika_ime_2_Plus_vetëm_esencë
Ad

More from Ajla Hasani (7)

PPT
Seminar 1
PDF
Fiber optics
PDF
Bazat e Te Dhenave - ACCESS
DOC
Sistemet operative
PDF
PSpice
PDF
Microsoft Access
PDF
Programimi i orientuar ne objekte
Seminar 1
Fiber optics
Bazat e Te Dhenave - ACCESS
Sistemet operative
PSpice
Microsoft Access
Programimi i orientuar ne objekte

Algoritmet C++

  • 1. Universiteti i Prishtinës Fakulteti i Inxhinierisë Elektrike dhe Kompjuterike Agni H. Dika Prishtinë 2007
  • 2. Libri të cilin e keni në dorë së pari u dedikohet studentëve të Fakultetit të Inxhinierisë Elektrike dhe Kompjuterike në Prishtinë. Por, ai mund të përdoret edhe nga të interesuar tjerë për programim me kompjuter. Njësitë mësimore në libër janë organizuar ashtu që materiali i përfshirë brenda tyre të jetë sa më i afërt për të gjithë ata të cilët fillojnë të punojnë me kompjuter. Për këtë qëllim, gjatë shpjegimit të algoritmeve janë shfrytëzuar shembuj të ndryshëm, duke filluar nga ato elementare. Në libër, çdo algoritmi i shoqërohet edhe programi përkatës i shkruar në gjuhën programuese C++, ashtu që përmes ekzekutimit në kompjuter, të jetë edhe më i qartë funksionimi i tyre. Lexuesit të cilët nuk kanë njohuri mbi gjuhën programuese C++, pa asnjë pengesë mund t'i kapërcejnë programet që paraqiten në libër. Autori
  • 3. Paraqitja analitike 2 Paraqitja grafike 4 Testimi i algoritmeve 7 Përcjellja në kompjuter 9
  • 4. 2 Algoritmet Grumbulli i veprimeve me një radhë të fiksuar, të cilët ndërmerren gjatë zgjidhjes së një problemi të caktuar, quhet algoritëm. Në jetën e përditshme, për zgjidhjen e problemeve të ndryshme, njeriu krijon algoritme përkatëse, duke shfrytëzuar dijen e grumbulluar. Por, me kohë, algoritmet që përsëriten fiksohen në ndërdije dhe sipas nevojës shfrytëzohen si të gatshme. Kështu, p.sh., ardhja para rrugëkryqit, çdo këmbësori i imponon përdorimin e algoritmit, i cili mund të përshkruhet përmes tekstit të dhënë në Fig.1.1. Nëse në rrugëkryq është vendosur semafori dhe ai punon, rruga mund të kalohet në vendëkalim pasi të paraqitet ngjyra e gjelbër. Nëse në rrugëkryq nuk ka semafor, ose ai nuk punon, rruga mund të kalohet në vendkalim kur nuk ka automjete, duke shikuar majtas dhe djathtas. Fig.1.1 Algoritmi logjik për kalimin e rrugëkryqit Varësisht nga operacionet që përdoren gjatë përpilimit, algoritmet mund të grupohen në algoritme logjike dhe algoritme numerike. Derisa algoritmet logjike mbështeten në operacione dhe konkluzione logjike, ashtu siç shihet në shembullin e algoritmit të dhënë më sipër, në algoritmet numerike shfrytëzohen operacionet dhe shprehjet aritmetikore. Paraqitja analitike Në formë më të lirë, paraqitja analitike e algoritmeve duket ashtu siç është dhënë në shembullin e algoritmit për kalimin e rrugëkryqit, në Fig.1.1. Kjo formë e paraqitjes së algoritmeve, nëse përdoret gjatë zgjidhjes së problemeve të komplikuara, mund të jetë e paqartë dhe e papërcaktuar plotësisht. Në praktikë përdoret forma analitike e paraqitjes së algoritmeve e shprehur përmes një numri hapash, të cilët kryhen sipas një radhe të fiksuar plotësisht. Kështu, shembulli i algoritmit të dhënë në Fig.1.1, i paraqitur në 10 hapa, do të duket si në Fig.1.2.
  • 5. Paraqitja e algoritmeve 3 1. Fillimi 2. A ka semafor? Nëse JO, hapi i 6. 3. A punon semafori? Nëse JO, hapi i 6. 4. A është paraqitur ngjyra e gjelbër? Nëse PO, hapi i 9. 5. Duhet pritur. Hapi i 4. 6. Shiko majtas e djathtas 7. A ka automjete? Nëse JO, hapi i 9. 8. Duhet pritur. Hapi i 6. 9. Kalo rrugën në vendëkalim 10. Fundi. Fig.1.2 Forma analitike e algoritmit për kalimin e rrugëkryqit Hapat e veçantë të këtij algoritmi kryhen me radhë prej fillimi, derisa nuk urdhërohet kapërcimi në një hap të caktuar. Kështu, p.sh., nëse në rrugëkryq ka semafor dhe paraqitet ngjyra e gjelbër, vargu i hapave nëpër të cilët do të kalohet gjatë ekzekutimit të algoritmit të dhënë është: 1, 2, 3, 4, 9 dhe 10. Por, në kushtet e kulturës së komunikacionit në hapësirat tona, kur shpesh ndodh që automjetet e kalojnë rrugëkryqin kur në semafor është e ndezur drita e kuqe, më e sigurt për këmbësorin është nëse hapi i katërt i algoritmit shkruhet kështu: 4. A është paraqitur ngjyra e gjelbër? Nëse PO, hapi i 6. ashtu që para se të kalohet rrugëkryqi, pavarësisht se për këmbësor është paraqitur ngjyra e gjelbër, duhet të shikohet mos ndoshta kalon ndonjë automjet. Kështu, për rastin e përmendur më sipër, kur në rrugëkryq ka semafor dhe është paraqitur ngjyra e gjelbër, vargu i hapave nëpër të cilët kalohet është: 1, 2, 3, 4, 6, 7, 9 dhe 10. Tek algaritmet numerike hapat e veçantë janë më të qartë, sepse konsistojnë në operacione dhe në shprehje matematikore.
  • 6. 4 Algoritmet Shembull Algoritmi numerik për llogaritjen e vlerës së funksionit: ⎧ x2 për x < 0.9 ⎪ y = ⎨ 2x për x = 0.9 ⎪x − 3 për x > 0.9 ⎩ nëse dihet vlera e variablës x. 1. Fillimi. 2. Merre vlerën e variablës x 3. A është x<0.9, ose x=0.9, ose x>0.9? Nëse x<0.9, hapi i 4. Nëse x=0.9, hapi i 5. Nëse x>0.9, hapi i 6. 4. y=x2. Hapi i 7. 5. y=2x. Hapi i 7. 6. y=x-3. Hapi i 7. 7. Shtype vlerën e variablës y 8. Fundi. Fig.1.3 Algoritmi numerik Algoritmi i dhënë është shkruar duke pasur parasysh zgjidhjen e këtij problemi me kompjuter, gjë që vlen edhe për të gjithë algoritmet të cilat janë dhënë në pjesën vijuese të librit. Gjatë ekzekutimit të këtij algoritmi, nëse për variablën x merret vlera 4.7, do të kalohet nëpër hapat: 1, 2, 3, 6, 7 dhe 8. Tek algoritmet e përbëra paraqitja e detajizuar e hapave të veçantë të algoritmit e komplikon shumë dhe e bën të paqartë strukturën logjike të algoritmit. Prandaj, si zgjidhje imponohet nevoja e paraqitjes së algoritmit në disa hapa të përgjithësuar, përkatësisht të përpilimit të algoritmit të përgjithësuar. Pastaj, për çdo hap të veçantë, mund të përpilohet edhe algoritmi i detajizuar. Paraqitja grafike Gjatë paraqitjes analitike të algoritmeve, nëse kemi të bëjmë edhe me algoritme relativisht të komplikuara, vështirë se mund të ndiqet rrjedhja e procesit llogaritës. Në praktikë, algoritmet paraqiten përmes skemave grafike, për vizatimin e të cilave përdoren disa figura gjeometrike, përkatësisht blloqe të formave të ndryshme. Forma gjeometrike e blloqeve që shfrytëzohen gjatë përpilimit të skemave grafike e tregon edhe natyrën e operacioneve që kryhen brenda tyre. Disa nga
  • 7. Paraqitja e algoritmeve 5 blloqet elementare që përdoren gjatë vizatimit të skemave grafike janë dhënë në Fig.1.4. Blloku Përdorimi Fillimi Tregon fillimin e algoritmit Lexohen vlerat e variablave të shënuara në bllok Shtypen vlerat e variablave të shënuara në bllok Kryhen veprimet ose llogaritjet, duke shfrytëzuar shprehjet e shënuara në bllok Përcaktohet degëzimi i veprimeve të ose mëtejme, duke pasur parasysh kushtet e shënuara në bllok Fundi Tregon fundin e algoritmit Fig.1.4 Blloqet elementare Me leximin e vlerave të variablave të shënuara në bllok nënkuptohet marrja e vlerave përkatëse përmes njësisë hyrëse dhe vendosja e tyre në kujtesën e kompjuterit. Kurse përmes shtypjes vlerat e variablave merren nga kujtesa e kompjuterit dhe shtypen në njësinë dalëse të tij. Skemat grafike të vizatuara duke shfrytëzuar blloqe të formave të ndryshme, shpesh quhen edhe bllok-diagrame, siç do të quhen edhe në pjesën vijuese të librit. Shembull Algoritmi për llogaritjen e sipërfaqes s dhe perimetrit p të katërkëndëshit kënddrejtë, me brinjët a dhe b.
  • 8. 6 Algoritmet a. Forma analitike 1. Fillimi. 2. Merri vlerat e brinjëve: a, b 3. s=a⋅b 4. p=2⋅(a+b) 5. Shtypi vlerat e llogaritura: s, p 6. Fundi. Fig.1.5 b. Forma grafike Fillimi 1 a,b 2 s=a⋅b 3 p=2⋅(a+b) 4 s,p 5 Fundi 6 Fig.1.6 Shembull Bllok-diagrami i algoritmit për kalimin e rrugëkryqit, i cili u dha në formë analitike në Fig.1.2.
  • 9. Paraqitja e algoritmeve 7 Fillimi 1 8 Jo Duhet 2 A ka semafor pritur Po 3 Jo A punon semafori Shiko majtas 6 Po e djathtas Duhet 5 pritur 7 Po A ka automjete A është paraqitur Jo 4 Jo drita e gjelbër Po Kalo rrugën në vendkalim 9 Fundi 10 Fig.1.7 Bllok-diagrami i algoritmit për kalimin e rrugëkryqit Nga shembujt e dhënë shihet se paraqitja e algoritmeve përmes bllok- diagrameve jep një dukshmëri shumë më të madhe të veprimeve që kryhen brenda blloqeve, si dhe në krejt algoritmin. Testimi i algoritmeve Me qëllim të kontrollimit të saktësisë së funksionimit të algoritmeve që përpilohen, duhet të bëhet testimi i tyre, duke marrë vetëm vlerat me të cilat përfshihen të gjitha rastet e mundshme të shfrytëzimit të tyre. Në këtë mënyrë, me punë minimale vërtetohet sjellja reale e algoritmeve para përdorimit praktik të tyre. Shembull Testimi i algoritmit numerik të dhënë në Fig.1.3, duke e përpiluar fillimisht bllok-diagramin përkatës.
  • 10. 8 Algoritmet a. Bllok-diagrami Fillimi 1 x 2 < > 3 x < 0.9 - > = y=x2 4 y=2x 5 y=x-3 6 y 7 Fundi 8 Fig.1.8 Me qëllim që testimi i bllok-diagramit të rrjedhë me një procedurë standarde, mund të shfrytëzohet një tabelë për testim, p.sh., si ajo që është dhënë në Fig.1.9. b. Testimi - për x=4.7 Vlerat numerike Hapi Blloku Urdhri Rezultati merren Fillimi i 1 1 Fillimi - algoritmit 2 2 Lexo: x Prej njësisë hyrëse x=4.7 3 3 Pyet:x≤0.9 x → 2 > 4 6 y=x-3 x → 2 y=4.7-3=1.7 Shtypet 5 7 Shtyp: y y → 3 numri 1.7 Fundi i 6 8 Fundi - algoritmit Fig.1.9 Në tabelë, me shkurtesat x→2 dhe y→3 duhet nënkuptuar se vlera numerike e variablës x merret nga hapi i 2, kurse ajo e variablës y - nga hapi i 3. Gjithnjë, mes Fillimit dhe Fundit të algoritmit, gjegjësisht bllok-diagramit, ekziston një rrugë e mbyllur, e cila, varësisht nga vlerat hyrëse, kalon nëpër pjesë të ndryshme të bllok-diagramit, ose një numër të ndryshëm herësh në pjesë të caktuara të tij.
  • 11. Paraqitja e algoritmeve 9 c. Rruga - për x=4.7 1 2 3 4 5 6 7 8 Fig.1.10 Testimi i algoritmit do të jetë komplet vetëm nëse, duke kaluar nëpër të gjitha rrugët e mundshme, vërtetohet funksionimi i saktë i tij. Algoritmet nëpër blloqet e bllok-diagramit përkatës të të cilëve mund të kalohet vetëm njëherë, p.sh. si ai që është dhënë në Fig.1.6, quhen algoritme lineare. Kurse, algoritmet te bllok-diagramet e të cilëve paraqiten më shumë degë, p.sh. ashtu siç është ai i dhënë në Fig.1.8, quhen algoritme të degëzuara. Përcjellja në kompjuter Përkthimi i algoritmeve në një formë të kuptueshme për kompjuterin bëhet duke i shkruar programet përkatëse në një gjuhë programuese. Meqë aktualisht njëra ndër gjuhët programuese më të popullarizuara është gjuha C, përkatësisht versioni i saj C++, në pjesën vijuese të librit, përveç paraqitjeve grafike të algoritmeve, do të jepen edhe programet përkatëse në këtë gjuhë. Shembull Programi i cili është shkruar në bazë të bllok-diagramit të dhënë në Fig.1.8.
  • 12. 10 Algoritmet // Programi Prg1_8 #include <iostream> using namespace std; int main() { double x,y; cout << "Vlera e variablës x="; cin >> x; if (x < 0.9) y=x*x; else if (x == 0.9) y=2*x; else y=x-3; cout << "Rezultati y=" << y << "n"; return 0; } Gjatë ekzekutimit të programit, nëse pas mesazhit: Vlera e variablës x= përmes tastierës kompjuterit i jepet vlera 4.7, në ekran do të shtypet vlera e variablës y, kështu: Rezultati y=1.7 gjë që i përgjigjet vlerës së fituar në tabelën e Fig.1.9.
  • 13. Shumat e zakonshme 12 Shumat e çfarëdoshme 20
  • 14. 12 Algoritmet Gjatë zgjidhjeve të problemeve të ndryshme, shpesh herë nevojitet të mblidhen anëtarët e një serie numrash. Në matematikë kjo mbledhje realizohet duke shtuar një nga një anëtarët e serisë, gjë që mund të shfrytëzohet edhe gjatë zgjidhjes së këtij problemi me kompjuter. Për shtimin automatik të anëtarëve të serisë, në algoritëm duhet të shfrytëzohet një unazë e mbyllur, para së cilës vlera fillestare e shumës merret zero. Shumat e zakonshme Si raste më të thjeshta të llogaritjes së shumave merren mbledhjet e numrave natyrorë, katrorëve ose kubeve të këtyre numrave, numrave natyrorë tek ose çift etj. Shembull Shuma e numrave natyrorë mes 3 dhe n, nëse është dhënë vlera e variablës n. n s = 3 + 4 + ... + n = ∑i i=3
  • 15. Llogaritja e shumës 13 a. Bllok-diagrami b. Rruga - për n=5 Fillimi 1 1 n 2 2 s=0 3 3 i=3 4 4 s=s+i 5 5 i=i+1 6 6 Po i ≤ n 7 7 Jo s 8 8 Fundi 9 9 Fig.2.1 Fig.2.2 Në bllok-diagram është shfrytëzuar shprehja i=i+1, gjë që është e palogjikshme në matematikë. Por, këtu me shprehjen e barazimit kompjuterit i urdhërohet: Llogarite vlerën numerike të shprehjes në anën e djathtë dhe jepja variablës në anën e majtë të barazimit! Nga kjo shihet se me shprehjen i=i+1 së pari variabla i rritet për 1 dhe pastaj rezultati i fituar ruhet përsëri te kjo variabël, përkatësisht me shprehjen e dhënë kompjuteri e nënkupton rritjen për 1 të vlerës së variablës i. Algoritmet, si ai që është dhënë përmes bllok-diagramit në Fig.2.1, te të cilët pjesë të caktuara të tyre përsëriten brenda një unaze të mbyllur, quhen algoritme ciklike. Përfundimi i cikleve të përsëritjes së unazës, përcaktohet me kushtin për dalje nga unaza, i cili në shembullin konkret, lidhet me raportin e vlerave të variablave i dhe n. Kështu, në momentin kur plotësohet kushti i>n, përsëritja e ekzekutimit të unazës ndërpritet, përkatësisht dilet nga unaza.
  • 16. 14 Algoritmet c. Testimi - për n=5 Vlerat numerike Hapi Blloku Urdhëri Rezultati merren Fillimi i 1 1 Fillimi - algoritmit prej njësisë 2 2 Lexo: n n=5 hyrëse 3 3 s=0 - s=0 4 4 i=3 - i=3 5 5 s=s+i s → 3, i → 4 s=0+3=3 6 6 i=i+1 i → 4 i=3+1=4 7 7 Pyet:i≤n i → 6, n → 2 Po 8 5 s=s+i s → 5, i → 6 s=3+4=7 9 6 i=i+1 i → 6 i=4+1=5 10 7 Pyet:i≤n i → 9, n → 2 Po 11 5 s=s+i s → 8, i → 9 s=7+5=12 12 6 i=i+1 i → 9 i=5+1=6 13 7 Pyet:i≤n i → 12, n → 2 Jo Shtypet numri 14 8 Shtyp:s s → 11 12 Fundi i 15 9 Fundi - algoritmit Fig.2.3 Vlera numerike e një variable, e cila nevojitet në një hap të caktuar, merret në hapin ku ajo variabël takohet së pari, nëse kthehemi pas në rrugën e kaluar. Kështu, p.sh., në tabelën e Fig.2.3, vlerat e variablave s dhe i në hapin e 11 janë marrë nga hapat 8 e 9, sepse, nëse prej hapit të 11 kthehemi pas, në kolonën e fundit të tabelës, variabla i së pari takohet në hapin e 9, kurse variabla s - në hapin e 8. Shigjeta → e cila përdoret për të treguar se në cilin hap merren vlerat e nevojshme numerike, duhet të lexohet prej hapit. Gjatë testimit në tabelën e mësipërme, shtimi i anëtarëve të serisë së numrave natyrorë, në hapat e veçantë rrjedh ashtu siç është treguar në Fig.2.4.
  • 17. Llogaritja e shumës 15 Vlera fillestare(3) s = 0 + 3 + 4 + 5 5 8 11 Fig.2.4 d. Programi // Programi Prg2_1 #include <iostream> using namespace std; int main() { int n,i; double s; cout << "Vlera e variablës n="; cin >> n; s=0; i=3; do { s=s+i; i=i+1; } while (i<=n); cout << "Shuma e numrave natyrorë s=" << s << "n"; return 0; } Nëse programi ekzekutohet për n=5, rezultati që shtypet në ekran është: Shuma e numrave natyrorë s=12 gjë që përputhet me rezultatin i cili është fituar gjatë testimit përmes tabelës në Fig.2.3. Anëtarët e vargut mund të jenë numra me një ligjshmëri të caktuar, përkatësisht nuk do të thotë se mes vete duhet të dallohen për vlerën 1. Për gjetjen e shumës së anëtarëve të vargjeve të tilla shfrytëzohen algoritme të
  • 18. 16 Algoritmet ngjashme me ato që u dhanë më sipër, duke pasur kujdes vetëm në ligjshmërinë e gjenerimit të anëtarëve të vargut. Shembull Shuma e kubeve të numrave natyrorë çiftë mes 2 dhe n, nëse është dhënë vlera e variablës n. n s = 23 + 43 + ... = ∑ i3 i=2 (çift) a. Bllok-diagrami b. Rruga - për n=9 Fillimi n s=0 i=2 s=s+i3 i=i+2 Po i ≤ n Jo s Fundi Fig.2.5 Fig.2.6 Rezultati që fitohet gjatë rrugës së kaluar është: vlera fillestare s = 0 + 23 + 43 + 63 + 83 = 800
  • 19. Llogaritja e shumës 17 c. Programi // Programi Prg2_5 #include <iostream> using namespace std; int main() { int n,i; double s; cout << "Vlera e variablës n="; cin >> n; s=0; i=2; do { s=s+i*i*i; i=i+2; } while (i<=n); cout << "Shuma s=" << s << "n"; return 0; } Pas ekzekutimit të programit të dhënë për n=9, si rezultat në ekran do të shtypet: Shuma s=800 ashtu siç u tregua më sipër. Detyra Të llogaritet shuma: a. e numrave natyrorë çiftë mes 2 dhe n; b. e numrave natyrorë tekë mes 1 dhe n; c. e katrorëve të numrave natyrorë mes 4 dhe n; d. e rrënjëve katrore të numrave natyrorë tekë mes 3 dhe n, nëse dihet vlera e variablës n.
  • 20. 18 Algoritmet Shprehjet e shumave përkatëse do të duken: a. n s = 2 + 4 + 6 + ... = ∑i i=2 (çift) b. n s = 1 + 3 + 5 + ... = ∑ i i=1 (tek) c. n s = 42 + 52 + 62 + ... + n2 = ∑ i2 i =4 d. n s = 3 + 5 + 7 + ... = ∑ i i =3 (tek) Anëtarët e serive mund të formohen edhe duke shfrytëzuar ligjshmëri më komplekse të raporteve të numrave natyrorë. Shembull Shuma e prodhimit të numrave natyrorë tekë e çiftë - të njëpasnjëshëm, mes vlerave 1 dhe n, nëse dihet vlera e variablës n. n s = 1 ⋅ 2 + 3 ⋅ 4 + 5 ⋅ 6 + ... = ∑ i ⋅ (i + 1) i =1 (tek)
  • 21. Llogaritja e shumës 19 a. Bllok-diagrami b. Rruga - për n=8 Fillimi n s=0 i=1 s=s+i⋅(i+1) i=i+2 Po i ≤ n Jo s Fundi Fig.2.7 Fig.2.8 Shuma që fitohet gjatë rrugës së kaluar, për n=8 është: s = 1 ⋅ 2 + 3 ⋅ 4 + 5 ⋅ 6 + 7 ⋅ 8 = 100 Detyra Të llogaritet shuma: a. e pjesëtimit të numrave natyrorë tekë me katrorët e numrave natyrorë çiftë - të njëpasnjëshëm, mes vlerave 1 dhe n; b. e katrorëve të numrave natyrorë tekë dhe e kubeve të numrave natyrorë çiftë - të njëpasnjëshëm, mes vlerave 1 dhe n, nëse dihet vlera e variablës n.
  • 22. 20 Algoritmet Shprehjet e shumave të kërkuara duken: a. 1 3 5 s= + + + ... 2 2 2 4 62 b. s = 12 + 23 + 32 + 43 + ... Shumat e çfarëdoshme Anëtarët e serive numerike mund të formohen si shprehje të çfarëdoshme matematikore. Procedurat e gjetjes së shumave të tyre nuk do të ndryshojnë aspak nga ato që u dhanë më sipër. Shembull Llogaritja e vlerës së shumës: n +1 2 ⎧ x⎫ s = ∑ ⎨ 2i + ⎬ i=2 ⎩ 3⎭ (i ≠ 4) nëse dihen vlerat e variablave n dhe x.
  • 23. Llogaritja e shumës 21 a. Bllok-diagrami b. Rruga - për x=1 dhe n=5 Fillimi x,n s=0 i=2 Jo i ≠ 4 Po 2 ⎧ x⎫ s = s + ⎨2i + ⎬ ⎩ 3⎭ i=i+1 Po i≤(n+1) Jo s Fundi Fig.2.9 Fig.2.10 Vlera e shumës, që fitohet gjatë rrugës së kaluar në Fig.2.10, është: 2 2 2 2 ⎧ 1⎫ ⎧ 1⎫ ⎧ 1⎫ ⎧ 1⎫ s = ⎨2 ⋅ 2 + ⎬ + ⎨2 ⋅ 3 + ⎬ + ⎨2 ⋅ 5 + ⎬ + ⎨2 ⋅ 6 + ⎬ = 317.778 ⎩ 3⎭ ⎩ 3⎭ ⎩ 3⎭ ⎩ 3⎭ c. Programi // Programi Prg2_9 #include <iostream> #include <cmath> using namespace std; int main() { int n,i; double x,s;
  • 24. 22 Algoritmet cout << "Vlerat hyrëse x dhe n: "; cin >> x >> n; s=0; i=2; do { if (i!=4) s=s+pow(2*i+x/3,2); i=i+1; } while (i<=n+1); cout << "Shuma s=" << s << "n"; return 0; } Nëse programi ekzekutohet për vlerat hyrëse x=1 dhe n=5, si rezultat do të shtypet: Shuma s=317.778 ashtu siç u fitua edhe gjatë llogaritjes me dorë. Nga krejt kjo që u dha më sipër, si përfundim mund të nxirret se në rastin e përgjithshëm, gjatë llogaritjes së shumës, shprehja për llogaritjen e shumës brenda unazës së mbyllur shkruhet: s=s+(shprehja nën simbolin e shumës) Detyra Të llogariten shumat: a. n +1 y = ∑ {x + 2k − 1}3 2 k =1 b. 2 2n ⎧ i⎫ z = ∑ ⎨i + ⎬ i=2 ⎩ 3⎭ (çift)
  • 25. Llogaritja e shumës 23 c. n +2 j3 ⎧ 1 ⎫ g = ∑ ⎨ ⎬ j= 1 ⎩ 2j + 3 ⎭ (j≠ 3, , ) 45 nëse dihen vlerat e variablave n dhe x. Gjatë vizatimit të bllok-diagrameve përkatës, duhet pasur parasyshë shprehjet e zbërthyera të shumave të dhëna, të cilat duken: a. y = {x + 2 ⋅ 1 − 1}3 2 + {x + 2 ⋅ 2 − 1}3 2 + ... + {x + 2 ⋅ (n + 1) − 1}3 2 b. 2 2 2 ⎧ 2⎫ ⎧ 4⎫ ⎧ 2n ⎫ z = ⎨2 + ⎬ + ⎨4 + ⎬ + ... + ⎨2n + ⎬ ⎩ 3⎭ ⎩ 3⎭ ⎩ 3⎭ c. 13 23 63 ⎧ 1 ⎫ ⎧ 1 ⎫ ⎧ 1 ⎫ g = ⎨ ⎬ + ⎨ ⎬ + ⎨ ⎬ + ... ⎩2 ⋅ 1 + 3⎭ ⎩2 ⋅ 2 + 3⎭ ⎩2 ⋅ 6 + 3⎭ Shumat mund të paraqiten edhe brenda shprehjeve të funksioneve të ndyshme. Gjatë kësaj, së pari llogariten vlerat e shumave dhe pastaj, duke shfrytëzuar këto vlera, llogariten edhe vlerat e funksioneve. Shembull Llogaritja e vlerës së funksionit: i3 x m+n−1 ⎧ 2⎫ y = + 2 ∑ ⎨x + ⎬ 3 i=1 ⎩ i⎭ nëse dihen vlerat e variablave m, n dhe x.
  • 26. 24 Algoritmet a. Bllok-diagrami b. Rruga - për x=1, m=3, n=1 Fillimi m +n+1 ⎧ 2⎫ i 3 x,m,n s= ∑ ⎨x + ⎬ i =1 ⎩ i⎭ s=0 i=1 i3 ⎧ 2⎫ s = s + ⎨x + ⎬ ⎩ i⎭ i=i+1 Po i≤(m+n-1) Jo x y= + 2⋅s 3 y Fundi Fig.2.11 Fig.2.12 Për vlerat hyrëse që janë marrë si shembull gjatë vizatimit të rrugës në Fig.2.12, vlera e llogaritur e funksionit është: 1 ⎡⎧ 2⎫ 13 ⎧ 2⎫ 23 ⎧ 2⎫ ⎤ 33 y = + 2 ⋅ ⎢⎨1 + ⎬ + ⎨1 + ⎬ + ⎨1 + ⎬ ⎥ 3 ⎢⎩ ⎣ 1⎭ ⎩ 2⎭ ⎩ 3⎭ ⎥ ⎦ c. Programi // Programi Prg2_11 #include <iostream> #include <cmath> using namespace std; int main() {
  • 27. Llogaritja e shumës 25 int m,n,i; double x,s,y; cout << "Vlerat hyrëse x,m dhe n: "; cin >> x >> m >> n; s=0; i=1; do { s=s+pow(x+2./i,i/3.); i=i+1; } while (i<=m+n-1); y=x/3+2*s; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Nëse pas ekzekutimit të programit, si vlera hyrëse përmes tastierës kompjuterit i jepen vlerat x=1, m=3 dhe n=1, rezultati që shtypet në ekran është: Vlera e funksionit y=9.72597 Shuma mund të paraqitet edhe te funksionet të cilat përcaktohen përmes më shumë shprehjeve. Shembull Llogaritja e vlerës së funksionit: ⎧ n +1 për x ≤ 4.55 ⎪2x + 3 ∑ {j + 2x} 2 ⎪ j= 1 y = ⎨ ⎪ ⎪ 3x2 + 2x − 1 për x > 4.55 ⎩ nëse dihen vlerat e variablave n dhe x.
  • 28. 26 Algoritmet a. Bllok-diagrami Fillimi n,x Po Jo x≤4.55 s=0 j=1 n +1 s = ∑ {j + 2x} 2 j=1 s=s+{j+2x}2 j=j+1 Po j≤(n+1) Jo y=2x+3⋅s y=3x2+2x-1 y Fundi Fig.2.13 Nga bllok-diagrami i dhënë në Fig.2.13 shihet se këtu përveç strukturës algoritmike të degëzuar, në njërën degë të algoritmit paraqitet edhe strukturë algoritmike ciklike. Për të qenë algoritmi më i saktë, vlera e variablës n do të duhej të lexohet në degën e majtë të bllokut për degëzim.
  • 29. Llogaritja e shumës 27 b. Rruga - për n=3 dhe x=3.5 Fig.2.14 c. Programi // Programi Prg2_13 #include <iostream> #include <cmath> using namespace std; int main() { int n,j; double x,y,s; cout << "Vlerat hyrëse n dhe x: "; cin >> n >> x; if (x<=4.55) { s=0;
  • 30. 28 Algoritmet j=1; do { s=s+pow(j+2*x,2); j=j+1; } while (j<=n+1); y=2*x+3*s; } else y=3*pow(x,2)+2*x-1; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Nëse programi i dhënë ekzekutohet për vlerat hyrëse n=3 dhe x=3.5, si rezultat në ekran do të shtypet: Vlera e funksionit y=1105 Detyra Të llogariten vlerat e funksioneve: a. n +1 { y = ax2 − bx + 4 ∑ i2 + 2a }x b i =3 b. x 3x z = + n +3 ∑ {m + 2i}a a i=2 (çift) c. ⎧ 2x2 + 3x − 4 për x + 2 > a + 1 ⎪ ⎪ g=⎨ + { ⎪x2 − 2n∑m 3k + k2 ⎪ } për x + 2 ≤ a + 1 ⎩ k =2 nëse dihen vlerat e variablave a, b, m, n dhe x. Brenda shprehjes së një funksioni, njëkohësisht mund të paraqiten disa shuma, të cilat duhet të llogariten para se kompjuterit t'i urdhërohet llogaritja e vlerës së funksionit. Shembull Llogaritja e vlerës së funksionit:
  • 31. Llogaritja e shumës 29 m +2 i m ⎛ ⎞ + 3 ∑ (2i + b) − 4 ∑ ⎜ − b ⎟ x y = 2 i =1 i=2 ⎝a ⎠ nëse dihen m, a dhe b. a. Bllok-diagrami b. Rruga - për m=2, a=2, b=3, x=4 Fillimi m d= ∑ (2i + b ) x,a,b,m i=1 d=0 i=1 d=d+(2i+b) i=i+1 Po i≤ m Jo e=0 i=2 ⎛i ⎞ e = e + ⎜ − b⎟ ⎝a ⎠ i=i+1 Po i≤ m+2 Jo x y= + 3d - 4e m+2 ⎛ i⎞ 2 e= ∑ ⎜ − b⎟ i = 2⎝ ⎠ a y Fundi Fig.2.15 Fig.2.16 Vlera e funksionit, e cila llogaritet gjatë rrugës së kaluar më sipër, është:
  • 32. 30 Algoritmet ⎧⎛ 2 ⎞ ⎛3 ⎞ ⎛4 ⎞⎫ + 3 {(2 ⋅ 1 + 3) + (2 ⋅ 2 + 3)} − 4 ⎨⎜ − 3⎟ + ⎜ − 3⎟ + ⎜ − 3⎟⎬ 4 y = 2 ⎩⎝2 ⎠ ⎝2 ⎠ ⎝2 ⎠⎭ c. Programi // Programi Prg2_15 #include <iostream> using namespace std; int main() { int m,i; double a,b,x,y,d,e; cout << "Vlerat hyrëse x,a,b dhe m: "; cin >> x >> a >> b >> m; d=0; i=1; do { d=d+(2*i+b); i=i+1; } while (i<=m); e=0; i=2; do { e=e+(i/a-b); i=i+1; } while (i<=m+2); y=x/3+3*d-4*e; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Nëse programi ekzekutohet për vlerat e variablave të cilat janë shfrytëzuar gjatë testimit të bllok-diagramit, rezultati që shtypet në ekran është: Vlera e funksionit y=55.3333 Funksioni mund të ketë më shum vlera, nëse në shprehjen e shumës, e cila merr pjesë në funksion, figurojnë parametra që ndryshojnë.
  • 33. Llogaritja e shumës 31 Shembull Llogaritja e vlerës së funksionit: m +1 g = 2m − 3 ∑ (ki + b) i=2 për k = 1,2,..., m nëse janë dhënë vlerat e variablave m dhe b. a. Bllok-diagrami b. Rruga - për m=2 dhe b=3.5 Fillimi m,b k=1 m +1 s = ∑ (k ⋅ i + b ) i=2 s=0 i=2 s=s+(ki+b) i=i+1 Po i≤(m+1) Jo g=2m-3s k,g k=k+1 Po k ≤m Jo Fundi Fig.2.17 Fig.2.18 Vlerat që llogariten gjatë rrugës së kaluar janë:
  • 34. 32 Algoritmet k = 1 g = 2 ⋅ 2 − 3 ⋅ {(1 ⋅ 2 + 3.5) + (1 ⋅ 3 + 3.5)} k = 2 g = 2⋅2 − 3⋅ {(2 ⋅ 2 + 3.5) + (2 ⋅ 3 + 3.5)} c. Programi // Programi Prg2_17 #include <iostream> using namespace std; int main() { int m,k,i; double b,s,g; cout << "Vlerat hyrëse b dhe m: "; cin >> b >> m; for (k=1;k<=m;k++) { s=0; for (i=2;i<=m+1;i++) s=s+(k*i+b); g=2*m-3*s; cout << "k=" << k << " g=" << g << "n"; } return 0; } Për vlerat hyrëse m=2 dhe b=3.5, pas ekzekutimit të programit, si rezultat në ekran shtypen dy vlera, kështu: k=1 g=-32 k=2 g=-47 sepse komanda cout, e cila gjendet brenda unazës së variablës k, ekzekutohet vetëm dy herë, gjë që shihet edhe gjatë testimit të bllok-diagramit në Fig.2.18.
  • 35. Prodhimet e zakonshme 34 Prodhimet e çfarëdoshme 37
  • 36. 34 Algoritmet Prodhimi i anëtarëve të një serie numerike gjendet ngjajshëm si edhe shuma e tyre. Por, për dallim nga shuma, gjatë llogaritjes së prodhimit vlera fillestare merret 1, kurse brenda unazës së mbyllur në rast të përgjithshëm shkruhet: p=p⋅(shprehja nën simbolin e prodhimit) Prodhimet e zakonshme Prodhimet elementare të cilat takohen në praktikë janë ato të llogaritjes së prodhimit të numrave natyrorë, katrorëve ose kubeve të tyre, prodhimit të numrave natyrorë tekë ose çiftë etj. Shembull Prodhimi i numrave natyrorë mes 2 dhe n, nëse është dhënë vlera e variablës n. n p = 2 ⋅ 3 ⋅ 4 ⋅ 5 ⋅ ... ⋅ n = ∏i i=2
  • 37. Llogaritja e prodhimit 35 a. Bllok-diagrami b. Rruga - për n=3 Fillimi 1 1 n 2 2 p=1 3 3 i=2 4 4 p=p⋅i 5 5 i=i+1 6 6 Po i ≤ n 7 7 Jo p 8 8 Fundi 9 9 Fig.3.1 Fig.3.2 c. Testimi - për n=3 Vlerat numerike Hapi Blloku Urdhëri Rezultati merren Fillimi i 1 1 Fillimi - algoritmit prej njësisë 2 2 Lexo: n n=3 hyrëse 3 3 p=1 - p=1 4 4 i=2 - i=2 5 5 p=p ⋅i p → 3, i → 4 p=1 ⋅2=2 6 6 i=i+1 i → 4 i=2+1=3 7 7 Pyet:i≤n i → 6, n → 2 Po 8 5 p=p ⋅i p → 5, i → 6 p=2 ⋅3=6 9 6 i=i+1 i → 6 i=3+1=4 10 7 Pyet:i≤n i → 9, n → 2 Jo 11 8 Shtyp:p p → 8 Shtypet numri 6 Fundi i 12 9 Fundi - algoritmit Fig.3.3
  • 38. 36 Algoritmet Llogaritja e vlerës së prodhimit, në hapat e veçantë të testimit, rrjedh kështu: Vlera fillestare(3) p = 1 ⋅ 2 ⋅ 3 5 8 Fig.3.4 d. Programi // Programi Prg3_1 #include <iostream> using namespace std; int main() { int n,i; double p; cout << "Vlera e variablës n="; cin >> n; p=1; i=2; do { p=p*i; i=i+1; } while (i<=n); cout << "Prodhimi p=" << p << "n"; return 0; } Nëse gjatë ekzekutimit të programit, përmes tastierës kompjuterit i jepet vlera n=3, rezultati që shtypet në ekran është: Prodhimi p=6 gjë që fitohet edhe gjatë testimit të algoritmit, ashtu siç është treguar në Fig.3.4.
  • 39. Llogaritja e prodhimit 37 Detyra Të llogaritet prodhimi: a. i numrave natyrorë çiftë mes 4 dhe n; b. i katrorëve të numrave natyrorë tekë mes 3 dhe n; c. i shumës së numrave natyrorë tekë e çiftë - të njëpasnjëshëm mes 1 dhe n; d. i katrorëve të numrave natyrorë tekë dhe i kubeve të numrave natyrorë çiftë - të njëpasnjëshëm mes 1 dhe n, nëse dihet vlera e variablës n. Shprehjet e prodhimeve të kërkuara duken kështu: a. p = 4 ⋅ 6 ⋅ 8 ⋅... b. p = 32 ⋅ 52 ⋅ 72 ⋅ ... c. p =(1 + 2)⋅(3 + 4)⋅(5 + 6)⋅... d. p = 12 ⋅ 23 ⋅ 32 ⋅ 43 ⋅ ... Prodhimet e çfarëdoshme Procedura që zbatohet gjatë llogaritjes së prodhimit të anëtarëve të serive të çfarëdoshme, është e ngjashme me ate që përdoret për llogaritjen e shumës së serive përkatëse. Shembull Llogaritja e vlerës numerike të shprehjes: m +1 ⎛ 2⎞ g = 3x + 4 ∏ ⎜i + ⎟ i=2 ⎝ x⎠ (çift) nëse janë dhënë vlerat e variablave m dhe x. a. Bllok-diagrami b. Rruga - për m=8 dhe x=1.5
  • 40. 38 Algoritmet Fillimi x,m p=1 i=2 ⎛ 2⎞ p = p ⋅ ⎜i + ⎟ ⎝ x⎠ i=i+2 Po i≤(m+1) Jo g=3x+4p g Fundi Fig.3.5 Fig.3.6 Vlera që llogaritet gjatë rrugës së kaluar është: ⎧⎛ 2 ⎞ ⎛ 2 ⎞ ⎛ 2 ⎞ ⎛ 2 ⎞⎫ g = 3 ⋅ 1.5 + 4 ⋅ ⎨⎜ 2 + ⎟ ⋅ ⎜4 + ⎟ ⋅ ⎜6 + ⎟ ⋅ ⎜8 + ⎟⎬ ⎩⎝ 1.5 ⎠ ⎝ 1.5 ⎠ ⎝ 1.5 ⎠ ⎝ 1.5 ⎠⎭ c. Programi // Programi Prg3_5 #include <iostream> using namespace std; int main() { int m,i; double x,p,g; cout << "Vlerat hyrëse x dhe m: "; cin >> x >> m;
  • 41. Llogaritja e prodhimit 39 p=1; i=2; do { p=p*(i+2/x); i=i+2; } while (i<=m+1); g=3*x+4*p; cout << "Vlera e funksionit g=" << g << "n"; return 0; } Për vlerat hyrëse x=1.5 dhe m=8, rezultati që shtypet në ekran është: Vlera e funksionit g=4871.66 Prodhimi, njëlloj si edhe shuma, mund të paraqitet brenda shprehjeve te funksioneve të cilat përcaktohen me më shumë shprehje. Shembull Llogaritja e vlerës numerike të funksionit: ⎧ 2x + 3n − 1 për x > n + 2 ⎪ ⎪ ⎪ x − 2n +2⎛ k 2 + x ⎞ ⎪ ∏⎜ ⎟ për x < n + 2 d=⎨ k=1⎝ 3⎠ ⎪ ⎪ 2x ⎪e + 3 për x = n + 2 ⎪ ⎩ nëse janë dhënë vlerat e variablave n dhe x. a. Bllok-diagrami
  • 42. 40 Algoritmet Fillimi n,x < < (n+2) > x - > = p=1 k=1 ⎛ x⎞ p = p ⋅ ⎜ k2 + ⎟ ⎝ 3⎠ k=k+1 Po k≤(n+2) Jo d=x-2p d=e2x+3 d=2x+3n-1 d Fundi Fig.3.7 Versioni më i saktë i bllok-diagramit mund të vizatohet duke e vendosur bllokun për leximin e variablës n në degën e majtë të degëzimit që është vendosur në fillim të tij, sepse variabla në fjalë shfrytëzohet vetëm në këtë pjesë. b. Rruga - për n=2 dhe x=3
  • 43. Llogaritja e prodhimit 41 Fig.3.8 c. Programi // Programi Prg3_7 #include <iostream> #include <cmath> using namespace std; int main() { int n,k; double x,p,d; cout << "Vlerat hyrëse n dhe x: "; cin >> n >> x; if (x<(n+2)) {
  • 44. 42 Algoritmet p=1; for (k=1;k<=n+2;k++) p=p*(k*k+x/3); d=x-2*p; } else if (x==n+2) d=exp(2*x)+3; else d=2*x+3*n-1; cout << "Rezultati d=" << d << "n"; return 0; } Nëse programi i dhënë ekzekutohet për vlerat hyrëse n=2 dhe x=3, në ekran do të shtypet: Rezultati d=-3397 Brenda shprehjes së një funksioni mund të paraqiten edhe më shumë prodhime të anëtarëve të serive, të cilat duhet të llogariten para se prej kompjuterit të kërkohet llogaritja e vlerës së vetë funksionit. Shembull Llogaritja e vlerës së funksionit: m +1 m +n z = 3a + 2 ∏ (2i + a) − ∏ (i + b) i =1 i=2 (çift) nëse janë dhënë vlerat e variablave m, n, a dhe b.
  • 45. Llogaritja e prodhimit 43 a. Bllok-diagrami b. Rruga - për m=2, n=7, a=3 dhe b=1 Fillimi m,n,a,b e=1 i=1 e=e⋅(2i+a) i=i+1 Po i≤(m+1) Jo f=1 i=2 f=f⋅(i+b) i=i+2 Po i≤(m+n) Jo z=3x+2e-f z Fundi Fig.3.9 Fig. 3.10
  • 46. 44 Algoritmet Vlera e funksionit, e cila llogaritet gjatë rrugës së kaluar në Fig.3.10, është: z = 3 ⋅ 3 + 2 ⋅ {(2 ⋅ 1 + 3) ⋅ (2 ⋅ 2 + 3) ⋅ (2 ⋅ 3 + 3)} e − {(2 + 1) ⋅ (4 + 1) ⋅ (6 + 1) ⋅ (8 + 1)} f c. Programi // Programi Prg3_9 #include <iostream> using namespace std; int main() { int m,n,i; double a,b,e,f,z; cout << "Vlerat hyrëse m,n,a dhe b: "; cin >> m >> n >> a >> b; e=1; for (i=1;i<=m+1;i++) e=e*(2*i+a); f=1; i=2; do { f=f*(i+b); i=i+2; } while (i<=m+n); z=3*a+2*e-f; cout << "Vlera e funksionit z=" << z << "n"; return 0; } Nëse programi ekzekutohet për vlerat e variablave hyrëse, të cilat janë shfrytëzuar gjatë vizatimit të rrugës së kaluar, si rezultat në ekran shtypet: Vlera e funksionit z=-306 Detyra Të llogariten vlerat e funksioneve:
  • 47. Llogaritja e prodhimit 45 a. m+n + 2 ∏ {k + 3x}a 2 x y = 2 k =1 (k ≠ 3) b. m g = 3 ∏ {x + 2j}2 − 1 n j= 2 ∏ (k + 1) k =2 c. ⎧ n ⎪ ∏(i + 3) për x 2 + 1 ≤ 7 ⎪ i=2 ⎪ çift) ( t=⎨ ⎪ m +2 ⎪x ⎪ 2 − 4 ∏(2i + 1) për x + 1 > 7 2 ⎩ i=1 nëse janë dhënë vlerat e variablave m, n dhe x.
  • 49. 48 Algoritmet Brenda shprehjeve të funksioneve mund të paraqiten njëkohësisht shuma dhe prodhime të anëtarëve të serive. Në këto raste, llogaritja rrjedh plotësisht njëlloj si edhe kur në shprehje paraqiten disa shuma ose disa prodhime. Shembull Llogaritja e vlerës numerike të shprehjes: x m+n n y = + 3 ∑ (2i + n) − 2 ∏ (k + x) 2 i =1 k =2 (tek) nëse janë dhënë vlerat e variablave m, n dhe x. a. Bllok-diagrami b. Rruga - për m=2, n=3 dhe x=1 Fillimi m,n,x s=0 i=1 s=s+(2i+n) i=i+2 Po i≤(m+n) Jo A B
  • 50. Shuma dhe prodhimi 49 A B p=1 k=2 p=p⋅(k+x) k=k+1 Po k ≤n Jo x y= + 3s − 2p 2 y Fundi Fig.4.1 Fig.4.2 Vlera që llogaritet gjatë rrugës së kaluar në Fig.4.2 është: + 3 ⋅ { 2 ⋅ 1 + 3) + (2 ⋅ 3 + 3) + (2 ⋅ 5 + 3) } 1 y = ( 2 − 2 ⋅ { 2 + 1) ⋅ (3 + 1) ( } c. Programi // Programi Prg4_1 #include <iostream> using namespace std; int main() { int m,n,i,k; double s,p,x,y; cout << "Vlerat hyrëse m,n dhe x: "; cin >> m >> n >> x; s=0;
  • 51. 50 Algoritmet i=1; do { s=s+(2*i+n); i=i+2; } while (i<=m+n); p=1; for (k=2;k<=n;k++) p=p*(k+x); y=x/2+3*s-2*p; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Pas ekzekutimit të programit të dhënë, për vlerat e shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.4.2, rezultati që shtypet në ekran është: Vlera e funksionit y=57.5 Shuma dhe prodhimi mund të paraqiten njëkohësisht edhe në rastet kur funksionet përcaktohen me më shumë shprehje. Shembull Llogaritja e vlerës numerike të funksionit: ⎧ n +1 ⎪ 2x − 3 ∑(i + x) për x + 1 < 4.5 ⎪ i=2 ⎪ ⎪ 2 ⎪4x + 3x + 1 për x + 1 = 4.5 g=⎨ ⎪ ⎪x m ⎛ x⎞ ⎪ + 4 ∏ ⎜k + ⎟ për x + 1 > 4.5 ⎪2 k=1 ⎝ 3⎠ ⎪ (k≠3) ⎩ nëse janë dhënë vlerat e variablave m, n dhe x.
  • 52. Shuma dhe prodhimi 51 a. Bllok-diagrami Fillimi m,n,x < > x+1 < 4.5 - > s=0 = p=1 i=2 k=1 Po k = 3 s=s+(i+x) Jo ⎛ x⎞ i=i+1 p = p⋅⎜k + ⎟ ⎝ 3⎠ Po i≤(n+1) Jo k=k+1 Po k ≤ m Jo x g=2x-3s g=4x2+3x+1 g= + 4p 2 d Fundi Fig.4.3 Këtu, versioni më i saktë i bllok-diagramit do të vizatohej nëse blloqet për leximin e variablave m dhe n vendosen në degën e majtë dhe të djathtë (përkatësisht), sepse vetëm në këto degë shfrytëzohen.
  • 53. 52 Algoritmet b. Rruga - për m=4, n=4 dhe x=2 Fig.4.4 Gjatë rrugës së kaluar në Fig.4.4, meqë plotësohet kushti x+1<4.5, vlera e funksionit llogaritet përmes shprehjes së parë ku figuron shuma, kështu: g = 2 ⋅ 2 − 3 ⋅ { 2 + 2) + (3 + 2) + (4 + 2) + (5 + 2) ( } s
  • 54. Shuma dhe prodhimi 53 c. Programi // Programi Prg4_3 #include <iostream> #include <cmath> using namespace std; int main() { int m,n,i,k; double s,p,x,g; cout << "Vlerat hyrëse m,n dhe x: "; cin >> m >> n >> x; if (x+1<4.5) { s=0; for (i=2;i<=n+1;i++) s=s+(i+x); g=2*x-3*s; } else if (x+1==4.5) g=4*pow(x,2)+3*x+1; else { p=1; for (k=1;k<=m;k++) if (k!=3) p=p*(k+x/3); g=x/2+4*p; } cout << "Vlera e llogaritur g=" << g << "n"; return 0; } Nëse ekzekutohet programi i dhënë dhe përmes tastierës i jepen vlerat e shfrytëzuara gjatë vizatimit të rrugës së kaluar, në ekran do të shtypet rezultati: Vlera e llogaritur g=-62
  • 55. 54 Algoritmet Detyra Të llogariten vlerat e funksioneve: a. n+1 x + 1 y = x + 2 ∑ (i + 3)2 − m i=1 (tek) ∏ (i + 1) i=2 b. ⎧x n ⎪ + 3 ∏ (2i + 1) për 2x > m ⎪2 i =1 ⎪ z = ⎨ ⎪ x − 2 n (k + x) ⎪3 ∑ për 2x ≤ m ⎪ k =1 ⎩ (k ≠ 3, ) 4 c. m 2 ∏ (k + 1) 1 k =2 v = e2x + m − n ∑ (i + 1) 3 ∑ (k + 3)2 i =1 k =1 nëse janë dhënë vlerat e variablave m, n dhe x.
  • 56. Faktorieli i zakonshëm 56 Faktorieli çift dhe tek 64 Faktorieli brenda shumës 66 Faktorieli brenda prodhimit 81
  • 57. 56 Algoritmet Në praktikë shpesh herë përdoren edhe vlera të faktorielëve të ndryshëm. Llogaritja e faktorielit është përafërsisht e njëjtë me llogaritjen e prodhimit, sepse vlera fillestare e faktorielit merret 1. Por, këtu duhet pasur kujdes në një dallim esencial të shprehjes e cila shkruhet brenda unazës në të cilën llogaritet faktorieli, sepse ajo gjithnjë e ka formën: F=F⋅i ku i është një numërator. Faktorieli i zakonshëm Procedura për llogaritjen e faktorielit të zakonshëm, kur ai gjindet jashtë shprehjeve të shumave, prodhimeve ose edhe shprehjeve tjera, është e njëjtë me llogaritjen e prodhimit të numrave natyrorë. Shembull Llogaritja e vlerës numerike të faktorielit: F=n! nëse është dhënë vlera e variablës n. n F = 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ n = ∏i i=1 Brenda unazës përmes së cilës realizohet shumëzimi i numrave natyrorë mes 1 dhe n, shprehja për llogaritjen e faktorielit shkruhet ashtu siç u tha më sipër. F = F ⋅ i ku përmes variablës i gjenerohen të gjithë numrat natyror mes 1 dhe n. a. Bllok-diagrami b. Rruga - për n=3
  • 58. Llogaritja e faktorielit 57 Fillimi 1 1 n 2 2 F=1 3 3 i=1 4 4 F=F⋅i 5 5 i=i+1 6 6 Po i ≤ n 7 7 Jo F 8 8 Fundi 9 9 Fig. 5.1 Fig.5.2 c. Testimi - për n=3 Vlerat numerike Hapi Blloku Urdhëri Rezultati merren Fillimi i 1 1 Fillimi - algoritmit prej njësisë 2 2 Lexo: n n=3 hyrëse 3 3 F=1 - F=1 4 4 i=1 - i=1 5 5 F=F ⋅i F → 3, i → 4 F=1 ⋅1=1 6 6 i=i+1 i → 4 i=1+1=2 7 7 Pyet:i≤n i → 6, n → 2 Po 8 5 F=F ⋅i F → 5, i → 6 F=1 ⋅2=2 9 6 i=i+1 i → 6 i=2+1=3 10 7 Pyet:i≤n i → 9, n → 2 Po 11 5 F=F ⋅i F → 8, i → 9 F=2 ⋅3=6 12 6 i=i+1 i → 9 i=3+1=4 13 7 Pyet:i≤n i → 12, n → 2 Jo
  • 59. 58 Algoritmet 14 8 Shtyp:F F → 11 Shtypet vlera 6 Fundi i 15 9 Fundi - algoritmit Fig.5.3 Vlera e faktorielit që fitohet gjatë procedurës së testimit është: Vlera fillestare(3) F = 1 ⋅ 1 ⋅ 2 ⋅ 3 5 8 11 Fig.5.4 d. Programi // Programi Prg5_1 #include <iostream> using namespace std; int main() { int n,i; double F; cout << "Vlera hyrëse n: "; cin >> n; F=1; for (i=1;i<=n;i++) F=F*i; cout << "Faktorieli F=" << F << "n"; return 0; } Nëse programi i dhënë ekzekutohet për vlerën hyrëse n=3, rezultati që shtypet në ekran është: Faktorieli F=6 gjë që përputhet me vlerën e fituar gjatë testimit.
  • 60. Llogaritja e faktorielit 59 Njëlloj gjendet edhe vlera e faktorielit për shprehjet e ndryshme, rezultati i të cilave është një numër natyror. Shembull Llogaritja e vlerës numerike të faktorielit: F=(2m+n)! nëse janë dhënë vlerat e variablave m dhe n. 2m + n F = 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ (2m + n) = ∏i i=1 a. Bllok-diagrami b. Rruga - për m=1 dhe n=2 Fillimi m,n F=1 i=1 F=F⋅i i=i+1 Po i≤(2m+n) Jo F Fundi Fig.5.5 Fig.5.6 c. Programi // Programi Prg5_5 #include <iostream> using namespace std;
  • 61. 60 Algoritmet int main() { int m,n,i; double F; cout << "Vlerat hyrëse m dhe n: "; cin >> m >> n; F=1; for (i=1;i<=2*m+n;i++) F=F*i; cout << "Faktorieli F=" << F << "n"; return 0; } Nëse gjatë ekzekutimit të programit, si vlera hyrëse përmes tastierës jepen vlerat m=1 dhe n=2, në ekran do të shtypet: Faktorieli F=24 ku vlera 24 i përgjigjet 4!. Procesi i llogaritjes do të ketë një cikël më pak, nëse gjatë llogaritjes së faktorielit të një numri më të madhë se 1 nisemi prej vlerës fillestare F=1 dhe vlera e variablës merret i=2. Ngjashëm, kur llogaritet faktorieli i një numri më të madh se 2, procesi i llogaritjes do të zvogëlohet për dy cikle, nëse merret F=2 dhe i=3. Nëse faktorieli paraqitet brenda shprehjeve të funksioneve, veprohet njëlloj si edhe te shumat e prodhimet, përkatësisht së pari llogaritet vlera e faktorielit dhe pastaj vlera e funksionit. Shembull Llogaritja e vlerës numerike të funksionit: ⎧ m + 1)! + 3x − 4 për x + m > 5 ( ⎪ y = ⎨0 për x + m = 5 ⎪ (3n + 2)! - x 2 për x + m < 5 ⎩ nëse janë dhënë vlerat e variablave m, n dhe x.
  • 62. Llogaritja e faktorielit 61 a. Bllok-diagrami Fillimi m,n,x < < > (x+m) - > 5 F=1 = F=1 i=1 i=1 F=F⋅i F=F⋅i i=i+1 i=i+1 Po Po i≤(3n+2) i≤(m+1) Jo Jo y=F-x2 y=0 y=F+3x-4 y Fundi Fig. 5.7
  • 63. 62 Algoritmet b. Rruga - për m=2, n=1 dhe x=5 Fig.5.8 Vlera që llogaritet gjatë rrugës së kaluar është: y = 1⋅2⋅3+ 3⋅5 −4 F c. Programi // Programi Prg5_7 #include <iostream> #include <cmath> using namespace std; int main()
  • 64. Llogaritja e faktorielit 63 { int m,n,i; double F,x,y; cout << "Vlerat hyrëse m,n dhe x: "; cin >> m >> n >> x; if (x+m<5) { F=1; for (i=1;i<=3*n+2;i++) F=F*i; y=F-pow(x,2); } else if (x+m==5) y=0; else { F=1; for (i=1;i<=m+1;i++) F=F*i; y=F+3*x-4; } cout << "Vlera e funksionit y=" << y << "n"; return 0; } Nëse programi ekzekutohet për vlerat hyrëse që janë shfrytëzuar gjatë vizatimit të rrugës në Fig.5.8, si rezultat në ekran do të shtypet: Vlera e funksionit y=17 gjë që fitohet ashtu siç u tregua edhe më sipër. Që algoritmi për llogaritjen e faktorielit të jetë plotësisht i saktë, në te mund të parashihet edhe rasti kur duhet të llogaritet vlera 0!=1. Detyra Të llogariten vlerat e funksioneve: a. x y= −(3n + m + 1)! 2
  • 65. 64 Algoritmet b. ⎧3x + 2 për x < m ⎪ ⎪ z = ⎨ ⎪ + 1)! + x (m për x ≥ m ⎪ ⎩ (m + n)! c. ⎧ e2x − 3x2 + (4n)! për x + 3 < n ⎪ ⎪ ⎪ ⎪(n + 1)!-2x për x + 3 = n g = ⎨ ⎪ ⎪ (n! ) + 2 1 për x + 3 > n ⎪ (2n)! ⎪ ⎩ nëse janë dhënë vlerat e variablave m, n dhe x. Faktorieli çift dhe tek Në matematikë përdoret edhe faktorieli i cili fitohet vetëm me shumëzimin e numrave natyrorë çiftë, ose të numrave natyrorë tekë. Shembull Llogaritja e vlerës numerike të faktorielit çift: F = (2n)!! nëse është dhënë vlera e variablës n. 2n F = 2 ⋅ 4 ⋅ 6 ⋅ ... ⋅ 2n = ∏i i=2 (çift)
  • 66. Llogaritja e faktorielit 65 a. Bllok-diagrami c. Rruga - për n=3 Fillimi n F=1 i=2 F=F⋅i i=i+2 Po i≤(2n) Jo F Fundi Fig.5.9 Fig.5.10 c. Programi // Programi Prg5_9 #include <iostream> using namespace std; int main() { int n,i; double F; cout << "Vlera hyrëse n: "; cin >> n; F=1;i=2; do { F=F*i; i=i+2; } while (i<=2*n); cout << "Faktorieli çift F=" << F << "n"; return 0;
  • 67. 66 Algoritmet } Për vlerën hyrëse n=3, rezultati që shtypet në ekran është: Faktorieli çift F=48 Plotësisht njëlloj llogaritet edhe vlera e faktorielit tek. Kështu, p.sh., nëse kërkohet vlera e faktorielit: F=(2n-1)!! në bazë të përkufizimit përkatës matematikor kjo vlerë llogaritet: 2n − 1 F = 1 ⋅ 3 ⋅ 5 ⋅ ... ⋅ (2n − 1) = ∏i i=1 (tek) gjë që nuk është aspak rëndë të realizohet përmes bllok-diagramit. Faktorieli brenda shumës Faktorielët mund të paraqiten brenda shprehjeve të shumave, ose edhe brenda funksioneve të ndryshme. Shembull Llogaritja e vlerës numerike të funksionit: n ⎡ i⎤ y = 3x − 2 ∑ ⎢ n + 2)! + ⎥ ( i =1 ⎣ 3⎦ nëse janë dhënë vlerat e variablave x dhe n. ⎧⎡ 1⎤ ⎡ 2⎤ ⎡ n ⎤⎫ y = 3x − 2⎨⎢ n + 2)! + ⎥ + ⎢ n + 2)! + ⎥ + ... + ⎢ n + 2)! + ⎥ ⎬ ( ( ( ⎩⎣ 3⎦ ⎣ 3⎦ ⎣ 3 ⎦⎭ Meqë, siç shihet edhe më sipër, vlera e faktorielit është konstante brenda të gjithë anëtarëve të serisë që mblidhen, atë duhet llogaritur së pari, për ta shfrytëzuar pastaj gjatë procesit të gjetjes së shumës.
  • 68. Llogaritja e faktorielit 67 a. Bllok-diagrami b. Rruga - për n=2 dhe x=3 Fillimi x,n F=(n+2)! F=1 i=1 F=F⋅i i=i+1 Po i≤(n+2) Jo s=0 i=1 ⎛ i⎞ s = s + ⎜F + ⎟ ⎝ 3⎠ i=i+1 Po i ≤ n Jo y=3x-2s n ⎛ i⎞ s = ∑ ⎜F + ⎟ i = 1⎝ 3⎠ y Fundi Fig.5.11 Fig.5.12 c. Programi
  • 69. 68 Algoritmet // Programi Prg5_11 #include <iostream> using namespace std; int main() { int n,i; double x,y,F,s; cout << "Vlerat hyrëse x dhe n: "; cin >> x >> n; F=1; for (i=1;i<=n+2;i++) F=F*i; s=0; for (i=1;i<=n;i++) s=s+(F+i/3.); y=3*x-2*s; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Nëse programi i dhënë ekzekutohet për vlerat e shfrytëzuara gjatë vizatimit të rrugës në Fig.5.12, rezultati që shtypet në ekran do të duket: Vlera e funksionit y=-89 Faktorieli brenda shumës mund të mos ketë vlerë konstante, përkatësisht të mos varet nga vlera e variablës e cila i përcakton anëtarët e serisë që mblidhen. Shembull Llogaritja e vlerës numerike të funksionit: n ⎡ i⎤ y = 3x − 2 ∑ ⎢ i + 2)! + ⎥ ( i = 1⎣ 3⎦ nëse janë dhënë vlerat e variablave x dhe n. ⎧⎡ 1⎤ ⎡ 2⎤ ⎡ n ⎤⎫ y = 3x − 2⎨⎢3! + ⎥ + ⎢4! + ⎥ + ... + ⎢ n + 2)! + ⎥ ⎬ ( ⎩⎣ 3⎦ ⎣ 3⎦ ⎣ 3 ⎦⎭
  • 70. Llogaritja e faktorielit 69 Nga shprehja e dhënë më sipër shihet se vlera e faktorielit nuk është konstante, por ajo ndryshon për çdo i, gjë që e imponon nevojën e llogaritjes së kësaj vlere brenda unazës për llogaritjen e shumës. Meqë në anëtarin e parë i cili merr pjesë në mbledhje figuron 3!, vlera fillestare e faktorielit duhet të merret 2!=2 dhe pastaj të shumëzohet me (i+2). a. Bllok-diagrami b. Rruga - për n=2 dhe x=3 Fillimi x,n s=0 F=2 i=1 F=F⋅(i+2) ⎛ i⎞ s = s + ⎜F + ⎟ ⎝ 3⎠ i=i+1 Po i ≤ n Jo y=3x-2s y Fundi Fig.5.13 Fig.5.14 c. Programi
  • 71. 70 Algoritmet // Programi Prg5_13 #include <iostream> using namespace std; int main() { int n,i; double x,y,F,s; cout << "Vlerat hyrëse x dhe n: "; cin >> x >> n; s=0; F=2; for (i=1;i<=n;i++) { F=F*(i+2); s=s+(F+i/3.); } y=3*x-2*s; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Pas ekzekutimit të programit të dhënë, p.sh. për vlerat hyrëse të shfrytëzuara gjatë vizatimit të rrugës së kaluar, rezultati që shtypet në ekran është: Vlera e funksionit y=-53 Gjetja e ligjshmërisë për ta fituar vlerën aktuale të faktorielit, duke shfrytëzuar vlerën paraprake të tij, në rast të përgjithshëm e komplikon punën e shkruarjes së programit për llogaritjen e vlerës së faktorielit. Më thjesht është nëse brenda unazës së shumës çdo vlerë e faktorielit llogaritet prej fillimit, pa menduar aspak se a mund të thjeshtohet llogaritja, nëse shfrytëzohet vlera e faktorielit e cila është llogaritur paraprakisht. Shembull Llogaritja e vlerës numerike të funksionit: n − 3 ∑ [ 2i + 1)! − x] x y = ( 2 i =1 nëse janë dhënë vlerat e variablave x dhe n. y = x − 3⋅ {[ ⋅ 1 (2 + 1)! - x ] + [ ⋅ 2 + 1)! - x (2 ] + ... + [ ⋅ n + 1)! - x (2 ]} 2
  • 72. Llogaritja e faktorielit 71 a. Bllok-diagrami Fillimi x,n s=0 i=1 F=(2i+1)! F=1 j=1 F=F⋅j j=j+1 Po j≤(2i+1) Jo s=s+[F-x] i=i+1 Po i ≤ n Jo x y = − 3s 2 y Fundi Fig.5.15 Nëse vizatohet rruga e kaluar në këtë rast, numri i vijave te pjesa e bllok- diagramit për llogaritjen e faktorielit do të jetë i madh, sepse llogaritja përsëritet prej fillimit për çdo vlerë të variablës i. b. Programi
  • 73. 72 Algoritmet // Programi Prg5_15 #include <iostream> using namespace std; int main() { int n,i,j; double x,y,s,F; cout << "Vlerat hyrëse x dhe n: "; cin >> x >> n; s=0; for (i=1;i<=n;i++) { F=1; for (j=1;j<=2*i+1;j++) F=F*j; s=s+(F-x); } y=x/2-3*s; cout << "Vlera e funksionit y=" << y << "n"; return 0; } Nëse programi ekzekutohet për vlerat hyrëse x=3 dhe n=2, rezultati që shtypet në ekran duket: Vlera e funksionit y=-358.5 Plotësisht njëlloj rrjedh llogaritja e faktorielëve, kur ata figurojnë brenda anëtarëve të serive për të cilët gjenden prodhimet. Gjatë llogaritjes së faktorielit çift ose tek, kur ata figurojnë nën shenjën e shumës ose të prodhimit, duhet pasur kujdes të veçantë. Shembull Llogaritja e vlerës numerike të funksionit: n +1 y = 3x + 4 ∑ [ 2i + 1)!! + i] ( i =1 nëse janë dhënë vlerat e variablave x dhe n. y = 3x + 4{ [3!! + 1] + [5!! + 2] + ... + [2 n + 1) ! + (n + 1) } ( ! ]
  • 74. Llogaritja e faktorielit 73 a. Bllok-diagrami b. Rruga - për x=2 dhe n=2 Fillimi x,n s=0 i=1 F=1 j=3 F=F⋅j s=s+[F+i] j=j+1 i=i+1 Po i≤(n+1) Jo y=3x+4s y Fundi Fig.5.16 Fig.5.17 c. Programi // Programi Prg5_16 #include <iostream> using namespace std; int main() {
  • 75. 74 Algoritmet int n,i,j; double x,y,s,F; cout << "Vlerat hyrëse x dhe n: "; cin >> x >> n; s=0; i=1; F=1; j=3; do { F=F*j; s=s+(F+i); j=j+2; i=i+1; } while (i<=n+1); y=3*x+4*s; cout << "Vlera e llogaritur y=" << y << "n"; return 0; } Rezultati që do të shtypet në ekran, nëse ekzekutohet programi i dhënë për vlerat e variablave hyrëse, të cilat janë marrë gjatë vizatimit të rrugës së kaluar në Fig.5.17, është: Vlera e llogaritur y=522 Në një shprehje të funksionit mund të ndodhë të nevojitet llogaritja alternative e faktorielit çift dhe tek. Shembull Llogaritja e vlerës numerike të funksionit: n ⎡ x⎤ g = 2a + 3 ∑ ⎢i!! + ⎥ i =1 ⎣ 2⎦ nëse janë dhënë vlerat e variablave a, x dhe n.
  • 76. Llogaritja e faktorielit 75 ⎧⎡ x⎤ ⎡ x⎤ ⎡ x⎤ ⎫ g = 2a + 3 ⋅ ⎨ ⎢1!! + ⎥ + ⎢2!! + ⎥ + ... + ⎢n!! + 2 ⎥ ⎬ ⎩⎣ 2⎦ ⎣ 2⎦ ⎣ ⎦⎭ a. Bllok-diagrami b. Rruga - për a=5, x=2 dhe n=4 Fillimi a,x,n s=0 i=1 F=1 j=i F=F⋅j j=j-2 Po j > 1 Jo ⎛ x⎞ s = s + ⎜F + ⎟ ⎝ 2⎠ i=i+1 Po i ≤ n Jo y=2a+3s y Fundi Fig.5.18 Fig.5.19
  • 77. 76 Algoritmet c. Programi // Programi Prg5_18 #include <iostream> using namespace std; int main() { int n,i,j; double a,x,y,s,F; cout << "Vlerat e variablave a, x dhe n: "; cin >> a >> x >> n; s=0; for (i=1;i<=n;i++) { F=1; j=i; do { F=F*j; j=j-2; } while (j>1); s=s+(F+x/2); } y=2*a+3*s; cout << "Vlera e llogaritur y=" << y << "n"; return 0; } Pas ekzekutimit të programit për vlerat e variablave hyrëse, të cilat janë shfrytëzuar gjatë vizatimit të rrugës së kaluar në Fig.5.19, në ekran fitohet: Rezultati y=64 Detyra Të llogariten vlerat e funksioneve: a. n +2 2 3x ⎡ i⎤ y = + 4 ∑ ⎢ 2i + 3)! + ⎥ ( a i = 2⎣ b⎦
  • 78. Llogaritja e faktorielit 77 b. ⎧ n + 1)! ( për x < (a + b) ⎪ ⎪ ⎪ m ⎡ a⎤ ⎪ 3 ∑ ⎢ 2i + 1)!! + ⎥ ( për x = (a + b) g = ⎨ i =1 ⎣ i⎦ ⎪ ⎪ ⎪(2n)!! për x > (a + b) ⎪ ⎩ nëse janë dhënë vlerat e variablave a, b, x, m dhe n. Në shprehjet e funksioneve njëkohësisht mund të paraqiten shuma, prodhime dhe faktoriele, të cilat llogariten duke u mbështetur në algoritmet elementare përkatëse. Shembull Llogaritja e vlerës numerike të funksionit: m −1 (m + 1)! 2m ⎡ ⎤ z = 3 ∑ [k + a]2 − 4 i ∏ ⎢ + 3⎥ + k =1 i=2 ⎣ 2 ⎦ x + 2 (çift) nëse janë dhënë vlerat e variablave x, a dhe m. z = 3⋅ { [1 + a]2 + [2 + a]2 + ... + [(m + 1) + a]2 } ⎧ ⎡2 ⎤ ⎡4 ⎤ ⎡ 2m ⎤⎫ − 4⎨ ⎢ + 3⎥ ⋅ ⎢ + 3⎥ ⋅ ... ⋅ ⎢ + 3⎥ ⎬ ⎩ ⎣2 ⎦ ⎣2 ⎦ ⎣ 2 ⎦⎭ 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ (m + 1) + x + 2
  • 79. 78 Algoritmet a. Bllok-diagrami b. Rruga - për x=3, a=0.5 dhe m=3 Fillimi m -1 x,a,n s= ∑ [k + a]2 k=1 s=0 k=1 s=s+[k+a]2 k=k+1 Po k≤(m-1) Jo p=1 i=2 2m ⎡ i ⎤ ⎡i ⎤ p= ∑ ⎢ + 3⎥ p = p ⋅ ⎢ + 3⎥ ⎣2 ⎦ i=2 ⎣ 2 ⎦ (çift) i=i+2 Po i ≤ 2m Jo A B
  • 80. Llogaritja e faktorielit 79 A B F=1 i=1 F=F⋅i F=(n+1)! i=i+1 Po i≤(m+1) Jo F z = 3 ⋅s − 4⋅ p + x+2 z Fundi Fig.5.20 Fig.5.21 c. Programi // Programi Prg5_20 #include <iostream> #include <cmath> using namespace std; int main() { const double x=3,a=0.5; const int m=3; int i,k; double s,p,F,z; s=0; for (k=1;k<=m-1;k++) s=s+pow(k+a,2); p=1; i=2; do { p=p*(i/2.+3);
  • 81. 80 Algoritmet i=i+2; } while (i<=2*m); F=1; for (i=1;i<=m+1;i++) F=F*i; z=3*s-4*p+F/(x+2); cout << "Rezultati z=" << z << "n"; return 0; } Nëse programi ekzekutohet për vlerat hyrëse të deklaruara si konstante, rezultati që shtypet në ekran është: Rezultati z=-449.7 Detyra Të llogariten vlerat numerike të funksioneve: a. n +1 + 2 ∑ [ 2i)!! + 3] − [ n + 2)!] 2 x f = ( ( 3 i =1 (i ≠ 3) b. ⎧ n ⎪(n + 1)! + 3 ∏ [k + 1] për (a + x) < b ⎪ k =1 ⎪ (tek) ⎪ ⎪(2n + 1)!! + 2a - b për (a + x) = b ⎪ g = ⎨ ⎪ ⎪(2n)!! + x për (x + a) > b ⎪ 2 ⎪ ⎪ ⎪ ⎩ nëse janë dhënë vlerat e variablave a, b, x dhe n.
  • 82. Llogaritja e faktorielit 81 Faktorieli brenda prodhimit Faktorielët mund të paraqiten edhe brenda anëtarëve të serive për të cilat kërkohet prodhimi. Gjatë përpilimit të algoritmeve përkatëse, në këto raste shfrytëzohen procedura plotësisht të njëjta si edhe te shumat. Shembull Llogaritja e vlerës numerike të funksionit: n ⎡ i⎤ y = 3x + 2 ∏ ⎢ + 1)! + 3 ⎥ (i i =1 ⎣ ⎦ (i ≠ 2, ) 3 nëse janë dhënë vlerat e variablave x dhe n. ⎧ ⎡ 1⎤ ⎡ 4⎤ ⎡ n + 1⎤ ⎫ y = 3x + 2 ⋅ ⎨ ⎢2! + 3 ⎥ ⋅ ⎢5! + 3 ⎥ ⋅ ... ⋅ ⎢ + 1)! + (n ⎬ ⎩ ⎣ ⎦ ⎣ ⎦ ⎣ 3 ⎥⎭ ⎦
  • 83. 82 Algoritmet a. Bllok-diagrami Fillimi x,n p=1 i=1 Po i=2 Jo Po i=3 Jo F=1 j=1 F=F⋅j j=j+1 Po j≤(i+1) Jo ⎡ i⎤ p = p ⋅ ⎢F + ⎥ ⎣ 3⎦ i=i+1 Po i ≤ n Jo y=3x+2p y Fundi Fig.5.22
  • 84. Llogaritja e faktorielit 83 b. Rruga - për x=2 dhe n=4 Fig.5.23
  • 85. 84 Algoritmet c. Programi // Programi Prg5_22 #include <iostream> using namespace std; int main() { int n,i,j; double x,y,p,F; cout << "Vlerat hyrëse x dhe n: "; cin >> x >> n; p=1; for (i=1;i<=n;i++) if ((i==2) || (i==3)) { } else { F=1; for (j=1;j<=i+1;j++) F=F*j; p=p*(F+i/3.); } y=3*x+2*p; cout << "Vlera e llogaritur y=" << y << "n"; return 0; } Nëse programi ekzekutohet për vlerat hyrëse të shfrytëzuara gjatë vizatimit të rrugës së kaluar, në ekran do të fitohet rezultati: Vlera e llogaritur y=572.222 Detyra Të llogariten vlerat e funksioneve: a. x m ⎡ x⎤ f = − 3 ∏ ⎢k!! + ⎥ 2 k =1 ⎣ 2⎦
  • 86. Llogaritja e faktorielit 85 b. ⎧ m +1 i ⎡ ⎤ ⎪3x + 2 ∑ ⎢ + 3⎥ për x ≠ a ⎪ i =1 ⎣2 ⎦ ⎪ g = ⎨ 2 ⎪ ax m ⎡ x⎤ ⎪e + 3 ∏ ⎢ (2j + 3)! - ⎥ për x = a ⎪ j= 2 ⎣ a⎦ ⎩ (çift) c. m +2 i 2 m ⎡ 2 a⎤ 1 ⎡ ⎤ h = − ∑ ⎢ + 4i⎥ − ∏ ⎢j ) − ⎥ (! 3 i =1 ⎣ 3 ⎦ 3 j= 1 ⎣ j⎦ (i ≠ 3, ) 5 nëse janë dhënë vlerat e variablave x, a dhe m.
  • 87. Vektorët 90 Matricat 134 Fushat tridimensionale 217
  • 88. 88 Algoritmet Grumbulli i numrave të vendosur në një hapësirë në bazë të parimeve të caktuara, quhet fushë numerike. Kur pozicionet e numrave në hapësirën e fushës numerike përcaktohen nga një madhësi, për fushën thuhet se është njëdimensionale dhe quhet vektor. Nëse për përcaktimin e pozicioneve të numrave përdoren dy madhësi, fusha numerike është dydimensionale dhe quhet matricë. Kurse, kur pozita e numrave në fushë përcaktohet përmes më shumë madhësive, për fushën thuhet se është shumëdimensionale. Për t'i kuptuar më mirë fushat numerike, do ta marrim si shembull grumbullin e notave të 5 nxënësve të parë, në regjistrin e notave të një klase, i cili është dhënë në Fig.6.1. 1 2 3 4 5 6 7 8 Numri rendor Gjuha amtare Gjuha e huaj Matematika Programimi Biologjia Edukata Fizika fizike Emri Kimia 1 Agroni 5 5 5 5 5 5 5 5 2 Ardiani 5 5 5 4 4 4 5 5 3 Arianisa 5 5 5 5 5 5 5 5 4 Arta 5 5 5 5 5 5 5 5 5 Besa 5 5 4 4 4 5 5 4 Fig.6.1 Notat e nxënësve të një klase Këtu, grumbulli i notave të një nxënësi është fushë njëdimensionale dhe e paraqet vektorin e notave të tij. Kështu, p.sh., vektori i notave të Ardianit është: 1 2 3 4 5 6 7 8 A = 5 5 5 4 4 4 5 5 Notat në këtë vektor nuk janë shënuar arbitrarisht, sepse çdo pozicioni në te i përgjigjet nota e një lënde të caktuar.
  • 89. Fushat numerike 89 Grumbulli i notave të nxënësve, të cilat janë shënuar në tabelën e dhënë në Fig.6.1: 1 2 3 4 5 6 7 8 1 5 5 5 5 5 5 5 5 2 5 5 5 4 4 4 5 5 B = 3 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 4 4 4 5 5 4 paraqetë fushë dydimensionale dhe e formon matricën e notave të tyre. Nga shembulli i dhënë më sipër shihet se te vektorët e notave të nxënësve, notat shënohen në bazë të lëndëve, përkatësisht numrave rendorë të tyre. Kurse, te matrica e notave të nxënësve, vendosja e notave në fushat e veçanta bëhet në bazë të nxënësve dhe lëndëve, ose numrave rendorë të tyre. Në rastin e përgjithshëm, kur kemi të bëjmë me m-nxënës dhe n-lëndë, vektori i notave të nxënësit mund të paraqitet kështu: 1 2 ... n A = a1 a2 ... an ose shkurt A(n), ku a1, a2, ..., an janë anëtarët e vektorit. Matrica e notave të nxënësve është: j=1 2 ... n i=1 b11 b12 ... b1n 2 b21 b22 ... b2n B = ... ... ... ... ... m bm1 bm2 ... bmn dhe shkurt shënohet B(m,n), ku b11, b12, ..., bm1, bm2,..., bmm janë anëtarët e matricës. Numrat të cilët i shoqërojnë anëtarët e vektorit, ose të matricës, quhen indekse. Kështu, p.sh., indeksi i notës së matematikës te vektorët e notave të nxënësve është 3, kurse anëtari i këtij vektori për notën e Artës është a3=5. Te matrica, p.sh., anëtari b53=4 i përgjigjet notës së Besës nga lënda e matematikës.
  • 90. 90 Algoritmet Vektorët Mbushja e vektorëve me vlera numerike, përkatësisht operimi me vlerat e anëtarëve të veçantë të tyre bëhet duke i shfrytëzuar indekset përkatës. Përcaktimi i vektorëve Vlerat numerike të anëtarëve të vektorëve kompjuterit mund t'i jepen përmes leximit si numra të gatshëm, ose ato mund të llogariten në bazë të ligjshmërisë së dhënë. Shembull Formimi i vektorit A(n), duke i llogaritur anëtarët ai të tij kështu: ai=3i+1 nëse dihet vlera e variablës n. a. Bllok-diagrami b. Rruga - për n=5 Fillimi n i=1 ai=3i+1 i,ai i=i+1 Po i ≤ n Jo Fundi Fig.6.2 Fig.6.3 Në gjuhën C++ indekset e anëtarëve të vektorëve dhe matricave fillojnë me vlerën 0. Për këtë arsye, në pjesën vijuese, gjatë shkruarjes së programeve, indekset fillestare dhe kufijt e tyre do të zvogëlohen për një, krahasuar me vlerat përkatëse në bllok-diagrame.
  • 91. Fushat numerike 91 c. Programi // Programi Prg6_2 #include <iostream> using namespace std; int main() { int const n=5; int i,A[n]; for (i=0;i<n;i++) { A[i]=3*i+1; cout << "A[" << i << "]=" << A[i] << "n"; } return 0; } Pas ekzekutimit të programit, anëtarët e vektorit do të shtypen në ekran kështu: A[0]=1 A[1]=4 A[2]=7 A[3]=10 A[4]=13 Anëtarët e vektorit mund edhe të llogariten, duke shfrytëzuar shprehje të çfarëdoshme. Shembull Formimi i vektorit A(n), duke llogaritur anëtarët ai të tij kështu: x i ai = + 3 ∑ (j + 2i) 3 j= 1 nëse janë dhënë vlerat e variablave x dhe n. a. Bllok-diagrami b. Rruga - për x=1 dhe n=3
  • 92. 92 Algoritmet Fillimi n,x i=1 s=0 j=1 s=s+(j+2i) j=j+1 Po j ≤ i Jo x a = + 3s i 2 i,ai i=i+1 Po i ≤ n Jo Fundi Fig.6.4 Fig.6.5 Vlerat e llogaritura gjatë rrugës së kaluar: a1 = 1 + 3⋅ { [1 + 2 ⋅ 1] } 2 a2 = 1 + 3⋅ { [1 + 2 ⋅ 2] + [2 + 2 ⋅ 2] } 2 a3 = 1 + 3⋅ { [1 + 2 ⋅ 3] + [2 + 2 ⋅ 3] + [3 + 2 ⋅ 3] } 2 c. Programi
  • 93. Fushat numerike 93 // Programi Prg6_4 #include <iostream> using namespace std; int main() { int const n=3, x=1; int i,j; double s,A[n]; for (i=0;i<n;i++) { s=0; for (j=1;j<=i;j++) s=s+(j+2*i); A[i]=x/2.+3*s; cout << "A[" << i << "]=" << A[i] << "n"; } return 0; } Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është: A[0]=0.5 A[1]=9.5 A[2]=33.5 Vektorët mund të formohen edhe duke shfrytëzuar anëtarët e vektorëve të tjerë. Shembull Formimi i vektorit B(n), duke shfrytëzuar vlerat e anëtarëve të vektorit të dhënë A(n), në bazë të ligjshmërisë: bi = i + 2ai − 1 2
  • 94. 94 Algoritmet a. Bllok-diagrami b. Rruga - për A= 3 5 -2 8 Fillimi n,(ai,i=1,n) i=1 bi=i+2ai2-1 i,bi i=i+1 Po i ≤ n Jo Fundi Fig.6.6 Fig.6.7 Në bllok-diagram, me (ai,i=1,n) shënohet shkurt vargu i anëtarëve të vektorit, përkatësisht a1, a2, ... , an. c. Programi // Programi Prg6_6 #include <iostream> using namespace std; int main() { int const n=4; int i,A[n]={3,5,-2,8},B[n]; for (i=0;i<n;i++) { B[i]=i+2*(A[i]*A[i])-1; cout << "B[" << i << "]=" << B[i] << "n"; } return 0; }
  • 95. Fushat numerike 95 Pas ekzekutimit të programit, anëtarët e vektorit të formuar do të shtypen në ekran kështu: B[0]=17 B[1]=50 B[2]=9 B[3]=130 Vektorët mund të formohen edhe duke shfrytëzuar vlerat numerike të anëtarëve të disa vektorëve njëkohësisht. Shembull Formimi i vektorit G(k), duke shfrytëzuar vlerat e anëtarëve të vektorëve A(n) dhe B(m), kështu: G = B A a. Bllok-diagrami Fillimi m,n,(ai,i=1,n),(bi,i=1,m) i=1 Po Jo i ≤ m gi=bi gi=ai-m i,gi i=i+1 Po i≤(m+n) Jo Fundi Fig.6.8
  • 96. 96 Algoritmet b. Rruga A = 9 -3 B = 6 -2 8 Fig.6.9 c. Programi // Programi Prg6_8 #include <iostream> using namespace std; int main() { int const m=3,n=2; int A[n]={9,-3}, B[m]={6,-2,8}, i,G[m+n]; for (i=0;i<m+n;i++) { if (i<m) G[i]=B[i];
  • 97. Fushat numerike 97 else G[i]=A[i-m]; cout << "G[" << i << "]=" << G[i] << "n"; } return 0; } Anëtarët e vektorit të formuar G, pas ekzekutimit të programit të dhënë, në ekran do të shtypen kështu: G[0]=6 G[1]=-2 G[2]=8 G[3]=9 G[4]=-3 Operacionet aritmetikore Në praktikë shpesh herë kryhen operacione të ndryshme aritmetikore mbi anëtarët e një vektori, si dhe mes anëtarëve të dy ose më shum vektorëve. Shembull Formimi i vektorit B(n), nga anëtarët përkatës të vektorit të dhënë A(n), duke shumëzuar anëtarëve negativë me vlerat e indekseve të tyre, kurse anëtarët pozitivë - me vlerën e konstantes së dhënë x.
  • 98. 98 Algoritmet a. Bllok-diagrami Fillimi x,n,(ai,i=1,n) i=1 Po Jo ai < 0 bi=i⋅ai bi=x⋅ai i,bi i=i+1 Po i ≤ n Jo Fundi Fig.6.10 b. Rruga e kaluar - për x=2 dhe A = 6 9 -3 4 -2 Fig.6.11
  • 99. Fushat numerike 99 Vlerat që llogariten gjatë rrugës së kaluar janë: b1 = x ⋅ a1 b2 = x ⋅ a2 b3 = 3 ⋅ a3 b4 = x ⋅ a4 b5 = 5 ⋅ a5 c. Programi // Programi Prg6_10 #include <iostream> using namespace std; int main() { int const x=2,n=5; int A[n]={6,9,-3,4,-2},i,B[n]; for (i=0;i<n;i++) { if (A[i]<0) B[i]=i*A[i]; else B[i]=x*A[i]; cout << "B[" << i << "]=" << B[i] << "n"; } return 0; } Nëse programi i dhënë ekzekutohet, vlerat e vektorit B të cilat shtypen në ekran, janë: B[0]=12 B[1]=18 B[2]=-6 B[3]=8 B[4]=-8 Vlerat e anëtarëve të vektorit mund të përcaktohen edhe përmes llogaritjeve të ndryshme më komplekse. Shembull Formimi i vektorit Z(m), nga anëtarët e vektorit të dhënë
  • 100. 100 Algoritmet F(m), duke ua shtuar anëtarëve të veçantë vlerat e shumave: ⎧fi + i për i ≥ 3 ⎪ ⎪ zi = ⎨ i ⎪ ∑ fj2 për i < 3 ⎪j= 1 ⎩ a. Bllok-diagrami Fillimi m,(fi,i=1,m) i=1 Po Jo i < 3 s=0 j=1 s=s+fj2 j=j+1 Po j ≤ i Jo zi=s zi=fi+i i,zi i=i+1 Po i ≤ m Jo Fundi Fig.6.12
  • 101. Fushat numerike 101 b. Rruga - për m=5 dhe F= 3 2 -1 6 -4 Fig.6.13
  • 102. 102 Algoritmet Gjatë rrugës së kaluar në Fig.6.13 anëtarët e vektorit Z(n) llogariten kështu: z1 = f1 2 z2 = 2 f1 + f22 z3 = f3 + 3 z4 = f4 + 4 z5 = f5 + 5 c. Programi // Programi Prg6_12 #include <iostream> using namespace std; int main() { int const m=5; int F[m]={3,2,-1,6,-4},i,j,s,Z[m]; for (i=0;i<m;i++) { if (i<2) { s=0; for (j=0;j<=i;j++) s=s+F[j]*F[j]; Z[i]=s; } else Z[i]=F[i]+i; cout << "Z[" << i << "]=" << Z[i] << "n"; } return 0; } Vektori Z, që formohet pas ekzekutimit të programit, për vlerat e vektorit F të cilat janë shfrytëzuar gjatë rrugës së kaluar në Fig.6.13, është: Z[1]=9 Z[2]=13 Z[3]=1 Z[4]=9 Z[5]=0
  • 103. Fushat numerike 103 Operacionet aritmetikore mund të zbatohen edhe mbi anëtarët e më shumë vektorëve njëkohësisht. Shembull Formimi i vektorit G(m), duke shumëzuar katrorët e anëtarëve përkatës të vektorit A(m) me vlerat absolute të anëtarëve me indeks të njëjtë të vektorit B(m). Njëkohësisht, anëtarët e vektorit G(m), të cilët janë më të mëdhenj se numri i dhënë x, duhet të pjesëtohen me indeksin përkatës. a. Bllok-diagrami Fillimi x,m,(ai,i=1,m),(bi,i=1,m) i=1 gi=ai2⋅|bi| Po gi > x Jo gi=gi/i i,gi i=i+1 Po i ≤ m Jo Fundi Fig.6.14
  • 104. 104 Algoritmet b. Rruga - për x=20 dhe A= -1 7 5 2 B = 2 -3 8 -4 Fig.6.15 c. Programi // Programi Prg6_14 #include <iostream> #include <cmath> using namespace std; int main() { int const x=20,m=4; int A[m]={-1,7,5,2}, B[m]={2,-3,8,4},i; double G[m]; for (i=0;i<m;i++)
  • 105. Fushat numerike 105 { G[i]=A[i]*A[i]*abs(B[i]); if (G[i]>x) G[i]=G[i]/i; cout << "G[" << i << "]=" << G[i] << "n"; } return 0; } Pas ekzekutimit të programit të dhënë për vlerat e shfrytëzuara gjatë vizatimit të rrugës në Fig.6.15, vlerat e anëtarëve të vektorit G, të cilat shtypen në ekran, janë: G[0]=2 G[1]=147 G[2]=100 G[3]=16 Shuma dhe prodhimi Gjatë llogaritjeve të ndryshme praktike, shpesh herë shfrytëzohet, p.sh., shuma, ose prodhimi, ose shuma e katrorëve, ose shuma e kubeve, përkatësisht shumë kombinime të tjera të mbledhjes, të zbritjes, të shumëzimit dhe të pjesëtimit të anëtarëve të vektorëve. Shembull Mbledhja e anëtarëve pozitiv dhe e katrorëve të anëtarëve negativ të vektorit të dhënë A(n).
  • 106. 106 Algoritmet a. Bllok-diagrami Fillimi n,(ai,i=1,n) s=0 i=1 Po Jo ai < 0 s=s+ai2 s=s+ai i=i+1 Po i ≤ n Jo s Fundi Fig.6.16
  • 107. Fushat numerike 107 b. Rruga - për A = 7 -2 4 6 -3 Fig.6.17 Shuma e cila llogaritet gjatë rrugës së kaluar është: s = 7 + (-2)2 + 4 + 6 + (-3) 2 c. Programi // Programi Prg6_16 #include <iostream> using namespace std; int main() { int const n=5; int A[n]={7,-2,4,6,-3},i,s; s=0; for (i=0;i<n;i++)
  • 108. 108 Algoritmet { if (A[i]<0) s=s+A[i]*A[i]; else s=s+A[i]; } cout << "Shuma e kërkuar s=" << s << "n"; return 0; } Nëse ekzekutohet programi i dhënë, si rezultat në ekran do të shtypet vlera: Shuma e kërkuar s=30 Ngjashëm, vlerat e anëtarëve të vektorëve mund të shfrytëzohen për gjetjen e prodhimeve të ndryshme. Shembull Prodhimi i anëtarëve të vektorit A(n) të cilët kanë vlerë absolute më të madhe se 5 dhe më të vogël se 12, duke shtypur anëtarët që nuk marrin pjesë në prodhim si dhe indekset e tyre.
  • 109. Fushat numerike 109 b. Bllok-diagrami b. Rruga - për A = 7 19 8 -2 10 Fillimi n,(ai,i=1,n) p=1 i=1 Jo ai > 5 Po Jo ai < 12 Po p=p⋅ai i,ai i=i+1 Po i ≤ n Jo p Fundi Fig.6.18 Fig.6.19 Vlera që llogaritet gjatë rrugës së kaluar është: Vlera fillestare p = 1 ⋅ 7 ⋅ 8 ⋅ 10 Njëkohësisht, shtypen edhe indekset dhe vlerat e anëtarëve të cilët janë jashtë kufijve të dhënë: 2 19 4 -2
  • 110. 110 Algoritmet c. Programi // Programi Prg6_18 #include <iostream> using namespace std; int main() { int const n=5; char t[20]="--------------"; int A[n]={7,19,8,-2,10},i,p; p=1; cout << " i A[i]" << "n" << t << "n"; for (i=0;i<n;i++) { if ((A[i]>5) && (A[i]<12)) p=p*A[i]; else cout << " " << i << " " << A[i] << "n"; } cout << t << "n" << "Prodhimi p=" << p << "n"; return 0; } Për vlerat e shfrytëzuara gjatë rrugës së kaluar në Fig.6.19, si rezultat në ekran shtypet: i A[i] -------------- 1 19 3 -2 -------------- Prodhimi p=560 Anëtarët e vektorëve mund të shfrytëzohen edhe brenda shprehjeve të ndryshme për llogaritjen e shumave ose të prodhimeve, përmes indekseve përkatëse.
  • 111. Fushat numerike 111 Shembull Llogaritja e vlerës së shprehjes: ⎧ ⎪3x + 4 ∏ ( ai + 2) n për x < 0.55 ⎪ i =1 ⎪ y = ⎨ ⎪ ∑ i ( ⎪ e2x − 2 n a2 − x ) për x ≥ 0.55 ⎪ i=2 ⎩ (çift) ku me ai nënkuptohen anëtarët e vektorit të dhënë A(n). a. Bllok-diagrami Fillimi n,(ai,i=1,n),x Po Jo x < 0.55 p=1 s=0 i=1 i=2 p=p⋅(|ai|+2) s=s+(ai2-x) i=i+1 i=i+2 Po Po i ≤ n i ≤ n Jo Jo y=3x+4p y=e2x-2s y Fundi Fig.6.20
  • 112. 112 Algoritmet b. Rruga - për x = 0.2 dhe A= 6 4 -9 Fig.6.21 c. Programi // Programi Prg6_20 #include <iostream> #include <cmath> using namespace std; int main() { int const n=3; int A[n]={6,4,-9},i; double s,p,x,y; cout << "Vlera e variablës x="; cin >> x;
  • 113. Fushat numerike 113 if (x<0.55) { p=1; for (i=0;i<n;i++) p=p*(abs(A[i])+2); y=3*x+4*p; } else { s=0; i=2; do { s=s+A[i]*A[i]-x); i=i+2; } while (i<=n); y=exp(2*x)-2*s; } cout << "Vlera e llogaritur y=" << y << "n"; return 0; } Rezultati që shtypet në ekran, për vlerat numerike që janë shfrytëzuar gjatë vizatimit të rrugës së kaluar në Fig.6.21, është: Vlera e llogaritur y=2112.6 Numërimi i anëtarëve të caktuar Për t'i numëruar anëtarët e caktuar brenda vektorit, të gjithë anëtarët e tij duhet të krahasohen me kushtet e përcaktuara për numërim. Shembull Numri n i anëtarëve me vlerë numerike negative, në vektorin e dhënë A(m). Këtu, vlera fillestare e numëratorit n duhet të merret zero. Pastaj, sa herë që gjendet ndonjë anëtar me vlerë numerike negative, vlera e numëratorit n rritet për një, kurse për anëtarët e tjerë kjo madhësi nuk ndryshohet.
  • 114. 114 Algoritmet a. Bllok-diagrami b. Rruga - për A= 3 -2 7 -4 5 Fillimi m,(ai,i=1,m) n=0 i=1 Jo ai < 0 Po n=n+1 i=i+1 Po i ≤ m Jo n Fundi Fig.6.22 Fig.6.23 c. Programi // Programi Prg6_22 #include <iostream> using namespace std; int main() { int const m=5; int A[m]={3,-2,7,-4,5},i,n; n=0; for (i=0;i<m;i++) if (A[i]<0) n=n+1; cout << "Anëtarë negativë n=" << n << "n"; return 0; }
  • 115. Fushat numerike 115 Rezultati që shtypet në ekran, për vlerat e shfrytëzuara gjatë vizatimit të bllok-diagramit në Fig.6.23, pas ekzekutimit të programit të dhënë, është: Anëtarë negativë n=2 gjë që shihet edhe nga rruga e vizatuar, kur nëpër bllokun në të cilin rritet numëratori n kalohet vetëm dy herë. Numërimi mund të bëhet edhe duke shtruar më shumë kushte njëkohësisht. Shembull Numërimi k i anëtarëve negativë të vektorit F(m), por të cilët për nga vlera absolute janë më të mëdhenj se numri pozitiv x. a. Bllok-diagrami b. Rruga - për x=3 dhe A= -7 4 -5 -1 6 Fillimi x,m,(fi,i=1,m) k=0 i=1 Jo fi<0 Po Jo |fi|>x Po k=k+1 i=i+1 Po i ≤ m Jo k Fundi Fig.6.24 Fig.6.25 c. Programi
  • 116. 116 Algoritmet // Programi Prg6_24 #include <iostream> #include <cmath> using namespace std; int main() { int const m=5,x=3; int F[m]={-7,4,-5,-1,6},i,k; k=0; for (i=0;i<m;i++) if ((F[i]<0) && (abs(F[i])>x)) k=k+1; cout << "Numri i kërkuar k=" << k << "n"; return 0; } Pas ekzekutimit të programit të dhënë, për vlerat hyrëse të shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.6.25, si rezultat në ekran shtypet: Numri i kërkuar k=2 meqë vetëm dy vlera numerike i plotësojnë dy kushtet e shtruara (-7 dhe -5). Bllok-diagrami mund të përpilohet edhe ashtu që brenda tij njëkohësisht të bëhen disa numërime. Shembull Numri p i anëtarëve pozitivë dhe numri n i anëtarëve negativë brenda vektorit A(m). a. Bllok-diagrami b. Rruga - për A= 2 -3 -7 4 1
  • 117. Fushat numerike 117 Fillimi m,(ai,i=1,m) p=0 n=0 i=1 Po Jo ai < 0 n=n+1 p=p+1 i=i+1 Po i ≤ m Jo n,p Fundi Fig.6.26 Fig.6.27 c. Programi // Programi Prg6_26 #include <iostream> using namespace std; int main() { int const m=5;int A[m]={2,-3,-7,4,1},i,p,n; p=0;n=0; for (i=0;i<m;i++) if (A[i]<0) n=n+1; else p=p+1; cout << "Anëtarë pozitiv p=" << p << "n"; cout << "Anëtarë negativ n=" << n << "n"; return 0;
  • 118. 118 Algoritmet } Për vlerat e shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.6.27, pas ekzekutimit të programit, si rezultat shtypet: Anëtarë pozitivë p=3 Anëtarë negativë n=2 Gjatë procedurës së numërimit të anëtarëve të vektorit mund të kërkohet që njëkohësisht të shtypen anëtarët që i plotësojnë, ose anëtarët që nuk i plotësojnë kushtet e numërimit. Shembull Numëri k i anëtarëve të vektorit A(n) me vlera absolute mes vlerave 3 dhe 8, duke shtypur njëkohësisht anëtarët me vlera jashtë këtij diapazoni, si dhe indekset përkatëse. a. Bllok-diagrami b. Rruga - për A= 5 2 4 9 -7 Fillimi n,(ai,i=1,n) k=0 i=1 Jo ai>3 Po Jo ai<8 Po k=k+1 i,ai i=i+1 Po i ≤ n Jo k Fundi Fig.6.28 Fig.6.29 c. Programi // Programi Prg6_28
  • 119. Fushat numerike 119 #include <iostream> using namespace std; int main() { int const n=5;int A[n]={5,2,4,9,-7},i,k; k=0; for (i=0;i<n;i++) { if ((A[i]>3) && (A[i]<8)) k=k+1; else cout << "i=" << i << " A[" << i << "]=" << A[i] << "n"; } cout << "Numri i kërkuar k=" << k << "n"; return 0; } Nëse ekzekutohet programi i dhënë për vlerat hyrëse të shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.6.29, në ekran do të shtypen së pari indekset dhe vlerat e anëtarëve të cilët nuk i plotësojnë kushtet: i=1 A[1]=2 i=3 A[3]=9 i=4 A[4]=-7 dhe pastaj edhe numri i anëtarëve që i plotësojnë kushtet: Numri i kërkuar k=2 Detyra Të gjendet: a. sa anëtarë të vektorit të dhënë Y(n), përnga vlera absolute janë numra më të mëdhenj se numri pozitiv x; b. numri i anëtarëve në vektorin e dhënë T(m), të cilët janë më të mëdhenj se x e më të vegjël se y, ku x>y.
  • 121. 120 Algoritmet Gjetja e anëtarëve të caktuar Shpeshherë, gjatë zgjidhjes së problemeve të ndryshme me kompjuter, nevojiten vlera të caktuara brenda fushave numerike, siç është, p.sh., anëtari me vlerë numerike minimale, ose anëtari me vlerë numerike maksimale. Procesi i gjetjes së tyre fillon me përvetësimin e vlerës fillestare të një variable ndihmëse, tek e cila do të ruhet vlera e kërkuar. Si vlerë fillestare e variablës ndihmëse merret kryesisht anëtari i parë në vektor, ose vlera e saj formohet nga ky anëtar i vektorit. Pastaj, krahasohen me vlerën e variablës ndihmëse të gjithë anëtarët e tjerë të vektorit. Sa herë që gjatë krahasimit vlera e anëtarit të vektorit, e cila krahasohet, është më e afërt me vlerën e kërkuar, ajo vlerë ruhet te variabla ndihmëse. Në fund, pasi të krahasohen të gjithë anëtarët e vektorit, variabla ndihmëse e përmban vlerën e kërkuar. Shembull Gjetja e vlerës maksimale x në vektorin e dhënë A(n). a. Bllok-diagrami b. Rruga - për A= 3 7 5 9 Fillimi m,(ai,i=1,m) x=a1 i=2 Po x ≥ ai Jo x=ai i=i+1 Po i ≤ m Jo x Fundi Fig.6.30 Fig.6.31
  • 122. Fushat numerike 121 c. Testimi – për A= 3 7 5 9 Vlerat numerike Hapi Blloku Urdhëri Rezultati merren Fillimi i 1 1 Fillimi - algoritmit Lexo: m prej njësisë m=4, a1 =3, a2 =7, 2 2 (ai ,i=1,m) hyrëse a3 =7, a4 =9 3 3 x=a1 a1 →2 x=3 4 4 i=2 - i=2 5 5 Pyet: x≥ai x→3, i→4, ai →2 Jo 6 6 x=ai i→4, ai →2 X=7 7 7 i=i+1 i→4, i=2+1=3 8 8 Pyet:i≤m i→7, m→2 Po 9 5 Pyet: x≥ai x→6, i→7, ai →2 Po 10 7 i=i+1 i→7, i=3+1=4 11 8 Pyet:i≤m i→10, m→2 Po 12 5 Pyet: x≥ai x→6, i→10, ai →2 Jo 13 6 x=ai i→10, ai →2 x=9 14 7 i=i+1 i→10, i=4+1=5 15 8 Pyet:i≤m i→14, m→2 Jo 16 9 Shtyp:x x→13 Shtypet numri 9 Fundi i 17 10 Fundi - algoritmit Fig.6.32 d. Programi // Programi Prg6_30 #include <iostream> using namespace std; int main() { int const m=4; int A[m]={3,7,5,9},i,x; x=A[0]; for (i=1;i<m;i++) { if (x>=A[i]) { } else
  • 123. 122 Algoritmet x=A[i]; } cout << "Numri më i madh x=" << x << "n"; return 0; } Pas ekzekutimit të programit, për vlerat hyrëse të shfrytëzuara për testimin e bllok-diagramit, rezultati që shtypet në ekran është: Numri më i madh x=9 Gjatë gjetjes së vlerës së caktuar, si vlerë fillestare mund të merret edhe anëtari i fundit në vektor. Shembull Gjetja e anëtarit me vlerë numerike më të vogël v për nga vlera absolute, në vektorin e dhënë G(n). a. Bllok-diagrami b. Rruga - për A= -7 3 -6 4 -8 Fillimi n,(gi,i=1,n) v=|gn| i=n-1 Po v ≤ |gi| Jo v=|gi| i=i-1 Po i > 0 Jo v Fundi Fig.6.33 Fig.6.34
  • 124. Fushat numerike 123 c. Programi // Programi Prg6_33 #include <iostream> #include <cmath> using namespace std; int main() { int const n=5; int G[n]={-7,3,-6,4,-8},i,v; v=abs(G[n-1]); i=n-2; do { if (v<=abs(G[i])) { } else v=abs(G[i]); i--; } while (i>0); cout << "Vlera më e vogël v=" << v << "n"; return 0; } Për vlerat numerike të shfrytëzuara gjatë vizatimit të rrugës së kaluar në bllok-diagramin e dhënë në Fig.6.34, si rezultat shtypet: Vlera më e vogël v=3 Si vlerë fillestare gjatë gjetjes së anëtarit të caktuar në vektor mund të merret edhe vlera e cilitdo anëtar brenda vektorit. Por, gjatë kësaj duhet gjetur ligjshmërinë se si të bëhet krahasimi i të gjitha vlerave të vektorit me vlerën e variablës ndihmëse. Përveç vlerës së anëtarit të caktuar, mund të kërkohet edhe pozita e tij në vektor, përkatësisht indeksi i tij. Shembull Gjetja e anëtarit me vlerë numerike më të madhe t për nga vlera absolute, si dhe pozita përkatëse k në vektorin e dhënë Z(n).
  • 125. 124 Algoritmet a. Bllok-diagrami b. Rruga - për A= 4 -7 2 9 -5 Fillimi n,(zi,i=1,n) t=|z1| k=1 i=2 Jo t < |zi| Po t=|zi| k=i i=i+1 Po i ≤ n Jo k,t Fundi Fig.6.35 Fig.6.36 c. Programi // Programi Prg6_35 #include <iostream> #include <cmath> using namespace std; int main() { int const n=5; int Z[n]={4,-7,2,9,-5},i,t,k; t=abs(Z[0]); k=0; for (i=1;i<n-1;i++)
  • 126. Fushat numerike 125 { if (t<abs(Z[i])) { t=abs(Z[i]); k=i; } } cout << "Vlera më e madhe ... t=" << t << "n"; cout << "Indeksi ............ k=" << k << "n"; return 0; } Nëse programi i dhënë ekzekutohet për vlerat e anëtarëve të vektorit Z të shfrytëzuara gjatë vizatimit të rrugës së kaluar në Fig.6.36, rezultati që shtypet në ekran është: Vlera më e madhe ... t=9 Indeksi ............ k=3 Brenda një vektori mund të gjendet edhe anëtari i caktuar nga grumbulli i vlerave numerike të anëtarëve të cilët plotësojn kushte të fiksuara paraprakisht. Kështu, p.sh., mund të gjendet anëtari më i madh (më i vogël) në grumbullin e anëtarëve pozitivë (negativë) të vektorit, duke i marrë si vlera reale, ose si vlera absolute etj. Shembull Gjetja e anëtarit me vlerë numerike më të madhe d për nga vlera absolute, në grumbullin e anëtarëve negativë të vektorit A(n).
  • 127. 126 Algoritmet a. Bllok-diagrami Fillimi n,(ai,i=1,n) i=1 X Y Po ai < 0 Jo d=|ai| i=i+1 k=i+1 Po i ≤ n Jo Jo ak<0 Po Jo d>|ak| Po d=|ak| k=k+1 Po k ≤ n Jo Mesazhi d Fundi Fig.6.37 Pjesa X e bllok-diagramit të dhënë në Fig.6.37 shfrytëzohet për përcaktimin e vlerës fillestare të variablës d, në të cilën si rezultat do ruhet vlera e kërkuar e vektorit. Në këtë pjesë, variablës d i shoqërohet vlera e anëtarit negativ, i cili gjendet në procesin e kërkimit, që fillon prej anëtarit të parë të vektorit. Në pjesën Y, pasi paraprakisht është përcaktuar vlera fillestare e variablës d, procedura e krahasimit dhe e gjetjes së vlerës absolute më të madhe në grumbullin e anëtarëve negativë fillon prej anëtarit k=i+1, ku i është indeksi i anëtarit të parë negativ në vektor, i cili fitohet në pjesën X të bllok-diagramit.
  • 128. Fushat numerike 127 b. Rruga - për A = 3 9 -2 6 -7 5 Fig.6.38 c. Programi // Programi Prg6_37 #include <iostream> #nclude <cmath> using namespace std; int main() { int const n=6; int A[n]={3,-9,2,-6,7,-15},i,d,k; i=0;
  • 129. 128 Algoritmet do { if (A[i]<0) goto Y; i++; } while (i<n); cout << "Nuk ka asnjë vlerë negative" << "n"; goto F; Y: d=abs(A[i]); for (k=i+1;k<n;k++) { if (A[k]<0) if (d>abs(A[k])) { } else d=abs(A[k]); } cout << "Vlera e gjetur d=" << d << "n"; F: return 0; } Programi i dhënë është shkruar ashtu që për nga struktura t'i ngjajë bllok- diagramit. Nëse gjatë kërkimit në pjesën X nuk gjendet asnjë anëtar negativ, është paraparë që si rezultat të shtypet mesazhi përkatës: Nuk ka asnjë vlerë negative Për vlerat e marra gjatë vizatimit të rrugës së kaluar në Fig.6.38 rezultati që shtypet në ekran është: Vlera e gjetur d=7 sepse, prej dy vlerave negative (-2 dhe -7), numri i dytë është më i madh si vlerë absolute. Detyra Në vektorin e dhënë F(n), të gjendet:
  • 130. Fushat numerike 129 a. anëtari me vlerë numerike më të vogël v, si dhe indeksi përkatës k; b. anëtari më i madh, në grupin e vlerave numerike, të cilat sillen mes vlerave x dhe y, nëse x<y. Radhitja e anëtarëve Anëtarët e vektorit të dhënë A(n) mund të radhiten sipas madhësisë, në (n-1)-hapa, kështu: Hapi i parë (i=1) a 1 krahasohet me a 2 ,a3 ,...,an Hapi i dytë (i=2) a 2 krahasohet me a 3 ,a4 ,...,an ............. ........... Hapi i fundit (i=n-1) a n-1 krahasohet me a n . Në çdo hap të ndërmarrë fiksohet vlera numerike e një anëtari të vektorit, kurse ngelin të pandryshuara vlerat numerike të anëtarëve që janë fiksuar në hapat paraprakë. Gjatë krahasimit të dy anëtarëve, për ndërrimin e vendeve të tyre shfrytëzohet një variabël ndihmëse, duke pasur parasysh radhën e cila është treguar në Fig.6.39, ku b është variabla ndihmëse, kurse ai dhe aj janë anëtarët, vlerat e të cilëve i ndërrojnë vendet mes vete. 2 ai aj 1 3 b Fig.6.39 Shembull Radhitja sipas madhësisë e vlerave numerike të anëtarëve të vektorit A(n), prej vlerës më të vogël.
  • 131. 130 Algoritmet a. Bllok-diagrami b. Rruga - për A= 7 2 8 3 Fillimi n,(ai,i=1,n) i=1 j=i+1 Po ai≤aj Jo b=ai ai=aj aj=b j=j+1 Po j≤n Jo i=i+1 Po i≤ n-1 Jo (ai,i=1,n) Fundi Fig.6.40 Fig.6.41 c. Programi // Programi Prg6_40 #include <iostream> using namespace std; int main() { int const n=4;
  • 132. Fushat numerike 131 int A[n]={7,2,8,3},i,j,b; for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) { if (A[i]<=A[j]) { } else { b=A[i]; A[i]=A[j]; A[j]=b; } } cout << "A=[ "; for (i=0;i<n;i++) cout << A[i] << " "; cout << "]" << "n"; return 0; } Këtu, meqë si shembull është marrë vektori me n=4 anëtarë, radhitja do të kryhet në 3-hapa. Vlerat e anëtarëve të vektorit në fund të çdo hapi janë: Hapi i parë (i=0): 2 7 8 3 Hapi i dytë (i=1): 2 3 8 7 Hapi i tretë (i=2): 2 3 7 8 Vlerat e fiksuara në fund të hapit të tretë janë vlerat e radhitura të vektorit sipas madhësive, prej më të voglit kah më i madhi, dhe rezultati që shtypet pas ekzekutimit të programit është: A=[ 2 3 7 8 ] Bllok-diagrami i dhënë në Fig.6.40 gjegjësisht programi përkatës, vlen edhe nëse vektori përmban vlera numerike negative. Anëtarët e vektorit mund të radhiten edhe në bazë të vlerave absolute. Shembull Radhitja sipas vlerave absolute të anëtarëve të vektorit A(n), prej vlerës më të madhe. a. Bllok-diagrami b. Rruga - për A= 3 -7 5 -4
  • 133. 132 Algoritmet Fillimi n,(ai,i=1,n) i=1 j=i+1 Jo |ai|≥|aj| Po b=ai ai=aj aj=b j=j+1 Po j≤n Jo i=i+1 Po i≤ n-1 Jo (ai,i=1,n) Fundi Fig.6.42 Fig.6.43 c. Programi // Programi Prg6_42 #include <iostream> #include <cmath> using namespace std; int main() {
  • 134. Fushat numerike 133 int const n=4; int A[n]={3,-7,5,-4},i,j,b; for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) { if (abs(A[i])>=abs(A[j])) { } else { b=A[i]; A[i]=A[j]; A[j]=b; } } cout << "A=[ "; for (i=0;i<n;i++) cout << A[i] << " "; cout << "]" << "n"; return 0; } Si rezultat, pas ekzekutimit të programit të dhënë në ekran, do të shtypet vektori me vlerat e radhitura brenda tij, kështu: A=[ -7 5 -4 3 ] meqë është kërkuar radhitja në bazë të vlerave absolute. Detyra Të radhiten sipas madhësisë anëtarët e vektorit të dhënë G(m): a. prej më të madhit kah më i vogli; b. si vlera absolute, prej më të voglit kah më i madhi.
  • 135. 134 Algoritmet Matricat Gjatë punës me matrica, për t'i shfrytëzuar anëtarët e vendosur në fushat e veçanta të tyre, përdoren indekset e rreshtave dhe të kolonave përkatëse. Përcaktimi i matricave Vlerat e anëtarëve të matricave kompjuterit mund t'i jepen si vlera të gatshme hyrëse, ose duke i llogaritur ato në bazë të procedurës së dhënë. Shembull Formimi i matricës A(m,n), duke i llogaritur anëtarët aij të saj kështu: ⎧ 2i + 3j për i < j ⎪ aij = ⎨i + j për i = j ⎪ 3i − j2 për i > j ⎩ nëse dihen dimensionet e matricës.
  • 136. Fushat numerike 135 a. Bllok-diagrami Fillimi m,n i=1 j=1 < > i < j >- = aij=2i+3j aij=i+j aij=3i-j2 j=j+1 Po j ≤ n Jo i=i+1 Po i ≤ m Jo ⎛ a ,i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ Fundi Fig.6.44 b. Rruga - për m=2, n=3
  • 137. 136 Algoritmet Fig.6.45 c. Programi // Programi Prg6_44 #include <iostream> using namespace std; int main() { int const m=2,n=3; int i,j,A[m][n]; for (i=0;i<m;i++) for (j=0;j<n;j++) if (i<j)
  • 138. Fushat numerike 137 A[i][j]=2*i+3*j; else if (i==j) A[i][j]=i+j; else A[i][j]=3*i-j*j; cout << "Matrica e formuar" << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) cout << A[i][j] << " "; cout << "n"; } return 0; } Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është: Matrica e formuar 0 3 6 3 2 8 Ligjshmëritë për llogaritjen e anëtarëve të matricave, përkatësisht për formimin e tyre, mund të jenë të ndryshme. Shembull Formimi i matricës R(m,n), duke llogaritur anëtarët e saj kështu: ⎧ i + j+ 1 ⎪3 ∑ (k + 2i − 3j) për i < j ⎪ rij = ⎨ k =1 ⎪ ⎪ (i + j)! ⎩ për i ≥ j a. Bllok-diagrami
  • 139. 138 Algoritmet Fillimi i+j+1 m,n s= ∑(k + 2i − 3j) k =1 i=1 j=1 Po Jo F=(i+j)! i < j s=0 F=1 k=1 k=1 s=s+(k+2i-3j) F=F⋅k k=k+1 k=k+1 Po Po k ≤ i+j+1 k ≤ i+j Jo Jo rij=3s rij=F j=j+1 j ≤ n i=i+1 i ≤ n ⎛ r ,i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ Fundi Fig.6.46
  • 140. Fushat numerike 139 Këtu, nuk është vizatuar edhe rruga që kalohet në bllok-diagram për vlera të caktuara të dimensioneve të matricës m dhe n, meqë numri i tyre është i madhë, gjë që do të praktikohet edhe në shumicën e shembujve të pjesës vijuese të librit. b. Programi // Programi Prg6_46 #include <iostream> using namespace std; int main() { int const m=2,n=3; int i,j,k,s,f,R[m][n]; for (i=0;i<m;i++) for (j=0;j<n;j++) if (i<j) { s=0; for (k=1;k<=(i+j+1);k++) s=s+(k+2*i-3*j); R[i][j]=3*s; } else { f=1; for (k=1;k<=(i+j);k++) f=f*k; R[i][j]=f; } cout << "Matrica e formuar" << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(5); cout << R[i][j]; } cout << "n"; } return 0; }
  • 141. 140 Algoritmet Nëse ekzekutohet programi i dhënë për matricën me dimensione m=2 dhe n=3, rezultati që shtypet në ekran është: Matrica e formuar 1 -9 -36 1 2 -18 Detyra Të formohet matrica katrore G(m,m), duke përcaktuar elementet e saj kështu: a. j=1 2 3 ... m i=1 1 5 5 ... 5 2 -3 1 5 ... 5 G = 3 -3 -3 1 ... 5 ... ... ... ... ... ... m -3 -3 -3 ... 1 b. j=1 2 3 ... m i=1 0 2 3 ... m 2 2 0 3 ... m G = 3 2 2 0 ... m ... ... ... ... ... ... m 2 2 2 ... 0 Matricat mund të formohen edhe duke shfrytëzuar vlerat e anëtarëve të vektorëve të dhënë.
  • 142. Fushat numerike 141 Shembull Formimi i matricës katrore A(m,m), duke shfrytëzuar anëtarët e vektorit të dhënë D(m), kështu: j=1 2 3 ... m i=1 d1 d1 +2 d1 +3 ... d1 +m 2 d2 +8 d2 d2 +3 ... d2 +m A = 3 d3 +8 d3 +8 d3 ... d3 +m ... ... ... ... ... ... m dm +8 dm +8 dm +8 ... dm a. Bllok-diagrami Fillimi m,(di,i=1,m) i=1 j=1 < > i < j - > = aij=di+j aij=di aij=di+8 j=j+1 Po j ≤ m Jo i=i+1 Po i ≤ m Jo ⎛ a ,i=1,m ⎞ ⎜ ij j=1,m ⎟ ⎝ ⎠ Fundi Fig.6.47
  • 143. 142 Algoritmet Siç shihet edhe nga bllok-diagrami, për i<j duhet të mbushen anëtarët mbi diagonalen kryesore, kurse kur është i>j kemi të bëjmë me anëtarët nën diagonalen kryesore. b. Programi // Programi Prg6_47 #include <iostream> using namespace std; int main() { int const m=5; int D[m]={3,-7,4,9,-2}; int i,j,A[m][m]; for (i=0;i<m;i++) for (j=0;j<m;j++) if (i<j) A[i][j]=D[i]+j; else if (i==j) A[i][j]=D[i]; else A[i][j]=D[i]+8; cout << "Matrica e formuar" << "n"; for (i=0;i<m;i++) { for (j=0;j<m;j++) { cout.width(5); cout << A[i][j]; } cout << "n"; } return 0; } Rezultati që shtypet në ekran pas ekzekutimit të programit të dhënë është: Matrica e formuar 3 4 5 6 7 1 -7 -5 -4 -3 12 12 4 7 8 17 17 17 9 13 6 6 6 6 -2 Me vlerat e anëtarëve të vektorit, përveç diagonales kryesore që u tregua në shembullin e mësipërm, mund të mbushet edhe një rresht, ose një kolonë e caktuar e matricës.
  • 144. Fushat numerike 143 Shembull Formimi i matricës G(m,m), duke i shfrytzëzuar edhe anëtarët e vektorit B(m): j=1 2 3 ... m i=1 b1 1 1 ... 1 2 b2 2 2 ... 2 G = 3 b3 3 3 ... 3 ... ... ... ... ... ... m bm m m ... m a. Bllok-diagrami Fillimi m,(bi,i=1,m) i=1 j=1 Po Jo j=1 gij=bj gij=i j=j+1 Po j ≤ m Jo i=i+1 Po i ≤ m Jo ⎛ g ,i=1,m ⎞ ⎜ ij j=1,m ⎟ ⎝ ⎠ Fundi Fig.6.48
  • 145. 144 Algoritmet b. Programi // Programi Prg6_48 #include <iostream> using namespace std; int main() { int const m=5; int B[m]={9,2,-4,6,-5}; int i,j,G[m][m]; for (i=0;i<m;i++) for (j=0;j<m;j++) if (j==0) G[i][j]=B[i]; else G[i][j]=i; cout << "Matrica e formuar" << "n"; for (i=0;i<m;i++) { for (j=0;j<m;j++) { cout.width(5); cout << G[i][j]; } cout << "n"; } return 0; } Nëse programi i dhënë ekzekutohet, si rezultat në ekran do të fitohet: Matrica e formuar 9 0 0 0 0 2 1 1 1 1 -4 2 2 2 2 6 3 3 3 3 -5 4 4 4 4
  • 146. Fushat numerike 145 Detyra Të formohet matrica katrore A(m,m), nëse anëtarët e vektorit të dhënë R(m) brenda matricës vendosen kështu: a. b. a. b. j=1 2 ... n j=1 2 ... n i=1 R i=1 2 2 -5 R A = ... 3 A = ... m m kurse pjesët e tjera të matricës mbushen me numrat e dhënë. Formimi i matricave mund të mbështetet edhe në shfrytëzimin e anëtarëve të matricave të tjera. Shembull Formimi i matricës Z, duke shfrytëzuar anëtarët e matricës A(m,m), kështu: j=1 2 ... m m+1 i=1 2 A 4 Z = ... m m+1 9 0
  • 147. 146 Algoritmet a. Bllok-diagrami Fillimi i=1,m m,⎛ aij,j=1,m ⎞ ⎜ ⎟ ⎝ ⎠ i=1 j=1 zij=aij j=j+1 Po j ≤ m Jo zi,m+1=4 i=i+1 Po i ≤ m Jo j=1 zm+1,j=9 j=j+1 Po j ≤ m Jo zm+1,m+1=0 ⎛ z ,i=1,m +1⎞ ⎜ ij j=1,m +1 ⎟ ⎝ ⎠ Fundi Fig.6.49
  • 148. Fushat numerike 147 b. Programi // Programi Prg6_49 #include <iostream> using namespace std; int main() { int const m=4; int A[m][m]={ {3,5,-4,2}, {6,9,-2,8}, {1,-3,7,4}, {2,0,-5,3} }; int i,j,Z[m+1][m+1]; for (i=0;i<m;i++) { for (j=0;j<m;j++) Z[i][j]=A[i][j]; Z[i][m]=4; } for (j=0;j<m;j++) Z[m][j]=9; Z[m][m]=0; cout << "Matrica e formuar" << "n"; for (i=0;i<=m;i++) { for (j=0;j<=m;j++) { cout.width(5); cout << Z[i][j]; } cout << "n"; } return 0; } Pas ekzekutimit të programit, rezultati që shtypet në ekran është: Matrica e formuar 3 5 -4 2 4 6 9 -2 8 4 1 -3 7 4 4 2 0 -5 3 4 9 9 9 9 0
  • 149. 148 Algoritmet Algoritmi për formimin e matricës Z mund të realizohet edhe ndryshe, duke paraparë mbushjen e të gjitha pjesëve të saj brenda unazave për indekset i dhe j, të cilat ndryshohen mes vlerave 1 dhe m+1, ashtu siç është treguar në vijim. a. Bllok-diagrami Fillimi i=1,m m,⎛ aij,j=1,m ⎞ ⎜ ⎟ ⎝ ⎠ i=1 j=1 Po Jo i=m+1 Po Jo Po Jo j=m+1 j=m+1 zij=0 zij=9 zij=4 zij=aij j=j+1 Po j≤ m+1 Jo i=i+1 Po i≤ m+1 Jo ⎛ z ,i=1,m +1 ⎞ ⎜ ij j=1,m +1 ⎟ ⎝ ⎠ Fundi Fig.6.50
  • 150. Fushat numerike 149 b. Programi // Programi Prg6_50 #include <iostream> using namespace std; int main() { int const m=4; int A[m][m]={ {3,5,-4,2}, {6,9,-2,8}, {1,-3,7,4}, {2,0,-5,3} }; int i,j,Z[m+1][m+1]; for (i=0;i<=m;i++) for (j=0;j<=m;j++) if (i==m) if (j==m) Z[i][j]=0; else Z[i][j]=9; else if (j==m) Z[i][j]=4; else Z[i][j]=A[i][j]; cout << "Matrica e formuar" << "n"; for (i=0;i<=m;i++) { for (j=0;j<=m;j++) { cout.width(5); cout << Z[i][j]; } cout << "n"; } return 0; } Detyra Duke shfrytëzuar anëtarët e matricës X(m,m), të formohet matrica R, kështu: a. b. 0 X R = 1 X 2 R = 5 -9
  • 151. 150 Algoritmet Gjatë formimit të matricave, pjesë të caktuara të tyre mund të mbushen edhe me vlerat e matricave të njohura, p.sh., siç është matrica njësi, ose matrica zero etj. Shembull Formimi i matricës T, kështu: j=1 ... n i=1 . E : T = n n+1 . 0 : 2n ku E(n,n) është matrica njësi, kurse O(n,n) është matrica zero.
  • 152. Fushat numerike 151 a. Bllok-diagrami Fillimi n i=1 j=1 Po Jo i ≤ n Jo Po i=j tij=0 tij=1 tij=0 j=j+1 Po j ≤ n Jo i=i+1 Po i ≤ 2n Jo ⎛ t ,i=1,2n ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ Fundi Fig.6.51 b. Programi // Programi Prg6_51 #include <iostream> using namespace std; int main() { int const n=5; int i,j,T[2*n][n];
  • 153. 152 Algoritmet for (i=0;i<(2*n);i++) for (j=0;j<n;j++) if (i<n) if (i==j) T[i][j]=1; else T[i][j]=0; else T[i][j]=0; cout << "Matrica e formuar" << "n"; for (i=0;i<(2*n);i++) { for (j=0;j<n;j++) { cout.width(3); cout << T[i][j]; } cout << "n"; } return 0; } Rezultati që shtypet në ekran pas ekzekutimit të programit të dhënë është: Matrica e formuar 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 154. Fushat numerike 153 Detyra Të formohet matrica R, kështu: a. j=1 ... m m+1 ... 2m i=1 2 R = . E 0 : m b. j=1 ... m+1 i=1 2 R = . 5 E : m ku E(m,m) është matrica njësi, kurse O(m,m) është matrica zero. Matricat mund të formohen edhe duke shfrytëzuar njëkohësisht më shum matrica, me vlera të çfarëdoshme. Shembull Formimi i matricës D nga anëtarët e matricave A(m,m) dhe B(m,m), kështu: j=1 ... m m+1 ... 2m i=1 2 D = . A B : m
  • 155. 154 Algoritmet a. Bllok-diagrami Fillimi i=1,m ⎞ ⎛ i=1,m ⎞ m,⎛ aij, ⎜ ⎟,⎜ b , ⎟ ⎝ j=1,m ⎠ ⎝ ij j=1,m ⎠ i=1 j=1 Po Jo j≤ m dij=aij dij=bi,j-m j=j+1 Po j ≤ 2m Jo i=i+1 Po i≤ m Jo ⎛ d ,i=1,m ⎞ ⎜ ij j=1,2m ⎟ ⎝ ⎠ Fundi Fig.6.52 b. Programi // Programi Prg6_52 #include <iostream> using namespace std; int main() { int const m=3; int A[m][m]={ {4,7,3}, {-2,3,9},
  • 156. Fushat numerike 155 {8,-4,2} }; int B[m][m]={ {-2,9,1}, {4,8,3}, {6,1,7} }; int i,j,D[m][2*m]; for (i=0;i<m;i++) for (j=0;j<(2*m);j++) if (j<m) D[i][j]=A[i][j]; else D[i][j]=B[i][j-m]; cout << "Matrica e formuar" << "n"; for (i=0;i<m;i++) { for (j=0;j<(2*m);j++) { cout.width(4); cout << D[i][j]; } cout << "n"; } return 0; } Pas ekzekutimit të programit të dhënë, rezultati që shtypet në ekran është: Matrica e formuar 4 7 3 -2 9 1 -2 3 9 4 8 3 8 -4 2 6 1 7
  • 157. 156 Algoritmet Detyra Të formohet matrica G, duke shfrytëzuar anëtarët e matricave A(m,n) dhe B(m,n), kështu: a. b. A A B G = G = 3 -6 B Kur në formimin e matricës përdoren më shum matrica, mbushja e saj në bllok-diagram mund të realizohet duke shfrytëzuar pjesë të veçanta për çdo matricë, ose përmes një tërësie të përbërë për të gjitha matricat. Shembull Formimi i matricës R, duke shfrytëzuar anëtarët e matricave F(m,n) dhe G(l,k), kështu: j=1 ... n n+1 ... n+k i=1 . F 0 : R = m m+1 . 0 G : m+l ku me 0 është shënuar matrica zero.
  • 158. Fushat numerike 157 a. Bllok-diagrami Fillimi m,n,l,k ⎛ f ,i=1,m ⎞,⎛ g ,i=1,l ⎞ ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟ ⎝ ⎠⎝ ⎠ i=1 j=1 Po Jo i≤ m Po Jo Po Jo j≤ n j≤ n rij=fij rij=0 rij=0 rij=gi-m,j-n j=j+1 Po j≤ n+k Jo i=i+1 Po i≤ m+l Jo ⎛ r ,i=1,m +l ⎞ ⎜ ij j=1,n+k ⎟ ⎝ ⎠ Fundi Fig.6.53 b. Programi // Programi Prg6_53 #include <iostream> using namespace std; int main()
  • 159. 158 Algoritmet { int const m=3,n=4,l=4,k=3; int F[m][n]={ {4,7,3,5}, {-2,3,9,2}, {8,-4,2,7} }; int G[l][k]={ {-2,9,1}, {4,8,3}, {6,1,7}, {-9,4,2} }; int i,j,R[m+l][n+k]; for (i=0;i<m+l;i++) for (j=0;j<n+k;j++) if (i<m) if (j<n) R[i][j]=F[i][j]; else R[i][j]=0; else if (j<n) R[i][j]=0; else R[i][j]=G[i-m][j-n]; cout << "Matrica e formuar" << "n"; for (i=0;i<m+l;i++) { for (j=0;j<n+k;j++) { cout.width(4); cout << R[i][j]; } cout << "n"; } return 0; } Rezultati që do të shtypet në ekran, nëse ekzekutohet programi i dhënë, është: Matrica e formuar 4 7 3 5 0 0 0 -2 3 9 2 0 0 0 8 -4 2 7 0 0 0 0 0 0 0 -2 9 1
  • 160. Fushat numerike 159 0 0 0 0 4 8 3 0 0 0 0 6 1 7 0 0 0 0 -9 4 2 Këtu, siç u theksua edhe më sipër, mund të zbatohet procedura e mbushjes parciale të matricës. Kështu, nëse, p.sh., mbushet së pari pjesa e majtë e matricës dhe pastaj pjesa e djathtë e saj, algoritmi përkatës do të duket si në vijim. a. Bllok-diagrami Fillimi m,n,l,k ⎛ f ,i=1,m ⎞,⎛ g ,i=1,l ⎞ ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟ ⎝ ⎠⎝ ⎠ i=1 j=1 Po Jo i≤ m rij=fij rij=0 j=j+1 Po j≤ n Jo i=i+1 Po i≤ m+l Jo A
  • 161. 160 Algoritmet A i=1 j=n+1 Po Jo i≤ m rij=0 rij=gi-m,j-n j=j+1 Po j≤ n+k Jo i=i+1 Po i≤ m+l Jo ⎛ r ,i=1,m +l ⎞ ⎜ ij j=1,n+k ⎟ ⎝ ⎠ Fundi Fig.6.54 b. Programi Pjesa e programit për mbushjen e matricës me vlera, e cila ndryshon nga programi që u dha më sipër, duket si në vijim. // Programi Prg6_54 ....................................... for (i=0;i<m+l;i++) for (j=0;j<n;j++) if (i<m) R[i][j]=F[i][j]; else R[i][j]=0; for (i=0;i<m+l;i++)
  • 162. Fushat numerike 161 for (j=n;j<n+k;j++) if (i<m) R[i][j]=0; else R[i][j]=G[i-m][j-n]; ............................................. Nëse matricat që përdoren për mbushje kanë vlera të caktuara, gjatë vendosjes së vlerave në matricë duhet pasur kujdes në indekset e anëtarëve të cilët shfrytëzohen për mbushje. Shembull Formimi i matricës F, duke shfrytëzuar anëtarët e matricave A(m,n), B(m,k), C(l,n) dhe D(l,k), kështu: j=1 ... n n+1 ... n+k i=1 . . A B . F = m m+1 . . C D . m+l
  • 163. 162 Algoritmet a. Bllok-diagrami Fillimi m,n,l,k ⎛ a ,i=1,m ⎞,⎛ b ,i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟ ⎝ ⎠⎝ ⎠ ⎛ c ,i=1,l ⎞,⎛ d ,i=1,l ⎞ ⎜ ij j=1,n ⎟ ⎜ ij j=1,k ⎟ ⎝ ⎠⎝ ⎠ i=1 j=1 Po Jo i≤ m Po Jo Po Jo j≤ n j≤ n fij=aij fij=bi,j-n fij=ci-m,j fij=di-m,j-n j=j+1 Po j≤ n+k Jo i=i+1 Po i≤ m+l Jo ⎛ f ,i=1,m +l ⎞ ⎜ ij j=1,n+ k ⎟ ⎝ ⎠ Fundi Fig.6.55
  • 164. Fushat numerike 163 b. Programi // Programi Prg6_55 #include <iostream> using namespace std; int main() { int const m=3,n=2,l=2,k=3; int A[m][n]={ {4,7}, {-2,5}, {8,3}}; int B[m][k]={ {-1,9,6}, {2,3,8}, {4,1,5} }; int C[l][n]={ {1,2}, {3,4} }; int D[l][k]={ {5,4,3}, {2,1,0} }; int i,j,F[m+l][n+k]; for (i=0;i<m+l;i++) for (j=0;j<n+k;j++) if (i<m) if (j<n) F[i][j]=A[i][j]; else F[i][j]=B[i][j-n]; else if (j<n) F[i][j]=C[i-m][j]; else F[i][j]=D[i-m][j-n]; cout << "Matrica e formuar" << "n"; for (i=0;i<m+l;i++) { for (j=0;j<n+k;j++) { cout.width(4); cout << F[i][j]; } cout << "n"; }
  • 165. 164 Algoritmet return 0; } Pas ekzekutimit të programit, matrica F e shtypur në ekran duket kështu: Matrica e formuar 4 7 -1 9 6 -2 5 2 3 8 8 3 4 1 5 1 2 5 4 3 3 4 2 1 0 Detyra Të formohet matrica F, duke shfrytëzuar anëtarët e matricave A(m,n) dhe B(k,l), si dhe matricën njësi E dhe matricën zero 0, ashtu siç është treguar më poshtë. a. E A F= B 0 b. 0 E F= A 0 c. E 0 F= 0 E d. A E F= B 0
  • 167. Fushat numerike 165 Operacionet aritmetikore Mbi anëtarët e matricave mund të zbatohen operacionet elementare aritmetikore. Mbledhja dhe zbritja Mblidhen vetëm matricat të cilat kanë dimensione të barabarta. Operacioni i mbledhjes kryhet duke i mbledhur anëtarët në pozicionet e njëjta të dy matricave, përkatësisht anëtarët me indekse të njëjtë. Shembull Gejtja e shumës C(m,n) të matricave A(m,n) dhe B(m,n). a11 a12 ... a1n b11 b12 ... b1n a21 a22 ... a2n b21 b22 ... b2n C = A+B = + = ... ... ... ... ... ... ... ... am1 am2 ... amn bm1 bm2 ... bmn a11 +b11 a12 +b12 ... a1n +b1n a21 +b21 a22 +b22 ... a2n +b2n = ... ... ... ... am1 +bm1 am2 +bm2 ... amn +bmn c11 =a11 +b11 c12 =a12 +b12 ......... cij =aij +bij ......... cmn =amn +bmn
  • 168. 166 Algoritmet a. Bllok-diagrami Fillimi i=1,m i=1,m m,n,⎛ aij,j=1,n ⎞,⎛ bij,j=1,n ⎞ ⎜ ⎟⎜ ⎟ ⎝ ⎠⎝ ⎠ i=1 j=1 cij=aij+bij j=j+1 Po j ≤ n Jo i=i+1 Po i ≤ m Jo ⎛ c ,i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ Fundi Fig.6.56 c. Programi // Programi Prg6_56 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {4,7,8,-6,9}, {1,-2,5,4,6}, {8,3,2,-1,0}, {-3,5,8,4,1} }; int B[m][n]={ {-1,6,9,6,4},
  • 169. Fushat numerike 167 {2,3,7,4,-8}, {4,3,2,-1,5}, {9,-2,6,4,1} }; int i,j,C[m][n]; for (i=0;i<m;i++) for (j=0;j<n;j++) C[i][j]=A[i][j]+B[i][j]; cout << "Matrica e formuar" << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(4); cout << C[i][j]; } cout << "n"; } return 0; } Duke pasur parasysh vlerat hyrëse për matricat A dhe B, të cilat kompjuterit i janë dhënë si konstante, rezultati që shtypet në ekran pas ekzekutimit të programit është: Matrica e formuar 3 13 17 0 13 3 1 12 8 -2 12 6 4 -2 5 6 3 14 8 2 Operacioni i zbritjes kryhet plotësisht njëlloj si edhe mbledhja, që do të thotë se shfrytëzohet algoritmi, përkatësisht programi i njëjtë. Shumëzimi Matrica shumëzohet me vektorë nëse numri i kolonave të matricës është i barabartë me numrin e anëtarëve të vektorit. Rezultati që fitohet pas shumëzimit të matricës me vektorë është vektor, i cili do të ketë aq anëtarë sa ka rreshta matrica.
  • 170. 168 Algoritmet Shembull Prodhimi T(m) i matricës A(m,n) me vektorin B(n). a11 a12 ... a1n b1 a21 a22 ... a2n b2 T = A⋅B = ⋅ = ... ... ... ... ... am1 am2 ... amn bn a11 ⋅b1 +a12 ⋅b2 +...+a1n ⋅bn a21 ⋅b1 +a22 ⋅b2 +...+a2n ⋅bn = ... am1 ⋅b1 +am2 ⋅b2 +...+amn ⋅bn t1 =a11 ⋅b1 +a12 ⋅b2 +...+a1n ⋅bn t2 =a21 ⋅b1 +a22 ⋅b2 +...+a2n ⋅bn ...................... n ti =ai1 ⋅b1 +ai2 ⋅b2 +...+ain ⋅bn = ∑ a ij ⋅ b j j=1 ...................... tm =am1 ⋅b1 +am2 ⋅b2 +...+amn ⋅bn
  • 171. Fushat numerike 169 a. Bllok-diagrami Fillimi m,n ⎛ a ,i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ (bi,i=1,n) i=1 s=0 j=1 s=s+aij⋅bj j=j+1 Po j≤ n Jo ti=s i=i+1 Po i≤ m Jo (ti,i=1,m) Fundi Fig.6.57 b. Programi
  • 172. 170 Algoritmet // Programi Prg6_57 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,5,8,-1,4}, {7,-4,9,2,1}, {6,2,1,5,-7}, {2,4,6,-8,3} }; int B[n]={-1,6,9,6,4}; int i,j,s,T[m]; for (i=0;i<m;i++) { s=0; for (j=0;j<n;j++) s=s+A[i][j]*B[j]; T[i]=s; } cout << "Vektori i prodhimit" << "n"; cout << "T=[ "; for (i=0;i<m;i++) cout << T[i] << " "; cout << "]" << "n"; return 0; } Pas ekzekutimit të programit të dhënë, rezultati i prodhimit në ekran shtypet kështu: Vektori i prodhimit T=[ 109 66 17 40 ] Detyra Të gjendet: a. matrica Y(m,n) si prodhim i matricës X(m,n) me konstanten k; b. vektori F(n) si prodhim i vektorit A(m) me matricën B(m,n).
  • 173. Fushat numerike 171 Dy matrica shumëzohen, nëse numri i kolonave të matricës së parë është i barabartë me numrin e rreshtave të matricës së dytë. Shumëzimi i dy matricave e jep si rezultat matricën tek e cila ruhet numri i rreshtave të matricës së parë dhe numri i kolonave të matricës së dytë. Shembull Gjetja e matricës C(m,n) si prodhim i matricës A(m,k) me matricën B(k,n). a11 a12 ... a1k b11 b12 ... b1n a21 a22 ... a2k b21 b22 ... b2n C = A⋅B = ⋅ ... ... ... ... ... ... ... ... am1 am2 ... amk bk1 bk2 ... bkn c11 =a11 ⋅b11 +a12 ⋅b21 +...+a1k ⋅bk1 c12 =a11 ⋅b12 +a12 ⋅b22 +...+a1k ⋅bk2 ........................ k c1k =a11 ⋅b1n +a12 ⋅b2n +...+a1k ⋅bkn = ∑ ail ⋅ b l=1 lj ........................ cij =ai1 ⋅b1j +ai2 ⋅b2j +...+aik ⋅bkj ........................ cmn =am1 ⋅b1n +am2 ⋅b2n +...+amk ⋅bkn
  • 174. 172 Algoritmet a. Bllok-diagrami Fillimi m,n,k ⎛ a ,i=1,m ⎞,⎛ b ,i=1,k ⎞ ⎜ ij j=1,k ⎟ ⎜ ij j=1,n ⎟ ⎝ ⎠⎝ ⎠ i=1 j=1 s=0 l=1 s=s+ail⋅blj l=l+1 Po l≤ k Jo cij=s j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo ⎛c , i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ Fundi Fig.6.58 b. Programi
  • 175. Fushat numerike 173 // Programi Prg6_58 #include <iostream> using namespace std; int main() { int const m=4,n=5,k=3; int A[m][k]={ {3,5,8}, {7,-4,9}, {6,2,1}, {2,4,6} }; int B[k][n]={ {-1,6,9,6,4}, {2,6,8,4,-3}, {5,3,-2,5,9} }; int i,j,l,s,C[m][n]; for (i=0;i<m;i++) for (j=0;j<n;j++) { s=0; for (l=0;l<k;l++) s=s+A[i][l]*B[l][j]; C[i][j]=s; } cout << "Matrica e prodhimit C" << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(5); cout << C[i][j]; } cout << "n"; } return 0; } Rezultati që fitohet në ekran pas ekzekutimit të programit të dhënë është: Matrica e prodhimit C 47 72 51 78 69 30 45 13 71 121 3 51 69 49 27 36 54 38 58 50
  • 176. 174 Algoritmet Ekuacionet matricore Duke u mbështetur në rregullat e ekzekutimit të operacioneve elementare aritmetikore të dhëna më sipër, mund të formohen ekuacione matricore. Shembull Llogaritja e anëtarëve të matricës R(m,k), nga matricat X(m,k), Y(k,n) dhe Z(m,n), përmes ekuacionit matricor: R=X⋅Y-Z Nga shprehja e ekuacionit të dhënë shihet se së pari duhet llogaritur anëtarët e prodhimit X⋅Y dhe pastaj, përmes zbritjes përkatëse, gjendet rezultati R i ekuacionit matricor.
  • 177. Fushat numerike 175 a. Bllok-diagrami Fillimi m,n,k ⎛ x ,i=1,m ⎞,⎛ y ,i=1,k ⎞,⎛ z ,i=1,m ⎞ ⎜ ij j=1,k ⎟ ⎜ ij j=1,n ⎟ ⎜ ij j=1,n ⎟ ⎝ ⎠⎝ ⎠⎝ ⎠ i=1 j=1 s=0 l=1 k s=s+ail⋅blj s= ∑ a il ⋅ b lj l =1 l=l+1 Po l≤ k Jo rij=s-zij j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo ⎛ z ,i=1,m ⎞ ⎜ ij j=1,n ⎟ ⎝ ⎠ Fundi Fig.6.59
  • 178. 176 Algoritmet b. Programi // Programi Prg6_59 #include <iostream> using namespace std; int main() { int const m=4,n=5,k=3; int i,j,l,s,R[m][n]; int X[m][k]={ {3,5,8}, {7,-4,9}, {6,2,1}, {2,4,6}}; int Y[k][n]={ {-1,6,9,6,4}, {2,6,8,4,-3}, {5,3,-2,5,9}}; int Z[m][n]={ {3,4,6,2,-1}, {9,1,3,-5,2}, {7,-2,1,4,8}, {-2,5,3,1,4}}; for (i=0;i<m;i++) for (j=0;j<n;j++) { s=0; for (l=0;l<k;l++) s=s+X[i][l]*Y[l][j]; R[i][j]=s-Z[i][j]; } cout << "Matrica e rezultatit R" << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(4); cout << R[i][j]; } cout << "n"; } return 0; } Zgjidhja e ekuacionit do të shtypet në ekran si matricë: Matrica e rezultatit R 44 68 45 76 70 21 44 10 76 119 -4 53 67 45 19 38 49 35 57 46
  • 179. Fushat numerike 177 Anëtarët në vektor Duke shfrytëzuar anëtarët e matricave, mund të formohen vektorë të ndryshëm. P.sh., me qëllim të sortimit sipas madhësisë të anëtarëve të matricës së dhënë, vlerat e tyre mund të vendosen në vektorë, p.sh., duke shkuar sipas rreshtave të matricës. Pastaj, sortimi i vlerave të anëtarëve të vektorit bëhet ashtu siç u tregua më parë. Shembull Vendosja e anëtarëve të matricës A(m,n) në vektorin Z(m⋅n). a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ k=0 i=1 j=1 k=k+1 zk=aij j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo (zi,i=1,k) Fundi Fig.6.60
  • 180. 178 Algoritmet Këtu, numëratori k shfrytëzohet për përcaktimin e indeksit të pozitës në vektor të anëtarëve të veçantë të matricës. b. Programi // Programi Prg6_60 #include <iostream> using namespace std; int main() { int const m=4,n=3; int A[m][n]={ {3,-4,6}, {-9,1,2}, {7,-8,1}, {-2,5,-3} }; int i,j,k,Z[m*n]; k=-1; for (i=0;i<m;i++) for (j=0;j<n;j++) { k=k+1; Z[k]=A[i][j]; } cout << "Z=["; for (i=0;i<=k;i++) { cout.width(3); cout << Z[i]; } cout << " ]n"; return 0; } Vektori që shtypet në ekran pas ekzekutimit të programit të dhënë është: Z=[ 3 -4 6 -9 1 2 7 -8 1 -2 5 -3 ] Mbushja e vektorit mund të bëhet vetëm me anëtarë të matricës që kanë vlera të caktuara. Shembull Mbushja e vektorit Z me anëtarët e matricës A(m,n) që kanë vlera negative.
  • 181. Fushat numerike 179 Për caktimin e pozitave të anëtarëve që marrin pjesë në formimin e vektorit duhet të shfrytëzohet një numërator, p.sh. k, i cili në këtë rast rritet për 1 sa herë që gjendet anëtar me vlerë numerike negative. Vlera përfundimtare e numëratorit, vetëm nëse të gjithë anëtarët e matricës janë numra negativë, do të jetë e barabartë me numrin e anëtarëve të matricës. a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ k=0 i=1 j=1 Jo aij < 0 Po k=k+1 zk=aij j=j+1 Po j≤n Jo i=i+1 Po i≤m Jo (zi,i=1,k) Fundi Fig.6.61 b. Programi
  • 182. 180 Algoritmet // Programi Prg6_61 #include <iostream> using namespace std; int main() { int const m=4,n=3; int A[m][n]={ {3,-4,6}, {-9,1,2}, {7,-8,1}, {-2,5,-3} }; int i,j,k,Z[m*n]; k=-1; for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j]<0) { k=k+1; Z[k]=A[i][j]; } cout << "Z=["; for (i=0;i<=k;i++) { cout.width(3); cout << Z[i]; } cout << " ]n"; return 0; } Rezultati që shtypet në ekran pas ekzekutimit të programit, për shembullin e vlerave të matricës A, do të duket kështu: Z=[ -4 -9 -8 -2 -3 ] Me vlerat e ndyshme të matricave mund të mbushen njëkohësisht disa vektorë. Shembull Mbushja e vektorëve F dhe G me anëtarë pozitivë dhe negativë të matricës A(m,n).
  • 183. Fushat numerike 181 Këtu, për secilin vektor duhet të shfrytëzohet një numërator i veçantë i anëtarëve të matricës të cilët janë vendosur në vektorin përkatës. a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ x=0 y=0 i=1 j=1 Po Jo aij < 0 x=x+1 y=y+1 fx=aij gy=aij j=j+1 Po j ≤ n Jo i=i+1 Po i ≤ m Jo (fi,i=1,x) (gi,i=1,y) Fundi Fig.6.62 b. Programi
  • 184. 182 Algoritmet // Programi Prg6_62 #include <iostream> using namespace std; int main() { int const m=4,n=3; int i,j,x,y,F[m*n],G[m*n]; int A[m][n]={ {3,-4,6}, {-9,1,2}, {7,-8,1}, {-2,5,-3}}; x=-1;y=-1; for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j]<0) { x=x+1; F[x]=A[i][j]; } else { y=y+1; G[y]=A[i][j]; } cout << "F=["; for (i=0;i<=x;i++) { cout.width(3); cout << F[i]; } cout << " ]n"; cout << "G=["; for (i=0;i<=y;i++) { cout.width(3); cout << G[i]; } cout << " ]n"; return 0; } Vektorët të cilët shtypen në ekran pas ekzekutimit të programit të dhënë duken kështu: Z=[ -4 -9 -8 -2 -3 ] G=[ 3 6 1 2 7 1 5 ] Vlerat e anëtarëve të matricave mund të vendosen në vektor edhe të ndryshuar në bazë të një ligjshmërie të caktuar. Shembull Mbushja e vektorit F me katrorët e anëtarëve pozitivë të
  • 185. Fushat numerike 183 matricës A(m,n), por të cilët janë më të vegjël se numri pozitiv x. a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, x, ⎜ a ij, ⎝ j= 1,n ⎟⎠ k=0 i=1 j=1 Jo aij > 0 Po Jo aij < x Po k=k+1 fk=aij2 j=j+1 Po j ≤ n Jo i=i+1 Po i ≤ m Jo (fi,i=1,k) Fundi Fig.6.63
  • 186. 184 Algoritmet b. Programi // Programi Prg6_63 #include <iostream> using namespace std; int main() { int const x=6,m=4,n=3; int A[m][n]={ {3,-4,6}, {-9,1,2}, {7,-8,4}, {-2,5,-3} }; int i,j,k,F[m*n]; k=-1; for (i=0;i<m;i++) for (j=0;j<n;j++) if ((A[i][j]>=0) && (A[i][j]<x)) { k=k+1; F[k]=A[i][j]*A[i][j]; } cout << "F=["; for (i=0;i<=k;i++) { cout.width(3); cout << F[i]; } cout << " ]n"; return 0; } Rezultati i programit të dhënë në ekran shtypet kështu: F=[ 9 1 4 16 25 ] Vektorët mund të mbushen edhe duke i shfrytëzuar anëtarët e matricës të cilët gjenden në rreshtat ose në kolonat e caktuara të matricës. Shembull Mbushja e vektorit F me sinuset e anëtarëve pozitivë të matricës A(m,n), por të cilët gjenden në rreshtat çiftë. a. Bllok-diagrami
  • 187. Fushat numerike 185 Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ k=0 i=2 j=1 Jo aij > 0 Po k=k+1 fk=sin(aij) j=j+1 Po j≤n Jo i=i+2 Po i≤m Jo (fi,i=1,k) Fundi Fig.6.64 b. Programi // Programi Prg6_64 #include <iostream> #include <cmath> using namespace std; int main() { int const m=4,n=3; int A[m][n]={ {3,-5,6},
  • 188. 186 Algoritmet {-9,1,2}, {7,-8,4}, {-2,5,-3} }; int i,j,k; double F[m*n]; k=-1; i=1; do { for (j=0;j<n;j++) if (A[i][j]>=0) { k=k+1; F[k]=sin(A[i][j]); } i=i+2; } while (i<=m); cout << "F=["; for (i=0;i<=k;i++) { cout.precision(3); cout.width(7); cout << F[i]; } cout << " ]n"; return 0; } Vektori që formohet përmes programit të dhënë, në ekran do të shtypet kështu: F=[ 0.841 0.909 -0.959 ] ku tre anëtarët e vektorit në fakt janë sinuset e vlerave numerike 1, 2 dhe 5, të anëtarëve pozitivë të matricës A të cilët gjenden në rreshtat çiftë. Veprime të tjera Përveç veprimeve të përmendura më sipër, për pjesë të caktuara të matricës, siç janë rreshtat, kolonat, pjesa mbi, në ose nën diagonalen kryesore të matricës, ose për komplet matricën, mund të gjendet shuma, prodhimi, të numërohen ose të gjenden anëtarë të caktuar etj.
  • 189. Fushat numerike 187 Shuma dhe prodhimi Procedura e llogaritjes së shumës ose e prodhimit të anëtarëve të matricës nuk dallon nga ajo që zbatohet te vektorët, me përjashtim të asaj se këtu operohet me dy indekse. Shembull Llogaritja e shumës së anëtarëve të matricës A(m,n). s = a11 + a12 + ... + a1n + a21 + a22 + ... + a2n + .................. + a m1 + a m2 + ... + a mn m n = ∑ ∑ aij i = 1j= 1 Fillimi a. Bllok-diagrami i = 1,m ⎞ ⎛ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ s=0 i=1 j=1 s=s+aij j=j+1 Po j≤n Jo i=i+1 Po i≤m Jo s Fundi Fig.6.65
  • 190. 188 Algoritmet b. Programi // Programi Prg6_65 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,6,7,2}, {-9,1,2,5,8}, {7,-8,4,3,9}, {6,5,-3,4,8} }; int i,j,s; s=0; for (i=0;i<m;i++) for (j=0;j<n;j++) s=s+A[i][j]; cout << "Shuma s=" << s << "n"; return 0; } Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është: Shuma s=55 dhe numri i fituar e paraqet shumën e të gjithë anëtarëve të matricës. Për matricën e dhënë mund të llogaritet shuma ose prodhimi i pjesëve të caktuara të matricës, gjë që përcaktohet përmes zgjedhjes së indekseve përkatëse. Shembull Llogaritja e shumës s të anëtarëve në rreshtat e matricës A(m,n). a. Bllok-diagrami
  • 191. Fushat numerike 189 Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ i=1 s=0 j=1 aij s=s+aij j=j+1 Po j≤n Jo s i=i+1 Po i≤m Jo Fundi Fig.6.66 b. Programi // Programi Prg6_66 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,6,7,2}, {-9,1,2,5,8}, {7,-8,4,3,9},
  • 192. 190 Algoritmet {6,5,-3,4,8} }; int i,j,s; for (i=0;i<m;i++) { s=0; for (j=0;j<n;j++) { cout.width(4); cout << A[i][j]; s=s+A[i][j]; } cout << " s=" << s << "n"; } return 0; } Nëse ekzekutohet programi i dhënë, për vlerat e matricës së marrë si shembull, rezultati që shtypet në ekran është: 3 -5 6 7 2 s=13 -9 1 2 5 8 s=7 7 -8 4 3 9 s=15 6 5 -3 4 8 s=20 Njëkohësisht mund të llogariten edhe më shumë vlera për pjesë të caktuara të matricës, siç janë, p.sh., anëtarët mbi diagonalë, në diagonalë ose nën diagonalë. Shembull Llogaritja e shumës s të anëtarëve mbi diagonalen kryesore dhe prodhimit p të anëtarëve në diagonalen kryesore të matricës A(m,m). a. Bllok-diagrami
  • 193. Fushat numerike 191 Fillimi ⎛ i = 1,m ⎞ m, ⎜ aij, ⎝ j= 1,m ⎟⎠ s=0 p=1 i=1 j=1 Po i < j Jo Jo i = j Po s=s+aij p=p⋅aij j=j+1 Po j ≤ m Jo i=i+1 Po i ≤ m Jo s,p Fundi Fig.6.67 b. Programi
  • 194. 192 Algoritmet // Programi Prg6_67 #include <iostream> using namespace std; int main() { int const m=5; int A[m][m]={ {4,3,5,-7,1}, {-5,6,4,9,2}, {3,-4,7,6,1}, {8,3,-2,5,9}, {6,4,8,-3,7} }; int i,j,s,p; s=0; p=1; for (i=0;i<m;i++) for (j=0;j<m;j++) if (i<j) s=s+A[i][j]; else if (i==j) p=p*A[i][j]; cout << "Shuma s=" << s << "n" << "Prodhimi p=" << p << "n"; return 0; } Pas ekzekutimit të programit, për vlerat e anëtarëve të matricës, e cila është marrë si shembull, rezultati që shtypet në ekran është: Shuma s=33 Prodhimi p=5880 Numërimi i anëtarëve të caktuar Brenda një matrice mund të numërohen anëtarë të caktuar të matricës, p.sh., anëtarët negativë, pozitivë, më të mëdhenj ose më të vegjël se vlera të dhëna etj. Shembull Numërimi i anëtarëve pozitivë x, negativë y dhe zero z, në matricën e dhënë A(m,n). a. Bllok-diagrami
  • 195. Fushat numerike 193 Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ x=0 y=0 z=0 i=1 j=1 Po aij > 0 Jo Jo aij < 0 Po x=x+1 y=y+1 z=z+1 j=j+1 Po j ≤ n Jo i=i+1 Po i ≤ m Jo x,y,z Fundi Fig.6.68 b. Programi // Programi Prg6_68 #include <iostream>
  • 196. 194 Algoritmet using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,6,7,2}, {-9,1,0,-7,8}, {0,-8,4,3,9}, {6,5,-3,0,8} }; int i,j,x,y,z; x=0;y=0;z=0; for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j]>0) x=x+1; else if (A[i][j]<0) y=y+1; else z=z+1; cout << "Anëtarë pozitivë x=" << x << "n" << "Anëtarë negativë y=" << y << "n" << "Anëtarë zero z=" << z << "n"; return 0; } Për shembullin e matricës së marrë në program, pas ekzekutimit të programit, numrat e kërkuar do të shtypen kështu: Anëtarë pozitivë x=12 Anëtarë negativë y=5 Anëtarë zero z=3 Numërimi i anëtarëve mund të zbatohet edhe në pjesë të veçanta të matricës. Shembull Numërimi i anëtarëve pozitivë x dhe negativë y në rreshtat e veçantë të matricës A(m,n), pa anëtarët me vlerë zero. a. Bllok-diagrami
  • 197. Fushat numerike 195 Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ i=1 x=0 y=0 j=1 Po Jo Po aij > 0 aij < 0 Jo x=x+1 y=y+1 aij j=j+1 Po j≤n Jo x,y i=i+1 Po i≤m Jo Fundi Fig.6.69 b. Programi // Programi Prg6_69 #include <iostream> using namespace std;
  • 198. 196 Algoritmet int main() { int const m=4,n=5; int A[m][n]={ {1,-8,-5,7,2}, {-6,0,-4,3,-8}, {4,-8,0,3,2}, {-1,0,-3,9,0} }; int i,j,x,y; for (i=0;i<m;i++) { x=0; y=0; for (j=0;j<n;j++) { if (A[i][j]>0) x=x+1; else if (A[i][j]<0) y=y+1; cout.width(3); cout << A[i][j]; } cout << " x=" << x << " y=" << y << "n"; } return 0; } Për shembullin e matricës së marrë në program, rezultati që shtypet në ekran është: 1 -8 -5 7 2 x=3 y=2 -6 0 -4 3 -8 x=1 y=3 4 -8 0 3 2 x=3 y=1 -1 0 -3 9 0 x=1 y=2 Anëtarët e caktuar mund të numërohen edhe vetëm në një pjesë të matricës. Shembull Numërimi i anëtarëve nën diagonalen kryesore të matricës A(m,m), të cilët janë më të mëdhenj se 2 dhe më të vegjël se 7.
  • 199. Fushat numerike 197 a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, ⎜ aij, ⎝ j= 1,m ⎟⎠ n=0 i=2 j=1 Jo aij > 2 Po Jo aij < 7 Po n=n+1 j=j+1 Po j ≤ i-1 Jo i=i+1 Po i ≤ m Jo n Fundi Fig.6.70 b. Programi // Programi Prg6_70 #include <iostream> using namespace std;
  • 200. 198 Algoritmet int main() { int const m=5; int A[m][m]={ { 4, 3, 5,-7, 1}, {-5, 6, 4, 9, 2}, { 3, 9, 7, 6, 1}, { 1,-3,-2, 5, 9}, { 6, 5, 8, 4, 7} }; int i,j,n; n=0; for (i=1;i<m;i++) for (j=0;j<=i-1;j++) { if ((A[i][j]>2) && (A[i][j]<7)) n=n+1; } cout << "Numri i kërkuar n=" << n << "n"; return 0; } Pas ekzekutimit të programit, për shembullin e matricës së marrë, rezultati që shtypet në ekran është: Numri i kërkuar n=4 Gjetja e vlerës së caktuar Plotësisht njëlloj si te vektorët, edhe te matricat mund të gjendet anëtari i caktuar, siç është, p.sh., anëtari minimal, ose anëtari maksimal etj. Procedura e gjetjes edhe këtu fillon me përvetësimin e një vlere fillestare të një variable ndihmëse, tek e cila në fund merret edhe rezultati i kërkuar. Si vlerë fillestare rregullisht merret anëtari i parë në matricë, ose kjo vlerë formohet nga ky anëtar i matricës. Shembull Gjetja e vlerës minimale z në matricën A(m,n). a. Bllok-diagrami
  • 201. Fushat numerike 199 Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ z=a11 i=1 j=1 Jo aij < z Po zk=aij j=j+1 Po j≤n Jo i=i+1 Po i≤m Jo z Fundi Fig.6.71 Këtu, për i=1 dhe j=1 do të krahasohet anëtari i parë i matricës me vetveten, gjë që imponohet si krahasim i domosdoshëm, meqë nëse merret i=1 dhe j=2, për vlerat e tjera të variablës i, gjatë krahasimit do të kapërcehen anëtarët e kolonës së parë të matricës. b. Programi
  • 202. 200 Algoritmet // Programi Prg6_71 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,6,7,2}, {-9,1,2,5,8}, {7,-8,4,3,9}, {6,5,-3,4,8} }; int i,j,z; z=A[0][0]; for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j]<z) z=A[i][j]; cout << "Vlera minimale z=" << z << "n"; return 0; } Rezultati që shtypet në ekran pas ekzekutimit të programit është: Vlera minimale z=-9 Në matricë, përveç anëtarit të caktuar, mund të gjendet edhe pozita e tij, përkatësisht indekset përkatëse. Shembull Anëtari më i madh për nga vlera absolute x si dhe pozita e tij, përkatësisht indekset f dhe g, në matricën e dhënë A(m,n).
  • 203. Fushat numerike 201 a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ x=|a11| f=1 g=1 i=1 j=1 Jo |aij| > x Po x=|aij| f=i g=j j=j+1 Po j≤n Jo i=i+1 Po i≤m Jo f,g,x Fundi Fig.6.72 b. Programi
  • 204. 202 Algoritmet // Programi Prg6_72 #include <iostream> #include <cmath> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,8,7,2}, {-4,1,2,5,8}, {7,-9,4,3,2}, {6,5,-3,4,7} }; int i,j,f,g,x; x=abs(A[0][0]); f=1;g=1; for (i=0;i<m;i++) for (j=0;j<n;j++) if (abs(A[i][j])>x) { x=abs(A[i][j]); f=i; g=j; } cout << "Vlera maksimale absolute x: " << x << "n" << "Pozita ............... f,g: " << f << "," << g << "n"; return 0; } Pas ekzekutimit të programit, për shembullin e matricës së marrë në program, rezultati që shtypet në ekran është: Vlera maksimale absolute x: 9 Pozita ............... f,g: 2,1 Anëtari i caktuar mund të gjendet edhe për çdo rresht ose kolonë, si dhe për pjesë të caktuar të matricës. Shembull Anëtari më i madh për çdo rresht të matricës A(m,n).
  • 205. Fushat numerike 203 a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ i=1 x=ai1 j=1 Jo aij > x Po x=aij aij j=j+1 Po j≤n Jo x i=i+1 Po i≤m Jo Fundi Fig.6.73 b. Programi
  • 206. 204 Algoritmet // Programi Prg6_73 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,8,7,2}, {-4,1,2,6,-3}, {7,-9,4,3,2}, {9,5,-3,4,1} }; int i,j,x; for (i=0;i<m;i++) { x=A[i][1]; for (j=0;j<n;j++) { if (A[i][j]>x) x=A[i][j]; cout.width(3); cout << A[i][j]; } cout << " x=" << x << "n"; } return 0; } Pas ekzekutimit të programit, rezultati në ekran duket kështu: 3 -5 8 7 2 x=8 -4 1 2 6 -3 x=6 7 -9 4 3 2 x=7 9 5 -3 4 1 x=9 Vlera e caktuar mund të gjendet edhe vetëm në një pjesë të matricës. Shembull Anëtari më i madh mbi diagonalën kryesore x dhe nën diagonalen kryesore y, të matricës së dhënë A(m,n). a. Bllok-diagrami
  • 207. Fushat numerike 205 Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ x=a12 y=a21 i=1 j=1 Jo i ≠j Po Po Jo i<j Jo Jo aij > x aij > y Po Po x=aij y=aij j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo x,y Fundi Fig.6.74 b. Programi
  • 208. 206 Algoritmet // Programi Prg6_74 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {3,-5,8,7,2}, {-4,1,2,6,-3}, {7,-9,6,3,4}, {9,5,-3,4,1} }; int i,j,x,y; x=A[0][1]; y=A[1][0]; for (i=0;i<m;i++) for (j=0;j<n;j++) if (i!=j) if (i<j) if (A[i][j]>x) x=A[i][j]; else { } else if (A[i][j]>y) y=A[i][j]; else { } cout << "Mbi diagonale x=" << x << "n" << "Nën diagonale y=" << y << "n"; return 0; } Pas ekzekutimit të programit të dhënë, rezultati në ekran shtypet kështu: Mbi diagonale x=8 Nën diagonale y=9
  • 209. Fushat numerike 207 Detyra Në matricën e dhënë A(m,n), të gjendet: a. anëtari me vlerë numerike më të madhe; b. anëtari me vlerë absolute më të vogël si dhe pozita e tij në matricë; c. anëtari më i vogël për çdo kolonë; d. anëtari më i madh në çdo rresht tek; e. anëtari më i vogël për nga vlera absolute në kolonat çiftë të matricës; f. anëtari më i madh për çdo rresht, duke marrë vetëm vlerat të cilat gjenden mbi diagonalen kryesore. Në matricë mund të gjenden edhe vlerat mesatare të anëtarëve të matricës, anëtarëve në rreshtat ose në kolonat e veçanta, anëtarëve mbi, në ose nën diagonalen kryesore etj. Shembull Vlerat mesatare x të rreshtave të veçantë të matricës A(m,n). 1 n x = ∑ aij , për i = 1,2,..., m. n j= 1
  • 210. 208 Algoritmet a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, ⎜ aij, ⎝ j= 1,n ⎟⎠ i=1 s=0 j=1 s=s+aij aij j=j+1 Po j≤ n Jo s x = n x i=i+1 Po i≤ m Jo Fundi Fig.6.75
  • 211. Fushat numerike 209 b. Programi // Programi Prg6_75 #include <iostream> using namespace std; int main() { int const m=4,n=5; int A[m][n]={ {7,3,4,9,5}, {6,1,2,4,8}, {7,6,4,1,2}, {9,5,3,8,7} }; int i,j; double s,x; for (i=0;i<m;i++) { s=0; for (j=0;j<n;j++) { s=s+A[i][j]; cout.width(3); cout << A[i][j]; } x=s/n; cout << " x=" << x << "n"; } return 0; } Rezultati i programit të dhënë, pas ekzekutimit të tij, në ekran do të shtypet kështu: 7 3 4 9 5 x=5.6 6 1 2 4 8 x=4.2 7 6 4 1 2 x=4 9 5 3 8 7 x=6.4
  • 212. 210 Algoritmet Detyra Për matricën A(m,m), të gjendet vlera mesatare: a. e të gjithë anëtarëve; b. e anëtarëve pozitivë; c. e vlerave absolute të anëtarëve negativë; d. e anëtarëve të diagonales kryesore; e. e anëtarëve mbi diagonalen kryesore; f. e anëtarëve nën diagonalen kryesore; g. e kolonave të veçanta. Fshirja e rreshtave dhe e kolonave Gjatë zgjidhjes së problemeve të ndryshme, duke shfrytëzuar matricat, shpesh herë në matrica duhet fshirë rreshta, kolona, ose rreshta e kolona njëkohësisht. Problemi kryesor këtu qëndron në zhvendosjen lart të rreshtave që gjenden pas rreshtit që fshihet, përkatësisht zhvendosjen majtë të kolonave që gjenden pas kolonës që fshihet. Shembull Formimi i matricës B(m-1,n) nga anëtarët e matricës A(m,n), pasi në të të fshihet rreshti i l-të.
  • 213. Fushat numerike 211 a. Bllok-diagrami Fillimi ⎛ i = 1,m ⎞ m, n, l, ⎜ aij, ⎝ j= 1,n ⎟⎠ i=1 j=1 Po Jo i<l bij=aij bij=ai+1,j j=j+1 Po j≤ n Jo i=i+1 Po i ≤ m-1 Jo ⎛ i = 1,m -1⎞ ⎜ bij,j= 1,n ⎟ ⎝ ⎠ Fundi Fig.6.76 b. Programi // Programi Prg6_76 #include <iostream> using namespace std; int main() { int const m=4,n=5,l=2; int A[m][n]={ {7,-3,4,-9,5}, {6,1,-2,4,-8}, {-7,6,-4,1,2},
  • 214. 212 Algoritmet {9,-5,3,8,-6} }; int i,j,B[m][n]; for (i=0;i<m-1;i++) for (j=0;j<n;j++) if (i<1) B[i][j]=A[i][j]; else B[i][j]=A[i+1][j]; cout << "Matrica B" << "n"; for (i=0;i<m-1;i++) { for (j=0;j<n;j++) { cout.width(3); cout << B[i][j]; } cout << "n"; } return 0; } Nëse ekzekutohet programi i dhënë, pas fshirjes së rreshtit të dytë në matricën A, matrica që fitohet do të duket kështu: Matrica B 7 -3 4 -9 5 -7 6 -4 1 2 9 -5 3 8 -6 Plotësisht njëlloj veprohet edhe gjatë fshirjes së kolonës në matricë. Shembull Formimi i matricës B(m,n-1) nga anëtarët e matricës A(m,n), pasi në të të fshihet kolona e k-të. a. Bllok-diagrami
  • 215. Fushat numerike 213 Fillimi ⎛ i = 1,m ⎞ m, n, k, ⎜ aij, ⎝ j= 1,n ⎟⎠ j=1 i=1 Po Jo j<k bij=aij bij=ai,j+1 i=i+1 Po i≤ m Jo j=j+1 Po j ≤ n-1 Jo ⎛ i = 1,m ⎞ ⎜ bij,j= 1,n-1⎟ ⎝ ⎠ Fundi Fig.6.77 b. Programi // Programi Prg6_77 #include <iostream> using namespace std; int main() { int const m=4,n=5,k=2; int A[m][n]={ {7,-3,4,-9,5}, {6,1,-2,4,-8}, {-7,6,-4,1,2}, {9,-5,3,8,-6} };
  • 216. 214 Algoritmet int i,j,B[m][n]; for (j=0;j<n-1;j++) for (i=0;i<m;i++) if (j<k) B[i][j]=A[i][j]; else B[i][j]=A[i][j+1]; cout << "Matrica B" << "n"; for (i=0;i<m;i++) { for (j=0;j<n-1;j++) { cout.width(3); cout << B[i][j]; } cout << "n"; } return 0; } Matrica që formohet pas fshirjes së kolonës k=2 përmes programit të dhënë më sipër, në ekran do të shtypet kështu: Matrica B 7 -3 -9 5 6 1 4 -8 -7 6 1 2 9 -5 8 -6 Nëse fshihen njëkohësisht rreshti dhe kolona e caktuar në matricën e dhënë, duhet të zhvendosen rreshtat dhe kolonat të cilat gjenden pas atyre që fshihen. Shembull Formimi i matricës B(m-1,n-1) nga anëtarët e matricës A(m,n), pasi në të të fshihet rreshti i l-të dhe kolona e k- të. a. Bllok-diagrami
  • 217. Fushat numerike 215 Fillimi i=1,m ⎞ m,n,k,l,⎛ aij, ⎜ ⎟ ⎝ j=1,n ⎠ i=1 j=1 Po Jo i<l Po Jo Po Jo j<k j<k bij=aij bij=ai,j+1 bij=ai+1,j bij=ai+1,j+1 j=j+1 Po j≤ n-1 Jo i=i+1 Po i≤ m-1 Jo ⎛ b ,i=1,m −1 ⎞ ⎜ ij j=1,n−1 ⎟ ⎝ ⎠ Fundi Fig.6.78 b. Programi
  • 218. 216 Algoritmet // Programi Prg6_78 #include <iostream> using namespace std; int main() { int const m=4,n=5,l=1,k=2; int A[m][n]={ {7,-3,4,-9,5}, {6,1,-2,4,-8}, {-7,6,-4,1,2}, {9,-5,3,8,-6} }; int i,j,B[m-1][n-1]; for (i=0;i<n-1;i++) for (j=0;j<m;j++) if (i<1) if (j<k) B[i][j]=A[i][j]; else B[i][j]=A[i][j+1]; else if (j<k) B[i][j]=A[i+1][j]; else B[i][j]=A[i+1][j+1]; cout << "Matrica B" << "n"; for (i=0;i<m-1;i++) { for (j=0;j<n-1;j++) { cout.width(3); cout << B[i][j]; } cout << "n"; } return 0; } Nëse ekzekutohet programi i dhënë, matrica e cila fitohet pas fshirjes së rreshtit l=1 dhe k=2 të matricës A, duket kështu: Matrica B 7 -3 -9 5 -7 6 1 2 9 -5 8 -6 Algoritmet për fshirjen e njëkohshme të më shumë rreshtave, ose të më shumë kolonave në matricë, do të jenë të ngjashme me ato që u dhanë më sipër.
  • 219. Fushat numerike 217 Detyra Formimi i matricës B nga anëtarët e matricës A(m,n), pasi në të të fshihen: a. x-rreshta, duke filluar prej rreshtit të l-të; b. y-kolona, duke filluar prej kolonës së k-të; c. x-rreshta dhe y-kolona, duke filluar prej rreshtit të l-të dhe kolonës së k-të. Këtu, para se të fillojë fshirja duhet të kontrollohet se a ka për fshirje x- rreshta dhe y-kolona, prej rreshtit të l-të dhe kolonës së k-të. Fushat tridimensionale Gjatë zgjidhjes së problemeve me kompjuter përdoren edhe fusha shumëdimensionale. Kështu, p.sh., operimi me të dhëna, të cilat përcaktohen përmes tri madhësive të ndryshme, thjeshtohet dukshëm, nëse shfrytëzohen fusha tridimensionale. Në algoritme, me fushat tridimensionale operohet duke i shikuar ato si grumbuj matricash, ku me dimensionin e tretë të tyre përcaktohet numri i matricës në strukturën tridimensionale të fushës, ashtu siç shihet në Fig.6.79.
  • 220. 218 Algoritmet k j j=1 2 ... n a111 a121 ... a1n1 i=1 a111 a121 ... a1n1 a211 a221 ... a2n1 2 a211 a221 ... a2n1 A = = + ... ... ... ... ... ... ... ... ... am11 am21 ... amn1 m am11 am21 ... amn1 k=1 i j=1 2 ... n j=1 2 ... n i=1 a112 a122 ... a1n2 i=1 a11l a12l ... a1nl 2 a212 a222 ... a2n2 2 a21l a22l ... a2nl + + ... + ... ... ... ... ... ... ... ... ... ... m am12 am22 ... amn2 m am1l am2l ... amnl k=2 k=l Fig.6.79 Fusha tridimensionale Shembull Formimi i fushës tridimensionale C(m,n,2), nga anëtarët e matricave A(m,n) dhe B(m,n).
  • 221. Fushat numerike 219 a. Bllok-diagrami Fillimi i=1,m ⎞ ⎛ i=1,m ⎞ m,n,l,⎛ aij, ⎜ ⎟,⎜ b , ⎟ ⎝ j=1,n ⎠ ⎝ ij j=1,n ⎠ k=1 i=1 j=1 Po Jo k=1 cijk=aij cijk=bij j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo k=k+1 Po k≤l Jo ⎛ k = 1,l ⎞ ⎜ ⎟ ⎜ cijk , i = 1,m ⎟ ⎜ j = 1,n ⎟ ⎝ ⎠ Fundi Fig.6.80
  • 222. 220 Algoritmet b. Programi // Programi Prg6_80 #include <iostream> using namespace std; int main() { int const m=4,n=5,l=2; int A[m][n]={ { 4,-2, 3, 7, 1}, { 2, 5,-9, 1,-5}, { 6, 4, 2, 9, 3}, { 6,-2, 1, 8,-4} }; int B[m][n]={ { 1, 3,-4,-6, 2}, { 6, 5,-2, 4,-8}, {-2, 3,-7, 1, 8}, { 9,-6, 2, 1, 7} }; int i,j,k,C[m][n][l]; for (k=0;k<l;k++) for (i=0;i<m;i++) for (j=0;j<n;j++) if (k==0) C[i][j][k]=A[i][j]; else C[i][j][k]=B[i][j]; cout << " Fusha C" << "n"; for (k=0;k<l;k++) { cout << " k=" << k << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(3); cout << C[i][j][k]; } cout << "n"; } cout << "n"; } return 0;
  • 223. Fushat numerike 221 } Fusha tridimensionale, e cila formohet përmes programit të dhënë, në ekran do të shtypet kështu: Fusha C k=0 4 -2 3 7 1 2 5 -9 1 -5 6 4 2 9 3 6 -2 1 8 -4 k=1 1 3 -4 -6 2 6 5 -2 4 -8 -2 3 -7 1 8 9 -6 2 1 7 Plotësisht njëlloj si edhe gjatë punës me matrica, mund të operohet edhe me anëtarët e fushave tridimensionale. Shembull Llogaritja e shumës s të katrorëve të anëtarëve negativë të fushës tridimensionale A(m,n,l). a. Bllok-diagrami
  • 224. 222 Algoritmet Fillimi ⎛ k = 1,l ⎞ ⎜ ⎟ m,n,l,⎜ aijk , i = 1,m ⎟ ⎜ j = 1,n ⎟ ⎝ ⎠ s=0 k=1 i=1 j=1 Jo aijk < 0 Po s=s+aijk2 j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo k=k+1 Po k≤l Jo s Fundi Fig.6.81 b. Programi
  • 225. Fushat numerike 223 // Programi Prg6_81 #include <iostream> #include <cmath> using namespace std; int main() { int const m=3,n=4,l=2; int A[m][n][l]={ {{3,5},{-2,4},{5,2},{-7,-1}}, {{-4,9},{6,1},{-2,7},{4,8}}, {{7,3},{6,-5},{8,1},{-2,9}} }; int i,j,k; double s; s=0; for (k=0;k<l;k++) for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j][k]<0) s=s+A[i][j][k]*A[i][j][k]; cout << "Fusha A" << "n"; for (k=0;k<l;k++) { cout << " k=" << k << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(3); cout << A[i][j][k]; } cout << "n"; } cout << "n"; } cout << "Shuma s=" << s << "n"; return 0; }
  • 226. 224 Algoritmet Pas ekzekutimit të programit të dhënë, fusha e lexuar A si dhe shuma e katrorëve të anëtarëve negativë të saj në ekran do të shtypen kështu: Fusha A k=0 3 -2 5 -7 -4 6 -2 4 7 6 8 -2 k=1 5 4 2 -1 9 1 7 8 3 -5 1 9 Shuma s=103 Detyra Për fushën tridimensionale A(m,n,l), të gjendet shuma: a. e kubeve të anëtarëve të saj; b. e anëtarëve të saj, të pjesëtuar me shumën e indekseve përkatëse; c. e anëtarëve të diagonales së saj; d. e anëtarëve me indeks të parë tek e indeks të tretë çift; e. e anëtarëve me të tri indekset tek; f. e anëtarëve pozitivë, por me indeks të tretë tek. Për gjetjen e anëtarit të caktuar, edhe te fushat tridimensionale mund të veprohet plotësisht njëlloj si edhe te vektorët ose matricat. Shembull Gjetja e anëtarit më të madh për nga vlera absolute e, në fushën tredimensionale A(m,n,l).
  • 227. Fushat numerike 225 a. Bllok-diagrami Fillimi ⎛ k = 1,l ⎞ ⎜ ⎟ m,n,l,⎜ aijk , i = 1,m ⎟ ⎜ j = 1,n ⎟ ⎝ ⎠ e=|a111| k=1 i=1 j=1 Jo |aijk| > e Po e=|aijk| j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo k=k+1 Po k≤l Jo e Fundi Fig.6.82
  • 228. 226 Algoritmet b. Programi // Programi Prg6_82 #include <iostream> #include <cmath> using namespace std; int main() { int const m=3,n=4,l=2; int A[m][n][l]={ {{3,-9},{-2,3},{4,2},{-5,-1}}, {{-4,8},{6,1},{-2,7},{-4,-8}}, {{7,3},{6,-5},{8,1},{-2,1}} }; int i,j,k,e; e=abs(A[0][0][0]); for (k=0;k<l;k++) for (i=0;i<m;i++) for (j=0;j<n;j++) if (abs(A[i][j][k])>e) e=abs(A[i][j][k]); cout << "Fusha A" << "n"; for (k=0;k<l;k++) { cout << " k=" << k << "n"; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout.width(3); cout << A[i][j][k]; } cout << "n"; } cout << "n"; } cout << "Vlera absolute më e madhe e=" << e << "n"; return 0; }
  • 229. Fushat numerike 227 Për vlerat numerike të anëtarëve të fushës tridimensionale, që është marr si shembull në program, rezultati që shtypet në ekran është: Fusha A k=0 3 -2 4 -5 -4 6 -2 -4 7 6 8 -2 k=1 -9 3 2 -1 8 1 7 -8 3 -5 1 1 Vlera absolute më e madhe e=9 Edhe te fushat tridimensionale mund të numërohen anëtarët e caktuar, plotësisht njëlloj si edhe te matricat ose vektorët. Shembull Numri i anëtarëve pozitivë p brenda fushës tridimensionale A(m,n,l), por të cilët gjenden mes vlerave 5 dhe 9, duke i shtypur njëkohësisht anëtarët negativë dhe indekset e tyre. a. Bllok-diagrami
  • 230. 228 Algoritmet Fillimi ⎛ k = 1,l ⎞ ⎜ ⎟ m,n,l,⎜ aijk , i = 1,m ⎟ ⎜ j = 1,n ⎟ ⎝ ⎠ p=0 k=1 i=1 j=1 Po aijk < 0 Jo Po Po aijk > 5 aijk < 9 Jo Jo k,i,j,aijk p=p+1 j=j+1 Po j≤ n Jo i=i+1 Po i≤ m Jo k=k+1 Po k≤l Jo p Fundi Fig.6.83
  • 231. Fushat numerike 229 b. Programi // Programi Prg6_83 #include <iostream> using namespace std; int main() { int const m=3,n=4,l=2; int A[m][n][l]={ {{3,-9},{-2,3},{4,2},{-5,-1}}, {{-4,8},{6,1},{-2,7},{-4,-8}}, {{7,3},{6,-5},{8,1},{-2,1}}}; int i,j,k,p; p=0; cout << " k i j A[i][j][k]" <<"n"; for (k=0;k<l;k++) for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j][k]<0) { cout << "t" << k << "t" << i << "t" << j << "t" << A[i][j][k] << "t"; } else if (A[i][j][k]>5 && A[i][j][k]<9) p=p+1; cout << "Numri i kërkuar p=" << p << endl; return 0; } Rezultati që shtypet në ekran, pas ekzekutimit të programit të dhënë, është: k i j A[i][j][k] 0 0 1 -2 0 0 3 -5 0 1 0 -4 0 1 2 -2 0 1 3 -4 0 2 3 -2
  • 232. 230 Algoritmet 1 0 0 -9 1 0 3 -1 1 1 3 -8 1 2 1 -5 Numri i kërkuar p=6 ku në pjesën e parë janë shtypur indekset dhe vlerat e anëtarëve negativë të fushës, kurse p=6 është numri i anëtarëve pozitivë të fushës të cilët gjenden mes vlerave 5 dhe 9. Detyra Në fushën tridimensionale A(m,n,l) të gjendet: a. numri i anëtarëve pozitivë; b. numri i anëtarëve më të mëdhenj se vlera x, por të ndryshëm nga vlera y; c. shuma e anëtarëve pozitivë; d. prodhimi i anëtarëve më të vegjël se vlera x; e. anëtari me vlerë minimale, për çdo vlerë të indeksit të tretë.
  • 234. 232 Algoritmet Në praktikë, vlerat numerike të funksioneve të ndryshme llogariten duke shfrytëzuar seri të pafundme. Por, meqë realisht nuk mund të shkohet në pafundësi, llogaritjet ndërpriten duke marrë parasyshë një numër të caktuar anëtarësh të serive, me çka fitohen vlerat e përafërta të funksioneve. Shembull Llogaritja e vlerës së përafërt s të shumës: ∞ 1 ∑ 2i i =1 i duke marrë parasysh vetëm anëtarët të cilët janë më të mëdhenj se numri i dhënë ε. a. Bllok-diagrami Fillimi ε s=0 i=1 1 Jo 2i >ε i Po s 1 z= 2i i Fundi s=s+z i,z i=i+1 Fig.7.1
  • 235. Vlerat e serive të pafundme 233 Algoritmet e tillë te të cilët paraprakisht nuk dihet se sa herë do të përsëritet një pjesë e caktuar e tyre, quhen edhe algoritme iterative. b. Programi // Programi Prg7_1 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { const double e=0.0000001; float i; double z,s; s=0; i=1; while ((1/pow(i,2*i)) > e) { z=1/pow(i,2*i); s=s+z; cout.precision(0); cout.width(5); cout <<i; cout.precision(7); cout.width(12); cout.setf(ios::fixed, ios::floatfield); cout <<z; cout << "n"; i=i+1; } cout << "Shuma s=" << s <<"n"; return 0; } Në program, fuqizimi është llogaritur përmes funksionit pow, te i cili, argumenti i parë e paraqet madhësin që fuqizohet, kurse fuqia shënohet si argument i dytë. Rezultati që do të shtypet në ekran, pas ekzekutimit të programit të dhënë, duket kështu: 1 1.0000000 2 0.0625000 3 0.0013717 4 0.0000153 5 0.0000001
  • 236. 234 Algoritmet Shuma s=1.0638871 ku në kolonën e dytë janë shtypur anëtarët e serisë së pafundme të cilët marrin pjesë në llogaritjen e vlerës së shumës. Gjatë llogaritjes së vlerave përmes serive të pafundme, llogaritja mund të ndërpritet në një numër të caktuar anëtarësh të serisë, i cili zgjidhet lirisht. Shembull Llogaritja e vlerës së përafërt s të shumës: ∞ x ∑ (−1)i 3i − 2 i =1 duke marrë parasysh k-anëtarët e parë të serisë. a. Bllok-diagrami Fillimi x,k s=0 i=1 z = (− 1) i x 3i - 2 s=s+z i,z i=i+1 Po i≤k Jo s Fundi Fig.7.2
  • 237. Vlerat e serive të pafundme 235 b. Programi // Programi Prg7_2 #include <iostream> #include <cmath> using namespace std; int main() { int const x=2,k=5; int i; double z,s; s=0; for (i=1;i<=k;i++) { z=pow((-1.),i)*x/(3*i-2); s=s+z; cout.width(5); cout <<i; cout.precision(7); cout.width(13); cout.setf(ios::fixed, ios::floatfield); cout <<z; cout << "n"; } cout << "Shuma s=" << s << "n"; return 0; } Në program, për llogaritje të fuqizimit është shfrytëzuar funksioni pow, përmes së cilit (-1) ngritet në fuqinë i. Rezultati që fitohet në ekran, për vlerat k=5 dhe x=2, do të duket kështu: 1 -2.0000000 2 0.5000000 3 -0.2857143 4 0.2000000 5 -0.1538462 Shuma s=-1.7395604 Kushti për ndërprerejen e shtimit të anëtarëve gjatë llogaritjeve përmes serive të pafundme mund të jetë edhe ndonjë vlerë e cila llogaritet nga vlera e anëtarit që shtohet.
  • 238. 236 Algoritmet Shembull Llogaritja e vlerës së përafërt s të shumës: ∞ ⎛ π ⎞ ∑ ⎜1 + ⎟ i =1 ⎝ 5i4 ⎠ duke marrë parasysh vetëm anëtarët, logaritmi natyror i të cilëve është më i madh se numri i dhënë ε. a. Bllok-diagrami Fillimi π s=0 i=1 ⎛ π ⎞ Jo ln⎜ 1 + ⎜ ⎟>ε ⎟ ⎝ 5i4 ⎠ Po s π z = 1+ 4 Fundi 5i s=s+z i,z i=i+1 Fig.7.3
  • 239. Vlerat e serive të pafundme 237 b. Programi // Programi Prg7_3 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { const double e=0.001,pi=3.1415926,x=2; float i; double z,s; s=0; i=1; while (log(1+pi/(5*pow(i,4))) > e) { z=1+pi/(5*pow(i,4)); s=s+z; cout.precision(0); cout.width(5); cout <<i; cout.precision(5); cout.width(10); cout.setf(ios::fixed, ios::floatfield); cout <<z; cout << "n"; i=i+1; } cout << "Shuma s=" << s <<"n"; return 0; } Rezultati që shtypet në ekran, nëse ekzekutohet programi i dhënë, duket kështu: 1 1.62832 2 1.03927 3 1.00776 4 1.00245 5 1.00101 Shuma s=5.67881
  • 240. 238 Algoritmet ku në kolonën e dytë janë shtypur anëtarët e serisë, të cilët i shtohen vlersës së shumës. Seritë e pafundme shfrytëzohen gjatë llogaritjes së vlerave të funksioneve të ndryshme trigonometrike. Shembull Llogaritja e vlerës së përafërt s e funksionit sin(x), përmes serisë së pafundme: ∞ x2i + 1 ∑ (−1)i (2i + 1)! i =0 nëse gabimi relativ i lejuar është ε. Gabimi relativ llogaritet përmes shprehjes: Sv − Sp r = Sv ku janë: Sp - shuma parciale paraprake Sv - shuma parciale vijuese.
  • 241. Vlerat e serive të pafundme 239 a. Bllok-diagrami
  • 242. Fillimi x,ε s=0 240 Algoritmet i=0 Sp=s F=1 Fig.7.4 b. Programi j=1 // Programi Prg7_4 F=F⋅j F=(2i+1)! #include <iostream> j=j+1 #include <cmath> Po #include j≤(2i+1) <iomanip> Jo using namespace std; 2i+1 s = s + (- 1) i x int main() { (2i + 1)! const double Sv=s e=0.0001,x=0.75 ; Sv − Sp int i,j; r= double Sv s,Sp,Sv,r,F; s=0; i,r i=0; do { i=i+1 Po Sp=s; r≥ε F=1; Jo for s,sin(x) (j=1;j<=2*i+1;j ++) Fundi F=F*j; s=s+pow((-1.),i)*pow(x,2*i+1)/F; Sv=s; r=fabs((Sv-Sp)/Sv); cout.width(4); cout <<i; cout.precision(6); cout.width(10); cout.setf(ios::fixed, ios::floatfield);
  • 243. Vlerat e serive të pafundme 241 cout <<r; cout << "n"; i=i+1; } while (r>=e); cout << "Vlera e përafërt s=" << s <<"n" << "Vlera e saktë sin=" << sin(x) <<"n"; return 0; }
  • 244. 242 Algoritmet Nëse ekzekutohet programi, rezultati që shtypet në ekran është: 0 1.000000 1 0.103448 2 0.002901 3 0.000039 Vlera e përafërt s=0.681639 Vlera e saktë sin=0.681639 Në pjesën e parë të rezultatit janë shtypur vlerat e variablës i dhe gabimi absolut r për çdo i, i cili, siç shihet, shkon gjithnjë duke u zvogëluar. Kurse në dy rreshtat e fundit, së pari është shtypur shuma s e vlerës së përafërt të sinusit, dhe pastaj edhe vlera e funksionit sin(x), e llogaritur përmes funksionit sin, i cili gjendet në kuadër të bibliotekës së funksioneve të gjuhës C++. Siç shihet, vlera e llogaritur përmes serisë së pafundme dhe ajo e llogaritur duke shfrytëzuar funksionin sin, për saktësinë e kërkuar, janë të barabarta. Vlerat e serive të pafundme mund të llogariten edhe duke e pasur parasysh gabimin e lejuar relativ. Shembull Llogaritja e vlerës së përafërt s e serisë së pafundme: ∞ x ∑ i =1 i3 nëse gabimi absolut i lejuar është ε. Gabimi absolut llogaritet përmes shprehjes: a = Sv − Sp ku janë: Sp - shuma parciale paraprake Sv - shuma parciale vijuese.
  • 245. Vlerat e serive të pafundme 243 a. Bllok-diagrami Fillimi x,ε s=0 i=1 Sp=s x s = s+ 3 i Sv=s a=|Sv-Sp| i,a i=i+1 Po a≥ε Jo s Fundi Fig.7.5 b. Programi // Programi Prg7_5 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { const double x=2,e=0.01; float i; double s,Sp,Sv,a; s=0; i=1; do {
  • 246. 244 Algoritmet Sp=s; s=s+x/pow(i,3); Sv=s; a=fabs(Sv-Sp); cout.precision(0); cout.width(4); cout <<i; cout.precision(6); cout.width(10); cout.setf(ios::fixed, ios::floatfield); cout <<a; cout << "n"; i=i+1; } while (a>=e); cout << "Vlera e llogaritur s=" << s <<"n"; return 0; } Rezultati që fitohet në ekran pas ekzekutimit të programit të dhënë është: 1 2.000000 2 0.250000 3 0.074074 4 0.031250 5 0.016000 6 0.009259 Vlera e llogaritur s=2.380583 Në kolonën e dytë të rezultateve të dhëna më sipër janë shtypur vlerat e gabimit absolut a në iteracionet e veçanta, përkatësisht për çdo vlerë të variablës i. Detyrë Të llogaritet vlera e përafërt z e funksionit ex, përmes serisë së pafundme: ∞ x ∑ i =1 i3 nëse gabimi relativ i lejuar është ε.
  • 248. 246 Algoritmet Gjatë llogaritjeve të ndryshme, kur kemi të bëjmë me vlera komplekse, operohet veç me pjesën reale dhe veç me atë imagjinare. Shembull Llogaritja e shumës së anëtarëve kompleksë të vektorit Z(n), nëse anëtarët e pjesës reale dhe të pjesës imagjinare janë dhënë përmes vektorëve X(n) dhe Y(n). n s = ∑ zi i =1 n = ∑ (xi + jyi) i =1 n n = ∑ xi + j ∑ yi = a + jb i =1 i =1
  • 249. Numrat kompleksë 247 a. Bllok-diagrami Fillimi n,(xi,i=1,n),(yi,i=1,n) a=0 b=0 i=1 a=a+xi b=b+yi i,xi,yi i=i+1 Po i≤n Jo a,b Fundi Fig.8.1 b. Programi // Programi Prg8_1 #include <iostream> #include <iomanip> using namespace std; int main() { int const n=5; int a,b,i; int X[n]={3,7,4,2,-8}; int Y[n]={6,-9,5,8,1}; a=0; b=0; cout << " i X Y"
  • 250. 248 Algoritmet << "n"; cout << "-------------" << "n"; for (i=0;i<n;i++) { a=a+X[i]; b=b+Y[i]; cout << setw(4) << i << setw(4) << setiosflags(ios::right)<<X[i] << setw(4) << setiosflags(ios::right)<<Y[i] << "n"; } cout << "Shuma reale .... a=" << a << "n" << "Shuma imagjinare b=" << b << "n"; return 0; } Për vlerat e vektorit kompleks Z(n), përkatësisht komponentes reale X(n) dhe komponentes imagjinare Y(n), të cilat janë marrë si shembull, pas ekzekutimit të programit në ekran do të shtypen këto rezultate: i X Y ------------- 1 3 6 2 7 -9 3 4 5 4 2 8 5 -8 1 Shuma reale .... a=8 Shuma imagjinare b=11 Për llogaritjen e prodhimit të anëtarëve të një vektori kompleks duhet shfrytëzuar formën eksponenciale të shprehjes së anëtarëve përkatës të vektorit.
  • 251. Numrat kompleksë 249 Shembull Llogaritja e prodhimit të anëtarëve kompleksë të vektorit Z(n), nëse anëtarët e pjesës reale dhe të pjesës imagjinare janë dhënë përmes vektorëve X(n) dhe Y(n). n P= ∏(xi + jy i) i=1 = n ( ∏ ρi ⋅ ejϕi ) i=1 ( )( ) = ρ1 ⋅ ejϕ1 ⋅ ρ 2 ⋅ ejϕ2 ⋅...⋅ ρ n ⋅ ejϕn ( ) n n j ∑ ϕi = ∏ ρi ⋅ e i=1 = α ⋅ ejβ i=1 = α ⋅ cos β + jα ⋅ sin β = a + jb ku janë: n α = ∏ ρi i =1 n β= ∑ ϕi i=1 a = α ⋅ cos β , b = α ⋅ sin β ρi = xi2 + yi2 y ϕi = arctg i xi
  • 252. 250 Algoritmet a. Bllok-diagrami Fillimi n,(xi,i=1,n),(yi,i=1,n) α=1 β=0 i=1 ρi = x i + y i 2 2 y ϕi = arctg i xi α=α⋅ρ i β=β⋅ϕ i i,xi,yi i=i+1 Po i≤ n Jo a=α⋅cosβ b=α⋅sinβ a,b Fundi Fig.8.2
  • 253. Numrat kompleksë 251 b. Programi // Programi Prg8_2 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { int const n=5; int i; double X[n]={3,7,4,2,-8}; double Y[n]={6,-9,5,8,1}; double a,b,Alfa,Beta,Ro[n],Fi[n]; Alfa=1; Beta=0; cout << " i X Y" << "n"; cout << "-------------" << "n"; for (i=0;i<n;i++) { Ro[i]=sqrt(pow(X[i],2)+pow(Y[i],2)); Fi[i]=atan(Y[i]/X[i]); Alfa=Alfa*Ro[i]; Beta=Beta+Fi[i]; cout << setw(4) << i << setw(4) << setiosflags(ios::right)<< X[i] << setw(4) << setiosflags(ios::right)<< Y[i] << "n"; } a=Alfa*cos(Beta); b=Alfa*sin(Beta); cout << "Pjesa reale .... a=" << a << "n" << "Pjesa imagjinare b=" << b << "n"; return 0; } Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran do të duket si në vijim.
  • 254. 252 Algoritmet i X Y ------------- 0 3 6 1 7 -9 2 4 5 3 2 8 4 -8 1 Pjesa reale .... a=-21570 Pjesa imagjinare b=24390 Për llogaritjen e shumës ose të prodhimit të funksioneve trigonometrike, ose edhe të funksioneve të tjera, duhet gjetur rrugë që shprehjet të zbërthehen në pjesën reale dhe në pjesën imagjinare të tyre. Shembull Llogaritja e shumës: n s= ∑ sin zi i =1 ku zi janë anëtarët kompleksë të vektorit Z(n), kurse anëtarët e pjesës reale dhe të pjesës imagjinare të tij janë dhënë përmes vektorëve X(n) dhe Y(n). n s= ∑ sin zi i=1 n = ∑ sin(xi + jyi) i=1 n ej xi +jyi) − e −j xi +jyi) ( ( = ∑ i=1 2j eyi + e −yi n n eyi − e −yi = ∑ sin xi + j ∑ cos xi i=1 2 i=1 2 = a + jb ku janë: n eyi + e −yi a= ∑ sin xi i=1 2 n eyi − e −yi b= ∑ cos xi i=1 2
  • 255. Numrat kompleksë 253 a. Bllok-diagrami Fillimi n,(xi,i=1,n),(yi,i=1,n) a=0 b=0 i=1 yi − yi e +e a =a+ sin x i 2 yi − yi e −e b = b+ cos x i 2 i,xi,yi i=i+1 Po i≤n Jo a,b Fundi Fig.8.3 b. Programi // Programi Prg8_3 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { int const n=5; int i; double X[n]={3,7,4,2,-8}; double Y[n]={6,-9,5,8,1};
  • 256. 254 Algoritmet double a=0,b=0; cout << " i X Y" << "n"; cout << "-------------" << "n"; for (i=0;i<n;i++) { a=a+(exp(Y[i])+exp(-Y[i]))/2*sin(X[i]); b=b+(exp(Y[i])-exp(-Y[i]))/2*cos(X[i]); cout << setw(4) << i << setw(4) << setiosflags(ios::right)<<X[i] << setw(4) << setiosflags(ios::right)<<Y[i] << "n"; } cout << "Pjesa reale .... a=" << a << "n" << "Pjesa imagjinare b=" << b << "n"; return 0; } Nëse ekzekutohet programi i dhënë, rezultati që shtypet në ekran është: i X Y ------------- 1 3 6 2 7 -9 3 4 5 4 2 8 5 -8 1 Pjesa reale .... a=3987.87 Pjesa imagjinare b=-3923.09 Detyra Nëse anëtarët e vektorit Z(n) janë numra kompleksë dhe pjesët reale dhe imagjinare të tyre jepen përmes vektorëve X(n) dhe Y(n), të llogariten vlerat: n p= ∏ coszi i=1 n s= ∑ ln zi i=1
  • 259. 256 Algoritmet Me tabelimin e vlerave numerike të funksioneve nënkuptohet llogaritja e vlerave të tyre, për vlera të ndryshme të variablave që paraqiten brenda shprehjeve përkatëse. Shembull Llogaritja e vlerave të funksionit: ⎧ e2x + 1 për x ≤ 3 ⎪ ⎪ y = ⎨ n 2 ⎪ ⎛x ⎞ ⎪∑ ⎝2 ⎜ + 2i ⎟ për x > 3 ⎩i = 1 ⎠ për vlera të ndryshme të variablës x mes a dhe b, duke ndryshuar atë me hapin h.
  • 260. Tabelimi i funksioneve 257 a. Bllok-diagrami Fillimi n,a,b,h x=a Po Jo x≤3 s=0 i=1 2 ⎛x ⎞ s = s + ⎜ + 2i ⎟ ⎝2 ⎠ i=i+1 Po i ≤ n Jo 2x+1 y=e y=s x,y x=x+h Po x≤b Jo Fundi Fig.9.1
  • 261. 258 Algoritmet b. Programi // Programi Prg9_1 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { const double a=2,b=5,h=0.5; int n=3,i; double x,y,s; cout << "Tabela e vlerave" << "n"; cout << " x y" << "n"; x=a; do { if (x<=3) y=exp(2*x+1); else { s=0; for (i=1;i<=n;i++) s=s+pow(x/2+2*i,2); y=s; } cout.setf(ios::fixed); cout.precision(2); cout.width(6); cout << x; cout.precision(4); cout.width(12); cout << y << "n"; x=x+h; } while (x<=b); return 0; } Rezultati që shtypet në ekran do të duket: Tabela e vlerave x y 2.00 148.4132 2.50 403.4288
  • 262. Tabelimi i funksioneve 259 3.00 1096.6332 3.50 107.1875 4.00 116.0000 4.50 125.1875 5.00 134.7500 Tabela mund t'i përmbajë vlerat numerike të disa funksionve njëkohësisht. Shembull Llogaritja e vlerave numerike të funksioneve: y = 3x2 + 2x − 1 1 z = 2 − x v = 3 ln(x − 1) t = ex + 2 sin x për vlera të ndryshme të variablës x mes a dhe b, duke ndryshuar vlerën e saj me hapin h. Meqë për të gjitha vlerat e variablës x mund të llogariten vetëm funksionet y dhe t, shprehjet e tyre janë vendosur menjëherë në fillim të bllok-diagramit. Për funksionet e tjera, para se të llogariten vlerat e tyre, duhet kontrolluar vlerën e variablës x, sepse funksioni v nuk mund të llogaritet, nëse x≤1, kurse vlera e funksionit z është e padefinuar për x=2, gjë që shihet edhe në paraqitjen vijuese: y z v t x -3 -2 -1 0 1 2 3
  • 263. 260 Algoritmet a. Bllok-diagrami Fillimi a,b,h x=a y=3x2+2x-1 t=ex+2sin x Po x≤1 Jo v=3 ln(x-1) Po x=2 Jo 1 1 z= z= 2− x 2− x x,y,z,v,t x,y,v,t x,y,z,t x=x+h Po x≤b Jo Fundi Fig.9.2
  • 264. Tabelimi i funksioneve 261 b. Programi // Programi Prg9_1 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { const double a=-3,b=3,h=0.5; double x,y,z,v,t; cout << " x y z v t" << "n" << "----------------------------------" << "n"; x=a; cout.setf(ios::fixed); cout.precision(2); do { y=3*pow(x,2)+2*x-1; t=exp(x)+2*sin(x); if (x<=1) { z=1/(2-x); cout << setw(5) << x << setw(8) << y << setw(6) << z << " Mungon" << setw(7) << t << "n"; } else { v=3*log(x-1); if (x==2) { cout << setw(5) << x << setw(8) << y << " ----" << setw(8) << v << setw(7)
  • 265. 262 Algoritmet << t << "n"; } else { z=1/(2-x); cout << setw(5) << x << setw(8) << y << setw(6) << z << setw(8) << v << setw(7) << t << "n"; } } x=x+0.5; } while (x<=b); return 0; } Tabela e vlerave numerike, e cila fitohet në ekran pas ekzekutimit të programit të dhënë, do të duket kështu: x y z v t ---------------------------------- -3.00 20.00 0.20 Mungon -0.23 -2.50 12.75 0.22 Mungon -1.11 -2.00 7.00 0.25 Mungon -1.68 -1.50 2.75 0.29 Mungon -1.77 -1.00 0.00 0.33 Mungon -1.32 -0.50 -1.25 0.40 Mungon -0.35 0.00 -1.00 0.50 Mungon 1.00 0.50 0.75 0.67 Mungon 2.61 1.00 4.00 1.00 Mungon 4.40 1.50 8.75 2.00 -2.08 6.48 2.00 15.00 ---- 0.00 9.21 2.50 22.75 -2.00 1.22 13.38 3.00 32.00 -1.00 2.08 20.37
  • 267. 264 Algoritmet Në praktikë, përveç mesatares aritmetikore, përdoret edhe mesatarja gjeometrike, si dhe mesatarja harmonike. Shembull Llogaritja e mesatares aritmetikore, mesatares gjeometrike dhe e mesatares harmonike, për anëtarët e vektorit X(n). Për llogaritjen e mesatareve në fjalë, përdoren shprehjet: • Mesatarja aritmetikore 1 n a = ∑ xi n i =1 • Mesatarja gjeometrike n g = n ∏ xi i =1 • Mesatarja harmonike n h = n 1 ∑x i =1 i
  • 268. Mesataret dhe devijimet 265 a. Bllok-diagrami Fillimi n,(xi,i=1,n) s1=0 p=1 s2=0 i=1 s1=s1+xi p=p⋅xi 1 s =s + 2 2 x i i=i+1 Po i≤n Jo s a= 1 n g= n p n h= s 2 a,g,h Fundi Fig.10.1
  • 269. 266 Algoritmet b. Programi // Programi Prg10_1 #include <iostream> #include <cmath> using namespace std; int main() { const int n=5; int X[n]={7,4,2,8,5},i; double s1=0,p=1,s2=0,a,g,h; for (i=0;i<n;i++) { s1=s1+X[i]; p=p*X[i]; s2=s2+1./X[i]; } a=s1/n; cout << "Mesatarja aritmetikore a=" << a; g=pow(p,1./n); cout << "nMesatarja gjeometrike g=" << g; h=n/s2; cout << "nMesatarja harmonike h=" << h << "n"; return 0; } Për vlerat e anëtarëve të vektorit që është marra si shembull në program, pas ekzekutimit të programit, si rezultat në ekran do të shtypet: Mesatarja aritmetikore a=5.2 Mesatarja gjeometrike g=4.67789 Mesatarja harmonike h=4.10557 Duke shfrytëzuar vlerat e llogaritura të mesatareve, përmes shprehjeve vijuese mund të gjenden edhe devijimet standarde përkatëse: • Devijimi aritmetikor 1 n σ = ∑ (xi − a)2 n i =1
  • 270. Mesataret dhe devijimet 267 • Devijimi gjeometrik 1 n ρ = ∑ (xi − g)2 n i =1 • Devijmi absolut 1 n δ = ∑ xi − a n i =1 Shembull Llogaritja e devijimit standard aritmetikor, gjeometrik dhe harmonik, për anëtarët e vektorit X(n). a. Bllok-diagrami Fillimi n,(xi,i=1,n) s1=0 p=1 s2=0 i=1 s1=s1+xi p=p⋅xi 1 s =s + 2 2 x i i=i+1 Po i≤n Jo A
  • 271. 268 Algoritmet A a = s1 / n g=np h = n/s2 a,g,h s3=0 s4=0 s5=0 i=1 s3=s3+(xi-a)2 s4=s4+(xi-g)2 s5=s5+|xi-a| i=i+1 Po i≤n Jo σ = s3 / n ρ = s4 / n δ = s5 / n σ,ρ,δ Fundi Fig.10.2
  • 272. Mesataret dhe devijimet 269 b. Programi // Programi Prg10_2 #include <iostream> #include <cmath> using namespace std; int main() { const int n=5; int X[n]={7,4,2,8,5},i; double s1=0,p=1,s2=0,a,g,h; double s3=0,s4=0,s5=0,Sigma,Ro,Delta; for (i=0;i<n;i++) { s1=s1+X[i]; p=p*X[i]; s2=s2+1./X[i]; } a=s1/n; cout << "Mesatarja aritmetikore a=" << a; g=pow(p,1./n); cout << "nMesatarja gjeometrike g=" << g; h=n/s2; cout << "nMesatarja harmonike h=" << h; for (i=0;i<n;i++) { s3=s3+pow(X[i]-a,2); s4=s4+pow(X[i]-g,2); s5=s5+fabs(X[i]-a); } Sigma=sqrt(s3/n); cout << "nDevijimi aritmetikor Sigma=" << Sigma; Ro=sqrt(s4/n); cout << "nDevijimi gjeometrik Ro=" << Ro; Delta=s5/n; cout << "nDevijimi absolut Delta=" << Delta << "n"; return 0; }
  • 273. 270 Algoritmet Pas ekzekutimit të programit të dhënë, rezultatet në ekran do të shtypen kështu: Mesatarja aritmetikore a=5.2 Mesatarja gjeometrike g=4.67789 Mesatarja harmonike h=4.10557 Devijimi aritmetikor Sigma=2.13542 Devijimi gjeometrik Ro=2.19832 Devijimi absolut Delta=1.84
  • 274. Integralet e njëfishta 272 Integralet e dyfishta 277
  • 275. 272 Algoritmet Për llogaritjen e vlerës së integralit të caktuar, përdoret Metoda e Trapezit, ose Metoda e Simpsonit. Integralet e njëfishta Vlera e integralit të njëfishtë: b ∫ f x)dx ( a sipas Metodës së Trapezit llogaritet me shprehjen: ⎡ f a) + f b) n −1 ⎤ ( ( T = h ⋅ ⎢ + ∑ fa ( + i ⋅ h)⎥ ⎢ ⎣ 2 i =1 ⎥ ⎦ ku b − a h = n është hapi i integrimit, nëse zona e integrimit ndahet në n-pjesë. Shembull Llogaritja e vlerës së integralit: 4 ∫ (x + 1)dx 2 1 me metodën numerike të Trapezit.
  • 276. Integrimi numerik 273 a. Bllok-diagrami Fillimi f(x)=x2+1 n,a,b b-a h= n s=0 i=1 s=s+f(a+ih) i=i+1 Po i ≤ n-1 Jo T = h⋅ ⎡ f(a)+ f(b) + s⎤ ⎢ ⎣ 2 ⎥ ⎦ T Fundi Fig.11.1 b. Programi // Programi Prg11_1 #include <iostream> using namespace std; double f(double x); int main() { const int n=10; const double a=1,b=4; int i; double T,s,h; h=(b-a)/n; s=0; for (i=1;i<=n-1;i++)
  • 277. 274 Algoritmet s=s+f(a+i*h); T=h*((f(a)+f(b))/2+s); cout << "Vlera e integralit T=" << T << "n"; return 0; } // Nënprogrami double f(double x) { return x*x+1; } Pas ekzekutimit të programit të dhënë, rezultati që shtypet në ekran është: Vlera e integralit T=24.045 Vlera e integralit llogaritet edhe përmes Metodës së Simpsonit, duke shfrytëzuar shprehjen: ⎧ n −1 ⎫ h ⎪ n ⎪ S = ⋅ ⎨f a) + f b) + 4 ∑ f[a + (2i − 1) ] + 2 ∑ f[a + 2ih]⎬ ( ( h 3 ⎪⎩ i =1 i =1 ⎪ ⎭ ku hapi i integrimit llogaritet kështu: b − a h = 2n nëse zona e integrimit ndahet në n-pjesë. Shembull Llogaritja e vlerës së integralit: 4 ∫ (x + 1)dx 2 1 me metodën numerike të Simpsonit.
  • 278. Integrimi numerik 275 a. Bllok-diagrami Fillimi f(x)=x2+1 n,a,b b-a h= 2n s1=0 s2=0 i=1 s1=s1+f[a+(2i-1)h] s2=s2+f(a+2ih) i=i+1 Po i ≤ n-1 Jo s1=s1+f[a+(2n-1)h] S= h 3 { ⋅ f(a)+ f(b)+ 4 ⋅ s + 2 ⋅ s 1 2 } S Fundi Fig.11.2
  • 279. 276 Algoritmet b. Programi // Programi Prg11_2 #include <iostream> using namespace std; double f(double x); int main() { const int n=10; const double a=1,b=4; int i; double S,s1,s2,h; h=(b-a)/(2*n); s1=0; s2=0; for (i=1;i<=n-1;i++) { s1=s1+f(a+(2*i-1)*h); s2=s2+f(a+2*i*h); } s1=s1+f(a+(2*n-1)*h); S=h/3*(f(a)+f(b)+4*s1+2*s2); cout << "Vlera e integralit S=" << S << "n"; return 0; } // Nënprogrami double f(double x) { return x*x+1; } Pas ekzekutimit të programit të dhënë, rezulati në ekran do të shtypet kështu: Vlera e integralit S=24
  • 280. Integrimi numerik 277 Integralet e dyfishta Për llogaritjen e vlerës së integralit të dyfishtë: bd ∫ ∫ f x, y)dx dy ( ac sipas Metodës së Trapezit, shfrytëzohet shprehja: ⎧1 T = h ⋅ g ⋅ ⎨ [f a,c)+ f a,d)+ f b,c)+ f b,d) ( ( ( ( ] ⎩4 1 ⎡n −1 m −1 ⎤ + ⎢ ∑ f xi,c)+ f xi,d)+ ∑ f a,y j)+ f b,y j) ( ( ( ( ⎥ 2 ⎢i=1 ⎣ j=1 ⎥ ⎦ m-1 n-1 ⎫ ⎪ + ∑ ∑ f(xi,y j)⎬ j=1 i=1 ⎪ ⎭ ku janë: xi = a + ih yj = c + jd b − a h = n d − c g = m Shembull Llogaritja e vlerës së integralit të dyfishtë: 24 1 ∫∫ dx dy 1 3 (x + y )2 me metodën numerike të Trapezit.
  • 281. 278 Algoritmet a. Bllok-diagrami Fillimi 1 f(x,y) = (x + y )2 m,n,a,b,c,d b-a h= n d-c g= m r= 1 4 [ ⋅ f(a,c)+ f(a,d)+ f(b,c)+ f(b,d) ] s1=0 i=1 xi=a+i⋅h s1=s1+f(xi,c)+f(xi,d) i=i+1 Po i ≤ n-1 Jo A
  • 282. Integrimi numerik 279 A s2=0 j=1 yj=c+j⋅g s2=s2+f(a,yj)+f(b,y1) j=j+1 Po j ≤ m-1 Jo s3=0 i=1 j=1 yj=c+j⋅g s3=s3+f(xi,yi) j=j+1 Po j ≤ m-1 Jo i=i+1 Po i ≤ n-1 Jo ⎧ T = h ⋅g ⋅ ⎨ r + ⎩ 1 2 [s 1 +s 2 ] + s3 ⎫ ⎬ ⎭ T Fundi Fig.11.3
  • 283. 280 Algoritmet b. Programi // Programi Prg11_3 #include <iostream> #include <cmath> using namespace std; double f(double x,double y); int main() { const int m=6,n=4; const double a=1,b=2,c=3,d=4; int i,j; double T,s1,s2,s3,r,h,g,xi,yj; h=(b-a)/n; g=(d-c)/m; r=(f(a,c)+f(a,d)+f(b,c)+f(b,d))/4; s1=0; for (i=1;i<=n-1;i++) { xi=a+i*h; s1=s1+f(xi,c)+f(xi,d); } s2=0; for (j=1;j<=m-1;j++) { yj=c+j*g; s2=s2+f(a,yj)+f(b,yj); } s3=0; for (i=1;i<=n-1;i++) { xi=a+i*h; for (j=1;j<=m-1;j++) { yj=c+j*g; s3=s3+f(xi,yj); } } T=h*g*(r+(s1+s2)/2+s3); cout << "Vlera e integralit T=" << T << "n"; return 0; }
  • 284. Integrimi numerik 281 // Nënprogrami double f(double x,double y) { return 1/pow(x+y,2); } Rezultati që do të shtypet në ekran, nëse ekzekutohet programi i dhënë, është: Vlera e integralit T=0.0408994
  • 285. Metoda Runge-Kutta 284 Metoda Kutta-Merson 287
  • 286. 284 Algoritmet Për zgjidhjen e ekuacioneve diferenciale lineare përdoren metoda të ndryshme numerike. Këtu do të jepen metodat Runge-Kutta dhe Kutta-Merson. Metoda Runge-Kutta Sipas metodës Runge-Kutta të rendit të katërt, për pikën (xi,yi), fillimisht llogariten vlerat e koeficientëve: r1 = f(xi, yi ) ⋅ h ⎛ h r ⎞ r2 = f⎜ xi + , yi + 1 ⎟ ⋅ h ⎝ 2 2⎠ ⎛ h r ⎞ r3 = f⎜ xi + , yi + 2 ⎟ ⋅ h ⎝ 2 2⎠ r4 = f(xi + h, yi + r3 ) ⋅ h përmes së cilëve pastaj gjendet pika vijuese (xi+1,yi+1), kështu: xi + 1 = xi + h yi + 1 = yi + {r1 + 2r2 + 2r3 + r4} 1 6 ku hapi i diferencimit llogaritet me shprehjen: x p − x0 h = n nëse kushtet fillestare merren (x0,y0) dhe zona e diferencimit [x0,xp] ndahet në n-pjesë. Shembull Zgjidhja e ekuacionit diferencial: dy = x2 + y dx përmes metodës Runge-Kutta, për kushtet fillestare x0=1 dhe y0=1.
  • 287. Diferencimi numerik 285 a. Bllok-diagrami Fillimi f(x,y)=x2+y n,x0,y0,xp x -x p 0 h= n x=x0 y=y0 i=1 r1=f(x,y)⋅h ⎛ h r1 ⎞ r = f⎜ x + ,y + ⎟⋅h 2 ⎝ 2 2 ⎠ ⎛ h r2 ⎞ r = f⎜ x + ,y + ⎟⋅h 3 ⎝ 2 2 ⎠ r4=f(x+h,y+r3)⋅h y=y+ 1 (r + 2⋅r + 2⋅r + r 6 1 2 3 4 ) x=x+h i,x,y i=i+1 Po i≤n Jo Fundi Fig.12.1
  • 288. 286 Algoritmet b. Programi // Programi Prg12_1 #include <iostream> #include <cmath> #include <iomanip> using namespace std; double f(double x,double y); int main() { const int n=10; const double x0=1,y0=1,xp=2; int i; double x,y,h,r1,r2,r3,r4; h=(xp-x0)/n; x=x0;y=y0; cout << " i x y" << "n------------------------" << "n"; cout.setf(ios::fixed); for (i=1;i<=n;i++) { r1=f(x,y)*h; r2=f(x+h/2,y+r1/2)*h; r3=f(x+h/2,y+r2/2)*h; r4=f(x+h,y+r3)*h; y=y+(r1+2*r2+2*r3+r4)/6; x=x+h; cout.width(4); cout << i; cout.precision(2); cout.width(8); cout << x; cout.precision(5); cout.width(11); cout << y << "n"; } return 0; } // Nënprogrami double f(double x,double y) { return pow(x,2)+y; }
  • 289. Diferencimi numerik 287 Pas ekzekutimit të programit, rezultatet që shtypen në ekran duken: i x y ------------------------ 1 1.10 1.22103 2 1.20 1.48842 3 1.30 1.80915 4 1.40 2.19095 5 1.50 2.64233 6 1.60 3.17271 7 1.70 3.79251 8 1.80 4.51324 9 1.90 5.34761 10 2.00 6.30968 Metoda Kutta-Merson Gjatë zgjidhjes së ekuacioneve diferenciale sipas metodës Kutta-Merson, vlera e pikës vijuese të funksionit yi+1 caktohet duke shfrytëzuar vlerën e pikës paraprake yi: yi + 1 = yi + 1 (k1 + 4k4 + k5 ) 6 ku koeficientët e veçantë llogariten përmes shprehjeve: k1 = f(xi, yi ) ⋅ h ⎛ h k ⎞ k2 = f⎜ xi + , yi + 1 ⎟ ⋅ h ⎝ 3 3⎠ ⎛ h k + k2 ⎞ k3 = f⎜ xi + , yi + 1 ⎟ ⋅ h ⎝ 3 6 ⎠ ⎛ h k1 3 ⎞ k4 = f⎜ xi + , yi + + k3 ⎟ ⋅ h ⎝ 2 8 8 ⎠ ⎛ k1 3 ⎞ k5 = f⎜ xi + h , yi + − k3 + 2k4 ⎟ ⋅ h ⎝ 2 2 ⎠ Nëse kushtet fillestare merren (x0,y0) dhe zona e diferencimit [x0,xp] ndahet në n-pjesë, hapi përkatës i diferencimit është: x p − x0 h = n Shembull Zgjidhja e ekuacionit diferencial: dy 1 = xy dx 2 përmes metodës Kutta-Merson, për kushtet fillestare x0=1 e y0=1, si dhe xp=1 e n=10.
  • 290. 288 Algoritmet a. Bllok-diagrami Fillimi f(x,y)= (x ⋅ y)/2 n,x0,y0,xp h = (x p - x 0)/2 x=x0 y=y0 i=1 k1=f(x,y)⋅h ⎛ h k1 ⎞ k = f⎜ x + ,y + ⎟⋅h 2 ⎝ 3 3 ⎠ ⎛ h ( k1 + k 2 ) ⎞ k = f⎜ x + ,y + ⎟⋅h 3 ⎝ 3 6 ⎠ ⎛ h k 3 ⎞ k = f⎜ x + ,y + 1 + ⋅ k ⎟ ⋅ h 4 ⎝ 2 8 8 3 ⎠ ⎛ k 3 ⎞ k5 = f⎜ x + h,y + 1 − ⋅ k3 + 2 ⋅ k4 ⎟ ⋅ h ⎝ 2 2 ⎠ y = y +(k1 + 4k4 + k5)/6 x=x+h i,x,y i=i+1 Po i≤n Jo Fundi Fig.12.2
  • 291. Diferencimi numerik 289 b. Programi // Programi Prg12_2 #include <iostream> #include <iomanip> using namespace std; double f(double x,double y); int main() { const int n=10; const double x0=0,y0=1,xp=1; int i; double x,y,h,k1,k2,k3,k4,k5; h=(xp-x0)/n; x=x0;y=y0; cout << " i x y" << "n------------------------" << "n"; cout.setf(ios::fixed); for (i=1;i<=n;i++) { k1=f(x,y)*h; k2=f(x+h/3,y+k1/3)*h; k3=f(x+h/3,y+(k1+k2)/6)*h; k4=f(x+h/2,y+k1/8+(3*k3)/8)*h; k5=f(x+h,y+k1/2-(3*k3)/2+2*k4)*h; y=y+(k1+4*k4+k5)/6; x=x+h; cout.width(4); cout << i; cout.precision(2); cout.width(8); cout << x; cout.precision(5); cout.width(11); cout << y << "n"; } return 0; } // Nënprogrami double f(double x,double y) { return (x*y)/2; } Pas ekzekutimit të programit, vlerat numerike të cilat fitohen si zgjidhje e ekuacionit diferencial, në ekran do të shtypen kështu: i x y ------------------------ 1 0.10 1.00250 2 0.20 1.01005 3 0.30 1.02276 4 0.40 1.04081 5 0.50 1.06449 6 0.60 1.09417 7 0.70 1.13032 8 0.80 1.17351 9 0.90 1.22446
  • 292. 290 Algoritmet 10 1.00 1.28403
  • 293. Agni H. Dika Fakulteti i Inxhinierisë Elektrike dhe Kompjuterike Prishtinë ALGORITMET njohuri themelore me programe në gjuhën C++ Lektor Dr. Ilaz Metaj Kopertina AfiDesign Shtypi Adea Prishtinë Copyright © 2007