E-gradiva > Računalništvo > Programiranje > Upravljanje s programirljivimi napravami > Ponavljanje > Primer z zanko while

Prijava

Primer z zanko while

Poglejmo si kako bi se lotili izdelave programa za izračun povprečne vrednosti ocen kontrolnih nalog dijakov. Koliko ocen bomo vnesli ni znano pred začetkom izvajanja programa.

 

VHOD:

   Ocene kontrolnih nalog dijakov.   

 IZHOD:

   Povprečna vrednost ocen.    

 

Operacije:

   Srednjo vrednost ocen izračunamo tako, da seštejemo vse ocene dijakov in jih delimo s številom ocen.

 

ALGORITEM:

  

Korak 1: Algoritem opišimo z manj podrobnostmi:

  

    Inicializiraj (postavi vrednosti spremenljivk na 0) vsoto in število kontrolnih nalog dijakov.

    Izračunaj vsoto.

    Izračunaj srednjo vrednost.

    Izpiši srednjo vrednost.

 

Korak 2: Algoritem razdelajmo podrobneje. Ocene prištevajmo k vsoti tako dolgo, dokler ne vnesemo ocene z vrednostjo -1. Upoštevajmo, da srednje vrednosti ne moremo izračunati, če nismo vnesli nobene ocene, saj bi pri deljenju vsote vseh ocen z nič prišlo do napake.

  

    Inicializiraj (postavi vrednosti spremenljivk na 0) vsoto in število kontrolnih nalog dijakov.

   // Izračunaj vsoto bomo razdelali podrobneje:

       Vnesi prvo oceno

       while nisi vnesel ocene  z vrednostjo -1

                           število kontrolnih nalog dijakov povečaj za 1

                           vsoti prištej oceno

                           vnesi oceno

       // preverimo, če smo vnesli vsaj eno oceno (ali je število kontrolnih nalog dijakov večje od 0)

       if število kontrolnih nalog dijakov večje od  0

          srednja vrednost  =  vsota  /  število kontrolnih nalog dijakov

          izpiši srednjo vrednost

      else

          izpiši, da srednje vrednosti nismo mogli izračunati, ker   nismo vnesli nobenega študenta

 

Programska koda ima naslednjo obliko: 

 

// Izracun povprecne ocene ocen kontrolnih nalog dijakov
// z uporabo markerja (-1) za konec vnosa ocen v zanki
#include <iostream>
#include <iomanip>
using namespace std;

int
main()
{

float
povprecje; // realno stevilo za povprecno oceno
int stevec_kontrolnih_nalog, ocena, vsota;

// inicializacija spremenljivk
vsota = 0;
stevec_kontrolnih_nalog = 0;

// izracun vsote
cout << "Vpisi oceno, -1 za konec vnosa ocen: ";
cin >> ocena;

while
(ocena != -1) {
vsota += ocena;
stevec_kontrolnih_nalog++;
cout << "Vpisi oceno, -1 za konec vnosa ocen: ";
cin >> ocena;
}


// preverimo, če smo vnesli vsaj eno oceno (ali je število kontrolnih nalog dijakov večje od 0)
 	if (stevec_kontrolnih_nalog != 0) {
povprecje = (float) vsota / stevec_kontrolnih_nalog;
cout << "Povprecna ocena kontrolnih nalog je: " << setprecision(2)
<<
setiosflags(ios::fixed | ios::showpoint)
<<
povprecje << endl;

}

else

cout << "Nobene ocene nismo vnesli, zato ne moremo izračunati srednje vrednosti." << endl;

return
0; // Program se je uspešno zaključil
}

Prefiksni in postfiksni izrazi

V gornjem programu smo spoznali nova operatorja ++ in +=. 

 

Prireditveni stavek vsota += ocena;  je krajši zapis prireditvenega stavka vsota =vsota+ocena.

V stavku vsota += ocena; se izvede operacija prištevanja rezultata aritmetičnega izraza (na desni strani operatorja +) spremenljivki, rezultat pa je nova vrednost spremenljivke.  

 

Ostali operatorji so še:

Prireditveni stavek stevec_kontrolnih_nalog++; je krajši zapis prireditvenega stavka stevec_kontrolnih_nalog = stevec_kontrolnih_nalog + 1; V našem primeru smo uporabili postinkrementalni operator.

 

Ločimo predinkrementalne in postinkrementalne operatorje. Če uporabimo v drugem stavku (npr. znotraj izpisa, v pogoju, v ponovitvenem stavku) predinkrementalni operator, se najprej trenutni vrednosti spremenljivke  prišteje vrednost 1, nato pa se rezultat uporabi.

 

Poglejmo primer stavka, kjer uporabimo predinkrementalni operator:

stevec_kontrolnih_nalog = 0;
cout << "Uporaba predinkrementalnega operatorja: "<<++stevec_kontrolnih_nalog << endl;

 

V tem primeru se najprej vrednost spremenljivke stevec_kontrolnih_nalog poveča za 1 (vrednost se poveča iz 0 na 1) in nato izpiše. Na zaslonu se izpiše: "Uporaba predinkrementalnega operatorja: 1".

 

Poglejmo si še uporabo postinkrementalnega operatorja:

stevec_kontrolnih_nalog = 0;
cout << "Uporaba postinkrementalnega operatorja: "<< stevec_kontrolnih_nalog++ << endl;

 

V tem primeru se najprej izpiše vrednost spremenljivke stevec_kontrolnih_nalog nato pa se vrednost spremenljivke poveča za 1 (vrednost se poveča iz 0 na 1) . Na zaslonu se izpiše: "Uporaba postinkrementalnega operatorja: 0".

 

Če uporabimo namesto operatorja "++", operator "--", vrednost spremenljivke zmanjšamo za 1. Če je operator "--" pred spremenljivko, mu pravimo preddekrementalni operator, če pa je za spremenljivko mu pravimo postdekrementalni operator.

Vhodno-izhodni manipulatorji 

Poglejmo stavek za izpis povprečne ocene:

cout << "Povprecna ocena kontrolnih nalog je: " << setprecision(2)
  <<
setiosflags(ios::fixed | ios::showpoint)
  <<
povprecje << endl;
 
 

V tem stavku smo uporabili vhodno-izhodne manipulatorje, ki smo jih vključili s pomočjo vključitvenenega stavka #include <iomanip>. Definirani so v razredu ios (v njem najdemo metode za delo z vhodno-izhodnimi enotami), zato se njihova definicija  začne z "ios::". V našem primeru smo uporabili vhodno-izhodne manipulatorje zato da smo izboljšali izpis podatkov.  Uporabili smo naslednje manipulatorje:

 

setprecision(2)        - spremenljivko (v našem primeru povprecje) izpišemo na dve decimalni mesti natančno.

ios::fixed                  - realno število izpišemo v neeksponentni obliki (npr. število 100,33 izpišemo kot 100.33).

ios: showpoint          - izpišemo decimalno piko v realnem številu.

 

Pogosto se uporablajo še naslednji vhodno-izhodni manipulatorji:

 

ios:scientific             realno število izpišemo v eksponentni obliki (npr. število 100,33 izpišemo kot 0.10033 E03).  Ta nastavitev je privzeta in jo ni potrebno nastaviti. Nastavimo jo samo v primeru, če smo predtem nastavili izpis realnega števila v neeksponentni obliki
ios::left                      izpis poravnamo levo.
ios::right  izpis poravnamo desno
ios::dec  izpis števila v desetiškem številskem sestavu; Ta nastavitev je privzeta.
ios::hex izpis števila v heksadecimalnem številskem sestavu
ios::oct  izpis števila v osmiškem številskem sestavu
ios::showpos izpis predznaka pred vrednostjo števila tudi če je število pozitivno.
setw(širina izpisa)  nastavitev širine izpisa (npr. setw(8) za izpis vrednosti spremenljivke rezervira 8 mest; Če vrednosti spremenljivke ali izraza zaradi drugih manipulatorjev ne moremo izpisati na 8 mest, se ta operator ingnorira).
endl izpis znaka '\n' - skok v novo vrstico pri izpisu
ends izpis znaka '\0' - dodajanje znaka za konec niza znakov
setioflags nastavljanje zastavic pri izpisu ( v našem primeru smo nastavili zastavici  fixed in showpoint - setiosflags(ios::fixed | ios::showpoint))
 
resetioflags nastavljanje zastavic na privzete vrednosti. Ta nastavitev se uporablja, ko smo prej spremenili vrednosti zastavic in sedaj želimo, da te zastavice dobijo privzeto vrednost. 

setfill

nastavitev znaka za zapolnjevanje praznih mest; Primer je setfill('*'), ki nam na mesta, kjer so se prej izpisovala prazna mesta izpiše znake *. Poglejmo si primer programske kode: 

double test=10.334; 
cout << setw(10) << setprecision(2) <<setfill('*')
<<
setiosflags(ios::fixed | ios::showpoint)
<<
test << endl;
Rezultat izpisa spremenljivke test je *****10.33

 

Pretvorbeni  operator

V stavku:

povprecje = (float) vsota / stevec_kontrolnih_nalog;

 

je uporabljen takoimenovani eksplicitni pretvorbeni operator (angl. "cast operator"). Gre za eksplicitno pretvorbo spremenljivke vsota,  ki je celo števili v realno število (to storimo s (float) vsota).  Če ne bi uporabili tega operatorja bi bil rezultat izračuna aritmetičnega izraza celo število, kjer bi se odrezale decimalna mesta (namesto 72.77 bi dobili 72).

 

Programski jezik C in njegovo nadaljevanje C++ omogočata implicitne pretvorbe v izrazih, kar lahko povzroča programerju precej preglavic pri prenosu programov med računalniki, ki uporabljajo različne prevajalnike in imajo različno arhitekturo in operacijski sistem. V teh dveh jezikih lahko izvajamo operacije med spremenljivkami, ki so različnih tipov (npr. lahko zmnožimo realno število z znakom - rezultat bo realno število, saj se bo znak pretvoril v njegovo ASCII kodo).

 

Možni so naslednji osnovni podatkovni tipi:

realna števila:

cela števila:

znaki:

 

Poleg  ekplicitnih pretvorb obstajajo standardne pretvorbe. Te izvršuje prevajalnik v mešanih izrazih. Veljajo naslednja pravila:

Primer:

char c;

short s;

int i;

 

c-s/i - rezultat je tipa  int.

 

Nasvet:

 

Uporabljajte eksplicitne pretvorbe spremenljivk različnih tipov v izrazih, če želite da bodo programi delovali tako kot si želite.

 

 

Prioriteta operatorjev po uvedbi zgoraj opisanih operatorjev je naslednja:

 

( )

++  --  +  -  ! (tip)

*  /  %

+  -

<<  >>

<  <=  >  >=

==  ! =

&&

||

?:

=  + =  -=  *=  /=  %=