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
}
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.
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; Rezultat izpisa spremenljivke test je *****10.33 |
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)
* / %
+ -
<< >>
< <= > >=
== ! =
&&
||
?:
= + = -= *= /= %=