uvod u programiranje - · pdf fileprogramiranje •razrada logike (konstrukcija algoritma)...
Post on 15-Feb-2018
239 Views
Preview:
TRANSCRIPT
C/C++ sintaksa
UVOD U
PROGRAMIRANJE
1 Odjel za matematiku
PROGRAMIRANJE
uvod
Odjel za matematiku 2
Programiranje
• Razrada logike (konstrukcija algoritma)
• Pisanje izvornog oblika (implementacija algoritma u
programski jezik)
• Ispravljanje grešaka (debugging)
• Izrada dokumentacije za primjenu
3 Odjel za matematiku
Algoritam
• Algoritam – opis postupka koji nakon konačnog broja
koraka dovodi do rezultata
Primjer 1: “Popij mlijeko”
1. Otvori hladnjak.
2. Provjeri ima li mlijeka.
3. Ako ima, natoči u čašu i popij
inače, odi u trgovinu i kupi.
5. Ponovi korake 2.,3. sve dok nisi
zadovoljan količinom popijenog
mlijeka.
6. Spremi mlijeko u hladnjak
Primjer 2: “Babilonsko računanje ”
putadovoljnokorakponavljaj
yyypostavi
ypostavi
.2.3
)2
(2
1:.2
0.1:.1
2
4 Odjel za matematiku
Prikaz algoritma
Učitati
Računati
Ako je Da
Ne
Dijagram toka Strukturni dijagram tipova naredbi
- sekvencija
- selekcija uvjet
- iteracija uvjet
5 Odjel za matematiku
Prikaz algoritma Pseudo-code
Rečenice pisane u govornom jeziku ali u obliku “naredbi” tako da su “slične” naredbama u programskom jeziku
Zadati (učitati) podatak n Ako je n>=0 onda Za svaki i=1 do n postavi n=n * i
Ispisati rezultat n U suprotnom Ispisati poruku o pogreški Kraj selekcije
Sekvencija Selekcija
Iteracija
6 Odjel za matematiku
Elementi proceduralnog jezika
Odjel za matematiku 7
funkcije i procedure
deklarativne, izvršne komentari, naredbe
Imena, podaci,
operatori, ključne
riječi
alfanumerički,
numerički, posebni
znakovi riječi
rečenice naredbe
Elementi
blokovi
vanjske programske
strukture
tekst
Tipovi podataka
Odjel za matematiku 8
tipovi podataka u C++
Tipovi podataka
ugrađeni tipovi
osnovni tipovi
cjelobrojni tip
boolean tip
bool
znakovni tip
char
unsigned
char
signed
char
wchar_t
cjelobrojni tip
short int
unsigned
short int
signed
short int
int
long int
realni tip
float
double
long
double
prazan tip izvedeni
tipovi
Nizovi Pokazivači reference
user-defined tipovi
pobrojani tip strukturirani
tip
klase strukture unije
Prijevod programskog koda
Računala razumiju samo strojni jezik stoga je programski kod potrebno prevesti na strojne instrukcije.
3 programa pretvaraju izvršni kod u izvršni kod: 1. Preprocessor –program koji u izvršni kod ubacuje predprocesorske direktive
2. Compiler – program koji izvršni kod zajedno s predprocesorskim direktivama pretvara u strojni jezik odnosno objektni kod (.obj datoteka). Izvršni kod mora zadovoljavati sintaktičke, leksičke i logičke norme da bi se kod mogao transformitati.
3. Linker – program koji povezuje objektni kod s izvršnim biblotekama kako bi se mogao generirati izvršni kod .exe
naredbe pridruživanja
ulazno-izlazne funkcije
Odjel za matematiku 10
1.1. NAREDBE
SEKVENCIJE
Potrebno predznanje:
tipovi podataka
formatiranje upisa/ispisa
operatori
Naredbe pridruživanja
Odjel za matematiku 11
Operatori:
-pridruživanja: = *= /= += -= &= |= ^=
-aritmetički: + - * / % ++ --
- za razdvajanje/grupiranje: . -> ( ) [ ] ::
- relacijski: < > == != <= >= ( ? :)
- logički: ! || &&
- adresni: * &
- bit-logički: ~ | & ^
varijabla operator izraz ;
izraz: konstante, varijable, (poziv) funkcije, operatori
Primjer: y=2*a*sin(x+3.5);
Upis i ispis na konzolu
Odjel za matematiku 12
Neke od funkcija za unos i ispis podataka (sadržani u stdio.h i conio.h datotekama) koje ćemo koristiti
učitavanje podataka scanf(“%format”,&var)
fscanf(dat,”%format”,&var)
getch()
gets()
upisivanje podataka printf(“%format”,broj)
fprintf(dat,”%format”,broj)
putch();
puts()
%format – predstavlja oblik podatka koje
unosimo odnosno ispisujemo.
Format: d cijeli broj(integer) ld dugi cijeli broj(long) f realni broj (float) c znak s niz znakova
&var – predstavlja adresno mjesto
varijable u kojoj spremamo podatak
“Hello, World”
Odjel za matematiku 13
Primjer 1.1A: “Hello, World” u C-u
# include <stdio.h> /*predprocesorska naredba*/
int main() /* funkcija main()*/
{
printf(“Hello, World!”); /*izvršna naredba*/
}
predprocesorska naredba koja u izvršenje našega programa uključuje datoteku za rad s konzolom. funkcija main – sve naredbe sadržane u ovoj funkciji se izvršavaju printf(“%s”,%var) – ispis u konzolu vrijednost varijable var
“Hello, World”
Odjel za matematiku 14
Primjer 1.1B: “Hello, World” u C++-u
#include <iostream> /*predprocesorska naredba*/
using namespace std;
int main() /* funkcija main()*/
{
cout << “Hello, world!” <<endl;
}
predprocesorska naredba koja u izvršenje našega programa uključuje datoteku za rad s konzolom: iostream.h funkcija main – sve naredbe sadržane u ovoj funkciji se izvršavaju. cout – objekt koji nam pomaže da ispisujemo tekst na konzolu
“Dobrodosli, %s u ...”
Odjel za matematiku 15
Primjer 1.2A: “Moje ime ” u C-u
#include <cstdlib>
#include<stdio.h>
int main()
{
char ime[20];
printf("Upišite svoje ime: ");
scanf("%s",&ime);
printf("Dobrodosli, %s u svijet programiranja\n ",ime);
system("PAUSE"); /*(ako konzola nema pauzu)*/
}
“%s” – format ispisa u konzolu
Zadaci
Odjel za matematiku 16
Primjer 1.3A: “MojKalkulator” u C-u
#include<cstdlib>
#include<stdio.h>
int main(){
float a,b;
printf("---------------MojKalkulator--------------------\n");
printf("Upišite I. broj: ");
scanf("%f",&a);
printf("Upišite II. broj: ");
scanf("%f",&b);
printf("\n Zbroj ta 2 broja je %3.2f",a+b); /**/
printf("\n Razlika ta 2 broja je %3.2f",a-b);
printf("\n Umnozak ta 2 broja je %3.2f",a*b);
printf("\n Kvocijent ta 2 broja je %3.2f \n",a/b);
system("PAUSE");
}
1.2. NAREDBE SELEKCIJE if ... else ...
switch
Odjel za matematiku 17
Potrebno predznanje:
operatori
If ... else ...
Odjel za matematiku 18
if (uvjet) blok1; else blok2; uvjet: Jednostavni uvjet izraz1 relacijski operator izraz2 npr. x +5 != exp(z) Složeni uvjet uvjet1 logički operator uvjet2 npr. b==0 && (a+x)/2 > t
U C/C++ sintaksi: if (uvjet){
naredba1;
naredba2;
...
}
else {
naredba 1’
naredba 2’
...
}
ternarni operator: varijabla=(logički izraz) ? izraz1:izraz2;
Naredba koje nam omogućuje ovisno o vrijednosti varijable
odrediti tok programa.
Switch
Odjel za matematiku 19
switch (varijabla){ case vrijednost1: naredba1.1; naredba1.2; case vrijednost2: naredba2.1; naredba2.2; ... }
U C/C++ sintaksi: switch (varijabla){
case vrijednost1:
naredba1;
naredba2;
...
}
case vrijednost2:
naredba 1’
naredba 2’
...
}
U slučaju više mogućnosti nad nekom
varijablom koristimo ključnu riječ switch.
1.3. NAREDBE ITERACIJE while
Do...while
for
Odjel za matematiku 20
Potrebno predznanje:
operatori
For petlja
Odjel za matematiku 21
For(inicijalizacija,terminacija,modifikacija)
blok (ili naredba) inicijalizacija: popis naredbi pridruživanja npr. i=0, sortiran=1;
terminacija: uvjet - iteracija(petlja) se ponavlja sve dok je ovaj uvjet ispunjen npr. i<=n-1;
modifikacija: povećavanje vrijednosti varijable: Npr. i++; i--;
U C/C++ sintaksi: for(i=1;i<=n;i++){
naredba1;
naredba2;
...
}
Napredne kontrolne naredbe: Break – uzrokuje prekid petlje.
Continue – preskače dio naredbi i prelazi na slijedeću iteraciju
For petlja
Odjel za matematiku 22
Primjer 3.1A: “Zbroj prvih n brojeva” u C-u
#include<cstdlib>
#include<stdio.h>
int main(){
int n,sum=0;
printf("Upišite prirodni broj: ");
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=i;
}
system("PAUSE");
}
While
Odjel za matematiku 23
while (uvjet) blok pre-test Uvjet se ispituje prije izvođenja prve naredbe u bloku. Ako je uvjet ispunjen, blok se izvodi i nakon toga ponavlja se ispitivanje uvjeta
do blok while (uvjet) post-test Uvjet se ispituje nakon izvođenja zadnje naredbe u bloku. Ako je uvjet ispunjen, blok se izvodi ponovo. Naredba break uzrokuje skok iz petlje.
U C/C++ sintaksi: while (uvjet){
naredba1;
naredba2;
...
}
do {
naredba 1’
naredba 2’
...
} while (uvjet)
While
Odjel za matematiku 24
Primjer 3.6A: “Zbroj s konzole” u C/C++-u
#include<cstdlib>
#include<stdio.h>
int main(){
float x;
float sum=0.0;
while(cin>>x) // izlaz: <CTRL>+<D>
sum +=x;
scanf("%d",&n);
cout<<“Zbroj je ”<<sum<<endl;
}
// Program koji aproksimira eksponencijalnu funkciju e^x
/*
Program koristi niz sukcesivnih aproksimacija oblika E_n=1+x+x^2/2!+...+x^n/n!
koji se zaustavlja nakon zadovoljenja uvjeta |x^n|(n!<=eps
*/
#include<iostream>
using namespace std;
#include<math.h>
#include<cstdlib>
#include<iomanip>
int main(){
float x, eps, E=1.0, slijedeci=1.0,n=1.0;
cout<<"x=";
cin>>x;
cout<<"eps=";
cin>>eps;
cout<<"Program aproksimira za dani x="<<x<<" funkciju exp(x) uz uvjet pogreske eps"<<endl;
while(fabs(slijedeci)>eps){
slijedeci=(x*slijedeci)/n;
E+=slijedeci;
cout<<"E= "<<E<<setw(5)<<" n="<<n<<endl;
n++;
}
system("PAUSE");
}
Primjenom iterativnih metoda aproksimirajte exp(x) funkciju
While
Odjel za matematiku 25
Numerički problem 1:
2. FUNKCIJE Funkcije i procedure
Odjel za matematiku 26
Potrebno predznanje:
Operatori
Naredbe iteracije i
selekcije
Funkcije
Odjel za matematiku 27
U C/C++ sintaksi: int func(formalni parametri){
naredba1;
naredba2;
...
return vrijednost;
}
void swap(int& x,int& y){ //procedura
float t=x;
x=y;
y=t;
}
Funkcije su potprogrami koji se izvršavaju prilikom poziva unutra neke druge funkcije. Funkcije koje ne vraćaju vrijednost zovemo procedure (funkcije praznog tipa).
Modularizacija programa
Funkcija se deklarira prije poziva po tipu, imenu i listom parametara. Proslijeđivanje parametra može biti po vrijednosti ili po referenci.
Funkcije
Odjel za matematiku 28
Primjer 2.1: “Faktoriel” u C/C++-u
#include<iostream>
using namespace std;
#include<cstdlib>
#include<iomanip>
int factorial(int n){
int f=1;
assert(n>=0);
if (n<2) return 1;
while(n>1)
f*=n--;
return f;
}
int main(){
cout<<factorial(5)<<endl;
system("PAUSE");
}
Funkcije
Odjel za matematiku 29
Primjer 2.2: “Power funkcija” u C/C++-u
#include<cstdlib>
#include<stdio.h>
double power(double y, int n){
double x=1.0;
for (int i=0;i<n;i++)
y*=x;
for (int i=0;i>n;i--)
y/=n;
return y;
}
int main(){
cout << power(7.4,3)<<endl;
cout<<power(7.4,-3)<<endl;
}
Proslijeđivanje argumenata u funkciju
Odjel za matematiku 30
Proslijeđivanje parametara funkciji preko vrijednosti.
Sadržaj proslijeđenih varijabli se kopira u sadržaj formalnih varijabli.
int addition(int a,int b){
return a+b;
}
int x=5, y=3, z;
z = addition ( x , y );
Proslijeđivanje argumenata u funkciju
Odjel za matematiku 31
Proslijeđivanje parametara funkciji preko referenci.
U funkciju se proslijeđuju adrese varijabli, pa u funkciji možemo mijenjati sadržaj proslijeđene varijable.
void swap(int& x,int& y)
{ temp=x;
x=y;
y=temp;
}
a=2; b=3;
swap(a,b);
3. POLJA Jednodimenzionalna i višedimenzionalna polja
Odjel za matematiku 32
Potrebno predznanje:
Naredbe iteracije
Funkcije
Polja
Odjel za matematiku 33
Niz je slijed elemenata istog tipa smješteni slijedno u memoriji koji se dohvaćaju putem cjelobrojnog indeksa.
Pristupanje elementu polja se događa tako da
sustav izračuna koliko je mjesta podatak
odmaknut od adrese početnog elementa.
cout<<"Adresa od polja "<<&polje<<endl;
cout<<"Adresa od "<<i<<". elementa u polju: "<<&(polje[i])<<endl;
void *offset=&(polje[0])+i;
Polja
Odjel za matematiku 34
Prilikom statičkog definiranja niza veličina polja mora biti konstanta.
Deklaracija polja
Polja mogu biti bilo kojeg tipa u C++:
float a[100] = {3.0,4.1,6.2} // float tip
int b[5] = {0}; // cjelobrojnog tipa
char rijeci[10]=“abc” // string (o tome poslije)
bool sudovi[4]={1,0,0,1} // boolean tip
float a[100] = {3.0,4.1,6.2} // polje koje sadrži konstante
Polja
Odjel za matematiku 35
Primjer 3.1: “Suma vektora” u C++-u
Napravite program koji će za unesena 2 niza brojeva ispisati u 3. niz
sumu prethodna 2 niza.
//Program definira proceduru koja će za dva unesena niza ispisati treći niz
koji je zbroj ta dva niza.
void suma_vektora(float a[ ], float b[ ], float c[ ], int n) {
for(int i = 0; i < n; i++)
c[i] = a[i] + b[i];
}
Polja mogu biti argumenti funkcijama i proslijeđeni su po referenci, što znači da je
njihova adresa proslijeđena funkciji.
Element polja kao parametar funkciji može biti proslijeđen po sadržaju ili referenci.
Dvodimenzionalna polja
Odjel za matematiku 36
U C/C++ sintaksi: int M[3][6];
M[0][4]={88};
M[2][1]=44;
----------------------
M[3][6]={{77,55,11,33,88},{99},{66,44,22}};
Dvodimenzionalni niz je niz koji ima 2 nezavisna indeksa. Sintaksa deklaracije je
<type> <name> [<num-rows>][<num-coloms>]
inicijalizacija
Dvodimenzionalna polja
Odjel za matematiku 37
Dvodimenzionalni polja u memoriji
2D nizovi u C++ se spremaju u row-major stilu – slijedno se sprema
prvi redak, zatim slijedeći redak itd.
]2,2[]1,2[]0,2[
]2,1[]1,1[]0,1[
]2,0[]1,0[]0,0[
AAA
AAA
AAA
A[2,2]A[2,1]A[2,0]A[1,2]A[1,1]A[1,0]A[0,2]A[0,1]A[0,0]
&A[i][j]= &A[0][0]+(m*i+j)*sizeof(element)
Adresa (i,j) elementa u polju A možemo
računati preko pomaka
Dvodimenzionalno polje se sprema u memoriji na sličan
način kao i jednodimenzionalno polje.
Dvodimenzionalna polja
Odjel za matematiku 38
Primjena: matrice i vektori
Polja mogu biti argumenti funkcijama i proslijeđeni su po referenci, što znači da je
njihova adresa proslijeđena funkciji.
Element polja kao parametar funkciji može biti proslijeđen po sadržaju ili referenci.
Dvodimenzionalna polja i funkcije
Množenje matrice s vektorom. Skalarni produkt
Nizovi
Odjel za matematiku 39
Zadatak. 3.10: “Gaussova eliminacija” u C++-u
Implementirajte Gaussovu eliminaciju za sustav Ax=b, gdje je A n x n matrica
vektori x,b dimenzije n.
Isprobajte vaš program na slijedećem sustavu:
Rješenje: x = (0.75,0.25,0.625)
4. STRINGOVI I DATOTEKE stringovi
ulaz/izlaz s datototeke
Odjel za matematiku 40
Potrebno predznanje:
nizovi
funkcije i procedure
Znakovi i stringovi
Odjel za matematiku 41
Osim numeričkih podataka, u C++ postoje nenumerički tip podataka – znakovi
(characters)
char c;
c=‘a’;
Znakove kodiramo na temelju ASCII tablice.
sizeof(char) = 1 veličina memorije za jedan znak
Tip char dozvoljava aritmetičke operacije:
char c;
c=‘a’+5; // c = ‘f’
Stringovi
Odjel za matematiku 42
‘Ja sam string’ // string veličine 13 znakova
Na analogan način kao i polja drugih tipova podataka inicijaliziramo stringove.
char rijec[]={‘a’,’b’,’c’,0};
stringovi su polja čiji su elementi tipa char.
deklaracija & incijalizacija
char rijec[4]; // ili
char rijec[4]={‘a’,’b’,’c’};
char rijec[]={‘a’,’b’,’c’};
Stringovi sadrže znak terminacije \0 - automatski pridodano.
<cstring> biblioteka
Odjel za matematiku 43
<cstring> Library
#include<cstring> //C++ sintaksa
#include<string.h> //C sintaksa
C++ naslijeđuje iz C-a kolekciju posebnih funkcija koji rade s C-stringovima.
Funkcije opis
strcap() Dodaje string s2 stringu s1.
strchr() vraća pokazivač na prvu pojavu
znaka c u stringu s
strcmp() Uspoređuje string s1 leksigrafski sa
podstringom s2.
strcpy() Zamijenjuje string s1 sa stringom s2.
strlen() vraća veličinu stringa
Neke od funkcija koje se nalaze u <cstring> biblioteci. Detaljnije na
http://www.cplusplus.com/reference/clibrary/cstring/
Napredniji rad sa stingovima uključeno je u bibliotekama:
Stringovi i datoteke
Odjel za matematiku 44
C-stringovi
//Program racuna broj velikih slova u C-stringu
int caps(char* s){
int c=0;
while(*s++) //povecavaj indeks adresnog mjesta
if (*s>=‘A’ && *s<=‘Z’) ++c;
return c;
}
C-stringovi se predaju kao parametri funkciji preko reference char*.
Primjeri
Odjel za matematiku 45
Primjer
#include<cstring>
int main(){
char* s1="peer";
char* s2="peech";
int cmp=strcmp(s1,s2);
cout<<"cmp= "<<cmp<<endl;
if (cmp<0)
cout<<s1<<"<"<<s2<<endl;
else if(cmp==0)
cout<<s1<<"="<<s2<<endl;
else cout<<s1<<">"<<s2<<endl;
}
Primjena nekih funkcija iz <cstring> biblioteke
#include<cstring>
int main(){
char* s1="peer";
char* s2="peech";
strcpy(s1,s2);
cout<<s1<<“ ”<<strlen(s1);
cout<<s2; //kopirani sadrzaj s1
}
Primjeri
Odjel za matematiku 46
Primjer
#include<cstring>
int main(){
char* s1="peer";
char* s2="peech";
int cmp=strcmp(s1,s2);
cout<<"cmp= "<<cmp<<endl;
if (cmp<0)
cout<<s1<<"<"<<s2<<endl;
else if(cmp==0)
cout<<s1<<"="<<s2<<endl;
else cout<<s1<<">"<<s2<<endl;
}
Primjena nekih funkcija iz <cstring> biblioteke
#include<cstring>
int main(){
char* s1="peer";
char* s2="peech";
strcpy(s1,s2);
cout<<s1<<“ ”<<strlen(s1);
cout<<s2; //kopirani sadrzaj s1
}
Stringovi i datoteke
Odjel za matematiku
47
<string> biblioteka
string sl; // sl sadrzi 0 znakova
string s2 = “MATH OS"; // s2 sadrzi 7 znakova
string s3 (60, '*'); // s3 sadrzi 60 asteriksa
string s4 = s3; // s4 sadrzi 60 asteriksa
string s5(s2, 5, 2); // s5 sadrzi string od 2 znaka "Yo"
Standardni C++ definira tipove string koje se nalaze u biblioteci
<string.h>
Funkcije koje podržavaju stringovi tipa string:
http://www.cplusplus.com/reference/string/string/
Odjel za matematiku 48
Stringovi i datoteke
<string> biblioteka
string sl; // sl sadrzi 0 znakova
string s2 = “MATH OS"; // s2 sadrzi 7 znakova
string s3 (60, '*'); // s3 sadrzi 60 asteriksa
string s4 = s3; // s4 sadrzi 60 asteriksa
string s5(s2, 5, 2); // s5 sadrzi string od 2 znaka "Yo"
Standardni C++ definira tipove string koje se nalaze u biblioteci
<string.h>
Funkcije koje podržavaju stringovi tipa string:
http://www.cplusplus.com/reference/string/string/
Standardni ulazi i izlazi
Odjel za matematiku 49
<iostream> Library
#include<iostream>
Standardna C++ biblioteka koja nam je omogućava ulaze i izlaze s konzole
Funkcije opis
cout ispisuje operand na konzolu
cin s konzole unosi vrijednost u operand. Terminira
nakon praznog mjesta ili novog reda.
cout.get() metoda objekta cout koji učitava znakove zajedno sa
razmacima.
cout.getline() metoda objekta cout koji učitava neformatirani niz znakova uključujući i prijelaz u novi red.
cin.put() metoda objekta cin koja ispisuje znak na konzolu.
Neke od funkcija koje se nalaze u <iostream> biblioteci.
Ulazi i izlazi s datoteke
Odjel za matematiku 50
Datoteke
#include<fstream>
U C rad s datotekama osigurano je s 2 vrste funkcija iz <stdio.h>
biblioteke: fprintf() – upis u datoteku fscanf() - ispis iz datoteke getc() - uzima jedan znak iz
datoteke putc() - stavlja jedan znak u
datoteke
#include<stdio.h>
U C++ rad s datotekama osigurano je s 2 vrste objekata: ifstream – omogućuje ulaz iz datoteke ofstream – omogućuje ulaz u datoteku.
Stringovi i datoteke
Odjel za matematiku 51
<stdio.h> biblioteka
#include<cstdlib>
#include<stdio.h>
int main(){
int n,i=0,duljina=0;
FILE *ulaz;
FILE *izlaz;
char imedat[20];
int podaci[100];
if(fopen("input.txt","r")==NULL) printf("Nema datoteke!\n");
else {
ulaz=fopen("input.txt","r");
izlaz=fopen("output.txt","w");
while(!feof(ulaz)){
duljina++;
fscanf(ulaz,"%d",&podaci[i++]);
}
for(int i=0;i<duljina;i++) fprintf(izlaz,"%d ",podaci[i]%2);
system("PAUSE");}
}
Osnovni upis iz datoteke i upis u datoteku. Iz datoteke učitavamo podatke kao brojeve i ispisujemo ostatke pri dijeljenju sa 2 u drugu datoteku.
Stringovi i datoteke
Odjel za matematiku 52
<fstream> biblioteka
#include<fstream> //ulaz iz datoteke
#include<iostream>
using namespace std;
int main(){
ifstream infile("input.txt"); //definiraj ulaznu datoteku
ofstream outfile("output.txt"); // -||- izlazna datoteka
string word; //tip string
char c;
while (infile>>word)
{
if (word[0]>='a' && word[0]<='z')
word[0]=word[0]+'A'-'a';
outfile<<word;
infile.get(c); //uzmi razmak iza svake rijeci
outfile.put(c); //upisi razmak u novu datoteku
}
system("PAUSE");
}
Program iz ulazne datoteke uzima riječi i ispisuje ih u izlaznu datoteku s velikim početnim slovima riječi.
POKAZIVAČI
Odjel za matematiku 53
Pokazivači, dinamička alokacija memorije
VJEŽBE 1
Pokazivači
Odjel za matematiku 54
Ponovimo …
Svakoj varijabli u programu pridružena je memorijska lokacija (ili blok lokacija)
čija veličina ovisi o tipu varijable.
Svakoj memorijskoj lokaciji pridružena je jedinstvena adresa.
adresa varijable = adresa prve lokacije u bloku memorijskih lokacija koji
predstavljaju varijablu.
Varijabli se može pristupiti korištenjem:
imena varijable — prevoditelj “zna” adresu,
adrese varijable — pokazivačem na tu varijablu.
VJEŽBE 1
Pokazivači
Odjel za matematiku 55
Deklaracija pokazivača
Pokazivač na tip je varijabla koja sadrži adresu varijable tog tipa:
tip *p;
int *pi //pokazivač tipa int
char *pc // pokazivač tipa char
float *f // pokazivač tipa float
void *p //generički pokazivač
*p=NULL //prazan pokazivač
Primjer
VJEŽBE 1
Pokazivači
Odjel za matematiku 56
Operatori pokazivača
Adresni operator &x= //adresa varijable x
Operator
referenciranja
*ptr= // vrijednost spremljena u memorijsku
lokaciju na koju pokazuje ptr
VJEŽBE 1
Pokazivači
Odjel za matematiku 57
Inicijalizacija pokazivača
int i=5; //cjelobrojna varijabla sa sadržajem 5
int *pi=&i;
VJEŽBE 1
Pokazivači
Odjel za matematiku 58
Operacije nad pokazivačima
Dozvoljene operacije nad pokazivačima:
svakom pokazivaču možemo dodati ili oduzeti cijeli broj
oduzimanje pokazivača istog tipa
uspoređivanje pokazivača istog tipa relacijskim
operatorima
++px --px px + n px – n
//px pokazivač i n varijabla cjelobrojnog tipa
VJEŽBE 1
Pokazivači
Odjel za matematiku 59
Primjer 1:
int main(){
float x[]={1.0,2.0},*px=x; // px=&x[0]
printf("Vrijednosti: x[0]=%g,x[1]=%g\n",x[0],x[1]);
printf("Adrese: x[0]=%p, x[1]=%p\n",px,px+1);
}
Vrijednosti: x[0]=1.0,x[2]=2.0 Adrese: &x[0]=0012FF44, &x[1]=0012FF48
Pristupanje elementima polja pokazivačem.
VJEŽBE 1
Pokazivači
Odjel za matematiku 60
Primjer 2:
#include <stdio.h>
int main(void)
{
double x[] = {10.0, 20.0, 30.0, 40.0}, *px;
px=&x[0];
printf("%g, %g\n", *px+1, *px+2); /* 11, 12 */
px=&x[0];
printf("%g, %g\n", *px++, *px+2); /* 10, 22 */
return 0;
}
Po pokazivačima i vrijednostima na koji pokazuju može se
inkrementirati.
VJEŽBE 1
Pokazivači
Odjel za matematiku 61
Primjer 3:
int d(int a[]) {
int *pa = a;
while (*pa != 0) ++pa;
return pa - a; /* razlika pokazivaca */
}
-----------------------
…
-----------------------
int x[5] = {3, 2, 0, 0, 4};
...
printf("%d\n", d(x)); //output: 2
Pokazivači istog tipa mogu se oduzimati.
VJEŽBE 1
Pokazivači i jednodimenzionalna polja
Odjel za matematiku 62
Neka je p bilo koji pokazivač osim generičkog.
Onda p možemo interpretirati kao:
1. pokazivač na prvi element u polju odgovarajućeg tipa, p=&p[0]
2. Pristupanje elementima polja uključuje aritmetiku nad pokazivačem p.
Veza između aritmetike pokazivača i indeksiranja elemenata polja je : p+i=&p[i], *(p+i)=p[i]
gdje je i cijeli broj.
char *px, x[28]={‘a’,’b’,...,’z’};
px = &x[0]; /* Isto kao px = x; */
*(px + 3) = ’d’; /* Isto kao x[3] = ’d’; */
px++; /* Isto kao px = &x[1]; */
*(px + 1) = ’b’; /* Isto kao px[1] = ’b’;
ekviv. s x[2] = ’b’; */
*(px + 30) = ’z’; /* NIJE GRESKA,
ali prelazimo po memoriji! */
VJEŽBE 1
Nizovi
Odjel za matematiku 63
Zadatak. 1 “Zbroj elemenata” primjenom pokazivača
Napravite program koji će za uneseni niz realnih podataka ispisati sumu
njegovih elemenata primjenom pokazivača.
VJEŽBE 1
Pokazivači i funkcije
Odjel za matematiku 64
Polje može biti argument funkcije. Funkcija tada ne dobiva kopiju čitavog
polja, već samo kopiju pokazivača na prvi element polja.
void funkcija(float v[]) ili void funkcija (float *v)
Zadatak 2 “Aritmetička sredina” primjenom pokazivača
Napravite funkciju koji će za uneseni niz realnih podataka ispisati
aritmetičku sredinu njegovih podataka. Primjenite pokazivače.
VJEŽBE 1
Pokazivači i funkcije
Odjel za matematiku 65
Osim pokazivača na osnovne tipove podataka postoje i pokazivači na
funkcije.
int (*fptr)(int)
Definiran je pokazivač fptr na funkciju koja prima jedan int argument i
vraća int vrijednost.
Primjer 3:
double integracija(double a, double b, double (*f)(double))
{
return 0.5*(b-a)*((*f)(a)+(*f)(b));
}
…
printf("Sinus: %f\n",integracija(0,1,sin));
…
VJEŽBE 1
Pokazivači i višedimenzionalna polja
Odjel za matematiku 66
Indeksiranje jednodimenzionalnog polja
Indeksiranje po dvodimenzionalnom polju:
VJEŽBE 1
Pokazivači i stringovi
Odjel za matematiku 67
Analogija jednodimenzionalnog polja – string je niz tipa char.
Indeksiranje po stringu:
Primjer 4:
void strcpy(char *s, char *t){ //kopiranje stringova
while((*s=*t)!='\0') {
s++;t++;
}
}
VJEŽBE 1
Dinamička alokacija memorije
Odjel za matematiku 68
Rezerviranje memorije za objekte (varijable) može biti:
statički – prilikom definicije i inijializacije varijabli memorija se
automatski rezervira.
Nakon završetka programa memorija se oslobađa automatski.
dinamički – proizvoljna veličina memorije može se staviti na
raspolaganje varijablama i bude tako alocirana sve dok je eksplicitno
ne oslobodimo.
VJEŽBE 1
Dinamička alokacija memorije
Odjel za matematiku 69
Dinamička memorija – upotreba:
- polja za koje nije unaprijed zadana dimenzija
- dinamičke strukture: povezane liste, stabla, matrice …
Funkcije za alokaciju i delokaciju memorije su deklarirane u biblioteci <stdlib.h>:
- alokacija: funkcije malloc, calloc (C) operator new (C++)
- delokacija: funkcija free (C)
operator delete (C++)
VJEŽBE 1
Dinamička alokacija u C-u
Odjel za matematiku 70
size_t cjelobrojni tip bez predznaka
n - ukupan broj bajtova koje treba rezervirati
Funkcija malloc rezervira blok memorije od n bajtova. Vraća:
• pokazivač na rezervirani blok memorije, ili
• NULL, ako zahtjev nije mogao biti ispunjen.
Vraćeni pokazivač je generički, tipa void* — prije upotrebe treba ga eksplicitno
konvertirati u potrebni tip pokazivača (cast operatorom).
malloc
VJEŽBE 1
Dinamička alokacija u C-u
Odjel za matematiku 71
Funkcija calloc rezervira blok memorije za spremanje:
nobj objekata, od kojih svaki pojedini objekt ima veličinu size, tj. ukupan broj
rezerviranih bajtova je nobj * size.
inicijalizira cijeli rezervirani prostor na nule, preciznije, na nul-znakove (’\0’).
Vraćeni pokazivač je generički, tipa void* — prije upotrebe treba ga eksplicitno
konvertirati u potrebni tip pokazivača (cast operatorom).
calloc
VJEŽBE 1
Dinamička alokacija u C-u
Odjel za matematiku 72
double *p;
p=(double *) malloc(128*sizeof(double)); // ili ...
p = (double *) calloc(128, sizeof(double));
if(p==NULL)
{
printf("Greska: alokacija nije uspjela!");
exit(-1);
}
Primjer 5:
Alokacija bloka memorije od 128 objekata tipa double.
VJEŽBE 1
Dinamička alokacija u C-u
Odjel za matematiku 73
Alociranu memoriju, nakon upotrebe, možemo osloboditi funkcijom free.
Funkcija free uzima pokazivač p na početak alociranog bloka memorije i
oslobađa taj blok memorije.
Funkcija free ne mijenja pokazivač p. Nakon poziva free(p); taj pokazivač i
dalje pokazuje na (sad) oslobođeni dio memorije i ne smije se koristiti.
Najbolje je odmah iza poziva free(p); staviti i p = NULL;.
free
VJEŽBE 1
Dinamičko alokacija u C-u
Odjel za matematiku 74
Primjer 6:
#include<cstdlib>
#include<stdio.h>
int main(){
int *a;
int i, n, zbroj;
printf("Upisi broj elemenata polja a: ");
scanf("%d",&n);
if ((a=(int*) calloc(n,sizeof(int)))==NULL){
printf("Alokacija nije uspjela"); exit(-1);
}
for (i=0;i<n;i++){
printf("Upisi element polja: ");
scanf("%d",&a[i]);
}
zbroj=0;
for(i=0;i<n;i++)
zbroj=zbroj+a[i];
printf("%d ",zbroj);
free(a);
}
Program dinamički stvori polje a tipa int s tim da se duljina polja n
učitava. Ispisuje zbroj elemenata.
VJEŽBE 1
Dinamičko alokacija u C++-u
Odjel za matematiku 75
float tip podatka
n - ukupan broj bajtova koje treba rezervirati
Operator new rezervira blok memorije od n bajtova. Vraća:
pokazivač na rezervirani blok memorije, ili
NULL, ako zahtjev nije mogao biti ispunjen.
Ukoliko se ne može rezervirati memorijski prostor C++ podiže iznimku.
new
float *b=new float[n]
VJEŽBE 1
Dinamičko alokacija u C++-u
Odjel za matematiku 76
Operator delete oslobođa rezervirani blok memorije od n bajtova. Premda
vraća alocirane blokove memorije na ponovo raspologanje korisno je i pokazivač
koji je pokazivao na alocirani memorijski sadržaj postaviti na NULL kako bi se
izbjegli problemi memorijske redundacije.
delete
delete [ ]b;
delete [ ]b;
b=NULL;
VJEŽBE 1
Dinamičko alokacija u C++-u
Odjel za matematiku 77
Primjer 7:
#include<cstdlib>
#include<iostream.h>
int main(){
cout<<"Upisite n:";
int i,n;
cin>>n;
float *a=new float[n];
float suma=0;
cout<<"Upisite elemente polja: "<<endl;
for(i=0;i<n;i++){
cin>>a[i];
suma=suma+a[i];
}
cout<<"Zbroj elemenata polja je "<<suma;
delete []a;
system("PAUSE");
}
Program dinamički kreira polje a tipa float s tim da se duljina polja n
učitava. Ispisuje zbroj elemenata.
VJEŽBE 1
Dinamička alokacija u C++-u
Odjel za matematiku 78
Primjer 8:
void matvec(float **A, float *b, float *x, int n){
for(int i=0;i<n;i++){
float temp=0;
for (int j=0;j<n;j++)
temp=temp+A[i][j]*x[j];
}
}
int main(){
int n;
int i;
printf("Upisite n:"); scanf("%d",&n);
float *b=new float[n];
float *x=new float[n];
for(i=0;i<n;i++) x[i]=i;
float **A; //A je pokazivac na pokazivac;
A=new float*[n]; // alociraj spremanje za n pokazivača
for(i=0;i<n;i++)
A[i]=new float[n]; //alociraj spremanje za matricu
for(i=0;i<n;i++) // inicijalizacija vrijednosti
for(int j=0;j<n;j++)
A[i][j]=i+j;
matvec(A,b,x,n);
printf("%3.2f %3.2f",&b[0],&b[1]);
system("PAUSE");
}
Množenje matrice s vektorom.
VJEŽBE 1
Zadaci
Odjel za matematiku 79
Napiši program koji će koristiti funkciju locate(s,c) gdje je s string, a c
znak za koji želimo znati na kojem se mjestu stringu pojavio prvi puta.
Napiši C++ program koji će izračunati duljinu stringa pomoću funkcije strlen(const char* s) (Potrebno je definirati takvu funkciju)
Zadatak. 5.2: “strlen” u C++
Zadatak. 5.1: “Nadji znak” u C++
Napiši C++ funkciju strcat koja će za 2 stringa s1,s2 izvršiti konkatenaciju s2 na
s1; char* strcat (char* sl, const char* s2)
Zadatak. 5.3: “strcat” u C++-u
VJEŽBE 1
top related