FSR - Uvod u c++
-
Upload
ismar-kunc -
Category
Documents
-
view
408 -
download
9
description
Transcript of FSR - Uvod u c++
PROGRAMSKI JEZICI IPROGRAMSKI JEZICI II dio: Uvod u jezik C++I dio: Uvod u jezik C++
Sveučilište u MOSTARU
STUDIJ RAČUNARSTVA
2
1.1.1.1. Uvod Uvod u C u C++++
Malo istorije...Malo istorije...
O programskom jeziku CO programskom jeziku C Nastao 70-ih godina prošlog vijekaNastao 70-ih godina prošlog vijeka
1970. Ken Thompson, “B”1970. Ken Thompson, “B”1972. Denis Ritchie, “C”1972. Denis Ritchie, “C”
ZahtjeviZahtjevi koje je trebao da zadovolji: koje je trebao da zadovolji:
Viši programski jezik sa implementiranim mogućnostima mašinskog jezikaViši programski jezik sa implementiranim mogućnostima mašinskog jezika
(direktan pristup memoriji, veći skup operatora, ...)(direktan pristup memoriji, veći skup operatora, ...)
prednosti: prednosti: udobnost višeg programskog jezika, moć mašinskog udobnost višeg programskog jezika, moć mašinskog jezikajezika
Programski jezik sa malim setom naredbi i bogatom bibliotekom funkcijaProgramski jezik sa malim setom naredbi i bogatom bibliotekom funkcija
prednosti: prednosti: jednostavnost programiranja i pojednostavljeni jednostavnost programiranja i pojednostavljeni prevodiociprevodioci
Standardizacija:Standardizacija: ANSI, 1988. ANSI, 1988.
3
1.1.1.1. Uvod Uvod u C u C++++
Malo istorije...Malo istorije...
Istorijat jezika C++Istorijat jezika C++
Pojava objektno-orijentisanih (OO) koncepata u programiranju Pojava objektno-orijentisanih (OO) koncepata u programiranju zahtijevala je nove mogućnosti jezika “C”zahtijevala je nove mogućnosti jezika “C”
1980. “C sa klasama”1980. “C sa klasama” dodate su klase jeziku “C”dodate su klase jeziku “C” strukture omogućavaju da podaci imaju samo vrijednostistrukture omogućavaju da podaci imaju samo vrijednosti klase omogućavaju da se definišu i moguće operacije nad klase omogućavaju da se definišu i moguće operacije nad
podacimapodacima
1983. “C++”1983. “C++” ++ znači da se ne radi o novom jeziku nego o proširenom ++ znači da se ne radi o novom jeziku nego o proširenom
jeziku “C”jeziku “C” dodate virtuelne funkcije, omogućeno preklapanje operatoradodate virtuelne funkcije, omogućeno preklapanje operatora autor: autor: Bjarne StroustrupBjarne Stroustrup
Standardizacija:Standardizacija: ANSI, 1995. ANSI, 1995.
4
1.1.1.1. Uvod Uvod u C u C++++
Razvoj C/C++ Razvoj C/C++ programa?programa?
Procedura za razvoj C/C++ programaProcedura za razvoj C/C++ programa
.C.C
EDITOR
IZVORNI KOD(SOURCE)
.OBJ.OBJ
OBJEKTNI KOD
KOMPAJLER
.EXE.EXE
IZVRŠNI KOD
LINKER.CPP.CPP
5
1.1.1.1. Uvod Uvod u C u C++++
Kako programirati Kako programirati u jeziku C ?u jeziku C ?
Programiranje u programskom jeziku CProgramiranje u programskom jeziku C Program u programskom jeziku C čini određen broj funkcijaProgram u programskom jeziku C čini određen broj funkcija Jedna od funkcija obavezno se naziva Jedna od funkcija obavezno se naziva mainmain - glavna funkcija - glavna funkcija izvršavanje C programa = poziv i izvršavanje funkcije main()izvršavanje C programa = poziv i izvršavanje funkcije main()
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ printf(“Primjer programa”);printf(“Primjer programa”);}}
6
Kako programirati Kako programirati u jeziku C?u jeziku C?
#include <stdio.h>#include <stdio.h>
main()main()
{{ printf(“Primjer”);printf(“Primjer”);}}
Svaki program mora da ima main funkciju
main()
Zaglavlje funkcije
printf(“Primjer”);
tijelo funkcije (blok iskaza)
{
Početak bloka
}
Kraj bloka
;
Separator iskaza
#include <stdio.h>
Pretprocesorska direktiva
1.1.1.1. Uvod Uvod u C u C++++
7
1.1.1.1. Uvod Uvod u C u C++++
PRETPROCESORSKPRETPROCESORSKA direktiva?A direktiva?
#include <stdio.h>#include <stdio.h>
main()main()
{{printf(“Primjer”);printf(“Primjer”);
}}
#include <stdio.h> Pretprocesorska direktiva
Obrađuje se prije prevođenja programa
Obavezno počinje sa #
#include – najčešće korištena direktiva
Uključuje u program sadržaj datoteke koja se navodi kao parametar
#include <ime>ili
#include ”ime”
Standardne biblioteke
<stdio.h> funkcije za standardni I/O<math.h> matematičke funkcije ...
#define – često korištena direktiva
Definiše simboličke konstante i makroe
#define IME vrijednost
#define PI 3.14159#define EPS 0.0001
8
1.1.1.1. Uvod Uvod u C u C++++
PRETPROCESORSKPRETPROCESORSKA direktiva?A direktiva?
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
#define PI 3.14159#define PI 3.14159
#define EPS 1e-6#define EPS 1e-6
#define MAXINT 32767#define MAXINT 32767
#define K_OCT 071#define K_OCT 071
#define K_HEX 0x41#define K_HEX 0x41
main()main()
{{ printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );
printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );
printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );
printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );}}
#include <stdio.h>Pretprocesorska direktiva
uključuje standardne funkcije za ulaz/izlaz podataka#define PI 3.14159
Pretprocesorska direktiva definiše simboličku konstantu
PI#define EPS 1e-6Pretprocesorska direktiva
definiše simboličku konstantu EPS = 0.000001#define MAXINT 32767
Pretprocesorska direktiva definiše cjelobrojnu konstantu
MAXINT = 32767#define K_OCT 071definiše oktalnu konstantu
K_OCT = 071Oktalna konstanta započinje nulom
071 = 7*8 + 1*1 = 56 + 1 = 57 dec#define K_HEX 0x41
definiše heksadecimalnu konstantu K_HEX = 0x41
Heksadecimalna konstanta počinje sa 0x0x41 = 4*16 + 1*1 = 64 + 1 = 65 dec
printf( ”%d”, MAXINT );
printf( ”%8.5f\n”, PI );
printf( ”%10.8f\n”, EPS );
printf( ”%d %d”,K_OCT, K_HEX );
Glavni program (funkcija main)ispisuje vrijednosti definisanih konstanti
na ekran
Za ispis na ekran koristi se standardna funkcija printf()
9
1.1.1.1. Uvod Uvod u C u C++++
PRETPROCESORSKPRETPROCESORSKA direktiva?A direktiva?
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
#define PI 3.14159#define PI 3.14159
#define EPS 1e-6#define EPS 1e-6
#define MAXINT 32767#define MAXINT 32767
#define K_OCT 071#define K_OCT 071
#define K_HEX 0x41#define K_HEX 0x41
main()main()
{{ printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );
printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );
printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );
printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );}}
printf( ”%d”, MAXINT );
32767_
printf( ”%8.5f\n”, PI );
_3.14159
printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );
0.00000100
printf( ”%10.8f\n”, EPS );
printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );
printf( ”%d %d”,K_OCT, K_HEX );
57_65_
printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );
printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );
10
1.1.1.1. Uvod Uvod u C u C++++
printf ???printf ???
Standardna funkcija za izlaz (ispis) na ekranStandardna funkcija za izlaz (ispis) na ekran
printfprintf( ”konverzioni string” , lista_argumenata )( ”konverzioni string” , lista_argumenata ) ”konverzioni string”
Kontrolni (konverzioni) niz određuje način na koji se vrši ispis
Štampa se sve što se nađe unutar ” ” sve dok se ne dođe do znaka %
Kad se dođe do znaka % gleda se sljedeći znak (grupa znakova) koji se naziva konverzioni karakter
Konverzioni karakter definiše kako će se ispisati odgovarajući podatak iz liste argumenata
Mora biti onoliko znakova % u cijelom stringu koliko ima i argumenata u listi
lista_argumenata
Određuje šta treba da se ispiše (koji podaci treba da se ispišu)
Argumenti se odvajaju zapetama
Argumenti mogu da budu promjenljive, konstante, izrazi
11
1.1.1.1. Uvod Uvod u C u C++++
Konverzioni karakteri ?Konverzioni karakteri ?
Konverzioni karakteriKonverzioni karakteri
%c - %c - znakznak%s - %s - stringstring%d - %d - integer (cijeli broj)integer (cijeli broj)%sd – %sd – short integershort integer%ld – %ld – long integerlong integer
Opšti oblik:Opšti oblik:
% [širina] [.preciznost] tip
Ukupan broj mjesta za ispis podatkan – najmanje n znakova (vodeće bjeline)0n – najmanje n znakova (vodeće nule)
[širina]
Ukupan broj mjesta za ispis decimala.d – najviše d decimala
[.preciznost]
%f - %f - floatfloat%lf - %lf - doubledouble%o - %o - oktalni podatakoktalni podatak%x - %x - heksadecimalni podatakheksadecimalni podatak%% - %% - ispis znaka %ispis znaka %
12
1.1.1.1. Uvod Uvod u C u C++++
Konverzioni karakteri ?Konverzioni karakteri ?
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{ int var=65;int var=65;
printf( ”printf( ”Znakovi:Znakovi:\n”);\n”);
printf( ”printf( ”%%2c\n”2c\n”,, ’A’); ’A’);
printf(printf( ” ”%%4c\n%6c\n”4c\n%6c\n”,, var, ’B’); var, ’B’);
printf(printf( ” ”%%8c\n”8c\n”,, var+1); var+1);
printf(printf( ” ”%%3d\n”3d\n”,, ’A’); ’A’);
printf(printf( ” ”%%03d”03d”,, ’A’); ’A’);
}}
MEMORIJA
0100 0001
int var=65;
Znakovi:
int var=65;
printf( ”Znakovi:\n”);printf( ”Znakovi:\n”);
printf( ”%2c\n”, ’A’);
.A
printf( ”%2c\n”, ’A’);
printf( ”%4c\n%6c\n”, var, ’B’);
...A
.....B
printf( ”%4c\n%6c\n”, var, ’B’);
printf( ”%8c\n”, var+1);
.......B
printf( ”%8c\n”, var+1);
printf( ”%3d\n”, ’A’);
.65
printf( ”%3d\n”, ’A’);
printf( ”%03d”, ’A’);
065
printf( ”%03d”, ’A’);
13
1.1.1.1. Uvod Uvod u C u C++++
Specijalne znakovne Specijalne znakovne konstantekonstante??
Specijalne znakovne konstanteSpecijalne znakovne konstante
\n\n - - novi rednovi red
\b\b - - jedno mjesto unazadjedno mjesto unazad
\a\a - - zzvučni signal (beeper)vučni signal (beeper)
\\r r – – vraćanje na početak redavraćanje na početak reda
\\t t – – tabulator udesnotabulator udesno
\’\’ – – ispisuje znak ’ispisuje znak ’
\”\” – – ispisuje znak ”ispisuje znak ”
\\\\ – – ispisuje znak \ispisuje znak \
\ddd \ddd – – ispisuje znak sa kodom ddd oktalnoispisuje znak sa kodom ddd oktalno
\xdd \xdd – – ispisuje znak sa kodom dd heksadecimalnoispisuje znak sa kodom dd heksadecimalno
14
1.1.1.1. Uvod Uvod u C u C++++
cout ???cout ???
Standardni izlaz u jeziku C++Standardni izlaz u jeziku C++ I u C++ jeziku može da se koristi I u C++ jeziku može da se koristi printf()printf() funkcija iz funkcija iz <stdio.h><stdio.h>
C++ ima biblioteku C++ ima biblioteku <iostream.h><iostream.h> za rad sa U/I tokovima za rad sa U/I tokovimatok = stream = dugački niz bajtovatok = stream = dugački niz bajtova
standardni tok za izlaz podataka standardni tok za izlaz podataka
coutcout - upućivač na konzolu - upućivač na konzolu u istom programu u istom programu NE TREBANE TREBA istovremeno koristiti istovremeno koristiti printf()printf() i i coutcout
cout << izraz1 << izraz2 << ... << izrazN;cout << izraz1 << izraz2 << ... << izrazN;
15
1.1.1.1. Uvod Uvod u C u C++++
cout ???cout ???
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>
main()main()
{{ cout << ”Prog. jezik C++”;cout << ”Prog. jezik C++”;}}
Prog. jezik C++
cout << ”Prog.” << ” jezik” << ” C++”;cout << ”Prog.” << ” jezik” << ” C++”;
cout << ”Prog. ” ;cout << ”Prog. ” ;
cout << ”jezik ” ;cout << ”jezik ” ;
cout << ”C++” ;cout << ”C++” ;
16
1.1.1.1. Uvod Uvod u C u C++++
cout ???cout ???
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>
main()main()
{{ cout << ”Jezik C++cout << ”Jezik C++\n\n”;”;}}
Jezik C++_
cout << ”cout << ”JJezik” << ” C++”ezik” << ” C++” << ”\n” << ”\n”;;
cout << ”cout << ”JJezik ezik C++C++” ” << endl << endl ;;
manipulator za kraj linije (reda)
17
1.1.1.1. Uvod Uvod u C u C++++
TIPOVI TIPOVI ??????
Prosti tipovi podatakaProsti tipovi podataka
ZnakovniZnakovni char char (1 bajt)(1 bajt)
CjelobrojniCjelobrojni short short (1 bajt)(1 bajt) int int (2 bajta)(2 bajta) long long (4 bajta)(4 bajta)
RealniRealni float float (4 bajta)(4 bajta) double double (8 bajtova)(8 bajtova)
Kvalifikatori za cjelobrojne podatkeKvalifikatori za cjelobrojne podatke signed signed - o- označeniznačeni ako se ne navede podrazumijeva se signed short (-128..+127) signed int (-32767..+32768)
ununsigned signed - - neneooznačeniznačeni unsigned short (0..255) unsigned int (0..65535)
BROJ BAJTOVA ZA BROJ BAJTOVA ZA CJELOBROJNE PODATKE CJELOBROJNE PODATKE
ZAVISI OD OPERATIVNOG ZAVISI OD OPERATIVNOG SISTEMASISTEMA
18
1.1.1.1. Uvod Uvod u C u C++++
LOGIČKI PODACI ???LOGIČKI PODACI ???
Logički podaci u jeziku CLogički podaci u jeziku CC ne raspolaže logičkim tipom podatakaC ne raspolaže logičkim tipom podataka
Nisu implementirane ni logičke konstante Nisu implementirane ni logičke konstante TRUE (istina) i FALSE (laž)TRUE (istina) i FALSE (laž)
Bilo koji podatak može da se posmatra kao logičkiBilo koji podatak može da se posmatra kao logički ISTINA ...ISTINA ... podatak <> 0podatak <> 0
LAŽ ... podatak = 0LAŽ ... podatak = 0Uobičajeno je da se koriste cjelobrojni podaciUobičajeno je da se koriste cjelobrojni podaciRezultati logičkih operacijaRezultati logičkih operacija
rezultat=1 ->rezultat=1 -> ISTINA (tačno)ISTINA (tačno) rezultat=0 ->rezultat=0 -> LAŽ (netačno)LAŽ (netačno)
19
1.1.1.1. Uvod Uvod u C u C++++
LOGIČKI PODACI ???LOGIČKI PODACI ???
Logički podaci u jeziku C++Logički podaci u jeziku C++C++ ima ugrađen tip C++ ima ugrađen tip boolbool
Implementirane su i logičke konstante Implementirane su i logičke konstante TRUETRUE (istina) (istina) ( 1 )( 1 )FALSEFALSE (laž) (laž) ( 0 )( 0 )
Naravno, i dalje bilo koji podatak može da se posmatra kao logičkiNaravno, i dalje bilo koji podatak može da se posmatra kao logički ISTINA ...ISTINA ... podatak <> 0podatak <> 0
LAŽ ... podatak = 0LAŽ ... podatak = 0
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>main()main(){{ bool t = TRUE, n = FALSE;bool t = TRUE, n = FALSE; cout << t << endl << n;cout << t << endl << n;}}
10
20
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Promjenljive (varijable)Promjenljive (varijable)Promjenljiva je simboličko ime za neku memorijsku lokacijuPromjenljiva je simboličko ime za neku memorijsku lokaciju
Svaka promjenljiva mora da ima neko jedinstveno imeSvaka promjenljiva mora da ima neko jedinstveno imeime se formira od slova, cifara i znaka _ime se formira od slova, cifara i znaka _prvi znak ne može biti cifraprvi znak ne može biti ciframaksimalno 31 znakmaksimalno 31 znakrazlikuju se velika i mala slovarazlikuju se velika i mala slova
MEMORIJAMEMORIJA
broj
BROJ
podatak_1
Broj-1
123A
21
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Promjenljiva mora biti tačno određenog tipaPromjenljiva mora biti tačno određenog tipa
Tip promjenljive ne može se mijenjati tokom izvršavanja programaTip promjenljive ne može se mijenjati tokom izvršavanja programapromjenljiva može biti nekog promjenljiva može biti nekog prostogprostog ili ili složenogsloženog tipa tipa
Može da se mijenja samo vrijednost (sadržaj memorijske lokacije)Može da se mijenja samo vrijednost (sadržaj memorijske lokacije)zato se i zove promjenljiva (varijabla)zato se i zove promjenljiva (varijabla)
MEMORIJA
int
charA
x
ZGa ABC
2.35
13
13
6-657
ABC
2.35
D
22
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Svaka promjenljiva mora biti definisana!!!Svaka promjenljiva mora biti definisana!!!
Prevodiocu (kompajleru) mora se ukazati na to da će se u Prevodiocu (kompajleru) mora se ukazati na to da će se u programu koristiti neka promjenljiva, kako bi on mogao da programu koristiti neka promjenljiva, kako bi on mogao da rezerviše potreban prostor u memorijirezerviše potreban prostor u memoriji
Opšti oblik definicije promjenljive:Opšti oblik definicije promjenljive:
tip imepromjenljive [=vrijednost]
Početna vrijednost
početna vrijednost ne mora se dodjeljivati
[ ] se koriste da bi se naglasilo da nije obavezno
[=vrijednost]
Npr.Npr.
int i,j,n=10;int i,j,n=10;
float a, e=2.71;float a, e=2.71;
char znak=’+’,c;char znak=’+’,c;
23
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{ int i=9,j;int i=9,j;
float a,b;float a,b;
j=i/2;j=i/2;
a=i/2.0;a=i/2.0;
b=a*2.0/j;b=a*2.0/j;
printf( ”printf( ”i=%di=%d\n”\n”, i , i ););
printf( ”printf( ”j=%dj=%d\n”\n”, j , j ););
printf(printf( ” ”a=%6.2fa=%6.2f\n”\n”, a , a ); );
printf( printf( ””b=%6.2fb=%6.2f\n”\n”, b , b ););
}}
MEMORIJA
jj
aa
bb
ii
int i=9,j;int i=9,j;int i=9,j;
float a,b;float a,b;float a,b;
j=i/2;
0000 10010000 1001
0000 00000000 00009
0000 01000000 0100
0000 00000000 00004
1001 00001001 0000
0100 00000100 0000
0000 00000000 0000
0000 00000000 00004.5
j=i/2;
a=i/2.0;a=i/2.0;a=i/2.0;
b=a*2.0/j;
0001 00000001 0000
0100 00000100 0000
0000 00000000 0000
0000 00000000 00002.25
24
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{ int i=9,j;int i=9,j;
float a,b;float a,b;
j=i/2;j=i/2;
a=i/2.0;a=i/2.0;
b=a*2.0/j;b=a*2.0/j;
printf( ”printf( ”i=%di=%d\n”\n”, i , i ););
printf( ”printf( ”j=%dj=%d\n”\n”, j , j ););
printf(printf( ” ”a=%6.2fa=%6.2f\n”\n”, a , a ); );
printf( printf( ””b=%6.2fb=%6.2f\n”\n”, b , b ););
}}
MEMORIJA
j
a
b
i0000 10010000 0000
9
0000 01000000 0000
4
1001 00000100 0000
0000 00000000 0000
4.5
0001 00000100 0000
0000 00000000 0000
2.25
b=a*2.0/j;b=a*2.0/j;
printf( ”i=%d\n”, i );
i=9
printf( ”printf( ”i=%di=%d\n”\n”, i , i ););
printf( ”j=%d\n”, j );
j=4
printf( ”printf( ”j=%dj=%d\n”\n”, j , j ););
printf( ”a=%6.2f\n”, a );
a= 4.50
printf(printf( ” ”a=%6.2fa=%6.2f\n”\n”, a , a ););
printf( ”b=%6.2f\n”, b );
b= 2.25
25
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Promjenljive u jeziku C++Promjenljive u jeziku C++Promjenljiva ne mora da bude definisana na početku bloka (programa)Promjenljiva ne mora da bude definisana na početku bloka (programa)
Može biti definisana bilo gdje u programu (tamo gdje treba)Može biti definisana bilo gdje u programu (tamo gdje treba)
Doseg (domen važenja) promjenljive je do kraja bloka u kojem je definisanaDoseg (domen važenja) promjenljive je do kraja bloka u kojem je definisana
U istom bloku ne može se više puta definisati ista promjenljivaU istom bloku ne može se više puta definisati ista promjenljiva
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>main()main(){{ int i=9;int i=9; cout << cout << ”Prije bloka : ” << ”Prije bloka : ” << i << endl;i << endl; { { int i=5;int i=5; cout << ”U bloku : ” << i << endl;cout << ”U bloku : ” << i << endl; }} int j=10;int j=10; cout << ”i=” << i << ” j=” << j << endlcout << ”i=” << i << ” j=” << j << endl;;}}
Prije bloka : 9U bloku : 5i=9 j=10
26
1.1.1.1. Uvod Uvod u C u C++++
PROMJENLJIVE ???PROMJENLJIVE ???
Promjenljive u jeziku C++Promjenljive u jeziku C++
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>
main()main()
{{
for ( int k=0; k<n ; k++)for ( int k=0; k<n ; k++)
{ ... }{ ... }
for ( int k=n; k>0 ; k--)for ( int k=n; k>0 ; k--)
{ ... }{ ... }
}}
Dozvoljena definicija promjenljive u C++
U jeziku C nije dozvoljeno, jer definicija promjenljive mora biti na početku bloka
GREŠKA !!!
Ne može se ponoviti definicija promjenljive k u istom bloku!!!
27
1.1.1.1. Uvod Uvod u C u C++++
KONSTANTE ???KONSTANTE ???
Konstante u jeziku CKonstante u jeziku CDefinisanje konstante moguće je preko pretprocesorske direktiveDefinisanje konstante moguće je preko pretprocesorske direktive
#define ime vrijednost#define ime vrijednost
Konstante u jeziku C++Konstante u jeziku C++Uvedena je ključna riječ Uvedena je ključna riječ constconst za definisanje konstanti za definisanje konstantiGubi se potreba za direktivom #define za definisanje konstantiGubi se potreba za direktivom #define za definisanje konstantiOpšti oblikOpšti oblik
const tip ime = vrijednost ;const tip ime = vrijednost ;Npr.Npr.
const int DIM = 100;const int DIM = 100; const char ODG = ’D’;const char ODG = ’D’; const bool TACNO = 1;const bool TACNO = 1;
Definisanoj Definisanoj konstantikonstanti nije mogu nije moguće promijeniti vrijednost !!!će promijeniti vrijednost !!!(konstanta = READ ONLY promjenljiva)(konstanta = READ ONLY promjenljiva)
28
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Aritmetički operatoriAritmetički operatoridodjela vrijednosti dodjela vrijednosti (=)(=)
a=3; c=2; a=3; c=2;
sabiranje sabiranje (+)(+)a=3; c=a+2; a=3; c=a+2; c c 5 5
oduzimanje oduzimanje (-)(-)b=3; c=b-2; b=3; c=b-2; c c 1 1
množenje množenje (*)(*)a=2; b=3; c=a*b; a=2; b=3; c=a*b; c c 6 6
dijeljenje dijeljenje (/)(/)i=9; k=4; n=i/k; i=9; k=4; n=i/k; c c 2 2
p=9.0; q=4.0; r=p/q; p=9.0; q=4.0; r=p/q; c c 2.25 2.25
ostatak cjelobrojnog dijeljenja ostatak cjelobrojnog dijeljenja (%)(%)c=9%4; c=9%4; c c 1 1
p=6%8; p=6%8; p p 6 6
29
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>
main()main()
{{
int a,b,c;int a,b,c;
a=b=c=10;a=b=c=10;
printf(printf( ” ”%d %d %d%d %d %d\n”\n”,, a,b,ca,b,c ); );
a = (b=10) + (c=20);a = (b=10) + (c=20);
printf(printf( ” ”%d %d %d%d %d %d\n”\n”,, a,b,ca,b,c ); );}}
MEMORIJA
aa0000 10100000 1010
0000 00000000 0000
bb0000 10100000 1010
0000 00000000 0000
cc0000 10100000 1010
0000 00000000 0000
10 10 10
0001 01000001 0100
0000 00000000 0000
0001 11100001 1110
0000 00000000 0000
30 10 20
30
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Aritmetički operatori Aritmetički operatori (nastavak)(nastavak)
Operator uvećavanja za jedan (inkrement) Operator uvećavanja za jedan (inkrement) (++)(++)
Operator umanjivanja za jedan (dekrement) Operator umanjivanja za jedan (dekrement) (--)(--)
prefiksni oblik prefiksni oblik postfiksni oblikpostfiksni oblik
++prom++prom prom++ prom++
--prom--prom prom-- prom--
Npr. Npr.
i=i+1 i=i+1 ++i ++i i++ i++
i=i-1 i=i-1 --i --i i-- i--
Npr. Npr. i = 2;i = 2; j = (++i)+5;j = (++i)+5; -------------------- i i i+1 = 2+1 = 3 i+1 = 2+1 = 3 j j i+5 = 3+5 = 8 i+5 = 3+5 = 8
Npr. Npr. i = 2;i = 2; j = (i++)+5;j = (i++)+5; -------------------- j j i+5 = 2+5 = 7 i+5 = 2+5 = 7 i i i+1 = 2+1 = 3 i+1 = 2+1 = 3
31
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Aritmetički operatori Aritmetički operatori (nastavak)(nastavak)
Složeni operatori dodjeljivanjaSloženi operatori dodjeljivanja
x=x+y x=x+y x+=yx+=y Npr. x+=3 Npr. x+=3 x=x+3 x=x+3
x=x-y x=x-y x-=yx-=y Npr. x-=3 Npr. x-=3 x=x-3 x=x-3
x=x*y x=x*y x*=yx*=y Npr. x*=3 Npr. x*=3 x=x*3 x=x*3
x=x/y x=x/y x/=yx/=y Npr. x/=3 Npr. x/=3 x=x/3 x=x/3
x=x%y x=x%y x%=yx%=y Npr. x%=3 Npr. x%=3 x=x%3 x=x%3
32
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Relacioni operatoriRelacioni operatori > > veće veće
< < manjemanje
>= >= veće ili jednakoveće ili jednako
<= <= manje ili jednakomanje ili jednako
== == jednakojednako
!= != različitorazličito
Npr. Npr.
i = 3<5i = 3<5
i = 3>5i = 3>5
i = 3==5i = 3==5
i = 3!=5 i = 3!=5
i = 3=5i = 3=5
i i 1 (istina) 1 (istina)
i i 0 (laž) 0 (laž)
i i 0 (laž) 0 (laž)
i i 1 (istina) 1 (istina)
greškagreška
33
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Logički operatoriLogički operatori && - && - AND = logičko I AND = logičko I
|||| - - OROR = logičko I = logičko ILILI
!! -- NOT = logi NOT = logiččko NE ko NE
Npr. Npr. i = 5 && 1i = 5 && 1 i = 1 && 1i = 1 && 1 j = 0 && 1j = 0 && 1 k = !0k = !0 k = !9k = !9 k = !(k+1)k = !(k+1) m = !(!(0))m = !(!(0)) m = !(!(5)) m = !(!(5)) x = 0 && (i=50)x = 0 && (i=50) y = 1 y = 1 |||| (j=128) (j=128)
i i 1 (istina) 1 (istina) i i 1 (istina) 1 (istina) j j 0 (laž) 0 (laž) k k 1 (istina) 1 (istina) k k 0 (laž) 0 (laž) k k 0 (laž) 0 (laž) m m 0 (laž) 0 (laž) m m 1 (istina) 1 (istina) x x 0 (laž) 0 (laž) y y 1 (istina) 1 (istina)
34
1.1.1.1. Uvod Uvod u C u C++++
OPERATORI ???OPERATORI ???
Bitski operatori (operacije nad bitima)Bitski operatori (operacije nad bitima) & & -- bitsko AND bitsko AND
|| -- bitsko bitsko OROR
~~ - - bitsko bitsko NOTNOT (prvi komplement) (prvi komplement)
^̂ - - bitsko bitsko XORXOR ( (ekskluzivno ILIekskluzivno ILI))
<<<< - pomjeranje ( - pomjeranje (šiftvanje)šiftvanje) ulijevoulijevo
>>>> - pomjeranje ( - pomjeranje (šiftvanje)šiftvanje) udesnoudesno
Složeni bit operatoriSloženi bit operatori
x=x&y x=x&y x&=yx&=y Npr. x&=Npr. x&=33 x=x& x=x&33
x=xx=x||y y xx||=y=y Npr. xNpr. x||==55 x=x x=x|5|5
x=xx=x<<<<y y xx<<<<=y=y Npr. Npr. x<<x<<==11 x=x x=x<<1<<1
x=xx=x>>>>y y xx>>>>=y=y Npr. Npr. x>>x>>=3 =3 x=x x=x>>>>33
35
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
& - bitsko AND& - bitsko AND
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
char c=’9’;char c=’9’;
short cifra;short cifra;
cifra = c & 0x0F;cifra = c & 0x0F;
printf(printf( ” ”%d%d\n”\n”,, ccifra );ifra );}}
MEMORIJA
cc00001111 10 100101
cifracifra
cc00001111 10 100101
00000000 1 1001001
0x0F0x0F00000000 1 1111111&&
00000000 1 1001001
9
36
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
|| - bitsko - bitsko OROR
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short cifra=9; short cifra=9;
char c;char c;
c = cifra | 0x30;c = cifra | 0x30;
printf(printf( ” ”%%c\n”c\n”,, cc ); );}}
MEMORIJA
cifracifra00000000 10 100101
cc
cifracifra00000000 10 100101
00001111 1 1001001
0x300x3000001111 00000000||
00001111 1 1001001
9
37
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
~~ - bitsko - bitsko NOTNOT
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short x=1,y; short x=1,y;
y = ~x;y = ~x;
printf(printf( ” ”%%d\n”d\n”,, y ); y );}}
MEMORIJA
xx00000000 00000101
yy
xx00000000 00000101
11111111 11101110~~
11111111 11101110
-2
38
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
^̂ - - XOR (EX ILI)XOR (EX ILI)
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short x=0x73,y; short x=0x73,y;
y = x^0x32;y = x^0x32;
printf(printf( ” ”%%c\n”c\n”,, y ); y );}}
MEMORIJA
xx00111111 00110011
yy
xx00111111 00110011
00100100 00010001
0x320x3200001111 00100010^̂
00100100 00010001
A
39
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
<<<< - - shift lijevoshift lijevo
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short x=3,y; short x=3,y;
y = x<<1;y = x<<1;
printf(printf( ” ”%%d\n”d\n”,, y ); y );}}
MEMORIJA
xx00000000 00001111
yy
xx00000000 00001111
00000 000 00111100
<<<<11
00000000 01100110
6
40
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
<<<< - - shift lijevoshift lijevo
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short x=3,y; short x=3,y;
y = x<<4;y = x<<4;
printf(printf( ” ”%%d\n”d\n”,, y ); y );}}
MEMORIJA
xx00000000 00001111
yy
xx00000000 00001111
00011 011 00000000
<<<<44
0011 00000011 0000
48
41
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
>>>> - - shift desnoshift desno
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short x=12,y; short x=12,y;
y = x>>1;y = x>>1;
printf(printf( ” ”%%d\n”d\n”,, y ); y );}}
MEMORIJA
xx00000000 11001100
yy
xx00000000 11001100
00000 000 00111100
>>>>11
00000000 01100110
6
42
1.1.1.1. Uvod Uvod u C u C++++
BITSKI operatoriBITSKI operatori ??? ???
>>>> - - shift desnoshift desno
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{
short x=-short x=-44,y; ,y;
y = x>>y = x>>22;;
printf(printf( ” ”%%d\n”d\n”,, y ); y );}}
MEMORIJA
xx11111111 11110000
yy
xx11111111 11110000
111111 111111 1111
>>>>22
11111111 11111111
-1
43
1.1.1.1. Uvod Uvod u C u C++++
PRIORITET PRIORITET OPERATORA ?OPERATORA ?
Prioritet i asocijativnost operatoraPrioritet i asocijativnost operatoraPrioritetPrioritet OperatoriOperatori AsocijativnostAsocijativnost
najvišinajviši
najnižinajniži
(( ) ) { } -> .{ } -> . ! ~ ++ -- + - * & (tip)! ~ ++ -- + - * & (tip)
(( ) ) { } -> .{ } -> .
* / %* / % ! ~ ++ -- + - * & (tip)! ~ ++ -- + - * & (tip)
+ -+ - * / %* / %
<< >><< >> + -+ -
< <= > >=< <= > >= << >><< >>
== != & ^ | && ||== != & ^ | && || < <= > >=< <= > >=
?:?: == != & ^ | && ||== != & ^ | && ||
= += -= *= /= %= &= ^= |== += -= *= /= %= &= ^= |= ?:?:
,, = += -= *= /= %= &= ^= |== += -= *= /= %= &= ^= |= ,,
44
1.1.1.1. Uvod Uvod u C u C++++
ASOCIJATIVNOSTASOCIJATIVNOST OPERATORA ?OPERATORA ?
Prioritet i asocijativnost operatoraPrioritet i asocijativnost operatora (nastavak)(nastavak)
Asocijativnost operatora slijeva udesno Asocijativnost operatora slijeva udesno (())
tzv. lijeva asocijativnost operatoratzv. lijeva asocijativnost operatora
X X opop Y Y opop Z Z (X (X opop Y) Y) opop Z Z
Asocijativnost operatora zdesna ulijevo Asocijativnost operatora zdesna ulijevo (())
tzv. desna asocijativnost operatoratzv. desna asocijativnost operatora
X X opop Y Y opop Z Z X X opop (Y (Y opop Z) Z)
45
1.1.1.1. Uvod Uvod u C u C++++
USLOVNI USLOVNI OPERATOR ?OPERATOR ?
Uslovni operator (?:)Uslovni operator (?:)
Opšti oblik:Opšti oblik:
uslov ? izraz1 : izraz2uslov ? izraz1 : izraz2
ISTINA LAŽuslov
izraz1 izraz2
Npr. Npr. y = 5;y = 5; x = (y>0) ? 100 : 200;x = (y>0) ? 100 : 200; -------------------- x x 100 100
Npr. Npr. y = -2;y = -2; x = (y>0) ? 100 : 200;x = (y>0) ? 100 : 200; -------------------- x x 200 200
46
1.1.1.1. Uvod Uvod u C u C++++
NOVI OPERATORI U NOVI OPERATORI U C++ ?C++ ?
Operator za razrješenje dosega (::)Operator za razrješenje dosega (::)Operator :: ima najviši priroritetOperator :: ima najviši priroritet
Bez operatora za razješenje dosega nemoguće je u unutrašnjem bloku Bez operatora za razješenje dosega nemoguće je u unutrašnjem bloku pristupiti identifikatoru iz spoljašnjeg bloka ako je on maskiran pristupiti identifikatoru iz spoljašnjeg bloka ako je on maskiran istoimenim identifikatoromistoimenim identifikatorom
Primjer:Primjer:
......int x = 1;int x = 1; // globalno x=1// globalno x=1 int f()int f(){{ int x = 2; int x = 2; // lokalno x=2// lokalno x=2 x++; x++; // lokalno x=3// lokalno x=3 ::x++;::x++; // globalno x=2// globalno x=2 return x + return x + ::x::x; ; }}
Komentar u C++ // sve iza je komentar
u C++ vrijednost koja se vraća pomoću
return ne mora da se navodi unutar zagrada
47
1.1.1.1. Uvod Uvod u C u C++++
ULAZ PODATAKAULAZ PODATAKA ??? ???
Standardna funkcija za Standardna funkcija za uulaz (čitanje) podatakalaz (čitanje) podataka
scanfscanf( ”konverzioni string” , lista_argumenata )( ”konverzioni string” , lista_argumenata ) ”konverzioni string”
Kontrolni (konverzioni) niz određuje način na koji se vrši unos podataka
Sličan konverzionom nizu kod printf()
Čine ga konverzioni karakteri koji definišu način unosa podataka
lista_argumenata
Određuje šta treba da se unese (koji podaci treba da se učitaju)
Argumenti se odvajaju zapetama
Argumenti su pokazivači na memorijske lokacije u koje se
smještaju učitani podaci
Ako se učitava promjenljiva x tada je argument oblika &x
48
1.1.1.1. Uvod Uvod u C u C++++
ULAZ PODATAKAULAZ PODATAKA ??? ???
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
main()main()
{{ int broj;int broj;
printf( ”printf( ”Unesite cijeli broj:Unesite cijeli broj:\n”\n” ););
scanfscanf( ”( ”%d%d””,, &broj &broj ););
printf(printf( ” ”Unijeli ste %dUnijeli ste %d\n”\n”,, broj broj ); );
}}
MEMORIJA
brojbroj
Unesite cijeli broj:
6
00000000 0110 0110
0000 00000 0000000
Unijeli ste 6
49
1.1.1.1. Uvod Uvod u C u C++++
cin ???cin ???
Standardni ulaz u jeziku C++Standardni ulaz u jeziku C++ I u C++ jeziku može da se koristi I u C++ jeziku može da se koristi scanf()scanf() funkcija iz funkcija iz <stdio.h><stdio.h>
C++ ima biblioteku C++ ima biblioteku <iostream.h><iostream.h> za rad sa U/I tokovima za rad sa U/I tokovimatok = stream = dugački niz bajtovatok = stream = dugački niz bajtova
standardni tok za ulaz podataka standardni tok za ulaz podataka
cincin - upućivač na konzolu - upućivač na konzolu u istom programu u istom programu NE TREBANE TREBA istovremeno koristiti istovremeno koristiti scanf()scanf() i i cincin
cin >> prom1 >> prom2 >> ... >> promN;cin >> prom1 >> prom2 >> ... >> promN;
50
1.1.1.1. Uvod Uvod u C u C++++
cin ???cin ???
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ int broj;int broj; printf( ”printf( ”Unesite cijeli broj:Unesite cijeli broj:\n”\n” );); scanfscanf( ”( ”%d%d””,, &broj &broj );); printf(printf( ” ”Unijeli ste %dUnijeli ste %d””,, broj broj ); ); }}
#include <iostream.h>#include <iostream.h>main()main(){{ int broj ;int broj ; cout << cout << ””Unesite cijeli broj:Unesite cijeli broj:\n”\n” ;; cin >> broj cin >> broj ;; cout <<cout << ” ”Unijeli ste Unijeli ste ”” << << broj broj ; ; }}
51
1.1.1.1. Uvod Uvod u C u C++++
MALO VJEŽBE...MALO VJEŽBE...
Primjer:Primjer:
Napisati program koji za proizvoljnu vrijednost poluprečnika kruga računa i ispisuje njegov obim i površinu.
POČETAK
r
o = 2*r*PI
p= r*r*PI
o
p
KRAJ
Dijagram tokaDijagram toka
ProgramProgram
#include <iostream.h>#include <iostream.h>
main()main()
{{
const float PI=3.14159;const float PI=3.14159;
float r,o,p;float r,o,p;
cout << "r=" ;cout << "r=" ;
cin >> r ;cin >> r ;
o = 2*r*PI;o = 2*r*PI;
p = r*r*PI; p = r*r*PI;
cout << "Obim : " << o << endl ;cout << "Obim : " << o << endl ;
cout << "Povrsina : " << p << endl ;cout << "Povrsina : " << p << endl ;
}}
r=3r=3Obim : 18.8495Obim : 18.8495Povrsina : 28.2743Povrsina : 28.2743
52
1.1.1.1. Uvod Uvod u C u C++++
ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......
Zadaci:Zadaci:
1. Napisati program koji učitava dužinu stranice kvadrata (a), a zatim računa i ispisuje njegov obim i površinu.
2. Napisati program koji učitava dužinu strane kocke (a), a zatim računa i ispisuje njenu zapreminu i površinu.
3. Napisati program koji učitava dužine stranice pravougaonika (a i b), a zatim računa i ispisuje njegov obim i površinu te dužinu dijagonale.
4. Napisati program koji učitava dužine strana dužine strana pravougaone prizme (a, b, c), a zatim računa i ispisuje njenu zapreminu i površinu.
5. Napisati program koji učitava temperaturu izraženu u C, a zatim ispisuje koliko je to K.
6. Napisati program koji učitava ugao izražen u stepenima, minutama i sekundama, a zatim ispisuje koliko je to ukupno stepeni.
7. Napisati program koji učitava ugao izražen u stepenima, minutama i sekundama, a zatim ispisuje koliko je to radijana.
8. Napisati program koji učitava ugao izražen u radijanima, a zatim ispisuje koliko je to stepeni.
9. Napisati program koji učitava ugao izražen u radijanima, a zatim ispisuje koliko je to stepeni, minuta i sekundi (stepeni, minute i sekunde su cjelobrojni).
53
1.2.1.2. Naredbe Naredbe
NAREDBE ?NAREDBE ?
NaredbeNaredbeC raspolaže malim skupom naredbiC raspolaže malim skupom naredbi
Svaka naredba (iskaz) završava sa Svaka naredba (iskaz) završava sa ;; (terminator iskaza) (terminator iskaza)
Osnovne grupe naredbi:Osnovne grupe naredbi:
naredbe grananja i izbora:naredbe grananja i izbora: if, switchif, switch
naredbe petlji:naredbe petlji: while, do while, forwhile, do while, for
naredbe za nasilnu promjenu toka:naredbe za nasilnu promjenu toka: break, continue, goto, returnbreak, continue, goto, return
Komponovana (složena) naredbaKomponovana (složena) naredba
jednu ili više naredbi grupišemo korištenjem velikih zagrada jednu ili više naredbi grupišemo korištenjem velikih zagrada {}{}
opšti oblik:opšti oblik: { { iskaz1;iskaz1;iskaz2;iskaz2; … …iskazN;iskazN;
}}
Složena naredba izvršava se tako što se izvršavaju jedna po jedna prosta naredba (iskaz)
od kojih je sastavljena
Ekvivalentna je BLOKU naredbi u PASCALUBEGIN ... END
54
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ifif ??
Naredba Naredba ififOmogućava realizaciju grananja u programu:Omogućava realizaciju grananja u programu:
jednoblokovsko, dvoblokovsko, višeblokovskojednoblokovsko, dvoblokovsko, višeblokovsko
Jednoblokovsko grananjeJednoblokovsko grananje
iskaz
ISTINA LAŽuslov
if (uslov) iskaz;if (uslov) iskaz;
složeni iskaz
ISTINA LAŽuslov
if (uslov) if (uslov) { { iskaziskaz11;; ... ... iskazN;iskazN; }}
55
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ifif ? ?
PrimjerProgram koji provjerava da li je učitani broj pozitivan.
broj
ISTINA LAŽ
POČETAK
"pozitivan"
KRAJ
broj>0
#include <stdio.h>#include <stdio.h>
main()main()
{{ float float brojbroj;;
printf(printf( ”Unesite broj: ” ); ”Unesite broj: ” );
scanfscanf( ”( ”%%f”f”,, &&brojbroj ););
if ( broj>0 ) if ( broj>0 )
printf(printf( ”Broj je pozitivan\n” ”Broj je pozitivan\n”,, ); );
}}
56
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ifif ? ?
Dvoblokovsko grananjeDvoblokovsko grananje
if (uslov) if (uslov) iskaz1;iskaz1; elseelse iskaz2;iskaz2;
if (uslov) if (uslov) { { iskaziskaz11;; ... ... iskazN;iskazN; }} elseelse { { iskaziskaz11;; ... ... iskazN;iskazN; }}
ISTINA LAŽuslov
iskaz 1 iskaz 2
ISTINA LAŽuslov
složeni iskaz 1 složeni iskaz 2
57
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ifif ? ?
PrimjerProgram koji provjerava da li je učitani prirodni broj paran ili neparan.
#include <stdio.h>#include <stdio.h>main()main(){{ int int brojbroj, ost;, ost; printf(printf( ”Unesite broj: ” ); ”Unesite broj: ” ); scanfscanf( ”( ”%d%d””,, &&brojbroj );); if ( brojif ( broj<=<=0 ) 0 ) printf(printf(””Nije prirodanNije prirodan\n”);\n”); elseelse {{ ost = broj % 2;ost = broj % 2; if (ost==0)if (ost==0) printf(printf(””ParanParan\n”);\n”); elseelse printf(printf(””NeparanNeparan\n”);\n”); }}}}
ISTINA LAŽ
ISTINA LAŽ
POČETAK
broj
"GREŠKA"
"Paran" "Neparan"
KRAJ
ost = broj MOD 2
broj<=0
ost = 0
if (broj % 2 == 0)
58
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ifif ??
Višeblokovsko grananjeVišeblokovsko grananje
if (uslov1) if (uslov1) iskaz1;iskaz1; else if (uslov2)else if (uslov2) iskaz2; iskaz2; else if (uslov3)else if (uslov3) iskaz3; iskaz3;
... ...
else if (uslovN)else if (uslovN) iskazN;iskazN; [[elseelse iskaz0;iskaz0;]]
Blok 1Uslov 1ISTINA
LAŽ
Blok 2
Blok NUslov NISTINA
LAŽ
Uslov 2ISTINA
LAŽ
Blok 0
59
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ifif ? ?
PrimjerProgram koji za učitanu numeričku ocjenu ispisuje opisnu ocjenu.
#include <stdio.h>#include <stdio.h>main()main(){{ int int ocjenaocjena;; printf(printf( ”Ocjena? ” ); ”Ocjena? ” ); scanfscanf( ”( ”%d%d””,, &&ocjenaocjena );); if (ocjena=if (ocjena===5) 5) printf(printf(”Odlican\n”);”Odlican\n”); elseelse if (ocjena= if (ocjena===4) 4) printf(printf(”Vrlo dobar\n”);”Vrlo dobar\n”); elseelse if (ocjena= if (ocjena===3) 3) printf(printf(”Dobar\n”);”Dobar\n”); elseelse if (ocjena= if (ocjena===2) 2) printf(printf(”Dovoljan\n”);”Dovoljan\n”); elseelse if (ocjena= if (ocjena===1) 1) printf(printf(”Nedovoljan\n”);”Nedovoljan\n”); elseelse printf(printf(”GRESKA\n”);”GRESKA\n”); }}
POČETAK
ocjena=5
ocjena
ISTINA
"Odlican"
LAŽ
"GRESKA"
KRAJ
ISTINA
"Nedovoljan"
ocjena=4ISTINA
"Vrlo dobar"
LAŽ
ocjena=3ISTINA
"Dobar"
LAŽ
ocjena=2
ocjena=1
LAŽISTINA
"Dovoljan"
LAŽ
60
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
switchswitch ? ?
Naredba Naredba switchswitchOmogućava realizaciju Omogućava realizaciju selektivnog selektivnog
vivišeblokovskog grananjašeblokovskog grananja
izraz
v1 v2 vn inače. . .
blok 1 blok 0blok 2 blok n
switch (izraz) switch (izraz) {{ case v1:case v1: iskaz1;iskaz1; ...... iskazN;iskazN; case v2:case v2: iskaz1;iskaz1; ...... iskazN;iskazN; .. .. ..
case vN:case vN: iskaz1;iskaz1; ...... iskazN;iskazN; [default:[default: iskaz0;iskaz0;]] }}
61
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
switchswitch ? ?
Naredba Naredba switchswitch switch (izraz) switch (izraz) {{ case v1:case v1: iskaz1;iskaz1; ...... iskazN;iskazN; case v2:case v2: iskaz1;iskaz1; ...... iskazN;iskazN; .. .. ..
case vN:case vN: iskaz1;iskaz1; ...... iskazN;iskazN; [default:[default: iskaz0;iskaz0;]] }}
selektorski izrazne može biti float ili double
Na početku se izračunava vrijednost izraza
Izračunata vrijednost pronalazi se među konstantama v1 .. vN
Ako se vrijednost pronađe, izvršavaju se svi iskazi od pronađenog case do kraja
switch
Ako se vrijednost ne pronađe, prelazi se na iskaze iza default:
Ako se želi izlazak iz naredbe switch kad se završi odgovarajući case, treba koristiti
naredbu break
break;
break;
break;
62
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
switchswitch ? ?
PrimjerProgram koji za učitanu numeričku ocjenu ispisuje opisnu ocjenu koristeći selektivno višeblokovsko grananje.
#include <stdio.h>#include <stdio.h>main()main(){{ int int ocjenaocjena;; printf(printf(”Ocjena? ”);”Ocjena? ”); scanf scanf(”(”%d%d””,&,&ocjena);ocjena); switch (ocjena)switch (ocjena) {{ case 5:case 5: printf(printf(”Odlican\n”);”Odlican\n”); break; break; case 4:case 4: printf(printf(”Vrlo dobar\n”);”Vrlo dobar\n”); break; break; case 3:case 3: printf(printf(”Dobar\n”);”Dobar\n”); break; break; case 2:case 2: printf(printf(”Dovoljan\n”);”Dovoljan\n”); break; break; case 1:case 1: printf(printf(”Nedovoljan\n”);”Nedovoljan\n”); break; break; default:default: printf(printf(”GRESKA\n”);”GRESKA\n”); }}}}
63
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
switchswitch ? ?
Primjer: Program koji simulira rad kalkulatora cjelobrojnih operacija
#include <stdio.h>#include <stdio.h>main()main(){{ int x,y,rez;int x,y,rez; char op;char op; printf(printf(””Unesite izraz u obliku op1 operator op2: Unesite izraz u obliku op1 operator op2: \n”);\n”); scanfscanf(”(”%d %c %d%d %c %d””,&x,&op,&y),&x,&op,&y);; switch (op)switch (op) {{ case case ’+’’+’:: rez=x+y;rez=x+y; break; break; case case ’-’’-’:: rez=x-y;rez=x-y; break; break; case case ’*’’*’:: rez=x*y;rez=x*y; break; break; case case ’/’’/’:: rez=x*y;rez=x*y; break; break; default:default: printf(printf(”Ne poznajem tu operaciju!\n”);”Ne poznajem tu operaciju!\n”); return (0);return (0); }} printf printf ((”%d %c %d = %d”, x,op,y,rez);”%d %c %d = %d”, x,op,y,rez); }}
Nasilni izlaz iz programa
64
1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora
ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......
Zadaci:Zadaci:
1. Napisati program koji učitava dva broja, a zatim ispisuje manji broj.
2. Napisati program koji učitava tri broja, a zatim ispisuje najmanjeg (najvećeg).
3. Napisati program koji učitava prirodan broj manji od 100, a zatim ispisuje zbir njegovih cifara.
4. Napisati program koji učitava prirodan broj manji od 1000, a zatim ispisuje zbir njegovih cifara.
5. Učitati godinu, pa ispisati da li je ona prestupna ili nije.
6. Napisati program koji za učitani redni broj dana u sedmici ispisuje njegov naziv (ponedjeljak, utorak, ... , nedjelja).
7. Napisati program koji za učitani redni broj mjeseca u godini ispisuje naziv mjeseca (januar, februar, ... , decembar).
8. Napisati program koji učitava redni broj mjeseca i godinu, a zatim ispisuje koliko ima dana u tom mjesecu. U obzir uzeti da li je godina prestupna.
65
1.2.2.1.2.2. Naredbe nasilne promjene toka Naredbe nasilne promjene toka
break break ??
Naredba Naredba breakbreakDejstvo:Dejstvo:
u naredbi u naredbi switchswitch::• nasilni prekid izvršavanja naredbe switchnasilni prekid izvršavanja naredbe switch• prelazak na prvi iskaz iza naredbe switchprelazak na prvi iskaz iza naredbe switch
u petljama:u petljama:• nasilni prekid izvršavanja petljenasilni prekid izvršavanja petlje• prelazak na prvi iskaz iza petljeprelazak na prvi iskaz iza petlje
u ostalim slučajevima:u ostalim slučajevima:• nema dejstvanema dejstva
66
1.2.2.1.2.2. Naredbe nasilne promjene toka Naredbe nasilne promjene toka
return return ??
Naredba Naredba returnreturnDejstvo: izlazak iz funkcije Dejstvo: izlazak iz funkcije
• prekida izvršavanje date funkcije prekida izvršavanje date funkcije
(ignorišu se svi iskazi iza return)(ignorišu se svi iskazi iza return)
• ako se nalazimo u main funkciji – prekid programaako se nalazimo u main funkciji – prekid programa
Omogućava da funkcija vrati neku vrijednostOmogućava da funkcija vrati neku vrijednost
Opšti oblikOpšti oblik
return (vrijednost);return (vrijednost);
iliili
return (izrazreturn (izraz););
67
1.2.2.1.2.2. Naredbe nasilne promjene toka Naredbe nasilne promjene toka
goto goto ??
Naredba Naredba gotogotoOmogućava bezuslovni skokOmogućava bezuslovni skok
Opšti oblikOpšti oblik
goto labela;goto labela;
Labela (oznaka) neke naredbe u istoj funkciji
Primjer
#include <stdio.h>#include <stdio.h>main()main(){{
int broj;int broj;
lab1:lab1: printf(printf(””Unesite prirodan broj:Unesite prirodan broj: ”); ”);
scanfscanf(”(”%d%d””,&broj,&broj););
if (broj<1)if (broj<1)
{ { printf(”Nije prirodan!printf(”Nije prirodan!\n\n””); goto kraj; }); goto kraj; }
printf (”%d %s paran\n”, broj, (broj%2)? ”nije” : ”je”);printf (”%d %s paran\n”, broj, (broj%2)? ”nije” : ”je”);
goto lab1;goto lab1;
kraj: printf(”KRAJ...”);kraj: printf(”KRAJ...”);}}
Bezuslovni skok na iskaz označen
sa lab1
Bezuslovni skok na iskaz označen
sa kraj
68
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
while while ??
Naredba Naredba whilewhileOmogućava realizaciju petlje sa izlazom na vrhuOmogućava realizaciju petlje sa izlazom na vrhu
while (izraz) while (izraz) { { iskaziskaz11;; ... ... iskazN;iskazN; }}
uslov
ISTINA
tijelo petlje
LAŽ while (izraz) while (izraz) iskaz;iskaz;
Opšti oblikOpšti oblik
Ciklus će se izvršavati sve Ciklus će se izvršavati sve dok je uslov ispunjen dok je uslov ispunjen
(ne mora ni jedamput)(ne mora ni jedamput)
iliili
Sve dok je izraz ISTINIT (!=0) izvršava se Sve dok je izraz ISTINIT (!=0) izvršava se (složena) naredba(složena) naredba
Kad izraz postane LAŽ (==0) prekida se Kad izraz postane LAŽ (==0) prekida se izvršavanje petljeizvršavanje petlje
69
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
while while ??
Primjer: Program koji N puta ispisuje riječ "ALGORITAM“.
POČETAK
KRAJ
n
b = 1
b <=n
"ALGORITAM"
ISTINA
LAŽ
b = b + 1
#include <stdio.h>#include <stdio.h>main()main(){{ int n, b=1;int n, b=1; printf(printf(”Unesite ”Unesite NN: ”);: ”); scanfscanf(”(”%d%d””,&n,&n);); while ( b<=n )while ( b<=n ) {{ printf(printf(””AlgoritamAlgoritam\n”);\n”); b++;b++; }}}}
70
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
while while ??
Primjer: Program koji N puta ispisuje riječ "ALGORITAM". (bez korištenja pomoćnog brojača)
POČETAK
KRAJ
n
n
"ALGORITAM"
ISTINA
LAŽ
n--
#include <stdio.h>#include <stdio.h>main()main(){{ int n;int n; printf(printf(”Unesite ”Unesite NN: ”);: ”); scanf scanf(”(”%d%d””,&n,&n);); while (n)while (n) {{ printf(printf(””ALGORITAMALGORITAM\n”);\n”); n--;n--; }}}}
#include <stdio.h>main(){ int n; printf(”Unesite N: ”); scanf(”%d”,&n); while (n--) printf(”ALGORITAM\n”); }
71
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
while while ??
Primjer: Program koji učitava n, a zatim izračunava i ispisuje n!
#include <stdio.h>#include <stdio.h>
main()main()
{{
int n, f=1;int n, f=1;
printf(printf(”Unesite ”Unesite NN: ”);: ”);
scanfscanf(”(”%d%d””,&n,&n););
printf(printf(””%d!=%d!=””,n,n););
while (n)while (n)
f *= n--;f *= n--;
printf(printf(””%d%d””,f,f););
}}
POČETAK
KRAJ
n
f = 1
n
f
ISTINA
LAŽ
f = f * n
n = n -1
72
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
while while ??
Primjer: Program koji učitava prirodan broj, a zatim ispisuje zbir njegovih cifara.
#include <stdio.h>#include <stdio.h>main()main(){{ int b, s=0;int b, s=0; printf(printf(”Unesite ”Unesite brojbroj: ”);: ”); scanfscanf(”(”%d%d””,&b,&b);); if (b<1)if (b<1) printf(printf(””Nije prirodan!Nije prirodan!”);”); elseelse {{ while (b)while (b) {{ s += b % 10;s += b % 10; b /= 10;b /= 10; }} printf(printf(””Zbir cifara je:%dZbir cifara je:%d””,s,s);); }}}}
POČETAK
b
KRAJ
"Nije prirodan"
b < 1ISTINA LAŽ
s = 0
b > 0LAŽ
ISTINA
c = b MOD 10
s = s + c
b = b DIV 10
s
KRAJ
73
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
while while ??
Primjer: Program koji učitava prirodan broj, a zatim ispisuje da li je on prost ili nije.
#include <stdio.h>#include <stdio.h>#include <#include <mathmath.h>.h>main()main(){{ int b, p, d=int b, p, d=11;; printf(printf(”Unesite ”Unesite brojbroj: ”);: ”); scanfscanf(”(”%d%d””,&b,&b);); if (b<1)if (b<1) printf(printf(””Nije prirodan!Nije prirodan!”);”); elseelse {{ p = p = ((bb ==== 22)) | (b % 2);| (b % 2); while (while (p && (d+=2p && (d+=2))<=sqrt(b))<=sqrt(b)) pp = b % = b % dd;; printf(printf(”%”%dd %s prost” %s prost”,, b, p ? ”je”:”nije”); b, p ? ”je”:”nije”); }}}}
POČETAK
b
KRAJ
"Nije prirodan"
b < 1ISTINA LAŽ
p = (b==2) (b%2)
LAŽ
ISTINA
p = b%d != 0
d = 3
KRAJ
p && d < b
d = d + 2
LAŽISTINAp
“NIJE"“JESTE"
74
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
do ... do ... while while ??
Naredba Naredba do...wdo...whilehileOmogućava realizaciju petlje sa izlazom na dnuOmogućava realizaciju petlje sa izlazom na dnu
dodo { { iskaziskaz11;; ... ... iskazN;iskazN; } } while (izraz); while (izraz);
dodo iskaz;iskaz; while (izraz); while (izraz);
Opšti oblikOpšti oblik
iliiliISTINA
uslov
tijelo petlje
LAŽ
1. Izvršavaju se iskazi iza 1. Izvršavaju se iskazi iza dodo
2. Računa se vrijednost izraza2. Računa se vrijednost izraza
3. Ako je izraz ISTINIT (!=0) idi na korak 13. Ako je izraz ISTINIT (!=0) idi na korak 1
4. Ako je izraz LAŽ (==0) prekida se izvršavanje 4. Ako je izraz LAŽ (==0) prekida se izvršavanje petlje i prelazi na sljedeći iskaz iza petlje i prelazi na sljedeći iskaz iza whilewhile
75
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
do ... do ... while while ??
Primjer: Program koji N puta ispisuje riječ "ALGORITAM“.
#include <stdio.h>#include <stdio.h>main()main(){{ int n, b=1;int n, b=1; dodo {{ printf(printf(”Unesite ”Unesite NN: ”);: ”); scanfscanf(”(”%d%d””,&n,&n);); }} while (while (n<1n<1));; dodo {{ printf(printf(””AlgoritamAlgoritam\n”);\n”); b++;b++; }} while (b<=n);while (b<=n);}}
POČETAK
N
b = 1
"ALGORITAM"
b = b + 1
ISTINA N < 1
LAŽ
ISTINAb<=N
KRAJ
LAŽ
#include <stdio.h>main(){ int n, b=1; do { printf(”Unesite N: ”); scanf(”%d”,&n); } while (n<1); do printf(”Algoritam\n”); while ( ++b <= n );}
76
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
do ... do ... while while ??
Primjer: Euklidovim algoritmom odrediti NZD dva prirodna broja.
#include <stdio.h>#include <stdio.h>main()main(){{ int int x,y,p,ostx,y,p,ost;; dodo {{ printf(printf(”Unesite X i Y:”);”Unesite X i Y:”); scanfscanf(”(”%d%d %d” %d”,&,&x,&y);x,&y); }} while (while (x<1 || y<1x<1 || y<1));; if (x<y) if (x<y) { p=x; x=y; y=p; }{ p=x; x=y; y=p; } dodo { { ost = x%y;ost = x%y; x = y;x = y; y = ost;y = ost; }} while (y);while (y);}}
POČETAK
X , Y
ISTINA
LAŽ
X<1 v Y<1
P=XX=YY=P
ISTINA LAŽX < Y
T
Y > 0
KRAJ
ISTINA
X = Y
Y = ost
ost=X MOD Y
X
T
LAŽ
77
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
do ... do ... while while ??
Primjer: Podijeliti dva prirodna broja na proizvoljan broj decimala. (koristeći pravilo za ručno dijeljenje)
#include <stdio.h>#include <stdio.h>main()main(){{ int int x,y,x,y,bd;bd; dodo {{ printf( printf(”Unesite X i Y:”);”Unesite X i Y:”); scanf scanf(”(”%d%d %d” %d”,&,&x,&y);x,&y); }} while (while (x<1 || y<1x<1 || y<1));; dodo {{ printf( printf(””Broj decimalaBroj decimala:”);:”); scanf scanf(”(”%d%d””,&bd,&bd);); }} while (bdwhile (bd<1<1)); ; printf(”%d:%d=%d.”, x, y, x/y);printf(”%d:%d=%d.”, x, y, x/y); dodo { { xx = x%y = x%y * 10 * 10;; printf(”%d”, x/y);printf(”%d”, x/y); }} while (while (--bd--bd););}}
78
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
do ... do ... while while ??
Primjer: Program koji računa drugi korijen iz pozitivnog realnog broja X na četiri decimale koristeći Njutnovu iterativnu formulu.
...2 ,1 ,0 ,2
,2
110
n
xX
x
xX
x nn
n
POČETAK
X
ISTINA
LAŽ
X < 0
eps = 0.0001
xN = (X+1) / 2
xS = xN
xN = (xS + X/ xS) / 2
|xN - xS | > epsISTINA
KRAJ
LAŽ
xN
#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define EPS 0.0001#define EPS 0.0001main()main(){{ floatfloat x,xs,xnx,xs,xn;; dodo { { printf(printf(”X=”);”X=”); scanf scanf(”(”%%f”f”,&,&x);}x);} while (while (x<0x<0));; xn = (x+1)/2; xn = (x+1)/2; dodo { xs = xn; xn = (xs + x/xs) / 2;}{ xs = xn; xn = (xs + x/xs) / 2;} while (fabs(xn-xs)>EPS);while (fabs(xn-xs)>EPS); printf(”Korijen je: %8.4f”,xn);printf(”Korijen je: %8.4f”,xn);}}
79
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
for for ??
Naredba Naredba forfor
for (poc_izraz; uslov; izraz_petlje)for (poc_izraz; uslov; izraz_petlje) { { iskaziskaz11;; ... ... iskazN;iskazN; }}
for (poc_izraz; uslov; izraz_petlje) for (poc_izraz; uslov; izraz_petlje) iskaz;iskaz;
Opšti oblikOpšti oblik
iliiliuslov petlje
ISTINA
tijelo petlje
LAŽ
početniizraz
izraz petlje Ekvivalentno sljedećoj Ekvivalentno sljedećoj whilewhile petlji: petlji:
pocetni_izraz;pocetni_izraz; while (uslov)while (uslov) { { iskaz; izraz_petlje;iskaz; izraz_petlje; }}
80
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
forfor ??
Primjer: Program koji N puta ispisuje riječ "ALGORITAM“.
#include <stdio.h>#include <stdio.h>main()main(){{ int n, int n, ii;;
printf(printf(”Unesite ”Unesite NN: ”);: ”); scanf scanf(”(”%d%d””,&n,&n););
for (i=1 ; i<=n ; i++)for (i=1 ; i<=n ; i++) printf(printf(””AlgoritamAlgoritam\n”);\n”);}}
POČETAK
KRAJ
i = 1, N
"ALGORITAM"
N
#include <stdio.h>main(){ int n;
printf(”Unesite N: ”); scanf(”%d”,&n);
for ( ; n ; n--) printf(”Algoritam\n”);}
Početni izraz nepotreban, pa je izostavljen.
Uslov petlje (n), odnosno (n>0)
81
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
forfor ??
Primjer: Program koji ispisuje cijele brojeve iz intervala <A,B>.
#include <stdio.h>#include <stdio.h>main()main(){{ int a, b, broj;int a, b, broj;
printf(printf(”Unesite ”Unesite granice intervalagranice intervala: ”);: ”); scanfscanf(”(”%d %d%d %d””,&a, &b,&a, &b););
for (for ( broj broj==a+a+1 ; 1 ; brojbroj<=<=b-1b-1 ; ; brojbroj++++ )) printf(printf(”” %d %d””, broj, broj););}}
#include <stdio.h>main(){ int a, b, broj;
printf(”Unesite granice intervala: ”); scanf(”%d %d”,&a, &b);
for ( broj=a+1 ; broj<=b-1 ; )
printf(” %d”, broj++);}
POČETAK
KRAJ
broj = A+1, B-1
broj
A , B
izraz petlje izostavljen ali je implementiran u sljedećem
iskazu!!!printf(” %d”, broj++);
82
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
forfor ??
Primjer: Program koji računa n!
#include <stdio.h>#include <stdio.h>main()main(){{ int n, bint n, b, p, p;; dodo {{ printf(printf(””n=n=”);”); scanf scanf(”(”%d%d””,&,&n); }n); } while (n<0);while (n<0);
for (for ( p=1, p=1, bb=2 ; =2 ; bb<=n ; <=n ; bb++++ ) ) p=p*b;p=p*b;
printf(printf(””%d%d!=%d”!=%d”, , n, p);n, p);}}
POČETAK
KRAJ
P = 1
P
b = 2, N
P = P * b
N
ISTINA N < 0
LAŽ
#include <stdio.h>main(){ int n, p; do { printf(”n=”); scanf(”%d”,&n); } while (n<0);
for ( p=1 ; n ; p*=n-- );
printf(”%d”, p);}
dva početna izrazameđusobno odvojeni zapetom
83
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
forfor ??
Primjer: Učitati prirodan broj, pa provjeriti da li je on savršen.
KRAJ
LAŽ
“NIJE"
ISTINA
“JESTE"
broj = S
POČETAK
broj
D = 2, broj/2
ost = broj % D
"Nije prirodan"
broj < 1ISTINA LAŽ
ost = 0
ISTINA
LAŽ
S = 1
S = S + D
KRAJ
#include <stdio.h>#include <stdio.h>main()main(){{ int broj, d, s;int broj, d, s; printf(printf(””Unesite prirodan broj:Unesite prirodan broj:”);”); scanfscanf(”(”%d%d””,&broj,&broj); ); if if ((brojbroj<<11)) printf(”Nije prirodan!”);printf(”Nije prirodan!”); elseelse
{{
for (for ( s=1, d=2 ; d<=broj/2 ; d++s=1, d=2 ; d<=broj/2 ; d++ ) ) s += (broj%d) ? 0 : d;s += (broj%d) ? 0 : d;
printf(printf(””%d%d %s savrsen” %s savrsen”, , broj, broj,
(broj==s) ? ”je” : ”nije” );(broj==s) ? ”je” : ”nije” ); }}}}
84
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
forfor ??
Primjer: Ispisati sve savršene prirodne brojeve manje od 1000.
LAŽISTINA
broj
broj = S
KRAJ
POČETAK
broj = 1, 999
D = 2, broj/2
ost = broj MOD D
ost = 0
ISTINA
LAŽ
S = 1
S = S + D
#include <stdio.h>#include <stdio.h>main()main(){{ int broj, d, s;int broj, d, s;
for (for ( broj=1 broj=1 ; broj ; broj<1000<1000 ; ; brojbroj++++ ))
{ { for (for ( s=1, d=2 ; d<=broj/2 ; d++s=1, d=2 ; d<=broj/2 ; d++ ) ) s += (broj%d) ? 0 : d;s += (broj%d) ? 0 : d;
if (broj==s) if (broj==s) printf(” %d”, printf(” %d”, broj)broj);;
}}}}
85
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
forfor ??
Primjer: Program koji ispisuje prvih n redova sljedećeg trougla:
***************...
#include <stdio.h>#include <stdio.h>main()main(){{ int n, red, broj;int n, red, broj;
do { printf(”n=? ”); scanf(”%d”,&n); } while (n<1 || n>20);
for (for ( red=1 red=1 ; ; red<=nred<=n ; ; redred++++ )) { { for (for ( broj broj==11 ; broj ; broj<=red<=red ; ; brojbroj++++ ) ) printf(”*”);printf(”*”);
printf(”printf(”\n\n””));;
}}}}
86
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
forfor ??
Primjer: Program koji ispisuje prvih n redova sljedećeg trougla:
1121231234...123456789123456789012345678901...
#include <stdio.h>#include <stdio.h>main()main(){{ int n, red, broj;int n, red, broj;
do { printf(”n=? ”); scanf(”%d”,&n); } while (n<1 || n>20);
for (for ( red=1 red=1 ; ; red<=nred<=n ; ; redred++++ )) { { for (for ( broj broj==11 ; broj ; broj<=red<=red ; ; brojbroj++++ ) )
printf(”*”);printf(”*”);
printf(”printf(”\n\n””));;
}}}}
printf(”%d”, broj%10);
87
1.2.3. 1.2.3. Naredbe petljiNaredbe petlji
forfor ??
Primjer: Program koji ispisuje prvih n redova sljedeće piramide cifara:
1 232 34543 4567654 . . . 89012345432109890123456765432109 . . .
#include <stdio.h>#include <stdio.h>main()main(){{ int n, red, broj;int n, red, broj;
do { printf(”n=”); scanf(”%d”,&n); } while (n<1 || n>20);
for (for ( red=1 red=1 ; ; red<=nred<=n ; ; redred++++ )) { { for (for ( broj broj==11 ; broj ; broj<=<=n-n-redred ; ; brojbroj++++ ) ) printf(”printf(” ””));;
for (for ( broj broj=red ; broj=red ; broj<=<=2*2*redred-1 ; -1 ; brojbroj++++ ) ) printf(”printf(”%d%d””, broj%10), broj%10);;
for (for ( broj broj=2*red-2 ; broj>==2*red-2 ; broj>=redred ; ; brojbroj---- ) ) printf(”printf(”%d%d””, broj%10), broj%10);;
printf(”printf(”\n\n””));; }}}}
88
1.2.3.1.2.3. Naredbe petlji Naredbe petlji
ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......
Zadaci:Zadaci:
1. Napisati program koji koji učitava prirodan broj, a zatim ispisuje sve parne brojeve manje od njega. Zadatak riješiti korištenjem a) for petlje; b) while petlje; c) do…while petlje.
2. Napisati program koji tabelarno ispisuje vrijednosti funkcije f(x)=2x+3, za vrijednosti argumenta x[A,B], s korakom x. Zadatak riješiti korištenjem a) for petlje; b) while petlje; c) do…while petlje.
3. Učitati n brojeva, a zatim ispisati koliko među njima ima pozitivnih, kao i njihovu aritmetičku sredinu.
4. Učitati n brojeva, a zatim ispisati najvećeg.
5. Učitati n brojeva, a zatim ispisati najmanjeg, kao i njegov redni broj.
6. Ispisati sve dvocifrene proste brojeve.
7. Ispisati prvih n prostih brojeva.
8. Ispisati prvih n savršenih brojeva.
9. Učitati broj pa provjeriti da li je Armstrongov. Broj je Armstrongov ako je jednak zbiru kubova svojih cifara.
10. Učitati dva prirodna broja pa provjeriti da li oni predstavljaju par prijateljskih brojeva. Za dva broja kažemo da su prijateljski ako je prvi jednak zbiru djelilaca drugog, a drugi jednak zbiru djelilaca prvog broja.
89
1.3. 1.3. Složeni tipovi podatakaSloženi tipovi podataka
Složeni tipovi ?Složeni tipovi ?
Složeni tipovi podatakaSloženi tipovi podatakaC raspolaže sljedećim složenim tipovima podataka:C raspolaže sljedećim složenim tipovima podataka:
polja (indeksirane promjenljive) polja (indeksirane promjenljive)
jednodimenzionalno = NIZ,jednodimenzionalno = NIZ,
dvodimenzionalno = MATRICA,dvodimenzionalno = MATRICA,
višedimenzionalnovišedimenzionalno
strukturestrukture
unijeunije
90
1.3.1. 1.3.1. PoljaPolja
NIZOVI ?NIZOVI ?
NizoviNizoviNiz ili vektor je jednodimenzionalno poljeNiz ili vektor je jednodimenzionalno polje
To je skup podataka istog tipa To je skup podataka istog tipa
U memoriji se smješta u niz uzastopnih mem. lokacijaU memoriji se smješta u niz uzastopnih mem. lokacija
Svi podaci u nizu imaju jedno ime = IME NIZASvi podaci u nizu imaju jedno ime = IME NIZA
Ime niza predstavlja početnu adresu niza u memoriji Ime niza predstavlja početnu adresu niza u memoriji
Svaki element u nizu određen je: Svaki element u nizu određen je: imenom niza, i imenom niza, i
indeksom (pomjerajem u odnosu na početak niza)indeksom (pomjerajem u odnosu na početak niza)
MEMORIJA
nniziz[0][0]
nniziz[1][1]
nniziz[2][2]
nniziz[3][3]
nniziz[4][4]
nniziz[5][5]
nniziz[6][6]
nniziz[7][7]
91
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Deklaracija nizaDeklaracija nizaOpOpšti oblik deklaracije:šti oblik deklaracije:
tip tip imeime_niza [broj_elemenata] = {lista vrijednosti}_niza [broj_elemenata] = {lista vrijednosti}
tip niza (tip podataka u nizu)
ime niza (identifikator u skladu sa sintaksom jezika, važe sva pravila kao i za skalarne
promjenljive)broj elemenata u nizu (cjelobrojna konstanta)(rezerviše se potreban
broj bajtova za memorisanje deklarisanog
broja elemenata)
vrijednosti elemenata u nizu (inicijalizacija niza)
(nije obavezno inicijalizovanje)(vrijednosti se razdvajaju
zapetama)
92
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Deklaracija nizaDeklaracija nizaPrimjer deklaracije:Primjer deklaracije:
int int niz[5];niz[5];
charchar tekst[10];tekst[10];
MEMORIJA
teksttekst
10*1B = 10B10*1B = 10B
nizniz
5*2B = 10B5*2B = 10B
nniziz[0][0]
nniziz[1][1]
nniziz[2][2]
nniziz[3][3]
nniziz[4][4]
tekst[0]tekst[0]tekst[1]tekst[1]
tekst[9]tekst[9]
PrimjerPrimjer::
#define MAX 5#define MAX 5 #define LENG 10#define LENG 10 main()main() { { intint niz[MAX];niz[MAX]; charchar tekst[LENG];tekst[LENG]; ...... }}
93
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Deklaracija nizaDeklaracija nizaPrimjer deklaracijePrimjer deklaracije sa inicijalizacijom sa inicijalizacijom::
int int A[3]={1,2,3};A[3]={1,2,3}; 31 2A[2]A[0] A[1]
B[2]B[0] B[1]
31 2 4B[3]
C[2]C[0] C[1]
010 0 0C[3]
0C[4]
D[2]D[0] D[1]
00 0 0D[3]
0D[4]
intint B[]={1,2,3,4};B[]={1,2,3,4};
int C[5]={10};int C[5]={10};
int D[5]={0};int D[5]={0};
94
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Učitati niz od n cijelih brojeva, pa ih ispisati redoslijedom kojim su učitani.
#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){{ int int niz[MAX];niz[MAX]; int i,n;int i,n;
dodo { printf(”n=”); scanf(”%d”, &n); }{ printf(”n=”); scanf(”%d”, &n); } while (n<1);while (n<1);
for (for ( ii=1=1 ; i ; i<<=n ; i++=n ; i++ )) { printf(”Unesite %d. broj:”);{ printf(”Unesite %d. broj:”); scanf(”%d”, &niz[i-1]); }scanf(”%d”, &niz[i-1]); }
printf(”Unijeli ste: ”);printf(”Unijeli ste: ”); for (for ( ii==0 ; i0 ; i<<n ; i++n ; i++ )) printf(” %d”, niz[i]);printf(” %d”, niz[i]);}}
POČETAK
n
ISTINA n < 1
LAŽ
KRAJ
i = 1, n
niz[i-1]
i = 0, n-1
niz[i]
95
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Učitati niz od n cijelih brojeva, pa ih ispisati obrnutim redoslijedom.
#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){{ int int niz[MAX];niz[MAX]; int i,n;int i,n;
dodo { printf(”n=”); scanf(”%d”, &n); }{ printf(”n=”); scanf(”%d”, &n); } while (n<1);while (n<1);
for (for ( ii=1=1 ; i ; i<<=n ; i++=n ; i++ )) { printf(”Unesite %d. broj:”);{ printf(”Unesite %d. broj:”); scanf(”%d”, &niz[i-1]); }scanf(”%d”, &niz[i-1]); }
printf(”Unijeli ste: ”);printf(”Unijeli ste: ”); for (for ( ii==n ; i>=1 ; i++n ; i>=1 ; i++ )) printf(” %d”, niz[i-1]);printf(” %d”, niz[i-1]);}}
POČETAK
n
ISTINA n < 1
LAŽ
KRAJ
i = 1, n
niz[i-1]
i = n, 1
niz[i-1]
96
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Učitati niz od n cijelih brojeva, pa ispisati njihovu aritmetičku sredinu i one učitane brojeve koji su veći od sredine.
POČETAK
n
ISTINA n < 1
LAŽ
i = 0, n-1
niz[i]
s = 0
s = s + niz[i]
T
KRAJ
i = 0, n-1
T
as = s/n
LAŽISTINA
niz[i]
niz[i]>as
#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){{ int int niz[MAX];niz[MAX]; int i,n,s=0;int i,n,s=0; float as;float as;
dodo { printf(”n=”); { printf(”n=”); scanf(”%d”, &n); }scanf(”%d”, &n); } while (n<1);while (n<1);
for (ifor (i==0;i0;i<<=n-1;i++)=n-1;i++) { printf(”Unesite broj:”);{ printf(”Unesite broj:”); scanf(”%d”, &niz[i]);scanf(”%d”, &niz[i]); s+=niz[i]; }s+=niz[i]; }
as=(float)s / n;as=(float)s / n;
printf(”Sredina: %7.3f\n”,as);printf(”Sredina: %7.3f\n”,as);
printf(”Veci su: ”);printf(”Veci su: ”); for (for ( ii==0 ; i<n ; i++0 ; i<n ; i++ )) if (niz[i]>as)if (niz[i]>as) printf(” %d”, niz[i]);printf(” %d”, niz[i]);}}
97
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Učitati niz od n cijelih brojeva, pa ispisati njihovu aritmetičku sredinu i onaj učitani broj koji joj je najbliži.
#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define MAX 100#define MAX 100main()main(){ { int int niz[MAX]niz[MAX], , i, i, rb=0,rb=0, n, s=0; n, s=0; float as;float as;
dodo { printf(”n=”); scanf(”%d”, &n); }{ printf(”n=”); scanf(”%d”, &n); } while (n<1);while (n<1);
for ( ifor ( i==0; i0; i<<=n-1; i++ )=n-1; i++ ) { { printf(”Unesite broj:”);printf(”Unesite broj:”); scanf(”%d”, &niz[i]);scanf(”%d”, &niz[i]); s+=niz[i]; }s+=niz[i]; }
as=(float)s / n;as=(float)s / n;
for (for ( ii=1=1 ; i<n ; i++ ; i<n ; i++ )) if (if ( fabs( fabs(niz[i]niz[i]-as-as)) < fabs( < fabs(niz[niz[rbrb]]-as-as)) ) rb=i; ) rb=i; printf(” printf(” SredinaSredina je je: %7.3f: %7.3f\n”, as);\n”, as); printf(” printf(” Najblizi jeNajblizi je %d. po redu\n”, rb+1); %d. po redu\n”, rb+1); printf(” To je broj: %d”, niz[rb]);printf(” To je broj: %d”, niz[rb]);}}
98
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Učitati niz A od n cijelih brojeva, pa zatim formirati niz B, tako da je element bi jednak najvećoj cifri elementa ai.
#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){ { int int a[MAX]a[MAX], , b[MAX], i, n, pom, c;b[MAX], i, n, pom, c; do do { printf(”n=”); scanf(”%d”, &n); } { printf(”n=”); scanf(”%d”, &n); } while ((n<1) || (n>MAX));while ((n<1) || (n>MAX));
for ( ifor ( i==0; i0; i<<=n-1; i++ )=n-1; i++ ) { { printf(”Unesite broj:”);printf(”Unesite broj:”); scanf(”%d”, &a[i]); }scanf(”%d”, &a[i]); }
for (for ( ii==0 ; i<n ; i++0 ; i<n ; i++ ))
{ b[i]=0; pom=a[i];{ b[i]=0; pom=a[i];
do do
{ c=pom%10; pom/=10; if (c>b[i]) b[i]=c; } { c=pom%10; pom/=10; if (c>b[i]) b[i]=c; }
while (pom);while (pom); }} printf(”\n Aprintf(”\n A::”); for (”); for ( ii==0 ; i<n ; i++0 ; i<n ; i++ ) printf(” %d”, a[i]); ) printf(” %d”, a[i]); printf(”\n Bprintf(”\n B::”); for (”); for ( ii==0 ; i<n ; i++0 ; i<n ; i++ ) printf(” %d”, b[i]);) printf(” %d”, b[i]); }}
99
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Program koji učitava koeficijente dva polinoma A i B, stepena m i n, respektivno, (m , n < 10), a zatim izračunava i ispisuje proizvod ta dva polinoma.
Polinom A:Polinom A:Am(x) = amxm + am-1xm-1 +...+ a1x + a0
Polinom B:Polinom B:Bn(x) = bnxn + bn-1xn-1 +...+ b1x + b0
Množenje dva monoma:Množenje dva monoma:aixi * bjxj = ai*bjxi+j
Proizvod polinoma A i polinoma B:Proizvod polinoma A i polinoma B:Cm+n(x) = cm+nxm+n + cm+n-1xm+n-1 +...+ c1x + c0
100
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Program koji učitava koeficijente dva polinoma A i B, stepena m i n, respektivno, (m , n < 10), a zatim izračunava i ispisuje proizvod ta dva polinoma.
#include <stdio.h>#include <stdio.h>#define MAX 10#define MAX 10main()main(){ { int int a[MAX]a[MAX], , b[MAX], b[MAX], cc[2*MAX]={0};[2*MAX]={0}; int i,j,m,n;int i,j,m,n; printf(”Polinom A:\n”);printf(”Polinom A:\n”); do do { { printf(”Stepen polinoma A (m) je:”); printf(”Stepen polinoma A (m) je:”); scanf(”%d”, &m); scanf(”%d”, &m); } } while ((m<0) || (m>=MAX));while ((m<0) || (m>=MAX)); for ( ifor ( i==m; i>=0; i-- )m; i>=0; i-- ) { { printf(”Unesite koeficijent a%d: ”,i);printf(”Unesite koeficijent a%d: ”,i); scanf(”%d”, &a[i]); scanf(”%d”, &a[i]); }}
101
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
printf(”Polinom B:\n”);printf(”Polinom B:\n”); do do { { printf(”Stepen polinoma B (n) je:”); printf(”Stepen polinoma B (n) je:”); scanf(”%d”, &n); scanf(”%d”, &n); } } while ((n<0) || (n>=MAX));while ((n<0) || (n>=MAX)); for ( ifor ( i==n; i>=0; i-- )n; i>=0; i-- ) { { printf(”Unesite koeficijent b%d: ”,i);printf(”Unesite koeficijent b%d: ”,i); scanf(”%d”, &b[i]); scanf(”%d”, &b[i]); }}
for ( ifor ( i==0; i<=m; i++ )0; i<=m; i++ ) for ( jfor ( j==0; j<=n; j++ )0; j<=n; j++ ) c[i+j] += a[i] * b[j]; c[i+j] += a[i] * b[j];
printf(”Proizvod:\n”);printf(”Proizvod:\n”); for ( ifor ( i==m+n; i>=0; i-- )m+n; i>=0; i-- ) printf(” %da%d ”, c[i], i);printf(” %da%d ”, c[i], i);}}
102
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Program koji učitava prirodan broj n (n<100), a zatim ispisuje n!
Napomena:Napomena:Standardni prosti tipovi (int, long) omogućavaju maksimalnoStandardni prosti tipovi (int, long) omogućavaju maksimalno
12!=47900160012!=479001600
Rješenje problema?Rješenje problema?Problemi ”velikih brojeva” rješavaju se tako što se broj Problemi ”velikih brojeva” rješavaju se tako što se broj posmatra kao niz cifara!!!posmatra kao niz cifara!!!
f[2]f[4] f[3]00 0 0
f[1]1
f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]
1!=f[2]f[4] f[3]00 0 0
f[1]2
f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]
2!=f[2]f[4] f[3]00 0 0
f[1]6
f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]
3!=f[2]f[4] f[3]00 0 2
f[1]4
f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]
4!=f[2]f[4] f[3]10 0 2
f[1]0
f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]
5!=
103
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Program koji učitava prirodan broj n (n<100), a zatim ispisuje n!
#include <stdio.h>#include <stdio.h>#define MAX#define MAXCIFCIF 10 100000main()main(){ { int fint f[MAX[MAXCIFCIF]={]={11};}; int i,j,nint i,j,n, pom, prenos, pom, prenos;; do do { printf(”{ printf(”n=n=”); scanf(”%d”, &”); scanf(”%d”, &nn); } ); } while ((while ((nn<<11) || () || (n>100n>100));)); for ( ifor ( i==2; i2; i<=n<=n; i; i++++ ) ) for ( j=0, prenos=0; j<MAXCIF; j++ )for ( j=0, prenos=0; j<MAXCIF; j++ ) { { pom = fpom = f[j]*i + prenos;[j]*i + prenos; f[j] = pom % 10;f[j] = pom % 10; prenos = pom / 10;prenos = pom / 10; }} printf(”%d!printf(”%d!==”,n);”,n); for ( j=for ( j=MAXCIF-1; f[j]=MAXCIF-1; f[j]==0; j=0; j---- ) ); /* preskace vodece nule */; /* preskace vodece nule */ for (for (; j>=; j>=0; j0; j---- ) ) printf(”%d”,f[j]); /* ispisuje cifre */printf(”%d”,f[j]); /* ispisuje cifre */}}
104
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Program koji učitava niz cijelih brojeva, a zatim ih ispisuje u rastućem redoslijedu.
Sortiranje niza:Sortiranje niza:Sortiranje je postupak kojim se mijenja poredak elemenata u Sortiranje je postupak kojim se mijenja poredak elemenata u nizu, kako bi se podaci doveli u željeni redoslijed:nizu, kako bi se podaci doveli u željeni redoslijed:
rastući (ascending)rastući (ascending)opadajući (descending)opadajući (descending)
Rješenje problema?Rješenje problema?Postoji velik broj algoritama za sortiranjePostoji velik broj algoritama za sortiranjeNajpopularniji algoritmi za sortiranje:Najpopularniji algoritmi za sortiranje:
select-sortselect-sortbubble-sortbubble-sortquick-sortquick-sortshell-sortshell-sortstack-sortstack-sort......
105
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
SELECT-SORT: uzastopni izbor (selekcija) odgovarajućeg elementa
77 22 66 33 22 Polazni niz
a[2]a[0] a[1] a[3] a[4]
1. Prolaz: sređivanje prve pozicije (niz[0])
??????
0 indeks podobnog elementa
2<72<7
1
6<26<2
1
3<23<2
1
2<22<2
1
22 77 66 33 22 Niz nakon 1. prolaza
a[2]a[0] a[1] a[3] a[4]
6<76<7
2
3<63<6
3
2<32<3
4
2. Prolaz: sređivanje druge pozicije (niz[1])
22 ??????
indeks podobnog elementa1
22 22 66 33 77 Niz nakon 2. prolaza
106
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
22 22 66 33 77 Niz nakon 2. prolaza
a[2]a[0] a[1] a[3] a[4]
3<63<6
3
77<3<3
3
22 22 33 66 77 Niz nakon 3. prolaza
3. Prolaz: sređivanje treće pozicije (niz[2])
22 22 ??????
indeks podobnog elementa2
77<<66
3
22 22 33 66 77 Niz nakon 4. prolaza
indeks podobnog elementa3
4. Prolaz: sređivanje četvrte pozicije (niz[3])
22 22 33 ??????
107
1.3.1. 1.3.1. PoljaPolja
NIZOVINIZOVI ? ?
Primjer: Program koji učitava niz cijelih brojeva, a zatim ih ispisuje u rastućem redoslijedu.
#include <stdio.h>#include <stdio.h>#define MAX 10#define MAX 1000main()main(){ { int nizint niz[MAX];[MAX]; int i,j,nint i,j,n, rb, pom, rb, pom;; do do { printf(”{ printf(”n=n=”); scanf(”%d”, &”); scanf(”%d”, &nn); } ); } while ((while ((nn<<11) || () || (n>100n>100));));
for ( ifor ( i=1=1; i; i<<=n; i++ )=n; i++ ) { { printf(”Unesite broj:”);printf(”Unesite broj:”); scanf(”%d”, &scanf(”%d”, &nizniz[i[i-1-1]); }]); }
for ( ifor ( i=0=0; i; i<n-1<n-1; i; i++++ ) ) { { for ( j=i+1, rb=i; j<n; j++ )for ( j=i+1, rb=i; j<n; j++ ) if (nizif (niz[j][j] < niz < niz[[rbrb]]) rb=j;) rb=j; if (rb!=i)if (rb!=i) { pom= { pom=nizniz[i]; [i]; nizniz[i]=[i]=nizniz[rb]; [rb]; nizniz[rb]=pom; }[rb]=pom; } }} printf(”Sortirani niz:”);printf(”Sortirani niz:”); for ( for ( ii==0; i<n0; i<n; ; i++i++ ) ) printf(” %d”,niz[i]); printf(” %d”,niz[i]);}}
108
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
Dvodimenzionalna poljaDvodimenzionalna poljaElement niza moElement niza može da bude novi nizže da bude novi niz
tako dobijamo dvodimenzionalno polje (matrica)tako dobijamo dvodimenzionalno polje (matrica)
...0 1 j ... m-1
0
1
i
n-1
red (vrsta)red (vrsta)
kolonakolona(stupac)(stupac)mat[i][j]
mat[1][0]
mat[n-1][m-1]
109
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
Deklaracija matriceDeklaracija matriceOpOpšti oblik deklaracije:šti oblik deklaracije:
tip tip imeime_mat [D1][D2] = { {L1},{L2},...,{Ln-1} }_mat [D1][D2] = { {L1},{L2},...,{Ln-1} }
tip matrice (tip podataka) ime matrice
dimenzije matrice D1 = broj redovaD2 = broj kolona
rezerviše se potreban broj bajtova za memorisanje D1*D2 elemenata
vrijednosti elemenata u matrici inicijalizacija matrice
nije obavezno inicijalizovanje
110
MEMORIJA
fizičkafizička predstavapredstava
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
Deklaracija matriceDeklaracija matricePrimjer deklaracije:Primjer deklaracije:
charchar tablica[2][3];tablica[2][3];
20 1
0
1
llogiogiččka ka predstavapredstavatablicatablica[0][0][0][0]
tablicatablica[0][[0][11]]
tablicatablica[0][[0][22]]
tablicatablica[[11][0]][0]
tablicatablica[[11][][11]]
tablicatablica[[11][][22]]
111
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
Deklaracija matriceDeklaracija matricePrimjer deklaracije sa inicijalizacijom:Primjer deklaracije sa inicijalizacijom:
int matint mat[2][3][2][3] = = { {3,1,8}, {2,5,6} };{ {3,1,8}, {2,5,6} };20 1
83 1
62 5
0
1
Primjer deklaracije sa inicijalizacijom:Primjer deklaracije sa inicijalizacijom:
int matint mat[2][3][2][3] = = { {3,1,8} };{ {3,1,8} };20 1
83 1
00 0
0
1
112
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer učitavanja matrice:Primjer učitavanja matrice:
for ( for ( red=1red=1; ; red<red<=n; =n; redred++ )++ ) for ( kolfor ( kol=1=1; kol; kol<<=m; kol++ )=m; kol++ ) { { printf(”printf(”matmat[%d][%d]=”,red-1,kol-1);[%d][%d]=”,red-1,kol-1); scanf(”%d”, &mat[redscanf(”%d”, &mat[red-1-1][kol-1]); ][kol-1]); }}
iliili::
for ( for ( red=red=0; 0; red<red<n; n; redred++ )++ ) for ( kolfor ( kol==0; kol0; kol<<m; kol++ )m; kol++ ) { { printf(”printf(”matmat[%d][%d]=”,red,kol);[%d][%d]=”,red,kol); scanf(”%d”, &mat[red][kol]); scanf(”%d”, &mat[red][kol]); }}
113
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer ispisivanjaispisivanja matrice: matrice:
for ( for ( red=1red=1; ; red<red<=n; =n; redred++ )++ ) { { for ( kolfor ( kol=1=1; kol; kol<<=m; kol++ )=m; kol++ ) printf(” %4d”,mat[red-1][kol-1]);printf(” %4d”,mat[red-1][kol-1]); printf(”\n”);printf(”\n”); }}
iliili::
for ( for ( red=red=0; 0; red<red<n; n; redred++ )++ ) { { for ( kolfor ( kol==0; kol0; kol<<m; kol++ )m; kol++ ) printf(” %4d”,mat[red][kol]);printf(” %4d”,mat[red][kol]); printf(”\n”);printf(”\n”); }}
114
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije glavnom dijagonalom:manipulacije glavnom dijagonalom:
mat[0][0]mat[1][1]
mat[i][i]
mat[n-1][n-1]
Ispis elemenata na glavnoj dijagonali:Ispis elemenata na glavnoj dijagonali:
printf(”Glavna dijagonala: ”);printf(”Glavna dijagonala: ”); for ( ifor ( i==0; i0; i<<n; i++ ) printf(” %d”, mat[i][i]);n; i++ ) printf(” %d”, mat[i][i]);
Suma elemenata na glavnoj dijagonali:Suma elemenata na glavnoj dijagonali:
for ( s=ifor ( s=i==0; i0; i<<n; i++ ) s+=mat[i][i];n; i++ ) s+=mat[i][i]; printf(”Suma elemenata na GD: %d”,s);printf(”Suma elemenata na GD: %d”,s);
mat[i][j], i=jmat[i][j], i=j
115
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije sporednom dijagonalom:manipulacije sporednom dijagonalom:
mat[0][n-1]mat[1][n-2]
...
mat[n-1][0]
Ispis elemenata na sporednoj dijagonali:Ispis elemenata na sporednoj dijagonali:
printf(”Sporedna dijagonala: ”);printf(”Sporedna dijagonala: ”); for ( ifor ( i==n-1; i>=0; i-- ) printf(” %d”, mat[i][n-1-i]);n-1; i>=0; i-- ) printf(” %d”, mat[i][n-1-i]);
Suma elemenata na sporednoj dijagonali:Suma elemenata na sporednoj dijagonali:
for ( s=ifor ( s=i==0; i0; i<<n; i++ ) s+=mat[i][n-1-i];n; i++ ) s+=mat[i][n-1-i]; printf(”Suma elemenata na SD: %d”,s);printf(”Suma elemenata na SD: %d”,s);
mat[i][j],i+j=n-1mat[i][j],i+j=n-1
116
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije donjom trougaonom matricom:manipulacije donjom trougaonom matricom:
Ispis donje trougaone matrice:Ispis donje trougaone matrice:
printf(”Donja trougaona matrica:\n ”);printf(”Donja trougaona matrica:\n ”); for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) { { for ( j=0; j<=i; j++ )for ( j=0; j<=i; j++ ) printf(” %4d”, mat[i][j]);printf(” %4d”, mat[i][j]); printf(”\n”);printf(”\n”); }}
mat[i][j],j<=imat[i][j],j<=i
117
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije gornjom trougaonom matricom:manipulacije gornjom trougaonom matricom:
Ispis gornje trougaone matrice:Ispis gornje trougaone matrice:
printf(”Gornja trougaona matrica:\n ”);printf(”Gornja trougaona matrica:\n ”); for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) { { for ( j=1; j<=i; j++ ) printf(”%5c”,’ ’)for ( j=1; j<=i; j++ ) printf(”%5c”,’ ’) for ( j=i; j<n; j++ ) printf(” %4d”, mat[i][j]);for ( j=i; j<n; j++ ) printf(” %4d”, mat[i][j]); printf(”\n”);printf(”\n”); }}
mat[i][j],j>=imat[i][j],j>=i
118
transponovana matricatransponovana matrica
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer transponovanja matricetransponovanja matrice
23
1 4
65
789
3264
7 8
15
9
polazna matricapolazna matrica
Ispis transponovane matrice Ispis transponovane matrice na osnovu originalne matrice:na osnovu originalne matrice:
printf(”Transponovana:\n ”);printf(”Transponovana:\n ”); for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) { { for ( j=0; j<n; j++ ) for ( j=0; j<n; j++ ) printf(” %4d”, mat[j][i]);printf(” %4d”, mat[j][i]); printf(”\n”);printf(”\n”); }}
Transponovanje matrice: Transponovanje matrice:
for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) for ( j=i+1; j<n; j++ ) for ( j=i+1; j<n; j++ ) { { pom=mat[i][j]);pom=mat[i][j]); mat[i][j]=mat[j][i];mat[i][j]=mat[j][i]; mat[j][i]=pom;mat[j][i]=pom; }}
119
1.3.1. 1.3.1. PoljaPolja
MATRICEMATRICE ? ?
ManipulacijaManipulacija matric matricomomPrimjer Primjer mnomnoženja dvije matriceženja dvije matrice
32
1 0
1
264 5
MatricaMatrica A A
(m*n)(m*n)
3214
7 1
12
0
MatricaMatrica B B
(n*p)(n*p)
*
MatricaMatrica C C
(m*p)(m*p)
???30???66???15
9244
5173
Množenje matrica:Množenje matrica:
for ( ifor ( i==0; i<m; i++ ) 0; i<m; i++ ) /* red matrice C *//* red matrice C */ for ( j=for ( j=00; j<p; j++ ) ; j<p; j++ ) /* kolona matrice C *//* kolona matrice C */ for ( k=0; k<n; k++ )for ( k=0; k<n; k++ ) c[i][j]+=a[i][k]*b[k][j]; c[i][j]+=a[i][k]*b[k][j];
120
1.3.1.1.3.1. Polja Polja
VIŠE DIMENZIJE?VIŠE DIMENZIJE?
VišeVišedimenzionalna poljadimenzionalna poljaC omogućava i manipulaciju višedimenzionalnim poljimaC omogućava i manipulaciju višedimenzionalnim poljima
kocka[sloj][red][kolona]
Trodimenzionalno poljeTrodimenzionalno polje
tip imetip ime[[d1d1][][d2d2][][d3d3];];
Primjer deklaracije:Primjer deklaracije:
int kockaint kocka[[33][][66][][66];];
Primjer 4-dim. polja:Primjer 4-dim. polja:
char P4char P4[[d1d1][][d2d2][][d3d3][][d4d4];];
121
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
StruktureStruktureStruktura je skup heterogenih podataka meStruktura je skup heterogenih podataka međusobno logički povezanihđusobno logički povezanih
Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)
Atributi?Atributi?
prezimevisina
ime
struct osoba struct osoba {{
char prezime[15];char prezime[15];
char ime[15];char ime[15];
int visina;int visina;
}}
122
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Deklaracija struktureDeklaracija struktureOpOpšti oblik deklaracije:šti oblik deklaracije:
struct ime struct ime {{ tip1tip1 element1element1;; tip2tip2 element2element2;; ...... tipNtipN elementNelementN;;
}} lista_promjenljivih; lista_promjenljivih;
ključna riječ
ime strukture
Deklaracija elementa (polja)
lista promjenljivih ovog tipaPrimjer:Primjer:
struct osoba struct osoba {{ char prezime[15];char prezime[15]; char ime[15];char ime[15]; int visina;int visina; }} student1, student2, student1, student2, klub[100];klub[100];
123
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Deklaracija struktureDeklaracija struktureAlternativniAlternativni oblik deklaracije: oblik deklaracije:
struct ime struct ime {{ tip1tip1 element1element1;; ...... tipNtipN elementNelementN;; }};;struct ime lista_promjenljivih;struct ime lista_promjenljivih;
Npr:Npr:
struct osoba struct osoba {{ char ime[15];char ime[15]; int visina;int visina; };}; struct osobastruct osoba student, student, klub[100];klub[100];
Strukture u jeziku C++Strukture u jeziku C++Identifikator strukture može da se koristi i kao identifikator tipa bez korišćenja ključne riječi struct
Primjer:Primjer:
struct osoba struct osoba {{ char ime[15];char ime[15]; int visina;int visina; };};
osobaosoba student, student, klub[100];klub[100];
124
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Strukture u jeziku C++Strukture u jeziku C++U slučaju da u istom bloku postoji neki podatak prostog tipa i struktura sa istim imenom tada se mora koristiti ključna riječ struct
Primjer:Primjer:
struct struct alfaalfa { int a, b, c{ int a, b, c };};
struct osoba struct osoba {{ char ime[15];char ime[15]; int visina;int visina; };};
intint alfa;alfa;
alfa = 65;alfa = 65;
struct alfa a = { 1, 2, 3 };struct alfa a = { 1, 2, 3 };
osobaosoba student, student, klub[100];klub[100];
125
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Pristup elementima (poljima) strukturePristup elementima (poljima) strukturePristup pomoPristup pomoću operatoraću operatora
””.” = ELEMENT STRUKTURE .” = ELEMENT STRUKTURE
Primjer:Primjer:
struct osoba struct osoba {{ char prezime[15];char prezime[15]; char ime[15];char ime[15]; int visina;int visina; }} student, student, klub[100];klub[100];
Pristup poljima:Pristup poljima:
student.prezimestudent.prezime = ”Markovic”; = ”Markovic”; klubklub[1][1].prezime.prezime = ”Jankovic”; = ”Jankovic”;student.imestudent.ime = ”Marko”; = ”Marko”; klubklub[1][1]..ime = ”Janko”;ime = ”Janko”;student.visinastudent.visina = 190; = 190; klubklub[1][1]..visina = 202;visina = 202;
126
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Primjer: Manipulacija kompleksnim brojevima pomoPrimjer: Manipulacija kompleksnim brojevima pomoću struktureću strukture
#include <stdio.h>#include <stdio.h>
main()main()
{{
struct kompleks struct kompleks {{ floatfloat re,im re,im;; };};
kompleks x = { 3.0, 2.0 };kompleks x = { 3.0, 2.0 }; kompleks y = { 2.0, 3.0 };kompleks y = { 2.0, 3.0 };
kompleks zbir, proizvod;kompleks zbir, proizvod;
zbir.re = x.re + y.re;zbir.re = x.re + y.re; zbir.im = x.im + y.im;zbir.im = x.im + y.im;
proizvod.re = x.re*y.re – x.im*y.im;proizvod.re = x.re*y.re – x.im*y.im; proizvod.im = x.re*y.im + x.im*y.re;proizvod.im = x.re*y.im + x.im*y.re;
printf(”Zbir je: %5.2f + j%5.2f\n”, zbir.re, zbir.im);printf(”Zbir je: %5.2f + j%5.2f\n”, zbir.re, zbir.im); printf(”Proizvod je: %5.2f + j%5.2f\n”, proizvod.re, proizvod.im);printf(”Proizvod je: %5.2f + j%5.2f\n”, proizvod.re, proizvod.im);}}
127
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Struktura kao element struktureStruktura kao element struktureStruktura moStruktura može da bude element neke druge struktureže da bude element neke druge strukture
Primjer:Primjer:
struct datum struct datum { { int danint dan, , mjesecmjesec, , godina;godina; }; };
struct osoba {struct osoba { char prezime[15];char prezime[15]; char ime[15]; char ime[15]; int visina;int visina; datum rodjen;datum rodjen; }} student student;;
Pristup poljima:Pristup poljima:
student.prezimestudent.prezime = ”Markovic”; = ”Markovic”; student.imestudent.ime = ”Marko”; = ”Marko”;student.visinastudent.visina = 190; = 190; student.rodjen.dan = 1;student.rodjen.dan = 1;student.rodjen.mjesec = 4;student.rodjen.mjesec = 4;student.rodjen.godina = 1980;student.rodjen.godina = 1980;
128
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Primjer: Manipulacija taPrimjer: Manipulacija tačkom u dvodimenzionalnom koordinatnom sistemučkom u dvodimenzionalnom koordinatnom sistemu
xx
yy
A(x,y)A(x,y)
xx
yy
A(xA(xAA,y,yAA))
B(xB(xBB,y,yBB))
dd
#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define KV(x) (x)*(x)#define KV(x) (x)*(x)
main()main()
{{
struct struct tackatacka {{ floatfloat xx,,y;y; } a,b;} a,b;
float d;float d;
printf(”A: x=”); scanf(”%f”, &a.x);printf(”A: x=”); scanf(”%f”, &a.x); printf(”A: y=”); scanf(”%f”, &a.y);printf(”A: y=”); scanf(”%f”, &a.y);
printf(”B: x=”); scanf(”%f”, &b.x);printf(”B: x=”); scanf(”%f”, &b.x); printf(”B: y=”); scanf(”%f”, &b.y);printf(”B: y=”); scanf(”%f”, &b.y);
d = sqrt( KV(a.x-b.x) + KV(a.y-b.y));d = sqrt( KV(a.x-b.x) + KV(a.y-b.y));
printf(”Udaljenost: %5.2f”, d);printf(”Udaljenost: %5.2f”, d);
} }
129
1.3.1.3.22. . StruktureStrukture
STRUKTURASTRUKTURA??
Primjer:Primjer: Program Program koji učitava koordinate vrhova poligona, koji učitava koordinate vrhova poligona, papa ispisuje ispisuje njegov obim.njegov obim.
#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define KV(x) (x)*(x)#define KV(x) (x)*(x)main()main(){ { struct struct tackatacka {{ floatfloat xx,,y;y; } } polpol[100];[100]; float ob=0;float ob=0; int i,n;int i,n; do do { printf(”Broj vrhova: ”); scanf(”%d”, &n); }{ printf(”Broj vrhova: ”); scanf(”%d”, &n); } while ((n<3) || (n>100));while ((n<3) || (n>100)); for (i=1; i<=n; i++)for (i=1; i<=n; i++) { printf(”%d. vrh:\n”, i);{ printf(”%d. vrh:\n”, i); printf(” x=”); scanf(”%f”, &pol[i-1].x);printf(” x=”); scanf(”%f”, &pol[i-1].x); printf(” y=”); scanf(”%f”, &pol[i-1].y); }printf(” y=”); scanf(”%f”, &pol[i-1].y); } for (i=1; i<n; i++)for (i=1; i<n; i++) ob += sqrt( KV(pol[i].x-pol[i-1].x)+ KV(pol[i].y-pol[i-1].y));ob += sqrt( KV(pol[i].x-pol[i-1].x)+ KV(pol[i].y-pol[i-1].y)); ob += sqrt( KV(pol[0].x-pol[n-1].x)+ KV(pol[0].y-pol[n-1].y));ob += sqrt( KV(pol[0].x-pol[n-1].x)+ KV(pol[0].y-pol[n-1].y)); printf(”Obim: %5.2f”, ob);printf(”Obim: %5.2f”, ob);} }
AA00(x(x00,y,y00))
AA11(x(x11,y,y11))
AA22
AA33
AA44
130
1.3.1.3.33.. UnijeUnije
UNIJAUNIJA??
UnijeUnijeUnija je skup Unija je skup podataka različitih tipova smještenih u istom memorijskom prostoru.podataka različitih tipova smještenih u istom memorijskom prostoru.
Podaci u uniji nisu međusobno nezavisni, jer koriste isti memorijski prostor.Podaci u uniji nisu međusobno nezavisni, jer koriste isti memorijski prostor.
Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.
Unija zauzima u memoriji onoliko bajtova koliko je potrebno za memorisanje Unija zauzima u memoriji onoliko bajtova koliko je potrebno za memorisanje najvećeg podatka u unijinajvećeg podatka u uniji
MEMORIJA
Podatak1Podatak1(2 bajta)(2 bajta)
Podatak2Podatak2(1 bajt)(1 bajt)
Zajednička oblastza podatak1 i za podatak2 Unija zauzima
ukupno 2 bajta
131
1.3.3. 1.3.3. UnijeUnije
UNIJAUNIJA??
Deklaracija Deklaracija unijeunijeOpOpšti oblik deklaracije:šti oblik deklaracije:
union ime union ime {{ tip1tip1 element1element1;; tip2tip2 element2element2;; ...... tipNtipN elementNelementN;;
}} lista_promjenljivih; lista_promjenljivih;
ključna riječ
ime unije
Deklaracija elementa (polja)
lista promjenljivih ovog tipaPrimjer:Primjer:
union unija union unija {{ char char c;c; intint ii;; }} x; x;
132
1.3.3. 1.3.3. UnijeUnije
UNIJAUNIJA??
Deklaracija Deklaracija unijeunijeAlternativniAlternativni oblik deklaracije: oblik deklaracije:
union ime union ime {{ tip1tip1 element1element1;; tip2tip2 element2element2;; ...... tipNtipN elementNelementN;; }};;unionunion ime lista_prom; ime lista_prom;
Primjer:Primjer:
union unija union unija {{ char char cc;; int iint i;; floatfloat ff;; };}; unionunion unija xunija x;;
Pristup elementima (poljima) unijePristup elementima (poljima) unijexx..i = 100;i = 100;
x.c = ’A’;x.c = ’A’;
133
1.3.3. 1.3.3. UnijeUnije
UNIJAUNIJA??
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
union unija union unija {{ char char cc;; int iint i;; };};
main()main()
{{
union unija xunion unija x;;
x.i = 0x141;x.i = 0x141;
printf(”printf(”x.i = %dx.i = %d\n”, x.i);\n”, x.i);
printf(”printf(”x.x.cc = % = %c\n”, x.c);c\n”, x.c);
}}
MEMORIJA
4141
0101x.ix.i
x.cx.c
x.i = 321
x.c = A
134
1.3.1.3.33. . UnijeUnije
UNIJAUNIJA??
UnijaUnija u jeziku C++ u jeziku C++
U slučaju da u istom bloku postoji neki podatak prostog tipa i unija sa istim imenom tada se mora koristiti ključna riječ union
Identifikator unije može da se koristi i kao identifikator tipa bez korišćenja ključne riječi union
Primjer:Primjer:
unionunion alfaalfa {{ double a,b,c;double a,b,c; };};
alfa a1, a2;alfa a1, a2;
Primjer:Primjer:
unionunion alfaalfa { int a, b, c{ int a, b, c };}; intint alfa;alfa; alfa = 65;alfa = 65; union alfa a1, a2 = { 1, 2, 3 };union alfa a1, a2 = { 1, 2, 3 };
135
1.3.1.3.33. . UnijeUnije
BEZIMENA UNIJABEZIMENA UNIJA??
Bezimena unijaBezimena unijaU jeziku C++ unije mogu da se definišu bez navođenja identifikatora iza ključne riječi union. Takve unije zovu se bezimene unije.
Članovi bezimene unije ponašaju se kao “obične promjenljive”
Primjer:Primjer:
unionunion {{ int int i; char i; char c;c; };};
char d;char d;
i = 65i = 65;;
d = c;d = c;
Promjenjljive i,c su elementi bezimene unije i pristupa im se kao
“običnim” promjenljivima
Unija za koju je definisan neki podatak nije bezimena. Elementima takve unije pristupa se preko identifikatora i operatora “.”
Primjer:Primjer:
unionunion {{ int int i; char i; char c;c; }} u u;; char d; char d; u.i = 65u.i = 65;; d = u.c; d = u.c;
136
1.3.1.3.44. . Definisanje tipovaDefinisanje tipova
Kako definisati Kako definisati vlastiti tipvlastiti tip??
Definisanje korisniDefinisanje korisniččkihkih tipova tipovaC omogućava:C omogućava:
definisanje korisničkih tipovadefinisanje korisničkih tipova
promjenu imena postojećim tipovimapromjenu imena postojećim tipovima
Opšti oblik:Opšti oblik:
typedef staritip novitip;typedef staritip novitip;
Primjeri:Primjeri:
typedef int INTEGER;typedef int INTEGER; INTEGER i,j;INTEGER i,j; ----------------------------------------------
typedef float NIZtypedef float NIZ[100][100];;NIZ niz1, niz2;NIZ niz1, niz2;
----------------------------------------------
typedef typedef struct {struct { int i;int i; char c;char c; }} TIPTIP;; TIP niz[10];TIP niz[10];
137
1.3. 1.3. Složeni tipovi podatakaSloženi tipovi podataka
ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......
Zadaci:Zadaci:
1. Napisati program koji učitava N brojeva, a zatim ispisuje sve one koji su pozitivni, kao i njnihov ukupan broj.
2. Napisati program koji učitava N brojeva, a zatim ispisuje sve one elemente niza koji se ne ponavljaju.
3. Napisati program koji učitava N brojeva, a zatim ispisati koliko se puta svaki od njih ponavlja u tom nizu.
4. Napisati program koji učitava N brojeva, a zatim ispisati sve parne brojeve iz tog niza koji su veći od aritmetičke sredine niza.
5. Napisati program koji učitava dvije kvadratne matrice, a zatim ispisuje njihov zbir.
6. Napisati program koji učitava matricu, a zatim ispisuje sve elemente matrice veće od najvećeg elementa na glavnoj dijagonali.
7. Učitati matricu, pa ispisati sve elemente matrice poredane od najvećeg do najmanjeg.
8. Učitati matricu, pa ispisati sve elemente matrice iznad glavne dijagonale poredane od najvećeg do najmanjeg.
9. Ako bi se na prvo polje šahovske table stavilo jedno zrno, a na svako sljedeće polje dvostruko više nego na prethodno, izračunati koliko bi se zrna nalazilo na posljednjem (64-om) polju, odnosno koliko bi ukupno zrna trebalo da bude na tabli.
138
1.1.44. . FunkcijeFunkcije
POTPROGRAMI ?POTPROGRAMI ?
PotprogramiPotprogramiPrilikom razvoja algoritma mogu da se uoče logičke cjeline koje se često Prilikom razvoja algoritma mogu da se uoče logičke cjeline koje se često puta ponavljaju, najčešće nad različitim skupom podataka. Takve cjeline puta ponavljaju, najčešće nad različitim skupom podataka. Takve cjeline treba izdvojiti u zasebne programske cjeline – potprograme.treba izdvojiti u zasebne programske cjeline – potprograme.
Korištenjem potprograma:Korištenjem potprograma:povećava se preglednost programa,povećava se preglednost programa,smanjuje se veličina programa,smanjuje se veličina programa,postiže se univerzalnost koda,postiže se univerzalnost koda,omogućava se lakše otklanjanje grešaka.omogućava se lakše otklanjanje grešaka.
U programskim jezicima obično se implementiraju:U programskim jezicima obično se implementiraju:proceduralni potprogrami (proceduralni potprogrami (procedureprocedure))funkcijski potprogrami (funkcijski potprogrami (funkcijefunkcije))
Programski jezik C ima implementirane samo funkcijske potprograme.Programski jezik C ima implementirane samo funkcijske potprograme.
139
1.1.44.. FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
FunkcijeFunkcijeFunkcija se obično definiše kao potprogram koji na osnovu određenog broja Funkcija se obično definiše kao potprogram koji na osnovu određenog broja argumenata argumenata daje jedan rezultatdaje jedan rezultat..
Podatak koji funkcija vraća glavnom programu naziva se Podatak koji funkcija vraća glavnom programu naziva se vrijednost funkcijevrijednost funkcije..
Pod Pod tipom funkcijetipom funkcije podrazumijeva se tip podatka koji vraća funkcija. podrazumijeva se tip podatka koji vraća funkcija.
Proceduralni potprogrami (u drugim programskim jezicima) mogu da Proceduralni potprogrami (u drugim programskim jezicima) mogu da vraćaju više podataka. Zbog toga, funkcije u C-u imaju implementiranu vraćaju više podataka. Zbog toga, funkcije u C-u imaju implementiranu mogućnost da osim rezultata – vrijednost funcije, vrate više podataka kroz mogućnost da osim rezultata – vrijednost funcije, vrate više podataka kroz razmjenu argumenata. razmjenu argumenata. Efekat kad funkcija kroz argumente vraća rezultate Efekat kad funkcija kroz argumente vraća rezultate naziva senaziva se bočni efekatbočni efekat..
Funkcija može u potunosti da se ponaša kao procedura, tj. može da daje samo Funkcija može u potunosti da se ponaša kao procedura, tj. može da daje samo bočne efekte.bočne efekte.
140
1.1.44. . FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Definicija funkcijeDefinicija funkcijeOpOpšti oblik definicije funkcije:šti oblik definicije funkcije:
tip ime (arg1, arg2, ... , argN)tip ime (arg1, arg2, ... , argN)
definicija_formalnih_argumenata;definicija_formalnih_argumenata;
{{
definicija_lokalnih_promjenljivih; definicija_lokalnih_promjenljivih;
programski_iskazi;programski_iskazi;
return (izraz); return (izraz); }}
tip funkcije
Ako se ne navede podrazumijeva se int
Ako funkcija ne vraća podatak, tip je void
lista formalnih argumenata parametri kroz koje funkcija
prima podatke (vrijednosti ili adrese)
definicija tipova argumenata
ime funkcije identifikator u skladu sa sintaksom jezika
definicija lokalnih promjenljivih
promjenljive koje se koriste u funkciji,
nisu vidljive izvan funkcije
izlaz iz funkcije i vraćanje vrijednosti datog tipa
U tijelu funkcije može biti biti više return iskaza
Ako funkcija ne vraća ništa, return može da se izostavi.
141
1.1.44. . FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Definicija funkcijeDefinicija funkcijeAlternativni oblik definicije funkcije:Alternativni oblik definicije funkcije:
tip ime ( tip ime ( tip1 arg1, tip2 arg2, ... , tipN tip1 arg1, tip2 arg2, ... , tipN argN argN ))
{{ definicija_lokalnih_promjenljivih; definicija_lokalnih_promjenljivih; programski_iskazi;programski_iskazi; return (izraz); return (izraz); }}
definicija tipova argumenata sadržana je
u listi argumenata
Poziv funkcijePoziv funkcijeOpšti oblik poziva funkcije:Opšti oblik poziva funkcije:
ime ( sarg1, sarg2, ... , sargN )ime ( sarg1, sarg2, ... , sargN )
lista stvarnih argumenata parametri koji se šalju u funkciju
(vrijednosti ili adrese)Zovu se stvarni zato što su to
stvarni, realni podaci
142
1.1.44. . FunkcijeFunkcije
PROTOTIP ?PROTOTIP ?
Deklaracija funkcije (prototip)Deklaracija funkcije (prototip)Prototip ili deklaracija funkcije predstavlja njen ”opis za spoljašnji svijet”Prototip ili deklaracija funkcije predstavlja njen ”opis za spoljašnji svijet”
Iz prototipa se vidi kako se komunicira s datom funkcijom, jer sadrži:Iz prototipa se vidi kako se komunicira s datom funkcijom, jer sadrži:tip funkcije,tip funkcije,ime funkcije,ime funkcije,tipove (a može i imena) argumenata.tipove (a može i imena) argumenata.
Opšti oblik prototipa:Opšti oblik prototipa:
tip ime ( tip1, tip2, ... , tipN );tip ime ( tip1, tip2, ... , tipN );
Primjer:Primjer:
int zbir( int a, int b )int zbir( int a, int b )
{{ return (a+b); return (a+b); }}
int zbir( int, int );int zbir( int, int );
void poruka ()void poruka ()
{{ printf(”Zdravo!”); printf(”Zdravo!”); }}
void poruka ();void poruka ();
143
1.1.44. . FunkcijeFunkcije
STRUKTURA STRUKTURA PROGRAMA ?PROGRAMA ?
Struktura C programaStruktura C programaUobičajena je sljedeća struktura:Uobičajena je sljedeća struktura:
pretprocesorske direktivepretprocesorske direktive
prototip funkcijaprototip funkcija
mainmain
definicija funkcijadefinicija funkcija
Alternativno je moguće i:Alternativno je moguće i:
pretprocesorske direktivepretprocesorske direktive definicija funkcijadefinicija funkcija mainmain
Pogodno kad imamo malen broj funkcija
Ako funkcija zove neku drugu funkciju, funkcija koja se poziva mora biti
prethodno definisana
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
void poruka ();void poruka ();
main()main() {{ poruka();poruka(); }}
void poruka ()void poruka () {{ printf(”Zdravo!”); printf(”Zdravo!”); }}
144
1.1.44. . FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Primjer:Primjer: Program Program koji učitava dužine stranica pravougaonika, a zatim ispisujekoji učitava dužine stranica pravougaonika, a zatim ispisuje njegov obim i površinu. Obim treba da se računa u funkciji obim, anjegov obim i površinu. Obim treba da se računa u funkciji obim, a površina u funkciji povrs.površina u funkciji povrs.
#include <stdio.h>#include <stdio.h>
float obim(float, float);float obim(float, float);
float povrs(floatfloat povrs(float s1 s1, float, float s2 s2););
main()main(){{ float float a,b, o,p;a,b, o,p; printf(”printf(”Stranica aStranica a: ”); scanf(”%d”, &: ”); scanf(”%d”, &aa); ); printf(”printf(”Stranica bStranica b: ”); scanf(”%d”, &: ”); scanf(”%d”, &bb); ); o = obim(a,b);o = obim(a,b); p = povrs(a,b);p = povrs(a,b); printf(”printf(”Obim Obim : : %7.3f%7.3f\n”, o);\n”, o); printf(”Povrsinaprintf(”Povrsina : : %7.3f%7.3f\n”, p);\n”, p);} }
float obim (float x, float y)float obim (float x, float y) { return ( 2*x + 2*y ); }{ return ( 2*x + 2*y ); }
float povrs (float c, float d)float povrs (float c, float d) { return ( c*d ); }{ return ( c*d ); }
Prototip funkcije obim
Navedeni samo tipovi argumenata
Prototip funkcije povrs
Navedeni tipovi i imena argumenata
Poziv funkcije obimPoziv funkcije povrs
Šalju se stvarni podaci a i b
Definicija funkcije obim
Funkcija prihvata proslijeđene vrijednosti (a i b) kroz formalne
argumente x i y
Funkcija izračunava obim 2*x+2*y i to vraća u glavni program
145
1.1.44. . FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Primjer:Primjer: Funkcija koja ne vraća vrijednostFunkcija koja ne vraća vrijednost
#include <stdio.h>#include <stdio.h>
void kvadrat ( int );void kvadrat ( int );
main()main(){{ intint i,n;i,n;
do do { printf(”{ printf(”n =n = ”); scanf(”%d”, &n); } ”); scanf(”%d”, &n); } while (n<1); while (n<1);
for (i=1; i<=n; i++)for (i=1; i<=n; i++) kvadrat(i);kvadrat(i);} }
void kvadrat (int k)void kvadrat (int k) { { int kv;int kv; kv = k * k;kv = k * k; printf(”%5d %5d\n”, k, kv);printf(”%5d %5d\n”, k, kv); }}
Funkcija kvadrat ne vraća vrijednost (void)
Ovakva funkcija ponaša se kao proceduralni potprogram
n = 4....1 ....1....2 ....4....3 ....9....4 ...16
146
1.1.44. . FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Primjer:Primjer: Program koji ispisuje prvih n prostih brojeva. Program koji ispisuje prvih n prostih brojeva.
Provjera da li je broj prost vrši se u funkciji prost.Provjera da li je broj prost vrši se u funkciji prost.
#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>int prost (int);int prost (int);main()main(){{ int i=1, broj=1, n;int i=1, broj=1, n; do do { printf(”{ printf(”n =n = ”); scanf(”%d”, &n); } ”); scanf(”%d”, &n); } while (n<1);while (n<1); printf(printf(”To su”To su brojev brojevii::\n”);\n”);
while (i<=n)while (i<=n)
{{
if ( prost(broj) ) if ( prost(broj) )
{ printf(” %d”, broj); i++; }{ printf(” %d”, broj); i++; }
broj++;broj++;
} }
}}
int prost (intint prost (int b b)){{ int int dd==33, , pom;pom; pom = (b%2) || (b==2);pom = (b%2) || (b==2); while (pom &&while (pom && d<=sqrt(b))d<=sqrt(b)) { { pom = b%2;pom = b%2; d += 2;d += 2; }} return(pom); return(pom);
}}
n = 6To su brojevi: 1 2 3 5 7 11
147
1.1.44. . FunkcijeFunkcije
prenos putem prenos putem VRIJEDNOSTI ?VRIJEDNOSTI ?
Prenos parametara u funkciju putem VRIJEDNOSTIPrenos parametara u funkciju putem VRIJEDNOSTIU prethodnim primjerima korišten je prenos parametara putem VRIJEDNOSTI:U prethodnim primjerima korišten je prenos parametara putem VRIJEDNOSTI:
1. prilikom poziva funkcije šalje se vrijednost 1. prilikom poziva funkcije šalje se vrijednost •• kao stvarni argument kao stvarni argument može da se navede: može da se navede: ime promjenljiveime promjenljive, neka , neka konstantakonstanta ili ili izrazizraz•• izračunava se vrijednost izraza i ta vrijednost šalje u funkcijuizračunava se vrijednost izraza i ta vrijednost šalje u funkciju
2. funkcija prihvata vrijednosti u formalne argumente2. funkcija prihvata vrijednosti u formalne argumente•• formalni i stvarni argumenti formalni i stvarni argumenti moraju da se slažu u:moraju da se slažu u:
brojubroju, , redoslijeduredoslijedu i i tiputipu•• formalni argumenti (promjenljive) automatski nastaju prilikomformalni argumenti (promjenljive) automatski nastaju prilikom
ulaska u funkciju i preuzimaju proslijeđene vrijednostiulaska u funkciju i preuzimaju proslijeđene vrijednosti
3. po izlasku iz funkcije formalni argumenti automatski nestaju3. po izlasku iz funkcije formalni argumenti automatski nestaju
•• automatski nastaju i nestaju pa se nazivaju automatski nastaju i nestaju pa se nazivaju automatske promjenljive automatske promjenljive
U funkciji se kreira slika stvarnih argumenata i koriste te slike, a ne stvarne promjenljive iz glavnog programa, zato nakon izlaska iz funkcije promjenljive u
glavnom programu ostaju nepromijenjene!!!
148
1.1.44. . FunkcijeFunkcije
prenos putem prenos putem VRIJEDNOSTI ?VRIJEDNOSTI ?
Primjer:Primjer: Ilustracija prenosa parametara putem vrijednosti. Ilustracija prenosa parametara putem vrijednosti.
#include <stdio.h>#include <stdio.h>
void f (int);void f (int);
main()main(){{ int i=10;int i=10; printf(printf(””main: %dmain: %d\n”\n”,i,i););
f(i);f(i); printf(printf(””main: %dmain: %d\n”\n”,i,i););
}}
void f (int k)void f (int k){{ printf(printf(”f: %d\n”,”f: %d\n”,kk);); kk=20;=20; printf(printf(”f: %d\n”,”f: %d\n”,kk););
}}
main: 10
MEMORIJA
ii1010
kk10102020
f: 10f: 20main: 10
149
1.1.44. . FunkcijeFunkcije
prenos VEKTORA u prenos VEKTORA u funkciju ?funkciju ?
VEKTOR (polje) kao argument funkcijeVEKTOR (polje) kao argument funkcije
Prenos vektora (polja) vrši se putem adresePrenos vektora (polja) vrši se putem adrese
1. prilikom poziva funkcije šalje se adresa niza (vektora) 1. prilikom poziva funkcije šalje se adresa niza (vektora) •• kao stvarni argument kao stvarni argument navodi se ime niza navodi se ime niza
(ime niza je početna adresa niza) (ime niza je početna adresa niza) 2. funkcija prihvata adresu niza2. funkcija prihvata adresu niza
•• formalni argument u definicji funkcije mora da sadrži formalni argument u definicji funkcije mora da sadrži [ ][ ]broj elemenata niza ne mora da se navodibroj elemenata niza ne mora da se navodi
•• ne stvara se kopija niza nego se manipuliše stvarnim podacimane stvara se kopija niza nego se manipuliše stvarnim podacima
U funkciji se manipuliše stvarnim podacima, a ne kopijom niza. Zato funkcija može da promijeni niz,
pa po povratku iz funkcije nemamo originalni nego modifikovani niz !!!
150
1.1.44. . FunkcijeFunkcije
prenos VEKTORA u prenos VEKTORA u funkciju ?funkciju ?
Primjer:Primjer: Program koji pronalaProgram koji pronalazi najveći element u nizu.zi najveći element u nizu.
#include <stdio.h>#include <stdio.h>
int max ( int nizint max ( int niz[], int n[], int n););
main()main(){{ int int a[] = { 2,15,5,0,8 }a[] = { 2,15,5,0,8 };; int n = 5;int n = 5; printf(printf(”Najveci”Najveci: %d: %d\n”\n”,, max( a,n ) ); max( a,n ) );
}}
intint maxmax ( int ( int niz[], int nniz[], int n ) ){{ int i, m=niz[0];int i, m=niz[0]; for (i=1; i<n; i++)for (i=1; i<n; i++) if (niz[i]>m) m=a[i];if (niz[i]>m) m=a[i]; return (m);return (m);
}}
Najveci: 15
Formalni argument
deklaracija niza bez dimenzije
moglo je i int niz[5]
Poziv funkcije
šalje se adresa niza
151
1.1.44. . FunkcijeFunkcije
prenos VEKTORA u prenos VEKTORA u funkciju ?funkciju ?
Primjer:Primjer: Program koji sortira i ispisuje niz Program koji sortira i ispisuje niz korišćenjem funkcija.korišćenjem funkcija.
#include <stdio.h>#include <stdio.h>
void sort ( int nizvoid sort ( int niz[], int n[], int n););void pisi ( int nizvoid pisi ( int niz[], int n[], int n););
main()main(){{ int int a[] = { 2,15,5,0,8 }a[] = { 2,15,5,0,8 };; printf(printf(””Prije:Prije:””); pisi(); pisi( a,n ); a,n ); sort( a,n );sort( a,n ); printf(printf(””Poslije:Poslije:””); pisi(); pisi( a,n ); a,n ); }}
void pisi ( int void pisi ( int niz[], int nniz[], int n ) ){{ int iint i;; for (i=for (i=00; i<n; i++); i<n; i++) printf(printf(”” %d %d””, , niz[niz[ii]]); ); printf(printf(”\n””\n”); ); }}
void void sortsort ( int ( int niz[], int nniz[], int n ) ){{ int i,j,rb,pomint i,j,rb,pom;; for (i=for (i=00; i<n-1; i++); i<n-1; i++) {{ for (rb=i, j=i+1; j<n; j++)for (rb=i, j=i+1; j<n; j++) ifif (niz[j]<niz[rb]) rb=j;(niz[j]<niz[rb]) rb=j; if (rb!=i)if (rb!=i) { { pom=niz[i];pom=niz[i]; niz[i]=niz[rb]; niz[i]=niz[rb]; niz[rb]=pom;niz[rb]=pom; }} }}}}
Prije: 2 15 5 0 8Poslije: 0 2 5 8 15
152
1.1.44. . FunkcijeFunkcije
prenos prenos MATRICEMATRICE u u funkciju ?funkciju ?
VIVIŠŠEDIMENEDIMENZZIONALNO poljeIONALNO polje kao argument funkcije kao argument funkcije
Prenos višedimenzionalnog polja vrši se putem adresePrenos višedimenzionalnog polja vrši se putem adrese
U deklaraciji formalnih parametara:U deklaraciji formalnih parametara:
•• pprva dimenzija ne mora da se navede (može samo rva dimenzija ne mora da se navede (može samo [ ] )[ ] )
•• ostale dimenzije moraju da se naveduostale dimenzije moraju da se navedu
Primjer:Primjer:
int funkcija (int a[][10][10], int p, int q)int funkcija (int a[][10][10], int p, int q)
iliili
int funkcija (int a[10][10][10], int p, int q)int funkcija (int a[10][10][10], int p, int q)
U funkciji se manipuliše stvarnim podacima, a ne kopijom polja. Zato po povratku iz funkcije nemamo
originalno nego modifikovano polje !!!
153
1.1.44. . FunkcijeFunkcije
prenos prenos MATRICEMATRICE u u funkciju ?funkciju ?
Primjer:Primjer: Program koji transponuje kvadratnu matricuProgram koji transponuje kvadratnu matricu..
#include <stdio.h>#include <stdio.h>
void void trantran ( int ( int m[m[1010][10], int n][10], int n););void pisi ( int void pisi ( int m[10][10], int nm[10][10], int n););
main()main(){{ int int a[a[1010][][1010] = { {1,2},{3,4} }] = { {1,2},{3,4} };; printf(printf(””Prije:Prije:\n”\n”); pisi(); pisi(a,n);a,n); trantran( a,n );( a,n ); printf(printf(””Poslije:Poslije:\n”\n”); pisi(); pisi(a,n);a,n); }}
void pisi (int void pisi (int m[10][10], int nm[10][10], int n)){{ int i,jint i,j;; for (i=for (i=00; i<n; i++); i<n; i++) { { for (j=0; j<n; j++) for (j=0; j<n; j++) printf(printf(”” % %44dd””, , m[m[ii][j]][j]); ); printf(printf(”\n””\n”); ); }}}}
void void trantran (int (int m[10][10], int nm[10][10], int n)){{ int i,j,pomint i,j,pom;; for (i=for (i=00; i<n; i++); i<n; i++) for (j=i+1; j<n; j++)for (j=i+1; j<n; j++) { { pom=m[i][j];pom=m[i][j]; m[i][j]=m[j][i]; m[i][j]=m[j][i]; m[j][i]=pom;m[j][i]=pom; }} }}}}
Prije: 1 2 3 4Poslije: 1 3 2 4
154
1.1.44. . FunkcijeFunkcije
prenos prenos STRUKTURESTRUKTURE u funkciju ?u funkciju ?
STRUKTURA STRUKTURA kao argument funkcijekao argument funkcije
Strukura moStrukura može biti argument funkciježe biti argument funkcije
Primjer:Primjer:
voidvoid funkcija ( funkcija ( struct tacka a struct tacka a ))
Ako funkcija vraća strukturu treba definisati tip, a zatim u definiciji/deklaAko funkcija vraća strukturu treba definisati tip, a zatim u definiciji/deklarraciji aciji funkcije navesti da je funkcija toga tipafunkcije navesti da je funkcija toga tipa
Primjer:Primjer:
typedef struct typedef struct {int i,j} TACKA;{int i,j} TACKA;
TACKA funkcija (TACKA funkcija ( TACKATACKA a a, TACKA b, TACKA b ););
155
1.1.44. . FunkcijeFunkcije
prenos prenos STRUKTURESTRUKTURE u funkciju ?u funkciju ?
Primjer:Primjer: Program koji manipuliProgram koji manipuliše kompleksnim brojevima.še kompleksnim brojevima.
#include <stdio.h>#include <stdio.h>typedef struct typedef struct { float re,im; } COMPLEX;{ float re,im; } COMPLEX;COMPLEXCOMPLEX dodjeladodjela ( ( float a, float b float a, float b )) { { COMPLEX x;COMPLEX x; x.re=a; x.im=b;x.re=a; x.im=b; return(x);return(x); } } COMPLEXCOMPLEX zbirzbir ( ( COMPLEX x, COMPLEX y COMPLEX x, COMPLEX y )) { { COMPLEX z;COMPLEX z; z.re=x.re+y.re; z.im=x.im+y.im;z.re=x.re+y.re; z.im=x.im+y.im; return(z);return(z); } } main()main(){{ COMPLEX x,y,z;COMPLEX x,y,z; x=dodjela(1,2); y=doDjela(3,4);x=dodjela(1,2); y=doDjela(3,4); z=zbir(x,y);z=zbir(x,y); printf(printf(”(%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)\n”,”(%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)\n”, x.re,x.im,y.re,y.im,z.re,z.imx.re,x.im,y.re,y.im,z.re,z.im););}}
156
1.1.44. . FunkcijeFunkcije
REKURZIJAREKURZIJA ? ?
Rekurzivne funkcije (REKURZIJE)Rekurzivne funkcije (REKURZIJE)
Rekurzivna funkcija je funkcija koja sama sebe poziva!!!Rekurzivna funkcija je funkcija koja sama sebe poziva!!!
Primjer:Primjer:
faktorijel:faktorijel: n! = n * (n-1)!, n>n! = n * (n-1)!, n>00; 0!=1 ; 0!=1
stepenovanje:stepenovanje: xxnn = x * x = x * xn-1n-1, n>0; x, n>0; x00=1 =1
FibonaFibonaččijevijev niz niz:: ffnn = = ffnn-1-1 * * ffnn-2-2, n>, n>11; ; f f00==0, f0, f11==11
Opšte karakteristike rekurzivnih (rekurentnih) rješenja:Opšte karakteristike rekurzivnih (rekurentnih) rješenja:
•• problem se svodi na rješavanje istog problema, ali jednostavnijegproblem se svodi na rješavanje istog problema, ali jednostavnijeg
•• funkcija poziva samu sebe sve dok se problem ne pojednostavi do trivijalnogfunkcija poziva samu sebe sve dok se problem ne pojednostavi do trivijalnog
•• rekurzivna rješenja su manje efikasna (veći zahtjev za memorijom)rekurzivna rješenja su manje efikasna (veći zahtjev za memorijom)
•• treba ih izbjegavati, ali postoje problemi koji su po prirodi rekurzivni i koje treba ih izbjegavati, ali postoje problemi koji su po prirodi rekurzivni i koje jeje gotovo nemoguće riješiti bez rekurzijegotovo nemoguće riješiti bez rekurzije
157
1.1.44. . FunkcijeFunkcije
REKURZIJAREKURZIJA ? ?
Matematski opis rekurzije:Matematski opis rekurzije:
n! = n * (n-1)!, n>0; 0!=1 n! = n * (n-1)!, n>0; 0!=1
Primjer:Primjer: Rekurzivno izračunavanje faktorijela.Rekurzivno izračunavanje faktorijela.
3! = 3 * 2!3! = 3 * 2!
2! = 2 * 1!2! = 2 * 1!
1! = 1 * 0!1! = 1 * 0!
0! = 10! = 1
1*1 = 11*1 = 1
2*1 = 22*1 = 2
3*2 = 63*2 = 6
int fakt (int n)int fakt (int n){ { if (n == 0) if (n == 0) return (1);return (1); elseelse return (n * fakt(n-1));return (n * fakt(n-1));}}
int fakt (int n)int fakt (int n){ { return (n==0 ? 1 : n*fakt(n-1));return (n==0 ? 1 : n*fakt(n-1));}}
158
1.1.44. . FunkcijeFunkcije
REKURZIJAREKURZIJA ? ?
Primjer:Primjer: RekurzivnRekurzivna funkcija za konverziju dekadskog u binarni brojni sistem.a funkcija za konverziju dekadskog u binarni brojni sistem.
11991010 = ? = ?22voidvoid konkon (int (int bb)){ { int cif;int cif; cif = b % 2;cif = b % 2; b /= 2;b /= 2; if (b>0) kon (b);if (b>0) kon (b); printf(”%d”,cif); printf(”%d”,cif); }}
19 : 219 : 2
99 11
44 11
22 00
11 00
00 11
11991010 = 10011 = 1001122
1919cif=1cif=1b=9b=9kon(9) => cif=1kon(9) => cif=1 b=4b=4
kon(4) => cif=0kon(4) => cif=0 b=2 b=2
kon(2) => cif=0kon(2) => cif=0 b=1b=1 kon(1) => cif=1kon(1) => cif=1
b=0b=0””1”1”
” ”0” <=0” <= ” ”0” <=0” <=
” ”1” <=1” <= ” ”1” <=1” <=
159
1.1.44. . FunkcijeFunkcije
INLINE funkcijeINLINE funkcije ? ?
Neposredno Neposredno ugrađivanje u kodugrađivanje u kod ( (inline funkcijeinline funkcije))Za malene funkcije (sa malo koda) pogodnije je direktno ugrađivanje u kod, Za malene funkcije (sa malo koda) pogodnije je direktno ugrađivanje u kod, nego da se prevode nezavisno i pozivaju iz nekog koda jer se tako ubrzava nego da se prevode nezavisno i pozivaju iz nekog koda jer se tako ubrzava rad, štede resursi ...rad, štede resursi ...
Opšti oblik:Opšti oblik:
inline tip imefunk ( parametri)inline tip imefunk ( parametri) { tijelo } { tijelo }
kvalifikatorkvalifikator funkcijefunkcije
tiptip funkcije funkcije
Prevodilac ne mora da uvaPrevodilac ne mora da uvaži sugestiju da funkcija bude inline. Tada se to ži sugestiju da funkcija bude inline. Tada se to ignoriše i navedena funkcija se ponaša kao “standardna” funkcijaignoriše i navedena funkcija se ponaša kao “standardna” funkcija
Inline funkcije podsjećaju na makroeInline funkcije podsjećaju na makroe• pogodnije su od makroa jer omogućavaju bolju kontrolu argumenatapogodnije su od makroa jer omogućavaju bolju kontrolu argumenata• obrada makroa je prosta leksička obrada (obrada teksta) – može daobrada makroa je prosta leksička obrada (obrada teksta) – može da dovede do neželjenih posljedica u slučaju bočnih efekatadovede do neželjenih posljedica u slučaju bočnih efekata
160
1.1.44. . FunkcijeFunkcije
INLINE funkcijeINLINE funkcije ? ?
Primjer:Primjer: #include <iostream.h>#include <iostream.h> #define max(a,b) ((a)>(b))?(a):(b)#define max(a,b) ((a)>(b))?(a):(b) main()main() {{ int a=3, b=2, c;int a=3, b=2, c; c = max(a,b);c = max(a,b); cout << c << endl;cout << c << endl; c = max(++a,++b);c = max(++a,++b); cout << c << endl; cout << c << endl; }}
c = ((a)>(b)) ? (a):(b) ; c = ((a)>(b)) ? (a):(b) ;
c = ((++a)>(++b)) ? (++a):(++b); c = ((++a)>(++b)) ? (++a):(++b);
35
#include <iostream.h>#include <iostream.h> inlineinline int int max(max(int int aa; int ; int b)b) { return ({ return ((a>b)?(a>b)? a:ba:b); }); } main()main() { int a=3, b=2, c;{ int a=3, b=2, c; c = max(a,b); cout << c << endl;c = max(a,b); cout << c << endl; c = max(++a,++b); cout << c << endl; c = max(++a,++b); cout << c << endl; }}
34
161
1.1.44. . FunkcijeFunkcije
podrazumijevane podrazumijevane vrijednostivrijednosti ? ?
Podrazumijevane vrijednosti argumenata u funkciji Podrazumijevane vrijednosti argumenata u funkciji
U definiciji funkcije mogu da se navedu podrazumijevane vrijednosti za U definiciji funkcije mogu da se navedu podrazumijevane vrijednosti za formalne argumente.formalne argumente.
Podrazumijevane vrijednosti formalnih argumenata koriste se kad u Podrazumijevane vrijednosti formalnih argumenata koriste se kad u pozivu funkcije nedostaju stvarni argumentipozivu funkcije nedostaju stvarni argumenti
Ako se za neki argument podrazumijeva vrijednost, onda mora da se Ako se za neki argument podrazumijeva vrijednost, onda mora da se podrazumijeva i za sve preostale argumente deklarisane iza njegapodrazumijeva i za sve preostale argumente deklarisane iza njega
Prilikom poziva funkcije mogu da se izostave samo posljednji argumenti Prilikom poziva funkcije mogu da se izostave samo posljednji argumenti (nema preskakanja)(nema preskakanja)
Dozvoljeno je da se svi argumenti podrazumijevajuDozvoljeno je da se svi argumenti podrazumijevaju
162
1.1.44. . FunkcijeFunkcije
podrazumijevane podrazumijevane vrijednostivrijednosti ? ?
Primjer:Primjer: #include <iostream.h>#include <iostream.h> #include <math.h>#include <math.h>
struct Tacka { double x,y; };struct Tacka { double x,y; }; const Tacka O = {0,0};const Tacka O = {0,0};
double daljina ( Tacka a, Tacka b=O )double daljina ( Tacka a, Tacka b=O ){ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); }{ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); }
main()main() {{ Tacka p={1,1}, q={-1,-1};Tacka p={1,1}, q={-1,-1}; cout << daljina(p,q) << endl; // udaljenost od p do qcout << daljina(p,q) << endl; // udaljenost od p do q cout << daljina(p) << endl; // udaljenost od p do Ocout << daljina(p) << endl; // udaljenost od p do O }}
2.828431.41421
163
1.1.44. . FunkcijeFunkcije
function function overloadingoverloading ? ?
Preklapanje imena funkcija (function overloading)Preklapanje imena funkcija (function overloading)Srodnim funkcijama moguće je dati isto ime.Srodnim funkcijama moguće je dati isto ime.
Ako dvije funkcije imaju ista imena, kažemo da imamo funkcije sa Ako dvije funkcije imaju ista imena, kažemo da imamo funkcije sa preklopljenim imenima (function overloading).preklopljenim imenima (function overloading).
Prevodilac razlikuje preklopljene funkcije samo preko argumenataPrevodilac razlikuje preklopljene funkcije samo preko argumenata
Primjer:Primjer: ...... int int max (int i, int j) max (int i, int j) { return (i>j) ? i : j ; } { return (i>j) ? i : j ; } floatfloat max ( max (floatfloat i, i, floatfloat j) j) { return (i>j) ? i : j ; }{ return (i>j) ? i : j ; } char max (char i, char j) { return (i>j) ? i : j ; }char max (char i, char j) { return (i>j) ? i : j ; } ...... cout << max (2,6) << endl;cout << max (2,6) << endl; cout << max (’B’,’A’) << endl;cout << max (’B’,’A’) << endl; ......
6B
164
1.1.44. . FunkcijeFunkcije
function function overloadingoverloading ? ?
Preklapanje imena funkcija (function overloading)Preklapanje imena funkcija (function overloading)Preklopljene funkcije ne moraju nuPreklopljene funkcije ne moraju nužno da imaju isti broj argumenata i žno da imaju isti broj argumenata i isto (slično) ponašanjeisto (slično) ponašanje
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>
char max (char a, char b)char max (char a, char b) { return (a>b) ? a : b ; }{ return (a>b) ? a : b ; }
int max (int i=0, int j=0, int k=0)int max (int i=0, int j=0, int k=0) { return (i>j) ? (i>k)?i:k : (j>k)?j:k ; }{ return (i>j) ? (i>k)?i:k : (j>k)?j:k ; }
main()main(){ { cout << max ('b','a') << endl;cout << max ('b','a') << endl; cout << max (5, 10, 6) << endl;cout << max (5, 10, 6) << endl; cout << max (10,5) << endl; cout << max (10,5) << endl; }}
b1010
165
1.1.44. . FunkcijeFunkcije
function function overloadingoverloading ? ?
Preklapanje imena funkcija (function overloading)Preklapanje imena funkcija (function overloading)Posebno treba paziti kod funkcija sa podrazumijevanim vrijednostima Posebno treba paziti kod funkcija sa podrazumijevanim vrijednostima argumenata!!!argumenata!!!
Primjer:Primjer:
#include <iostream.h>#include <iostream.h>
char fun (char c, int i=0) char fun (char c, int i=0) { return c+i ; }{ return c+i ; }
char fun (char c, double f=0)char fun (char c, double f=0) { return c + (int) f; }{ return c + (int) f; }
main()main(){ { cout << fun(’A’,1) << endl;cout << fun(’A’,1) << endl; cout << fun(’A’,2.5) << endl;cout << fun(’A’,2.5) << endl; // cout << fun(’A’) << endl; // cout << fun(’A’) << endl; }}
BC
Poziva se funkcija kojoj se Poziva se funkcija kojoj se šalje samo jedan argument, šalje samo jedan argument, drugi se podrazumijeva. drugi se podrazumijeva.
Međutim, ne može Međutim, ne može jednoznačno da se odredi jednoznačno da se odredi koja od funkcija treba da koja od funkcija treba da
se izvrši!!!se izvrši!!!
166
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Domen identifikatora?Domen identifikatora?
Domen identifikatoraDomen identifikatoraDomen Domen (oblast definisanosti) identifikatora (promjenljive) je područje (oblast definisanosti) identifikatora (promjenljive) je područje programa u kojem je taj identifikator dostupan (vidljiv)programa u kojem je taj identifikator dostupan (vidljiv)
Osnovno pravilo:Osnovno pravilo:Identifikator je dostupan u bloku u kojem je definisan, kao i u svim ugnježđenim blokovima, osim ako u
njima nije maskiran drugim identifikatorom sa istim imenom!
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ int x=1;int x=1; printf(”Prije bloka: %dprintf(”Prije bloka: %d\n”,x);\n”,x); {{ int x=0;int x=0;
printf(”U bloku: %d\n”,x);printf(”U bloku: %d\n”,x); }} printf(”printf(”PoslijePoslije bloka: %d bloka: %d\n”,x);\n”,x);}}
Prije bloka: 1U bloku: 0Poslije bloka: 1
U ugnježđenom bloku je definisana
promjenljiva sa istim imenom, čime
je maskirana promjenljiva x iz funkcije main()
167
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Memorijske klaseMemorijske klase??
Memorijske klase promjenljivihMemorijske klase promjenljivihU programskom jeziku C razlikujemo 4 memorijske klase promjenljivih:U programskom jeziku C razlikujemo 4 memorijske klase promjenljivih:
•• globalneglobalne
definišu se izvan svih funkcijadefinišu se izvan svih funkcija
•• statičkestatičke
definišu se korišćenjem ključne riječi definišu se korišćenjem ključne riječi staticstatic static tip ime=vrijednoststatic tip ime=vrijednost
•• automatskeautomatske
definišu se korišćenjem ključne riječi definišu se korišćenjem ključne riječi autoauto auto tip ime=vrijednostauto tip ime=vrijednost
podrazumijeva se da je promjenljiva automatska, ako se podrazumijeva se da je promjenljiva automatska, ako se drugačije ne navededrugačije ne navede
•• registarskeregistarske
definišu se korišćenjem ključne riječi definišu se korišćenjem ključne riječi registerregister register tip ime=vrijednostregister tip ime=vrijednost
168
1.1.55.. Domeni i memorijske klaseDomeni i memorijske klase
AutomatskeAutomatske promjenljive?promjenljive?
AutomatskeAutomatske promjenljive promjenljiveAutomatske promjenljive definiAutomatske promjenljive definiššu seu se na početku tijela funkcije (glavnog programa na početku tijela funkcije (glavnog programa ili potprograma). Često se koristi i termin ili potprograma). Često se koristi i termin lokalna promjenljivalokalna promjenljiva..
Početna vrijednost im se ne podrazumijeva!!! (To znači da nije nula!!!)Početna vrijednost im se ne podrazumijeva!!! (To znači da nije nula!!!)
Mogu da se koriste samo u funkciji u kojoj su definisane. To znači da isto ime Mogu da se koriste samo u funkciji u kojoj su definisane. To znači da isto ime možemo da koristimo nezavisno u više različitih funkcija. Čak te promjenljive možemo da koristimo nezavisno u više različitih funkcija. Čak te promjenljive mogu da budu i različitih tipova.mogu da budu i različitih tipova.
Automatski nastaju prilikom ulaska u funkciju, a automatski nestaju nakon Automatski nastaju prilikom ulaska u funkciju, a automatski nestaju nakon izlaska iz funkcije.izlaska iz funkcije.
Podrazumijeva se da je promjenljiva automatska ako se drugačije ne navedePodrazumijeva se da je promjenljiva automatska ako se drugačije ne navede
Ne mora se eksplicitno navoditi da se radi o automatskoj promjenljivoj, ali može Ne mora se eksplicitno navoditi da se radi o automatskoj promjenljivoj, ali može pomoću ključne rijeći autopomoću ključne rijeći auto
auto tip ime=vrijednost;auto tip ime=vrijednost;
169
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Automatske Automatske promjenljive?promjenljive?
Primjer:Primjer: Maniulacija automatskim promjenljivima.Maniulacija automatskim promjenljivima.
#include <stdio.h>#include <stdio.h>
void f1 ()void f1 () {{ int i=1; int i=1; printf(printf(””f1: %df1: %d\n”\n”, i);, i); }}
void f2 ()void f2 () {{ int i=2; int i=2; printf(printf(””f2: %df2: %d\n”\n”, i);, i); i=10;i=10; }}
main()main(){{ int i=0; int i=0; printf(printf(””main: %dmain: %d\n”\n”, i);, i); f1();f1(); printf(printf(””main: %dmain: %d\n”\n”, i);, i); i=5;i=5; f2();f2(); printf(printf(””main: %dmain: %d\n”\n”, i);, i);}}
main: 0 f1: 1main: 0 f2: 2main: 0
170
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Statičke promjenljive?Statičke promjenljive?
Statičke promjenljiveStatičke promjenljive
Definišu se navođenjem ključne riječi Definišu se navođenjem ključne riječi staticstatic static tip ime=vrijednoststatic tip ime=vrijednost
Vrijednost im se određuje prije početka izvršavanja programaVrijednost im se određuje prije početka izvršavanja programauzima se eksplicitna vrijednost kojom je inicijalizovana promjernljivauzima se eksplicitna vrijednost kojom je inicijalizovana promjernljivapodrazumijeva se početna vrijednost nula ako se ne navedepodrazumijeva se početna vrijednost nula ako se ne navede
Imaju trajan karakterImaju trajan karakterpostoje od početka do kraja izvršavanja programapostoje od početka do kraja izvršavanja programavrijednost ostaje sačuvana do sljedećeg poziva date funkcijevrijednost ostaje sačuvana do sljedećeg poziva date funkcije
171
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Statičke promjenljive?Statičke promjenljive?
Primjer:Primjer: Maniulacija statičkom promjenljivom.Maniulacija statičkom promjenljivom.
#include <stdio.h>#include <stdio.h>
void f ()void f () {{ static int brs=1;static int brs=1; auto int bra=1;auto int bra=1; printf(printf(””static brs=%d auto bra=%dstatic brs=%d auto bra=%d\n”\n”, brs, bra);, brs, bra); brs++;brs++; bra++;bra++; }}
main()main(){{ int i; int i; for (i=1; i<=3; i++)for (i=1; i<=3; i++) f();f();}}
static brs=1 auto bra=1 static brs=2 auto bra=1 static brs=3 auto bra=1
172
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Globalne promjenljive?Globalne promjenljive?
Globalne promjenljiveGlobalne promjenljiveGlobalne promjenljive definišu se izvan svih funkcija. Globalne promjenljive definišu se izvan svih funkcija. Ako se u definiciji ne Ako se u definiciji ne navede početna vrijednost podrazumijeva se nula!!!navede početna vrijednost podrazumijeva se nula!!!
Globalna promjenljiva dostupna je u svim funkcijama koje su definisane nakon Globalna promjenljiva dostupna je u svim funkcijama koje su definisane nakon definicije date promjenljive.definicije date promjenljive.
Globalne promjenljive omogućavaju da više funkcija manipuliše istim skupom Globalne promjenljive omogućavaju da više funkcija manipuliše istim skupom podataka, pa omogućavaju efikasnu razmjenu podataka između funkcija (jer sve podataka, pa omogućavaju efikasnu razmjenu podataka između funkcija (jer sve funkcije pristupaju istim memrijskim lokacijama).funkcije pristupaju istim memrijskim lokacijama).
Treba ih izbjegavati jer se gubi univerzalnost funkcije i fleksibilnost primjene na Treba ih izbjegavati jer se gubi univerzalnost funkcije i fleksibilnost primjene na različite setove podataka.različite setove podataka.
Ako se u nekoj funkciji definiše promjenljiva sa istim imenom kao i neka globalna, Ako se u nekoj funkciji definiše promjenljiva sa istim imenom kao i neka globalna, tada ta lokalna promjenljiva maskira globalnu i globalnoj ne može da se pristupi.tada ta lokalna promjenljiva maskira globalnu i globalnoj ne može da se pristupi.
Ako se u nekoj funkciji koristi neka globalna promjenljiva to može da se Ako se u nekoj funkciji koristi neka globalna promjenljiva to može da se eksplicitno naglasi deklaracijom korišćenjem ključne riječi extern, iako ne postoji eksplicitno naglasi deklaracijom korišćenjem ključne riječi extern, iako ne postoji obaveza da se globalne promjenljive deklarišu u funkcijiobaveza da se globalne promjenljive deklarišu u funkciji
extern tip promjenljiva;extern tip promjenljiva;
173
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Globalne promjenljive?Globalne promjenljive?
Primjer:Primjer: Maniulacija globalnom promjenljivom.Maniulacija globalnom promjenljivom.
#include <stdio.h>#include <stdio.h>
void f1 ()void f1 () {{ int i=1; int i=1; printf(printf(””f1: %df1: %d\n”\n”, i);, i); }}
int i;int i;
void f2 ()void f2 () {{ extern int i; extern int i; printf(printf(””f2: %df2: %d\n”\n”, i);, i); i=10;i=10; }}
main()main(){{ printf(printf(””main: %dmain: %d\n”\n”, i);, i); f1();f1(); printf(printf(””main: %dmain: %d\n”\n”, i);, i); i=5;i=5; f2();f2(); printf(printf(””main: %dmain: %d\n”\n”, i);, i);}}
main: 0 f1: 1main: 0 f2: 5main: 10
globalna promjenljiva
i=0
Globalna promjenljiva i nije vidljiva u funkciji f1() jer je
definisana nakon funkcije.U funkciji f1() raspoloživa je
lokalna promjenljiva i.
U funkciji f2() koristi se globalna promjenljiva i.
Deklaracija extern int i mogla je da se izostavi
174
1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase
Registarske Registarske promjenljive?promjenljive?
Registarske promjenljiveRegistarske promjenljiveRegistarske promjenljive su automatske promjenljive za koje je izražena želja da Registarske promjenljive su automatske promjenljive za koje je izražena želja da se drže u registrima procesora, a ne u memoriji, kako bi se dobilo na brzini.se drže u registrima procesora, a ne u memoriji, kako bi se dobilo na brzini.
Poželjno je korišćenje registarskih promjenljivih kod promjenljivih koje se često Poželjno je korišćenje registarskih promjenljivih kod promjenljivih koje se često koriste (npr. brojač)koriste (npr. brojač)
Ne garantuje se da će promjenljiva stvarno i biti registarska. To zavisi i od Ne garantuje se da će promjenljiva stvarno i biti registarska. To zavisi i od konkretnog prevodioca, procesora , ukupnog broja registarskih promjenljivih do konkretnog prevodioca, procesora , ukupnog broja registarskih promjenljivih do trenutka deklaracije date promjenljive...trenutka deklaracije date promjenljive...
Broj registarskih promjenljivih je ograničen i malen.Broj registarskih promjenljivih je ograničen i malen.
Registarske promjenljive definišu se uz pomoć ključne riječi Registarske promjenljive definišu se uz pomoć ključne riječi registerregisterregister tip ime=vrijednostregister tip ime=vrijednost
Primjer:Primjer:register int i=10;register int i=10;register j;register j;
175
1.6. 1.6. PokazivačiPokazivači
POINTERI?POINTERI?
Pokazivači (Pointeri)Pokazivači (Pointeri)Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)
Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objektaPokazivač je promjenljiva koja sadrži memorijsku adresu nekog objektaako je u pitanju polje – tada je to adresa početnog elementa poljaako je u pitanju polje – tada je to adresa početnog elementa poljaako je u pitanju funkcija – tada je to adresa početka funkcijeako je u pitanju funkcija – tada je to adresa početka funkcije
Ako promjenljiva p sadrži adresu objekta q, kažemo da p pokazuje na qAko promjenljiva p sadrži adresu objekta q, kažemo da p pokazuje na q
Primjer: Primjer:
MEMORIJA
adresaadresa
101101
100100
9999
qq 6565
Deklaracija pokazivača:Deklaracija pokazivača:
tip *ime;tip *ime;
Primjer:Primjer:
int *pi;int *pi;
char *pc, *tekst;char *pc, *tekst;
100100pp
176
1.6. 1.6. PokazivačiPokazivači
POINTERI?POINTERI?
Operatori za rad sa pokazivačimaOperatori za rad sa pokazivačimaAdresni operatorAdresni operator &&
daje adresu nekog objekta u daje adresu nekog objekta u memorijimemoriji
Ako je q neka promjenljiva tada Ako je q neka promjenljiva tada &q&q daje adresu te promjenljivedaje adresu te promjenljive
Ako želimo da pokazivač p pokazuje Ako želimo da pokazivač p pokazuje na promjenljivu q imamo na promjenljivu q imamo p=&qp=&q
MEMORIJA
adresaadresa
101101
100100
9999
qq 6565
Operator indirekcijeOperator indirekcije **
omogućava indirektan pristup promjenljivoj omogućava indirektan pristup promjenljivoj koristeći pokazivač na tu promjenljivukoristeći pokazivač na tu promjenljivu
Ako je s neka promjenljiva, a p pokazivač na Ako je s neka promjenljiva, a p pokazivač na isti tip, tada se može pisati isti tip, tada se može pisati s=*ps=*p . .To znači da će q dobiti vrijednost koja se To znači da će q dobiti vrijednost koja se nalazi na lokaciji koju pokazuje pnalazi na lokaciji koju pokazuje p
MEMORIJA
adresaadresa
101101
100100
9999
qq 6565
100100pp
p=&qp=&q 100100ppp=&qp=&q
6565ss
s=*ps=*p
177
1.6. 1.6. PokazivačiPokazivači
POINTERI?POINTERI?
Operatori za rad sa pokazivačimaOperatori za rad sa pokazivačimaAdresni operatorAdresni operator & & i i operator indirekcijeoperator indirekcije * * su INVERZNIsu INVERZNI OPERATORIOPERATORI
y = *& xy = *& x iliili y = x y = x
iliiliint x,y,*z;int x,y,*z;z = &x;z = &x;y = *z;y = *z;
y = *z = *&x = xy = *z = *&x = x
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ int x, prom=5, *pokaz;int x, prom=5, *pokaz; pokaz = &prom;pokaz = &prom; x = *pokaz;x = *pokaz; printf(”prom=%dprintf(”prom=%d\n\nx=%dx=%d\n”,\n”,prom,xprom,x););}}
prom=5x=5
178
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA STRUKTURU?STRUKTURU?
Pokazivači na strukturePokazivači na strukture
Neka imamo strukturuNeka imamo strukturu
struct datum struct datum { { int dan;int dan; int mjesec;int mjesec; int godina;int godina; }; };
Tada moTada možežemo da mo da definišemo:definišemo:
struct datum struct datum rodjen,rodjen, *pokaz *pokaz ;;
Pokazivač na strukturu datum(još uvijek ne pokazuje
nikakav konkretan podatak)
Ako želimo da Ako želimo da pokazpokaz pokazuje pokazuje rodjenrodjen: : *pokaz = &rodjen ;*pokaz = &rodjen ;
pokaz sada pokazuje na promjenljivu rodjen (sadrži adresu promjenljive rodjen)
179
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA STRUKTURU?STRUKTURU?
Pristup elementima strukturePristup elementima struktureNeka imamoNeka imamo
struct datum struct datum { { int dan;int dan; int mjesec;int mjesec; int godina;int godina;
}} rodjenrodjen, , *pokaz = &rodjen ;*pokaz = &rodjen ;
Pristup elementima strukture:Pristup elementima strukture:
rodjen.dan = 1;rodjen.dan = 1; rodjen.mjesec = 4;rodjen.mjesec = 4; rodjen.godina = 1985;rodjen.godina = 1985;
Pristup elementima strukture preko pokazivača:Pristup elementima strukture preko pokazivača:
(*pokaz).dan = 1;(*pokaz).dan = 1; (*pokaz).mjesec = 4;(*pokaz).mjesec = 4; (*pokaz).godina = 1985;(*pokaz).godina = 1985;
iliili pokaz->dan = 1;pokaz->dan = 1;pokaz->mjesec = 4;pokaz->mjesec = 4;pokaz->godina = 1985;pokaz->godina = 1985;
180
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA STRUKTURU?STRUKTURU?
Pristup elementima strukturePristup elementima strukturePrimjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ struct datum struct datum { int dan{ int dan, , mjesecmjesec, , godina;godina; }}; ; struct datum r, *p = &r;struct datum r, *p = &r; p->dan = 1;p->dan = 1; p->mjesec = 4;p->mjesec = 4; p->godina = 1985;p->godina = 1985; printf(”Datum: %02d.%02d.%d.printf(”Datum: %02d.%02d.%d.”,”, r.dan, r.mjesec, r.godina r.dan, r.mjesec, r.godina););}}
Datum: 01.04.1985.
181
1.6. 1.6. PokazivačiPokazivači
POINTER U POINTER U STRUKTURI?STRUKTURI?
Pokazivač u strukturiPokazivač u strukturi
x=2 y=5
Pokazivač može da bude element strukturePokazivač može da bude element strukture
struct primjer struct primjer { int { int *p1, *p2*p1, *p2;; }} clan; clan;
Pristup pokazivaču u strukturiPristup pokazivaču u strukturi
*clan.p1 *clan.p1 odnosnoodnosno *clan.p2 *clan.p2
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ int x,y;int x,y; struct primjer struct primjer { int { int *p1, *p2*p1, *p2;; }};; struct primjer proba, *pok = &proba;struct primjer proba, *pok = &proba; proba.p1 = &x; *proba.p1 = 2;proba.p1 = &x; *proba.p1 = 2; pok->p2 = &y; *pok->p2 = 5;pok->p2 = &y; *pok->p2 = 5; printf(”x=%d y=%dprintf(”x=%d y=%d”,”, x,y x,y););}}
182
1.6. 1.6. PokazivačiPokazivači
POVEZANE POVEZANE STRUKTURE?STRUKTURE?
Povezane strukturePovezane struktureKombinovanjem pokazivača na strukturu i strukture sa pokazivačem Kombinovanjem pokazivača na strukturu i strukture sa pokazivačem možemo da dobijemo možemo da dobijemo strukturu sa pokazivačem na istu strukturustrukturu sa pokazivačem na istu strukturu tj. tj. imamo imamo povezane strukturepovezane strukture
struct element struct element { { tiptip infoinfo;;
struct element *next;struct element *next;
}} prvi, drugi; prvi, drugi;
pokazivač na istu strukturu(omogućava povezivanje struktura i pravljenje liste – dinamičkog niza)
informaciono polje u strukturi
prviprvi
Aprvi.next = &drugiprvi.next = &drugi
prviprvi..infoinfo prviprvi..nextnext
drugidrugi
B
drugidrugi..infoinfo drugidrugi..nextnext
183
1.6. 1.6. PokazivačiPokazivači
POVEZANE POVEZANE STRUKTURE?STRUKTURE?
Linearna jednostruko povezana listaLinearna jednostruko povezana lista
00glavaglava
linklinkinfoinfo
struct element struct element { { tiptip infoinfo;; struct element *link;struct element *link; }} *glava; *glava;
Linearna dvostruko povezana listaLinearna dvostruko povezana lista
glavaglava
DDinfoinfoLL
reprep00 00
184
1.6. 1.6. PokazivačiPokazivači
POVEZANE POVEZANE STRUKTURE?STRUKTURE?
Binarno stabloBinarno stabločvor
korijenkorijen
LL DD
infoinfo
Lijevo podstablo
0 0Desno
podstablo
0
0 0 0 0
185
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA POLJEPOLJE??
Pokazivač na vektor (jednodimenzionalno polje)Pokazivač na vektor (jednodimenzionalno polje)Ime vektora (niza) predstavlja adresu početnog elementa vektora i već je Ime vektora (niza) predstavlja adresu početnog elementa vektora i već je samo po sebi pokazivač (statički pokazivač)samo po sebi pokazivač (statički pokazivač)
a[2]a[0] a[1]
00 0 0a[3]
0a[4]
int int aa[5][5]=={0};{0};
int *p, *q; int *p, *q;
p = a;p = a;iliili
p = &a[0];p = &a[0];
q = a+3;q = a+3;iliili
q = &a[3];q = &a[3];
Napomena:
a je statička promjenljivaNije dozvoljeno a=a+2; ili a++;
Napomena:
p je dinamička promjenljivaDozvoljeno je p=p+2; ili p++;
186
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA POLJEPOLJE??
Pokazivač na vektor (jednodimenzionalno polje)Pokazivač na vektor (jednodimenzionalno polje)
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>static int xstatic int x[5] = {1,2,3,4,5};[5] = {1,2,3,4,5};main()main(){{ int int *p*p;; p = x;p = x; printf(”%d %dprintf(”%d %d %d\n”, %d\n”, x[0], x[1], x[2]);x[0], x[1], x[2]); printf(”%d %dprintf(”%d %d %d\n”, %d\n”, *p, *(p+1), *(p+2) );*p, *(p+1), *(p+2) );}}
1 2 31 2 3
187
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA POLJEPOLJE??
Prenos vektora u funkciju pPrenos vektora u funkciju poomomoću pokazivačaću pokazivačaPretpostavimo da imamo funkcijuPretpostavimo da imamo funkciju
int funkcija (niz, n)int funkcija (niz, n) int nizint niz[], n;[], n; { ... }{ ... }
pristup elementima u nizu
niz[indeks]
int funkcija (int funkcija (pp, n), n) int int *p, n;*p, n; { ... }{ ... }
pristup pomoću pointera
*(p+indeks)
iliili
Primjer:Primjer:
int suma (int suma (int int nizniz[][], , int int n)n) {{ int int s=0, is=0, i;; for (i=0; i<n; i++)for (i=0; i<n; i++) s += niz[i];s += niz[i]; return (s);return (s); }}
Primjer:Primjer:
int suma (int suma (int *pint *p, , int int n)n) {{ int int s=0, is=0, i;; for (i=0; i<n; i++)for (i=0; i<n; i++) s += *(p+i);s += *(p+i); return (s);return (s); }}
188
1.6. 1.6. PokazivačiPokazivači
POINTER NA POINTER NA POLJEPOLJE??
Pokazivač na Pokazivač na matricumatricu ( (dvdvodimenzionalno polje)odimenzionalno polje)...0 1 j ... m-1
0
1
i
n-1
mat[i][j]
mat[0][0]
int *p; int *p;
p = mat;p = mat;iliili
p = &mat[0][0];p = &mat[0][0];
*( mat + m*i + j )*( mat + m*i + j )iliili
*( &mat[0][0] + m*i + j )*( &mat[0][0] + m*i + j )
189
1.6. 1.6. PokazivačiPokazivači
ADRESNA ADRESNA ARITMETIKAARITMETIKA??
Adresna aritmetikaAdresna aritmetikaNeka je:Neka je: a a – vektor sa elementima tipa T– vektor sa elementima tipa T v v – izraz tipa T– izraz tipa T n n – cjelobrojni izraz– cjelobrojni izraz p, p, qq – pokaziva – pokazivači na tip T (pokazuju na elemente niza a)či na tip T (pokazuju na elemente niza a)
Tada važe sljedeća pravila:Tada važe sljedeća pravila: a a – – pokazivač na početak nizapokazivač na početak niza &a&a[0] [0] – poka– pokazzivaivačč na na početak nizapočetak niza *p *p – element niza a na koji pokazuje p– element niza a na koji pokazuje p *p=v *p=v – elementu na koji pokazuje p dodjeljuje vrijednost v– elementu na koji pokazuje p dodjeljuje vrijednost v ++p ++p – pokazuje na sljedeći element niza– pokazuje na sljedeći element niza --p --p – pokazuje na prethodni element niza– pokazuje na prethodni element niza *++p *++p – inkrementira p, pa pristupa tom (sljedećem) elementu– inkrementira p, pa pristupa tom (sljedećem) elementu *p++ *p++ - pristupa elementu na koji pokazuje p, a zatim pokazuje- pristupa elementu na koji pokazuje p, a zatim pokazuje na sljedeći elementna sljedeći element p+n p+n - pokazuje na n-ti naredni element niza- pokazuje na n-ti naredni element niza *(p+n)=v *(p+n)=v – dodjeljuje vrijednost v n-tom narednom elementu u nizu u– dodjeljuje vrijednost v n-tom narednom elementu u nizu u odnosu na element na koji pokazuje podnosu na element na koji pokazuje p q-p q-p - određuje broj elemenata niza smještenih između adresa na- određuje broj elemenata niza smještenih između adresa na koje pokazuju q i pkoje pokazuju q i p
190
1.6. 1.6. PokazivačiPokazivači
ADRESNA ADRESNA ARITMETIKAARITMETIKA??
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ static char cstatic char c[] = {’a’,’b’,’c’,’d’};[] = {’a’,’b’,’c’,’d’}; static static intint i[] = { 1, 2, 3, 4};i[] = { 1, 2, 3, 4}; charchar *pc1=&c[0], *pc2=&c[3]*pc1=&c[0], *pc2=&c[3];; int *pi1=&i[0], *pi2=&i[3];int *pi1=&i[0], *pi2=&i[3]; printf(”printf(”*c=*c=%%cc *i= *i=%d%d\n”,\n”, *c, *i);*c, *i); printf(”printf(”*pc1=*pc1=%%cc *pi1= *pi1=%d%d\n”,\n”, *pc1, *pi1);*pc1, *pi1); printf(”printf(”*(pc1+1)=*(pc1+1)=%%cc *(pi1+2)= *(pi1+2)=%d%d\n”,\n”, *(pc1+1), *(pi1+2));*(pc1+1), *(pi1+2)); printf(”printf(”*++pc1=*++pc1=%%cc *++pi1= *++pi1=%d%d\n”,\n”, *++pc1, *++pi1);*++pc1, *++pi1); printf(”printf(”*pc1++=*pc1++=%%cc *pi1++= *pi1++=%d%d\n”,\n”, *pc1++, *pi1++);*pc1++, *pi1++); printf(”printf(”*pc1=*pc1=%%cc *pi1= *pi1=%d%d\n”,\n”, *pc1, *pi1);*pc1, *pi1); pc1-=2; pi1-=2;pc1-=2; pi1-=2; printf(”printf(”*pc1=*pc1=%%cc *pi1= *pi1=%d%d\n”,\n”, *pc1, *pi1);*pc1, *pi1); printf(”printf(”pc2-pc1=%dpc2-pc1=%d pi2-pi1= pi2-pi1=%d%d\n”,\n”, pc2-pc1, pi2-pi1);pc2-pc1, pi2-pi1);}}
*c=a *i=1*pc1=a *pi1=1*(pc1+1)=b *(pi1+2)=3*++pc1=b *++pi1=2*pc1++=b *pi1++=2*pc1=c *pi1=3*pc1=a *pi1=1pc2-pc1=3 pi2-pi1=3
191
1.6. 1.6. PokazivačiPokazivači
REFERISANJEREFERISANJE??
Prenos argumenata u funkciju referisanjemPrenos argumenata u funkciju referisanjem
Argumenti se u funkciju standardno prenose putem vrijednostiArgumenti se u funkciju standardno prenose putem vrijednosti
Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta!!!Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta!!!
Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta:Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta:
1. Prilikom poziva funkcije treba slati adresu!1. Prilikom poziva funkcije treba slati adresu!
2. Formalni argument treba definisati kao pokazivač na tip!2. Formalni argument treba definisati kao pokazivač na tip!
3. U tijelu funkcije treba koristiti operator indirekcije!3. U tijelu funkcije treba koristiti operator indirekcije!
REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumentaREFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta
Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta!Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta!
192
1.6. 1.6. PokazivačiPokazivači
REFERISANJE?REFERISANJE?
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>
void suma ( niz, n, s )void suma ( niz, n, s ) int *niz, n, *s;int *niz, n, *s; {{ int i;int i; *s = 0; *s = 0; for (i=0; i<n; i++) for (i=0; i<n; i++) *s += *niz++ ;*s += *niz++ ; }}
main()main(){{ static static intint i[]={1,2,3,4};i[]={1,2,3,4};
int x;int x;
suma (i, 4, &x);suma (i, 4, &x);
printf(”Suma: %dprintf(”Suma: %d”,”, x x););}}
Suma: 10šalje se adresa
Formalni argument je pokazivač
Korišćenje operatora
indirekcije
193
1.7. 1.7. Upućivači Upućivači
UPUĆIVAČ ?UPUĆIVAČ ?
Upućivači (reference)Upućivači (reference)Upućivač je alternativno ime za neki podatak (upućuje na podatak kojem je pridružen)Upućivač je alternativno ime za neki podatak (upućuje na podatak kojem je pridružen)
Ne zauzima prostor u memoriji i ne može da se dobije njegova adresaNe zauzima prostor u memoriji i ne može da se dobije njegova adresa
Mora da se inicijalizuje prilikom definisanja (mora da upućuje na neki stvarni objekat)Mora da se inicijalizuje prilikom definisanja (mora da upućuje na neki stvarni objekat)
Sve operacije djeluju na stvarne podatke, a ne na upućivačeSve operacije djeluju na stvarne podatke, a ne na upućivače
Veoma su slični pokazivačima, ali pokazivači fizički postoje a upućivači neVeoma su slični pokazivačima, ali pokazivači fizički postoje a upućivači ne
Glavna primjena upućivača: prenos argumenata u funkcijuGlavna primjena upućivača: prenos argumenata u funkciju
Primjer:Primjer:
int k=1; int k=1; // definisana promjenljiva k// definisana promjenljiva k
int &u=k; int &u=k; // definisan upućivač u na promjenljivu k// definisan upućivač u na promjenljivu k // i u i k predstavljaju isti podatak// i u i k predstavljaju isti podatak
int x=u; int x=u; // definisana promjenljiva x (x=u=k=1)// definisana promjenljiva x (x=u=k=1)
u=2; u=2; // k=2// k=2
u++; u++; // k++ -> k=3// k++ -> k=3
194
1.7. 1.7. Upućivači Upućivači
UPUĆIVAČ ?UPUĆIVAČ ?
Upućivači (reference)Upućivači (reference)Glavna primjena upućivača: prenos argumenata u funkcijuGlavna primjena upućivača: prenos argumenata u funkciju
Primjer: Primjer:
(prenos pomo(prenos pomoću pokazivača)ću pokazivača)
#include <iostream.h>#include <iostream.h>
void invoid inkrementkrement ( (int int *a)*a) {{ *a += 1; *a += 1; }}
main()main() {{ int x=10;int x=10; inkrementinkrement (&x)(&x);; cout << x << endl;cout << x << endl;}}
Primjer: Primjer:
(prenos pomo(prenos pomoću upućivača)ću upućivača)
#include <iostream.h>#include <iostream.h>
void invoid inkrementkrement ( (int int &a)&a) {{ a += 1; a += 1; }}
main()main() {{ int x=10;int x=10; inkrementinkrement (x)(x);; cout << x << endl;cout << x << endl;}}
11 Korišćenje upućivača Korišćenje upućivača je “elegantnije”je “elegantnije”
195
1.8. 1.8. StringoviStringovi
STRING?STRING?
Stringovi Stringovi String je jednodimenzionalni znakovni niz String je jednodimenzionalni znakovni niz
To je niz znakova koji završava nul-znakom (znak čiji je kod 0)To je niz znakova koji završava nul-znakom (znak čiji je kod 0) ’\0’’\0’
Deklaracija stringa:Deklaracija stringa:
char ime[duzina] = ”string” ;char ime[duzina] = ”string” ; iliili
char ime[duzina] = { znak, znak, … , znak } ;char ime[duzina] = { znak, znak, … , znak } ;
Primjer:Primjer:char grad1[] = ”char grad1[] = ”BANJA LUKABANJA LUKA” ;” ;
char grad2[] = { ’D’,’O’,’B’,’O’,’J’,’\0’ };char grad2[] = { ’D’,’O’,’B’,’O’,’J’,’\0’ };
OOznačavanje znakovnih i string konstanti:značavanje znakovnih i string konstanti:
’’D’D’ – ovo je znak – ovo je znak DD
””DD” ” – ovo je string – ovo je string ’D’’D’,,’\0’’\0’
196
1.8. 1.8. StringoviStringovi
STRING?STRING?
Manipulacija stringomManipulacija stringomIspisivanje stringaIspisivanje stringa
ispisivanje pomoću funkcije ispisivanje pomoću funkcije
printf(printf(”%s”, string); ”%s”, string);
ispisivanje pomoću funkcije ispisivanje pomoću funkcije
putsputs((string); string);
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ charchar grad[]= ”grad[]= ”BANJA LUKABANJA LUKA”;”; printf(”%s\n”, grad);printf(”%s\n”, grad);}}
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ charchar grad[]= ”grad[]= ”BANJA LUKABANJA LUKA”;”; puts(grad);puts(grad);}}
BANJA LUKA BANJA LUKA
197
1.8. 1.8. StringoviStringovi
STRING?STRING?
Manipulacija stringomManipulacija stringomUUččitavanjeitavanje stringa stringa
učitavanje pomoću funkcije učitavanje pomoću funkcije
scanf(scanf(”%s”, string); ”%s”, string);
učitavanje pomoću funkcije učitavanje pomoću funkcije
getgetss((string); string);
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ charchar tekst tekst[[5050];]; printf(”printf(”Unesi recenicu:Unesi recenicu:\n”);\n”); scanfscanf(”(”%s%s””,, teksttekst);); printf(printf(”%s”, tekst);”%s”, tekst);}}
Primjer:Primjer:
#include <stdio.h>#include <stdio.h>main()main(){{ charchar tekst tekst[[5050];]; printf(”printf(”Unesi recenicu:Unesi recenicu:\n”);\n”); getgetss((teksttekst);); printf(printf(”%s”, tekst);”%s”, tekst);}}
Unesi recenicu:MOSTAR
Unesi recenicu:MOSTARMOSTAR
198
1.8. 1.8. StringoviStringovi
STRING?STRING?
Primjer:Primjer: Program koji uProgram koji učitava string, a zatim ispisuje njegovu dužinu.čitava string, a zatim ispisuje njegovu dužinu.
#include <stdio.h>#include <stdio.h>
int strlen ( char *s )int strlen ( char *s ) {{ int i;int i; for (i=0; *s!=for (i=0; *s!=’\0’’\0’;; i++)i++);; return(i)return(i);; }}
main()main(){{ char grad[]=”char grad[]=”BANJA LUKABANJA LUKA”;”; pprintf(”rintf(”Broj slovaBroj slova: %d: %d”,”, strlen(grad) strlen(grad) ););}}
Broj slova: 10
199
1.8. 1.8. StringoviStringovi
STRING?STRING?
Primjer:Primjer: Program koji uProgram koji učitava stringčitava string i pravi kopiju tog stringa i pravi kopiju tog stringa..
#include <stdio.h>#include <stdio.h>
voidvoid str strcopycopy ( char *s ( char *s1, char *s21, char *s2 ) ) {{ while ( *s2++ = *s1++ );while ( *s2++ = *s1++ ); }}
main()main(){{ char original[100]=”char original[100]=”BANJA LUKABANJA LUKA”;”; char kopija[100];char kopija[100]; strcopy(original, kopija);strcopy(original, kopija); printf(”%s\n”, original);printf(”%s\n”, original); printf(”%s\n”, kopija);printf(”%s\n”, kopija);}}
MOSTAR / ŽEPČE