14-funkcije polja pokazivaci primjeri
DESCRIPTION
programiranjeTRANSCRIPT
PROGRAMIRANJE I
Funkcije, polja, pokazivači
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.
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,
04/19/23 Dr.sc. I. Vilović: Programiranje I 4
Prijenos matrice u funkciju
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
04/19/23 Dr.sc. I. Vilović: Programiranje I 6
Nizovi pokazivača
04/19/23 Dr.sc. I. Vilović: Programiranje I 7
Nizovi pokazivača
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.
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.
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.
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;
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.
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)
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.
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
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.
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.
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 18
Funkcije s nizovima znakova <string.h>
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".
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.
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 21
Funkcije s nizovima znakova <string.h>
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).
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>
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 24
1. rješenje
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 25
2. rješenje
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.
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).
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 28
Funkcije s nizovima znakova
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.
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
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 31
Funkcije za generiranje slučajnih brojeva
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
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.
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.
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.
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.
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.
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.
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 39
Primjeri ispitnih zadataka
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 40
Primjeri ispitnih zadataka
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
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 42
Primjeri ispitnih zadataka
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;
}
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);}
}
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
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
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;}
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;}
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;
}
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; } }
19.04.23 Dr.sc.Ivan Vilović: Programiranje I 51
PROGRAMIRANJE I
Puno uspjeha na provjerama
znanja !!
Pitanja?