14-funkcije polja pokazivaci primjeri

51
PROGRAMIRANJE I Funkcije, polja, pokazivači Primjeri

Upload: lazniprofil

Post on 26-Dec-2015

38 views

Category:

Documents


3 download

DESCRIPTION

programiranje

TRANSCRIPT

Page 1: 14-Funkcije Polja Pokazivaci Primjeri

PROGRAMIRANJE I

Funkcije, polja, pokazivači

Primjeri

Page 2: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 2

Primjer za dvodimenzionalno polje kao argumentfunkcije: formiranje jedinične matrice

Napisati funkciju za formiranje jedinične matrice ranga N, gdje je N proizvoljan prirodan broj. U glavnom programu unijeti rang matrice <= 100, pozvati funkciju i provjeriti ispravnost generirane matricetako da se ispisuju indeksi i vrijednosti svih onih članova koji su različitiod 0 u obliku M(i, j) = x.

Page 3: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 3

Prijenos matrice u funkciju

U funkciji matrica se standardno tretira kao jednodimenzionalno polje. Moguće je matricu, koja je argument funkcije obrađivati i kao dvodimenzionalni objekt.

Primjer:Treba izračunati Frobeniusovu normu matrice. Ako je A = (ai,j)n

i,j=1

matrica reda n, onda je njena Frobeniusova norma:

n

jijiaA

1,

2,

Page 4: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 4

Prijenos matrice u funkciju

Page 5: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 5

Nizovi pokazivača

Elementi niza (polja) ne moraju biti pojedinačni znakovi ili brojevi, već i oni mogu biti pokazivači.

Primjer:char *imeDana[] = {"Nedjelja", "Ponedjeljak",

"Utorak", "Srijeda", "Četvrtak","Petak", "Subota"};

N e d j e l j a \0

P o n e d j e l j a k \0

U t o r a k \0

S r i j e d a \0

Č e t v r t a k \0

P e t a k \0

S u b o t a \0

8000

8009

8021

8028

8036

8045

8051

Page 6: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 6

Nizovi pokazivača

Page 7: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 7

Nizovi pokazivača

Page 8: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 8

Ugrađene posebne funkcije – rand – stdlib.h

Funkcija rand( ) slučajni cijeli broj u intervalu [0, RAND_MAX], gdje je RAND_MAX = 32767.

Opći oblik funkcije je

int rand ( void );

Nužno je prije pozivanja funkcije rand postaviti početnu vrijednost za generator slučajnih brojeva funkcijom:

void srand (unsigned int seed );

seed je argument funkcije srand koji omogućuje generiranje svaki put drugog slučajnog broja, pa on ne smije biti konstanta.

Page 9: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 9

Ugrađene posebne funkcije - rand

Općenito za generiranje slučajnog broja iz intervala [n1, n2]:

srand((unsigned) time(NULL));(int) ((float)rand()/(RAND_MAX+1)*(n2-n1+1)+n1);

ili n1 + rand() % (n2-n1+1);

srand(33); bi generirao uvijek iste slučajne brojeve.

Fukcija time(NULL)vraća broj sekundi proteklih od 1. siječnja 1970. Definirana u zaglavnoj datoteci time.h.

Page 10: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 10

Ugrađene posebne funkcije - rand

Primjer:

Napisati funkciju koja simulira bacanje igrače kocke. Simulira se bacanje kocke zadani broj puta. Ispisati frekvenciju ponavljanja svih brojeva.

Page 11: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 11

Korisnička deklaracija typedef

typedef stari_tip novi_tip;

Napr.

typedef int redni_broj;typedef unsigned short USHORT;typedef unsigned int size_t;

redni_broj i, j;USHORT velicina;size_t duljina;

Page 12: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 12

Opći oblik naredbe za definicije/deklaracije

Opći oblik naredbe za definicije (deklaracije) varijabli i polja uključuje tzv. smještajne razrede (storage classes).

smještajni_razred tip_podatka naziv_varijable; smještajni_razred tip_podatka naz_polja[izraz1][izraz2];

Smještajni razred je mjesto definicije/deklaracije, koja utvrđuje postojanost (trajnost) i područje važenja varijable ili polja u memoriji.

Page 13: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 13

Opći oblik naredbe za definicije/deklaracije

Smještajni razredi

auto - automatski smještajni razred. Ovaj razred se podrazumijeva, pa se ključna riječ auto obično ne navodi. Doseg varijable ili polja je unutar funkcije u kojoj je definirana. Izvođenjem funkcije se smještaju na stog, pozivom sljedeće (druge) funkcije bivaju prebrisane.

extern - smještajni razred izvan programa, varijable i polja zajednički (globalni) za sve funkcije programa.

Varijabla je definirana u vanjskom modulu izvan tijela funkcije (bez ključne riječi extern)

Page 14: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 14

Opći oblik naredbe za definicije/deklaracije

static - a) definicija unutar funkcije: kada vrijednost varijable treba zadržati poslije izlaska i ponovnog povratka u neku funkciju. b) definicija izvan funkcije: varijable su zajedničke

(globalne) svim funkcijama unutar jednog programskog modula, ali nisu dostupne drugim modulima.

register - registarski razred, kojim se procesoru preporuča da za smještaj varijabli koristi registre procesora, jer će

se varijable intenzivno koristiti.

Page 15: 14-Funkcije Polja Pokazivaci Primjeri

04/19/23 Dr.sc. I. Vilović: Programiranje I 15

Opći oblik naredbe za definicije/deklaracije

#include<stdio.h>extern int x;static int y;int funkcija1 (long a long b) {

............}double funkcija2(int c) {

static double y;.............

}int funkcija3 ( ..) {

........}

#include<stdio.h>int x;void funkcija4 ( ... ) { ..... }void main() { double y; ....}

funkcije.c Područje važenja varijabli

glavni.c

y'y

y''

x

Page 16: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 16

Funkcije - primjeri

Napisati funkciju Sume koja za zadani četveroznamenkasti broj vraća u pozivajući program dva cijela broja: sumu prve dvije znamenke i broj koji predstavlja sumu zadnje dvije znamenke zadanog broja. Napr. ako je zadan broj 3786 funkcija vraća brojeve 10 14.

Page 17: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 17

Funkcije s nizovima znakova <string.h>

Napisati funkciju koja će transformirati niz znakova tako da se zadani podniz u nizu zamjenjuje (jednim) uskličnikom (!). Prototip funkcije je zadan:

int trans(char *niz, const char *podniz);

Funkcija vraća broj obavljenih zamjena.

Page 18: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 18

Funkcije s nizovima znakova <string.h>

Page 19: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 19

Funkcije s nizovima znakova <string.h>

Ulazni niz: Pasko patak dobio zadatak.

1. Funkcija strstr vraća pokazivač niz na prvi podniz tak, odnosno na slovo t.

2. Naredba *niz++ = '!'; postavlja uskličnik umjesto slova t, pa niz sada izleda: Pasko pa!ak dobio zadatak. Adresa niza se uvećava za jedan, pa pokazuje na slovo 'a'..

3. Funkcija strcpy(niz, niz+duz-1); kopira od prve sljedeće praznine do kraja niza u isti niz, pa on tada izgleda: Pasko pa! dobio zadatak. Ostatak podniza ak jednostavno "nestane".

Page 20: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 20

Funkcije s nizovima znakova <string.h>

Napisati funkciju koja će transformirati niz znakova tako da se zadani podniz u nizu zamjenjuje drugim nizom. Funkcija ima prototip:

int zamijeni(char *niz, const char *podniz, const char *noviniz);

Funkcija vraća broj obavljenih zamjena.

Page 21: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 21

Funkcije s nizovima znakova <string.h>

Page 22: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 22

Funkcije s nizovima znakova <string.h>

Pitanje:Zašto je korišteno pomoćno

polje?

Kada se pomoćno polje ne bi koristilo, nego bi se primijenio algoritam sličan onom izpredhodnog primjera, program ne bi dobroradio kada bi novi niz bio dulji od podniza(inače bi dobro radio).

Page 23: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 23

Napisati funkciju čiji je prototip:

char *spoji(char *ime, char *prezime);

koja spaja nizove ime i prezime u jedan niz tako da ime i prezime budu odvojeni zarezom i prazninom. Napr. za ime = "Ivo" i prezime = "Ivić", rezultat treba biti "Ivić, Ivo". Funkcija vraća pokazivač na rezultantni niz. Nizovi za ime i prezime ostaju nepromijenjeni, a pretpostavlja se da imaju pratećih praznina. Rezultat ne smije imati pratećih praznina.

Funkcije s nizovima znakova <string.h>

Page 24: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 24

1. rješenje

Page 25: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 25

2. rješenje

Page 26: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 26

2. rješenje

p1

p2

4000

4004

8000 sMatić, Ana Marija8000 Brlić Mažuranić, Ivana

8000

main stog

Polje u funkciji s treba biti razreda static, kako bi se vrijednost polja sačuvala i poslije izlaska iz funkcije.

Page 27: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 27

Funkcije s nizovima znakova <string.h>

Napisati funkciju koja generira i vraća zaporku (lozinku) kao niz slučajno odabranih brojeva duljine 6 znamenaka. Glavni program treba ispisati 10 novo generiranih zaporki.

Generiranje cijelog slučajnog broja iz intervala [n1, n2]:

srand ((unsigned) time(NULL)); Funkcija time(NULL) vraća broj sekundi od 1. siječnja 1970. što omogućuje generiranje različitih slučajnih brojeva svakim izvođenjem programa, jer bi napr. rand(25) generirao uvijek isti niz slučajnih brojeva.

(int) ((float) rand()/RAND_MAX+1)*(n2-n1+1) + n1);

RAND_MAX = 32767 najveći mogući slučajni broj (za 32-bitno adresiranje).

Page 28: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 28

Funkcije s nizovima znakova

Page 29: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 29

Funkcije za generiranje slučajnih brojeva

Funkcijom se generira skup slučajnih brojeva i ispisuje u obliku tablice prema zadanim parametrima.

void ispis(int br_redova, int br_stupaca, int n);

Funkcija generira n slučajnih brojeva iz intervala [1, br_redova*br_stupaca]. Ispis mora biti u obliku tablice brojeva redom od 1 do br_redova*br_stupaca, a generirani brojevi trebaju biti označeni znakom x.

Page 30: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 30

Funkcije za generiranje slučajnih brojeva

Napr. za tablicu dimenzija 13x3 i 7 generiranih brojeva poziv funkcije izgleda kao

ispis(13, 3, 7);

te ukoliko su generirani brojevi: 5, 14, 3, 31, 19, 30 i 39 ispis treba izgledati ovako

1 2 x

4 x 6

7 8 9

10 11 12

13 x 15

16 17 18

x 20 21

22 23 24

25 26 27

28 29 x

x 32 33

34 35 36

37 38 x

Page 31: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 31

Funkcije za generiranje slučajnih brojeva

Page 32: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 32

Primjeri ispitnih zadataka

1. a) Kolika je vrijednost realne varijable, ako je njen heksadekadski prikaz: C1520000? b) Binarno i oktalno prikazati broj -7710 u registru od 8 bita, u kojem se pohranjuju brojevi s predznakom. c) Koliki je potreban minimalni registar za pohranu broja 547?

a) C 1 5 2 0 0 0 0

1100 0001 0101 0010 0000 0000 0000 0000

predznak karakteristika normalizirana mantisa

P = negativanK = 100000102 = 13010 → BE = 130 - 127 = 3NM = 101001000000000000000002 M = 1.10100100...23 = 1101.0012

pa je tražena vrijednost = -13.12510

Page 33: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 33

Primjeri ispitnih zadataka 1. zadatak

b) -7710 = 101100112 (8 bitni registar)

101100112 = 2638

c) 547 (pozitivni broj) 2n-1 ==> 210 - 1 = 1023 ==> 10 bitni reg.

Page 34: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 34

Primjeri ispitnih zadataka

2. Napisati program kojim se unosi cijeli broj n > 0 i računa, te ispisuje suma krajnjih znamenki unesenog broja. Napr. ako je uneseni broj 74536, onda je tražena suma 7 + 6 = 13.

Page 35: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 35

Primjeri ispitnih zadataka

3. Napisati program kojim se unosi cijeli broj n iz intervala [30, 150], te nedopustiti drugačiji unos. Zatim unositi n znakova i pobrojiti koliko je uneseno malih, koliko velikih slova engleske abecede, koliko znamenki, a koliko svih ostalih znakova. Nađene rezultate ispisati na zaslon.

Page 36: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 36

Primjeri ispitnih zadataka

4. Napisati funkciju koja iz jednodimenzionalnog polja cijelih brojeva izbacuje neparne brojeve. Na izbačeno mjesto (indeks) dolazi prvi slijedeći član polja, a svi ostali se pomiču za jedan indeks niže. U glavnom programu unijeti cijeli broj n za broj članova polja iz intervala [10, 100], te ako je ovaj broj pogrešno unesen prekinuti program. Potom unijeti vrijednosti za članove polja, pozvati funkciju i na kraju ispisati skraćeno polje.

Page 37: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 37

Primjeri ispitnih zadataka

5. Napisati funkciju kojom se izračunava aritmetička sredina članova kvadratne matrice, koji se nalaze iznad glavne dijagonale. U glavnom programu unijeti cijeli broj n za dimenzije matrice, koji mora biti iz intervala [3, 10]. Potom unijeti vrijednosti članova matrice, koji su realnog tipa, pozvati funkciju i ispisati rezultat.

Page 38: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 38

Primjeri ispitnih zadataka

Napisati program u kojem treba pročitati tri znakovne varijable koje predstavljaju znamenke nekog broja. Za svaku od učitanih vrijednosti treba provjeriti je li uistinu znamenka i ako sve zadovoljavaju dani uvjet treba iz njih izračunati i ispisati vrijednost troznamenkastog broja kojeg reprezentiraju, pri čemu znamenka koja je prva učitana ima najveću težinu.

Page 39: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 39

Primjeri ispitnih zadataka

Page 40: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 40

Primjeri ispitnih zadataka

Page 41: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 41

Napisati program koji učitava dimenzije matrice (maksimalno 15x15), a zatim i elemente matrice. Elementi matrice su cijeli brojevi. Ako se unesu pogrešne dimenzije matrice, treba završiti izvođenje programa. Pronaći i ispisati indeks stupca u kojem se broj nula pojavljuje najviše puta. Ispisati i koliko se puta nula pojavljuje u tom stupcu. Ako dva stupca imaju jednaki broj nula, ispisati indeks bilo kojeg od njih.

Primjeri ispitnih zadataka

Page 42: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 42

Primjeri ispitnih zadataka

Page 43: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 43

Primjeri

Napisati funkciju strncpy bez korištenja funkcije iz zaglavne datoteke string.h.

char *strncpy(char *niz1, const char *niz2, int n) {for(; n>0 && *niz2; --n) {

*niz1 = *niz2;++niz1;++niz2;

}*niz1 = '\0'; // ili *niz1 = 0;return niz1;

}

Page 44: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 44

Primjeri

Napisati funkciju koja će u nekom znakovnom nizu sva mala slova engleske abecede pretvoriti u velika, a velika u mala. Ako znak nije slovo, treba ga zamijeniti s prazninom.

#include<ctype.h>

void mijenjanje(char *niz) {for(; *niz; niz++) {

if(!isalpha(*niz))*niz = ' ';

else if(islower(*niz))

*niz = toupper(*niz); else

*niz = tolower(*niz);}

}

Page 45: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 45

Primjeri

Napisati funkciju koja cijeli broj pretvara u znakovni niz, kojise sastoji od njegovih znamenki

Page 46: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 46

Primjeri

7. Napisati funkcije:mojmod - ostatak od dijeljenjamojfloor - zaokruživanje na nižemojceil - zaokruživanje na više

Primjer C-ovih istovrsnih funkcija

x floor(x) ceil(x)

5.7 5 6

-5.7 -6 -5

5 5 5

-5 -5 -5

Page 47: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 47

Primjeri

mojmod

int mojmod(int x, int y) {return x - (int)(x/y)*y;

}

mojfloordouble mojfloor(double x) {

double zaok;

if((int)x == x)zaok = x; // x je cijeli broj

else if(x > 0)zaok = (double)((int)x);

elsezaok = (double)((int)x - 1);

return zaok;}

Page 48: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 48

Primjeri

mojceildouble mojceil(double x) {

double zaok;

if((int)x == x)zaok = x; //cijeli broj

else if(x > 0)zaok = (double)((int)x +1);

elsezaok = (double)((int)x);

return zaok;}

Page 49: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 49

Primjeri

Napisati funkciju koja će iz zadanog niza izbaciti sve razmake.

char *izbaci_razmake(char *niz){int idx_novi, idx_stari;idx_novi=idx_stari=0;while(niz[idx_stari] != '\0'){

if (niz[idx_stari]==' '){idx_stari++;

}else{niz[idx_novi]=niz[idx_stari];idx_stari++;idx_novi++;

}}niz[idx_novi]='\0'; // ili niz[idx_stari]return niz;

}

Page 50: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 50

Primjeri

Napisati funkciju koja zamjenjuje sadržaj dvaju slučajno odabranih redaka u zadanoj matrici proizvoljnih dimenzija.

void zamRedak(int *m, int brRed, int brStup, int maxStu){

// treba generirati slučajan broj u intervalu [0, brRed-1] // pretpostavlja se da matrica ima više od jednog retka ili // se može dodati: if (brRed > 1){

int r1, r2, j, pom; r1 = (int)((float)rand()/(RAND_MAX+1)*(brRed-1-0+1)+0); do{ r2 = rand()%(brRed-1-0+1)+0; }while(r1 == r2); for(j = 0; j < brStup; j++){ pom = m[ r1*maxStu + j]; m[ r1*maxStu + j] = m[ r2*maxStu + j]; m[ r2*maxStu + j] = pom; } }

Page 51: 14-Funkcije Polja Pokazivaci Primjeri

19.04.23 Dr.sc.Ivan Vilović: Programiranje I 51

PROGRAMIRANJE I

Puno uspjeha na provjerama

znanja !!

Pitanja?