Deltamu - Optimu - user experience 1 - Elodie 2018Deltamu
油
lodie optimise la gestion de son parc dinstruments de mesure gr但ce au logiciel Optimu : user experience #1
Fiche TD sur les syst竪mes informatiquesATPENSC-Group
油
Fiche de Travaux Dirig辿s d'exercices sur les syst竪mes informatiques permettant une bonne des 辿l竪ves pr辿paration au probatoire et baccalaur辿at (litt辿raire et scientifique) de l'enseignement secondaire g辿n辿ral pour la session 2015.
The document provides an overview of compiler design and the various phases involved in compiling a program from a high-level language to machine code. It describes the six main phases as lexical analysis, syntax analysis, semantic analysis, intermediate code generation, code optimization, and code generation. It explains the functions of each phase and how the output of one phase feeds into the next until an optimized machine code is produced for execution.
ROCm and Distributed Deep Learning on Spark and TensorFlowDatabricks
油
ROCm, the Radeon Open Ecosystem, is an open-source software foundation for GPU computing on Linux. ROCm supports TensorFlow and PyTorch using MIOpen, a library of highly optimized GPU routines for deep learning. In this talk, we describe how Apache Spark is a key enabling platform for distributed deep learning on ROCm, as it enables different deep learning frameworks to be embedded in Spark workflows in a secure end-to-end machine learning pipeline. We will analyse the different frameworks for integrating Spark with Tensorflow on ROCm, from Horovod to HopsML to Databrick's Project Hydrogen. We will also examine the surprising places where bottlenecks can surface when training models (everything from object stores to the Data Scientists themselves), and we will investigate ways to get around these bottlenecks. The talk will include a live demonstration of training and inference for a Tensorflow application embedded in a Spark pipeline written in a Jupyter notebook on Hopsworks with ROCm.
Team Emertxe explores the C programming language over several days. Day 1 introduces C and discusses its history, characteristics, standard, keywords, typical code structure, compilation process, data representations including numbers, characters, words, integers and floats, basic data types and modifiers, and conditional constructs like if, else if, switch case, for, while, and do while loops. C is presented as a flexible, efficient system programming language used widely in applications like operating systems, embedded systems, and drivers.
Why no auto negotiation for fiber optic media?MapYourTech
油
Attempts to develop auto-negotiation signaling for 10BASE-FL and 100BASE-FX fiber optic media failed because the media systems use different wavelengths and timing. This is why there is no IEEE standard for auto-negotiation on most fiber optic links, including 10 Gigabit Ethernet. While auto-negotiation was achieved for 1000BASE-X Gigabit Ethernet using identical encoding, the lack of auto-negotiation on fiber optic segments is not a major problem due to their use as backbone links where installers know the configuration.
This document discusses using the GNU Debugger (GDB) to debug programs. It begins with an introduction to GDB and why it is useful. Examples are then provided of using GDB for interactive debugging, examining core dumps, patching binaries, and advanced tricks. A real-world case study demonstrates using GDB to debug a crash in the GNU C library by examining assembly code and source-level debugging with debug symbols. The document concludes by mentioning another case study involving hijacking file descriptors in GDB.
The document provides an overview of compiler design and the various phases involved in compiling a program from a high-level language to machine code. It describes the six main phases as lexical analysis, syntax analysis, semantic analysis, intermediate code generation, code optimization, and code generation. It explains the functions of each phase and how the output of one phase feeds into the next until an optimized machine code is produced for execution.
ROCm and Distributed Deep Learning on Spark and TensorFlowDatabricks
油
ROCm, the Radeon Open Ecosystem, is an open-source software foundation for GPU computing on Linux. ROCm supports TensorFlow and PyTorch using MIOpen, a library of highly optimized GPU routines for deep learning. In this talk, we describe how Apache Spark is a key enabling platform for distributed deep learning on ROCm, as it enables different deep learning frameworks to be embedded in Spark workflows in a secure end-to-end machine learning pipeline. We will analyse the different frameworks for integrating Spark with Tensorflow on ROCm, from Horovod to HopsML to Databrick's Project Hydrogen. We will also examine the surprising places where bottlenecks can surface when training models (everything from object stores to the Data Scientists themselves), and we will investigate ways to get around these bottlenecks. The talk will include a live demonstration of training and inference for a Tensorflow application embedded in a Spark pipeline written in a Jupyter notebook on Hopsworks with ROCm.
Team Emertxe explores the C programming language over several days. Day 1 introduces C and discusses its history, characteristics, standard, keywords, typical code structure, compilation process, data representations including numbers, characters, words, integers and floats, basic data types and modifiers, and conditional constructs like if, else if, switch case, for, while, and do while loops. C is presented as a flexible, efficient system programming language used widely in applications like operating systems, embedded systems, and drivers.
Why no auto negotiation for fiber optic media?MapYourTech
油
Attempts to develop auto-negotiation signaling for 10BASE-FL and 100BASE-FX fiber optic media failed because the media systems use different wavelengths and timing. This is why there is no IEEE standard for auto-negotiation on most fiber optic links, including 10 Gigabit Ethernet. While auto-negotiation was achieved for 1000BASE-X Gigabit Ethernet using identical encoding, the lack of auto-negotiation on fiber optic segments is not a major problem due to their use as backbone links where installers know the configuration.
This document discusses using the GNU Debugger (GDB) to debug programs. It begins with an introduction to GDB and why it is useful. Examples are then provided of using GDB for interactive debugging, examining core dumps, patching binaries, and advanced tricks. A real-world case study demonstrates using GDB to debug a crash in the GNU C library by examining assembly code and source-level debugging with debug symbols. The document concludes by mentioning another case study involving hijacking file descriptors in GDB.
RP1 - Funkcije za rad s dinamikim poljem. Funkcije laniceGoran Igaly
油
C++ radna skripta
1. C++ RADNA SKRIPTA
STR.1 AUTOR: ILIJA MRENICA, ING.EL.
INSTALACIJA RAZVOJNOG OKRU貼ENJA DEV-C++
Duplim klikom mi邸a na program dev cpp dem c++ pokrenuti instalaciju. Odabrati engleski
jezik i pritisnuti I Agree. Odabrati punu instalaciju sa Full. Ostalo sve ii sa OK i Next.
POKRETANJE PRVOG PROGRAMA HELLO WORLD
Nakon instalacije razvojnog okru転enja Dev-C++ potrebno je napisati svoj prvi program
邸to je za veinu programera na svijetu bio Hello World:
#include <iostream>
using namespace std;
main() {
cout<<"Hello World!!!"<<endl;
}
Idemo sa File->New->Source File unijeti gornji tekst, koristiti Copy-Paste alat. Radi
preglednosti i kasnije lak邸e upotrebe programe snimiti u poseban direktorij nazvan C++ na
podatkovnoj particiji hard diska (npr. D). Potrebno je namjestiti izlazni direktorij na D/C++ u
varijablama okoline: Tools/Environment Options/Files&Dir/User's Default Directory mora
biti D:C++.
Zatim je program potrebno kompajlirati 邸to e odraditi Dev-C++ pritiskom na Ctrl+F9.
Kompajler je generirao helloworld.exe tj. izvr邸ni programski fajl kojeg moramo
pokrenuti, a da bi to uradili moramo se nalaziti u na邸em direktoriju D:C++ unutar Windows
konzole.
Pokrenuti Command Prompt sa /Start->All Programs->Accesories->Command Prompt/
Windows konzolu s kojom emo testirati napisane programe. Jo邸 samo treba nauiti kako doi
do programa koristei DOS komande. Sa CD.. se izlazi iz nekog direktorija, a sa D: npr. ulazi
na D particiju hard diska. DIR komanda e izlistati sve 邸to se nalazi u nekom direktoriju, a sa
CD ime direktorija emo ui u isti. Nakon 邸to smo do邸li do na邸eg direktorija D:C++
potrebno je pokrenuti program tako 邸to emo upisati ime programa npr. helloworld i pritisnuti
ENTER. Dolazak na D:C++helloworld ide na sljedei nain u Command Promptu (nakon
svake komande pritisnuti ENTER):
d:
cd c++
helloworld
Ako je program ispisao redak sa Hello World!!! znai da je sve postavljeno kako treba i da
mo転emo poeti sa programiranjem. Prozor Command Prompt ostaviti ukljuen dok god se
programira i testiraju programi.
Programski kod mora biti pregledan i po転eljno je dodati 邸to tanije komentare nakon linija
koda tako da program mogu razumjeti i drugi, a i sam autor nakon nekog vremena. Komentari
se dodaju sa dvije kose linije //. Sve nakon toga u istom redu kompajler ignori邸e. Du転i
komentari koji zauzimaju vi邸e redaka poinju se sa /*, a zavr邸avaju sa */. Sad emo
iskomentarisati programski kod helloworld u cilju njegovog obja邸njenja:
#include <iostream>
using namespace std; /* ukljuivanje koda biblioteke
standardnih ulazno-izlaznih funkcija u na邸 program */
main() { // uvijek pozivamo glavnu funkciju main
cout<<"Hello World!!!"<<endl; // endl za novi red
/* ispis poruke na ekran kori邸tenjem funkcije cout koja se
nalazi u biblioteci iostream.h, endl oznaava kraj linije */
} // uvijek zatvaramo glavnu funkciju main
2. C++ RADNA SKRIPTA
STR.2 AUTOR: ILIJA MRENICA, ING.EL.
PROGRAM ZA SABIRANJE DVA BROJA
Uradiemo jednostavan program za sabiranje dva cijela broja x+y=z. Od korisnika emo
tra転iti da unese x pa zatim y i ispisaemo na ekranu rezultat kao z. Kod je sljedei:
#include <iostream>
using namespace std;
main() {
int x, y, z;
cout << "Unesite x!" << endl;
cin >> x;
cout << endl;
cout << "Unesite y!" << endl;
cin >> y;
cout << endl;
z = x + y;
cout << "Zbir z=" << z << "." << endl << endl;
}
Prvo smo ukljuili iostream koja sadr転ava gotove funkcije za unos podataka sa tastature i
ispis podataka na ekran. Zatim smo deklarirali tri varijable x,y i z kao integer (cijeli
broj). Potom od korisnika tra転imo da unese x koju sa cin funkcijom dodjeljujemo varijabli
x. Sa funkcijom endl pravimo jedan red razmaka i tra転imo od korisnika da unese y, te se
stvar ponavlja. U retku z=x+y pridru転ili smo varijabli z zbir varijabli x i y te emo je zatim
ispisati na ekran. Zapamtite: = je operator pridru転ivanja, a ne jednakosti !!!
Obratiti pa転nju na sintaksu za ispis: cout<<"Zbir z="<<z<<"."<<endl; kako se
kombinira poruka u slovima pod navodnicima "poruka"sa varijablom iz programa unutar
znakova za manje i vee << varijabla >>. Vrlo jednostavno mo転emo kombinirati
jedne sa drugim unosei razmake i znakove interpunkcije.
DOMAA ZADAA
Za domau zadau instalirati Dev-C++ razvojno okru転enje. Program je besplatan i mo転e se
skinuti na www.bloodshed.net. Zatim podesiti kompajler te napisati i pokrenuti program
helloworld u obliku hellotvojeime. Nakon toga uraditi par programa koji obavljaju osnovne
raunske operacije nad cjelim brojevima koje su prethodno zatra転ili od korisnika da ih unesu i
ispisuju rezultat na ekranu. Ispis mora sadr転avati kombinaciju poruke i varijabli te mora biti
uredan.
UKLJUIVANJE MAKRODEFINICIJA
Makro je rije ije sve pojave u izvornom tekstu programa pretprocesor zamjenjuje
specificiranim nizom rijei, npr:
#define Pi 3.14 // nema ; na kraju !!!
e svaki Pi u programu zamjeniti sa vrijedno邸u 3.14. Ovo je vrlo znaajna mogunost
pretprocesora koja nam omoguuje da neke definirane ili konstantne vrijednosti u programu
mo転emo zamjeniti na jednom mjestu, u samom zaglavlju programa, tako da ih ne moramo
mjenjati na svakom mjestu u kodu gdje se pojavljuju. Definisani makro se mo転e ukinuti tako
da nakon naredbe #undef Pi kompajler ne pridodaje vi邸e Pi vrijednost 3.14.
3. C++ RADNA SKRIPTA
STR.3 AUTOR: ILIJA MRENICA, ING.EL.
NAREDBE U C++ ZA RAUNANJE MATEMATIKIH OPERACIJA
Ako se koriste druge osim osnovne 4 matematike operacije (+ - / *) i operator
modulus (%) u program potrebno je ukljuiti biblioteku matematikih funkcija cmath.
Uradiemo jednostavan program za stepenovanje broja tj. baze x sa eksponentom y,
programski kod je sljedei: pow(x,y) gdje je x baza, a y eksponent.
#include <iostream>
#include <cmath>
using namespace std;
main() {
float x, y;
cout << "Unesite bazu:" << endl;
cin >> x;
cout << "Unesite exponent:" << endl;
cin >> y;
x = pow(x, y);
cout << "Rezultat je: " << x << . << endl;
}
Napomena: Koristite take umjesto zareza kad unosite vrijednosti u program.
DOMAA ZADAA:
1. Matematike izraze napisati u obliku prihvatljivom za C++:
a) 1
)(
= n
b
a
y
b) 1
23
2
+
+
=
c
ab
b
dax
y
c) b
x
x
x
ax
y +
+
++
=
)sin(2
)84exp(
3
5
2. Ispitati rad modulus (%) operatora uvr邸tavanjem sljedeih izraza u program:
a) 9%2
b) 1%2
c) 4%2
4. C++ RADNA SKRIPTA
STR.4 AUTOR: ILIJA MRENICA, ING.EL.
OPERATORI
U C++ izrazi igraju va転nu ulogu pa C++defini邸e vei broj operatora od veine drugih jezika.
Operatori obavljaju operacije nad operandima, i mogu biti sljedeeg tipa:
Aritmetiki
+ (sabiranje) - (oduzimanje) * (mno転enje) /(djeljenje)
% (operator modulus daje ostatak pri djeljenju, npr. 9%2 e dati 1)
Relacioni
> >= < <=
= = (jednako) != (nije jednako)
Logiki
p q AND
p&&q
OR
p||q
NOT
!p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
Bitski (operatori nad bitovima)
& AND
| OR
^ XOR
~ komplement
>> pomjeranje udesno
<< pomjeranje ulijevo
Inkrement i dekrement
++a ili a++ za inkrement (uveanje za 1 ili a+1)
--a ili a-- za dekrement (umanjenje za 1 ili a-1)
5. C++ RADNA SKRIPTA
STR.5 AUTOR: ILIJA MRENICA, ING.EL.
NAREDBE U C++ ZA GRANANJE TOKA PROGRAMA
if
Naredba if omoguava uvjetno grananje toka programa ovisno o tome da li je ili nije
zadovoljen uvjet naveden iza kljune rijei if. Najjednostavniji oblik naredbe za uvjetno
grananje je:
if (logiki izraz)
{
blok naredbi;
}
Ako je vrijednost izraza iza rijei if logika istina (true), izvodi se blok naredbi koje
slijede iza izraza. U protivnom se taj blok preskae i izvo単enje nastavlja od prve naredbe iza
bloka. Na primjer:
if (a<0)
{
cout << Broj a je negativan! << endl;
}
Ako 転elimo da se neovisno o rezultatu izraza u if uvjetu izvode dva nezavisna programska
dijela, primjeniemo if else oblik uvjetnog grananja:
if (logiki izraz)
{
blok naredbi;
}
else
{
blok naredbi;
}
Kod ovog bloka, ako izraz u if uvjetu daje kao rezultat logiku istinu izve邸e se prvi blok
naredbi. Po zavr邸etku bloka, izvo単enje programa se nastavlja iza else bloka. Ako izraz daje
logiku neistinu (false) preskae se prvi blok iza if i izvr邸ava se onaj pod else nakon
ega program nastavlja izvo単enje naredbi koje slijede.
Zadatak: Napisati program koji e ispitati da li je une邸eni broj cijeli broj manji od nule,
jednak nuli ili vei od nule, te rezultat kao poruku ispisati na ekran.
if else if - else
Blokovi if mogu se nadovezivati na sljedei nain:
if (prvi logiki izraz)
{prvi blok naredbi}
else if (drugi logiki izraz)
{drugi blok naredbi}
6. C++ RADNA SKRIPTA
STR.6 AUTOR: ILIJA MRENICA, ING.EL.
else if (trei logiki izraz)
{trei blok naredbi}
...
else {zadnji blok naredbi}
Ilustriraemo upotrebu ove strukture primjerom u kojem tra転imo kakvi su korijeni kvadratne
jednaine ispitivanjem diskriminante:
#include <iostream>
using namespace std;
int main()
{
float a,b,c;
cout << Unesite koeficijente kvadratne jednaine:
<< endl;
cout << a=;
cin >> a;
cout << b=;
cin >> b;
cout << c=;
cin >> c;
float D=b*b-4*a*c; // odre単ivanje diskriminante
cout << Jednaina ima ; // ispis prvog dijela poruke
/* ispis drugog dijela poruke ovisno o uvjetu koji
diskriminanta ispunjava */
if (D==0)
{cout << dvostruki realni korijen. << endl;}
else if (D>0)
{cout << dva realna korijena. << endl;}
else
{cout << dva kompleksna korijena. << endl;}
}
for petlja
Tamo gdje se ponavljaju djelovi koda koristimo for petlju u sljedeem obliku:
for (poetni izraz; uvjet izvo単enja; izraz prirasta)
{blok naredbi}
Poetni izraz je naje邸e poetna vrijednost brojaa, uvjet izvo単enja mora biti istinit da bi se
izveo blok naredbi, a na kraju se rauna izraz prirasta tj. poveanje ili smanjenje brojaa.
Ilustriraemo upotrebu for petlje kroz sljedei primjer, program koji rauna sumu svih
7. C++ RADNA SKRIPTA
STR.7 AUTOR: ILIJA MRENICA, ING.EL.
parnih brojeva od 1 do nekog broja N ukljuujui i taj broj. Da li je broj paran ili ne
odre単ujemo tako 邸to cijeli broj i ispitujemo sa aritmetikim operatorom modulus % za ostatak
pri djeljenju sa 2 koji mora biti 0 za svaki paran broj.
PROGRAM KOJI UITAVA PRIRODNI BROJ N I RAUNA SUMU
SVIH PARNIH BROJEVA OD 1 DO N UKLJUUJUI I N
#include <iostream>
using namespace std;
main()
{
int N, i;
int k=0; /* varijabla k se mora inicijalizirati, u
protivnom mo転emo imati gre邸ku u programu */
cout << "Unesite N!" << endl;
cin >> N;
cout << endl;
for(i=0; i<=N; i++)
{
if(i%2==0) {k=k+i;}
/* ako je ostatak pri djeljenju sa 2 jednak 0 broj je paran pa
uveavamo rezultat k za i - broj koji se obra単uje u tom
momentu u petlji; rezultat k ispisijemo na izlasku iz petlje
*/
}
cout << "Rezultat je: " << k << "." << endl;
}
do-while petlja
- se koristi za izvr邸avanje odre単enog bloka naredbi sve dok se odre単eni uslov ne izvr邸i,
sintaksa je:
do
{
blok naredbi;
}
while (logiki izraz);
DOMAA ZADAA: Napisati program koji e tra転iti od korisnika da pogodi neko slovo i
ispisivati tu poruku na ekran sve dok korisnik ne pogodi to slovo. Ulazni podatak deklarirati
kao char x = 'b'; gdje je b slovo koje se poga単a. Kad korisnik pogodi slovo ispisati
prikladnu poruku.
switch case struktura za kontrolu toka programa
- koristi se umjesto ifelse if-else strukture u situacijama gdje postoji vi邸e od tri
razliita rezultata ispitivanog logikog iskaza. Openita sintaksa izgleda ovako:
switch (cjelobrojni_izraz) {
case: konstantan_izraz1: // prvi blok naredbi
case: konstantan_izraz2: // drugi blok naredbi
8. C++ RADNA SKRIPTA
STR.8 AUTOR: ILIJA MRENICA, ING.EL.
break;
case: konstantan_izraz3:
case: konstantan_izraz4: // trei blok naredbi
break;
default: // etvrti blok naredbi
}
Upotrebu switch-case strukture vidjeemo u sljedeem programu:
// mjesec.cpp
#include <iostream>
using namespace std;
main () {
int mjesec;
cout << "Unesite broj 1 do 12 za mjesec: ";
cin >> mjesec;
switch (mjesec) {
case 1:{cout<<"januar";
break;}
case 2:{cout<<"februar";
break;}
case 3:{cout<<"mart";
break;}
case 4:{cout<<"april";
break;}
case 5:{cout<<"maj";
break;}
case 6:{cout<<"juni";
break;}
case 7:{cout<<"juli";
break;}
case 8:{cout<<"avgust";
break;}
case 9:{cout<<"septembar";
break;}
case 10:{cout<<"oktobar";
break;}
case 11:{cout<<"novembar";
break;}
case 12:{cout<<"decembar";
break;}
default:{cout<<"pogresan unos";
break;}
}
}
9. C++ RADNA SKRIPTA
STR.9 AUTOR: ILIJA MRENICA, ING.EL.
UGRA丹ENI ILI OSNOVNI TIPOVI PODATAKA U C++
Tip Znaenje irina u bajtima Opseg
char Karakter (slovo) 1 -128 do 127
int Cijeli broj 2 -32768 do 32767
long int Cijeli broj 4 -2147483648 do
2147483648
float Broj u pokretnom
zarezu (7 decimala)
4 3.4e-38 do 3.4e+38
double Brojevi u pokretnom
zarezu dvostruke
preciznosti (15 dec.)
8 -1.7e-308 do
1.7e+308
long double Brojevi u pokretnom
zarezu dvostruke
preciznosti (18 dec.)
10 3.4e-4932 do
3.4e+4932
Ako je prije tipa navedemo unsigned npr. unsigned char to znai da radimo samo sa
pozitivnim brojevima pa se opseg poveava za 2 puta jer bit za predznak koristimo za prikaz
podatka, pa bi npr. unsigned char imao opseg 0-255 umjesto -128 do 127.
Da ispitamo koliko memorije zauzimaju pojedini tipovi na raunaru, 邸to zavisi od arhitekture
raunara koji koristimo, primjeniemo unarni operator sizeof(). Na primjer:
float f;
cout << sizeof(f) << endl; // du転ina tipa float
ZADATAK: Ispitati sve osnovne tipove podatka koristei sizeof().
10. C++ RADNA SKRIPTA
STR.10 AUTOR: ILIJA MRENICA, ING.EL.
OPERATOR DODJELE TIPA static_cast
Probajmo sljedei jednostavni primjer djeljenja dva broja izvesti na raunaru:
#include <iostream>
using namespace std;
main() {
int x = 1;
int y = 2;
float z = x / y;
cout << z << endl;
}
Oekujemo da e program ispisati taan rezultat 0.5 jer smo isti deklarirali kao float,
me単utim program je podjelio dva cijela broja prije ispisa rezultata i pridru転io cjelobrojni
rezultat tipu float pa je isti 0 邸to je netano, tako da smo ustvari zakasnili sa deklaracijom.
U ovom sluaju bilo je potrebno promijeniti tip podatka varijabli koje e se dijeliti iz int u
float 邸to inimo sa operatorom dodjele tipa static_cast na sljedei nain:
#include <iostream>
using namespace std;
main() {
int x = 1;
int y = 2;
float z = static_cast<float>(x) /
static_cast<float>(y);
cout << z << endl;
}
Opi oblik primjene operatora static_cast je: static_cast<tip>(izraz).
Bitno je napomenuti da varijable nakon upotrebe ovog operatora u programu i dalje ostaju
tipa int. Ako ovaj operator vi邸e puta koristimo u programu nad istim podacima znai da
tipovi podataka za te varijable nisu dobro projektovane u tom programu.
11. C++ RADNA SKRIPTA
STR.11 AUTOR: ILIJA MRENICA, ING.EL.
UGNJE貼丹AVANJE FOR PETLJI
Ugnje転単ene for petlje se vrlo esto koriste pa emo pokazati kako na sljedeem primjeru
programa koji rauna i ispisuje tablicu mno転enja:
#include <iostream>
#include <iomanip>
using namespace std;
main() {
for (int red=1; red<=10; red++) {
for (int kolona=1; kolona<=10; kolona++)
cout << setw(5) << red*kolona;
cout << endl;
}
}
Za svaku vrijednost vanjskog brojaa red izvodi se cjelokupna unutra邸nja petlja kolona :
red=1;
kolona=1, 2, 3, 4, 5, 6, 7, 8, 9, 10.
red=2;
kolona=1, 2, 3, 4, 5, 6, 7, 8, 9, 10.
itd...
U program je ukljuena biblioteka iomanip koja posjeduje kori邸tenu funkciju setw() za
razmak izme単u brojeva pri ispisu, parametar unutar zagrada odre単uje 邸irinu razmaka.
12. C++ RADNA SKRIPTA
STR.12 AUTOR: ILIJA MRENICA, ING.EL.
FUNKCIJE U C++
Funkcije se prave da se izbjegne ponavljanje koda i smanji mogunost gre邸ke. Funkcije
omoguavaju da se program razbije na vi邸e manjih djelova. Programski kod postaje
razumljiviji i pregledniji. Opi oblik deklaracije ili zaglavlja funkcije (prototip) je sljedei:
izlazni_tip ime_funkcije(parametar1, parametar2, ...)
Funkcija se deklari邸e poslije zaglavlja #include i definicija #define, a prije poziva
funkcije main(). Tijelo funkcije se stavlja ispod zavr邸etka funkcije main }. Uvo単enjem
funkcija programi dobijaju sljedei oblik:
#include ...
#define ...
deklaracija funkcija koje e se pozivati u main
main{
... programski kod
poziv funkcije ...
... programski kod
... programski kod
poziv funkcije, itd...
}
definicije (tijela) funkcija koje su se pozivale u main
U definiciji funkcije je sadr転an programski kod (tijelo) funkcije, ono izgleda ovako:
izlazni_tip ime_funkcije(parametar1, parametar2, ...)
{
deklaracije lokalnih varijabli;
linije koda koji se izvr邸ava unutar funkcije;
return izlazna_varijabla;
}
Ako nema izlazne varijable izlazni tip je definiran kao void, a return poziv na kraju se ne
navodi. Funkcije se mogu pozivati po vrijednosti i po referenci. Varijable unutar funkcije su
lokalne za funkciju 邸to znai da nisu vidljive van funkcije, nastaju pozivom funkcije, a nestaju
kad se izvr邸i return.
// Primjer poziva funkcije po vrijednosti faktorijel
#include <iostream>
using namespace std;
double fakt(int n); // deklaracija funkcije
// mo転e samo int bez n ali je razumljivije ovako
main() {
int n;
cout << "Unesite broj manji od 171:" << endl;
cin >> n; // 171 ve unosi preljev za tip double
cout << "Faktorijel od " << n << " je: " << fakt(n) << endl;
} // fakt(n) je poziv funkcije, predan joj je une邸eni n
13. C++ RADNA SKRIPTA
STR.13 AUTOR: ILIJA MRENICA, ING.EL.
double fakt(int n) { // tijelo funkcije
double rezultat=1; // obavezna inicijalizacija
for (int i=1; i<=n; i++)
{rezultat*=i;}
return rezultat; // rezultat izlazi iz funkcije
}
S obzirom da su varijable unutar svake funkcije lokalne nemogue je npr. napraviti funkciju
za zamjenu dva broja pozivom po vrijednosti. Varijable e se zamjeniti unutar funkcije, a u
programu e ostati iste. U ovom sluaju moramo koristiti poziv funkcije po referenci. Ova se
funkcija esto koristi kao pomona funkcija u algoritmima sortiranja kad je potrebno
zamijeniti pozicije dva elementa u nizu koji se sortira:
void zamjeni(int& x, int& y) // x i y su ulazni parametri
{
int z=x; // x stavljam u privremeni spremnik z
x=y; // y stavljam u x
y=z; // z stavljam u y i zamjena je izvr邸ena
}
& (ampersand) iza tipa varijable znai da se funkciji proslje単uje adresa varijable. Ovdje je
izlazni tip void jer funkcija ne vraa ni邸ta, ona samo vr邸i zamjenu ve postojeeg.
ZADATAK: Za sljedei program napisati funkciju koja e odrediti srednju vrijednost za
une邸ena tri decimalna broja:
#include <iostream>
using namespace std;
float srednja3(float a, float b, float c);
main () {
float a, b, c;
cout << "Koristite tacke umjesto zareza!" << endl;
cout << "Unesite a: " << endl;
cin >> a;
cout << "Unesite b: " << endl;
cin >> b;
cout << "Unesite c: " << endl;
cin >> c;
cout << "Srednja vrijednost je: " << srednja3(a, b, c);
}
DOMAA ZADAA: Koristei funkciju za faktorijel napisati program za raunanje
binominalnog koeficijenta prema sljedeoj formuli:
14. C++ RADNA SKRIPTA
STR.14 AUTOR: ILIJA MRENICA, ING.EL.
IZRADA MENIJA PROGRAMA
Za邸to se koristi atoi() funkcija pri pravljenju menija programa? Probaemo
funkcionalnost ovog menija bez upotrebe atoi funkcije u situaciji kad korisnik umjesto
broja unese slovo.
#include <iostream>
using namespace std;
main() {
int meni; // bri邸e se poslije
//char opcija[40];
cout<<"MENI PROGRAMA"<<endl;
cout<<"1.Kocka"<<endl;
cout<<"2.Valjak"<<endl;
cout<<"3.Kugla"<<endl;
cout<<"4.Izlaz iz programa"<<endl;
cout<<"Izaberite opciju: ";
cin>>meni; // bri邸e se poslije
//cin>>opcija;
//int meni=atoi(opcija);
switch(meni) {
case 1: cout<<"Kocka";
break;
case 2: cout<<"Valjak";
break;
case 3: cout<<"Kugla";
break;
case 0: exit(0);
default: exit(0); // ni邸ta nas ne ko邸ta ostaviti default...
}
}
Kako radi atoi() funkcija? Pretvara string (niz karaktera) u cijeli broj ako je na poetku
stringa cijeli broj, a ako nije izlaz je 0. Testirajte je na sljedee stringove: kd, 1gfd, 125ftz...
#include <iostream>
using namespace std;
main()
{
char s[20];
cout << "Unesite string za atoi(): ";
cin >> s;
cout << endl;
cout << "Pretvorena vrijednost stringa a je " << atoi(s);
}
Upotrebom atoi() funkcije ne mo転e se desiti da umjesto potrebne cjelobrojne vrijednosti u
switch-case izrazu dobijemo karakter. U kombinaciji sa case 0: exit(0); svaki
pogre邸an unos ili izabrana 0 osigurava izlaz iz programa.
15. C++ RADNA SKRIPTA
STR.15 AUTOR: ILIJA MRENICA, ING.EL.
ZAJEDNIKI PROJEKT GEOMETRIJSKA TIJELA
Znaaj funkcija mo転emo vidjeti u ovom jednostavnom projektu koji e napraviti grupa
uenika. Potrebno je napraviti zaglavlje geot.h u kojem se nalazi zbirka funkcija za izraun
povr邸ine i zapremine raznih geometrijskih tijela npr. kocka, prizma, kugla, itd (vidi
logaritamske tablice). U glavnom programu napraviti meni (izbornik) koji e na poetku
izvo単enja programa ponuditi korisniku spisak geometrijskih tijela pod rednim brojevima, npr:
1. Kocka
2. Prizma
3. Kugla, itd...
0. Izlaz
Meni rje邸iti strukturom switch-case. Odabir se vr邸i upisivanjem broja tijela (1, 2, 3, itd),
za default sluaj i case 0 koristiti funkciju exit(0). Koristiti funkciju atoi() pri
izradi menija za osiguranje od pogre邸nog unosa. Meni staviti u beskonanu petlju. Unutar
pojedinih sluaja u meniju pozivaju se odgovarajue funkcije za to tijelo, npr. case 1:
Kocka();. Svaka funkcija tra転i od korisnika potrebne varijable i vr邸i izraun, te ispisuje
rezultate.
2 uenika:
U Dev-C++ napraviti novi projekt, izabrati Console Application, ime projekta staviti
gtijela, projekt sadr転i gtijela.cpp i geot.h. Sve funkcije prikupiti i staviti u
zaglavlje geot.h, uraditi meni unutar gtijela.cpp. Na kraju projekta kompajlirati i
testirati program za svako pojedino tijelo.
Ostali uenici:
Izabrati jedno geometrijsko tijelo (osim kocke) iz logaritamskih tablica i uraditi za njega
odgovarajue funkcije za izraun povr邸ine i zapremine. Funkcije imenovati na sljedei nain,
npr. za kocku: Kocka. Ulazni tip podataka za sve funkcije je void jer funkcije ne vraaju
ni邸ta u glavni program, pozivaju se bez argumenata, znai i argumenti su tipa void.
// gtijela.cpp
#include <iostream>
#include "geot.h"
/* navodnici govore kompajleru da trazi tu datoteku u istom
direktoriju gdje je gtijela.cpp - na邸 radni direktorij C++ */
using namespace std;
extern void Kocka(void);
extern void Valjak(void);
extern void Kugla(void);
/* ovdje se dalje dodaju prototipovi funkcija, extern govori
kompajleru da je funkcija definirana u nekoj vanjskoj
datoteci,
kod nas je to geot.h */
main () {
char s[20];
cout << "PROGRAM ZA IZRACUN POVRSINE I ZAPREMINE
GEOMETRIJSKIH TIJELA" << endl;
cout << "1. Kocka" << endl;
cout << "2. Valjak" << endl;
cout << "3. Kugla" << endl;
cout << "0. Izlaz" << endl;
16. C++ RADNA SKRIPTA
STR.16 AUTOR: ILIJA MRENICA, ING.EL.
// ovdje se dalje dodaje listing geometrijskih tijela
for(;;){ // meni je unutar beskonane petlje
cout << "Izaberite opciju: ";
cin >> s;
int meni=atoi(s);
switch (meni) {
case 1: Kocka();
break;
case 2: Valjak();
break;
case 3: Kugla();
break;
case 0: exit(0);
break;
// ovdje se dalje samo dodaju opcije menija...
default: exit(0);
}
}
}
// geot.h
#include <cmath>
using namespace std;
void Kocka(void){
float a;
cout<<"Unesite duzinu stranice a: ";
cin>>a;
float P = 6 * a *a;
float Z = pow(a, 3);
cout<<"Povrsina kocke je: "<<P<<endl;
cout<<"Zapremina kocke je: "<<Z<<endl;
}
void Valjak(void){cout<<"Funkcija-za-valjak"<<endl;}
void Kugla(void) {cout<<"Funkcija-za-kuglu"<<endl;}
// ovdje se dalje samo dodaju funkcije za druga tijela...
17. C++ RADNA SKRIPTA
STR.17 AUTOR: ILIJA MRENICA, ING.EL.
JEDNODIMENZIONALNI NIZOVI U C++
Niz (engl. array) je lista promjenljivih istog tipa na koje se mo転e ukazivati preko istog imena.
Pojedinana promjenjljiva u nizu naziva se elemenat niza. Op邸ta forma deklaracije
jednodimenzionalnog niza u C++ je:
tip_promjenljive ime_niza[veliina_niza];
Jednodimenzionalni niz od 5 cijelih brojeva deklarisaemo na sljedei nain:
int niz[5]; // niz sadr転i 5 cijelih brojeva
U C/C++ je definisano da prvi elemenat u nizu ima indeks 0, 邸to znai da zadnji elemenat
prethodno definiranog niza mora imati indeks 4. Indeksi su bitni zbog toga 邸to pristupamo
pojedinanim elementima niza pomou njih. Npr, ako 転elimo da dodjelimo vrijednost 56
treem elementu na邸eg niza uradiemo to pomou njegovog indeksa:
niz[2] = 56;
Niz se mo転e i inicijalizirati pri pisanju programa koristei sljedeu sintaksu:
int niz[] = {15, 6, 12, 3, -1};
gdje su unutar vitiastih zagrada inicijalizirane poetne vrijednosti niza.
Ako nisu inicijalizirani u toku pisanja programa, prethodno deklarisani nizovi se upisuju u
toku izvo単enja programa pomou tastature kori邸tenjem cin funkcije i for petlje. Analogno
tome, cout for bi se koristio za ispis niza.
Sljedei programski kod omoguava upis i ispis niza od 8 cijelih brojeva kori邸tenjem gore
navedenog:
// Ime programa: nizunos.cpp
#include <iostream>
#include <iomanip>
using namespace std;
#define N 8 // maksimalni broj elemenata niza
int main()
{
int i, A[N];
cout << "Unesite " << N << "-clani niz: " << endl;
cout<<"(nakon svakog broja pritisnite ENTER)" << endl;
for (i=0; i<N; i++) {cin >> A[i];} // upis niza
cout << "Uneseni niz je: ";
for (i=0; i<N; i++) {cout << A[i] << setw(5);} // ispis
cout<<endl;
}
18. C++ RADNA SKRIPTA
STR.18 AUTOR: ILIJA MRENICA, ING.EL.
PROGRAM KOJI UTVR丹UJE DA LI JE NIZ OPADAJUI ILI RASTUI
// Ime programa: kakavjeniz.cpp
#include <iostream>
using namespace std;
main()
{
int niz[]={1,2,5,11}; // niz je inicijaliziran
if(niz[1]>niz[0]) // ako je drugi lan vei od prvog
{cout<<"Niz je rastuci."<<endl;}
else
cout<<"Niz je opadajuci.";
}
Promijenite vrijednosti elemenata niza da niz bude opadajui i ispitajte ispravnost programa.
DOMAA ZADAA
a) Napraviti program koji e tra転iti od korisnika da unese 5-lani niz cijelih brojeva.
b) Ispisati taj niz s lijeva na desno i obrnuto.
c) Zamjeniti prvi i zadnji lan niza kori邸tenjem gotove funkcije zamjeni.
DODJELJIVANJE DINAMIKE MEMORIJE
Do sada su nizovi kojima smo radili bili inicijalizirani ili je njihova veliina morala biti
odre単ena u toku pisanja programa. C++ naravno ima mogunost dodjeljivanja dinamike
memorije u toku samog izvo単enja programa 邸to emo vidjeti u sljedeem primjeru gdje se
koristi kljuna rije new za alokaciju dinamike memorije i koristi se pokaziva (engl.
pointer) *:
// Ime programa: alokacija.cpp
#include <iostream>
#include <iomanip>
using namespace std;
main()
{
int n;
cout << Unesite duzinu niza: << endl;
cin >> n;
int *niz = new int[n]; // kreiranje niza
for (int i=0; i<n; i++) // upis
{
cout << Unesi broj:;
cin >> niz[i];
}
cout << Uneseni niz je: << endl << endl; // ispis
for (int i=0; i<n; i++) {cout << niz[i] << setw(5);}
cout<<endl;
}
19. C++ RADNA SKRIPTA
STR.19 AUTOR: ILIJA MRENICA, ING.EL.
SORTIRANJE ELEMENATA NIZA
Za sortiranje elemenata nekog niza koristiemo najjednostavniji algoritam selection-sort koji
se jo邸 naziva i izbor uzastopnih minimuma, a sastoji se iz sljedeih koraka:
1. Prona単i najmanji elemenat u nizu i zamjeni ga sa prvim
2. Prona単i drugi najmanji element u nizu i zamjeni ga sa drugim
3. To ponavljaj dok se niz ne sortira
// Ime programa: ssort.cpp
#include <iostream>
#include <iomanip>
using namespace std;
void zamjeni(int& x, int& y); // funkcija za zamjenu
void ssort(int niz[], int n); // funkcija selection-sort
main()
{
int n;
cout << "Unesite duzinu niza:" << endl;
cin >> n;
int *niz = new int[n];
for (int i=0; i<n; i++){
cout << "Unesite element niza: ";
cin >> niz[i];
}
cout << "Uneseni niz je: ";
for (int i=0; i<n; i++) {
cout << niz[i] << setw(5);
}
cout<<endl;
ssort(niz, n);
cout << "Sortirani niz je: ";
for (int x=0; x<n; x++){
cout<<niz[x]<<setw(5);
}
}
void zamjeni(int& x, int& y) // funkcija uzima dvije adrese
{
int z=x; x=y; y=z;
}
void ssort(int niz[], int n)
// funkcija uzima niz i duzinu tog niza
{
int x, y;
for (x=0; x<n; x++)
for (y=x+1; y<n; y++)
if (niz[x]>niz[y]) zamjeni(niz[x], niz[y]);
/* unutar funkcije ssort poziva se funkcija zamjeni, a u
argumentu poziva ne koristimo & nego dajemo dva elementa niza
*/
}