Download pdf - rokovi_20082009

Transcript
Page 1: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 1/12

 

(x1, y1)

(x2, y2)

Programiranje i programsko inženjerstvo1. međuispit

17.10.2008

1. (4 boda) Napisati program kojim se učitavaju cjelobrojne koordinate donjeg lijevog i gornjeg desnog vrhapravokutnika te cjelobrojne koordinate točke T. Pretpostaviti da je korisnik ispravno unio koordinate vrhova

pravokutnika. Odrediti položaj točke T  u odnosu na pravokutnik zadan učitanim vrhovima te ispisati samo jednu  od sljedećih poruka: 

Točka se nalazi na stranici pravokutnika.

Točka se nalazi unutar pravokutnika

Točka se nalazi izvan pravokutnika 

2. (4 boda)  U cjelobrojnu varijablu bez predznaka učitati pozitivan broj. Ispisati je li broj djeljiv sa svojomnajvećom znamenkom. Pretpostaviti da je korisnik ispravno unio cijeli broj. Primjer.za učitani broj 123 potrebno je ispisati:Broj 123 je djeljiv sa svojom najvecom znamenkom 3

za učitani broj 21 potrebno je ispisati:Broj 21 nije djeljiv sa svojom najvecom znamenkom 2

3. (4 boda) Napisati program koji učitava cijele brojeve koji predstavljaju kalendarske godine. Za svaki učitanibroj provjeriti je li iz intervala <10,3000]. Ako je učitani broj iz zadanog intervala provjeriti je li godina

prijestupna ili nije te ispisati odgovarajuću poruku. U

čitavanje brojeva završiti kad se u

čita negativan broj. Prijestupne godine su godine koje su djeljive s 4 i nisu djeljive sa 100. Kao iznimka opisanom pravilu u

prijestupne godine ubrajaju se one koje su djeljive s 400.

Primjer:za učitani broj 1800 potrebno je ispisati:Godina nije prijestupna. 

za učitani broj 1600 potrebno je ispisati:Godina je prijestupna. 

za učitane brojeve veće od 3000 ili manje od 11 program ne treba ništa ispisati.

4. (3 boda ) Napisati program kojim se u varijablu tipa int uč itava cijeli broj iz intervala [0-127] (kôd nekogznaka iz ASCII tablice). Ispitati uč itanu vrijednost i ispisati na zaslonu odgovarajuć u poruku: Znak izvan

zadanog intervala, Znamenka:, Malo slovo:, Veliko slovo: , Kontrolni znak. Ako je

uč itan kôd za veliko slovo, iza navedene poruke ispisati isto to slovo ali malo, a ako je uč itan kôd za maloslovo, iza navedene poruke ispisati isto to slovo ali veliko. Ako je uč itan kôd za znamenku iza navedene poruke ispisati znamenku. Ako je uč itan kôd za kontrolni znak ispisati samo navedenu poruku.

Za sve preostale znakove (kao što su na primjer # + , & / i drugi) treba samo ispisati znak bez poruke.

Page 2: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 2/12

Rješenja

1. Zadatak

#include <stdio.h>

int main() {

int x1, y1, x2, y2, x3, y3;

printf("Učitajte koordinate donjeg lijevog i gornjeg desnog vrha pravokutnika:\n");scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

printf("Učitajte koordinate točke\n");

scanf("%d %d", &x3, &y3);

if (x3<x1 || x3>x2 || y3<y1 || y3>y2)

printf("Točka se nalazi izvan pravokutnika.");

else if (x3>x1 && x3<x2 && y3>y1 && y3<y2)

printf("Točka se nalazi unutar pravokutnika.");

else 

printf("Točka se nalazi na stranici pravokutnika.");

return 0;

}

2. Zadatak

#include <stdio.h>

int main(){

unsigned int br, b, max = 0;

scanf("%d", &br);

b = br;

while (br) {

if ((br % 10) > max) max = br % 10;

br /= 10;

}

if (b % max == 0)

printf ("Broj %d je djeljiv sa svojom najvećom znamenkom %d", b, max);else 

printf ("Broj %d NIJE djeljiv sa svojom najvećom znamenkom %d", b, max);

return 0;

}

3. Zadatak

#include <stdio.h>

int main(){

int godina;

scanf("%d", &godina);

while(godina >= 0){if (godina > 10 && godina <= 3000){

if ((godina%4 == 0 && godina%100 != 0) || godina%400 == 0)

printf("Godina je prijestupna.");

else

printf("Godina nije prijestupna");

}

scanf("%d", &godina);

}

return 0;

}

Page 3: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 3/12

 

Drugo rješenje 3.zadatka:

#include <stdio.h> 

int main () {

int godina;

do {

scanf("%d", &godina);

if (godina > 10 && godina <= 3000){

if ((godina%4 == 0 && godina%100 != 0) || godina%400 == 0)

printf("Godina je prijestupna.");

else

printf("Godina nije prijestupna");

}

} while (godina>=0);

return 0;

}

4. Zadatak

#include <stdio.h>

int main(){

int i;

scanf("%d", &i);

if (i < 0 || i > 127)

printf("Neispravno zadani znak");

else if (i < 32 || i==127)

printf("Zadan kontrolni znak");

else if (i >= '0' && i <= '9')

printf("Zadana znamenka: %c", i);

else if (i >= 'a' && i <= 'z')

printf("Zadano malo slovo: %c", i - 32);

else if (i >= 'A' && i<= 'Z')

printf("Zadano veliko slovo %c", i + 32);

else

printf("%c", i);

return 0;

Page 4: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 4/12

Programiranje i programsko inženjerstvo2. međuispit

28.11.2008

1. (6 bodova) Napisati program koji pomoću get s naredbe učitava niz znakova. Možete

pretpostaviti da učitani niz neće imati više od 80 znakova. Ispisati koje se veliko slovo abecedepojavilo najviše puta u učitanom nizu znakova, te ispisati broj pojavljivanja tog slova. Ukoliko suse različita slova pojavila jednak broj puta, ispisati ono slovo koje se nalazi bliže kraju abecede.(Pretpostaviti da će se sigurno pojaviti barem jedno veliko slovo.)

Primjer.za učitani niz: LOTUS 123 j e pr vi Tabl i cni KALKULATORtreba ispisati: Sl ovo T poj avi l o se 3 put a

2. (6 bodova) Napisati funkciju prototipa: 

f l oat povr s i na( f l oat a, f l oat b, i nt n) ;  

koja vraća aproksimaciju površine područ ja omeđenogparabolom f(x)=x2+3, osi x te pravcima x=a i x=b .Osim parametara a i b funkcija prima i broj koraka n za

izračunavanje površine. Pomo

ću broja koraka n potrebno je izračunati ∆x na x osi. Ukupna površina područ ja

dobije se zbrajanjem površina n pravokutnika sa

stranicama ∆x i f(xi) gdje i=0, …, n-1.

Napisati i glavni program u kojem će se učitati parametria, b i broj koraka n te te u glavnom programu ispisatipovršina zadanog područ ja.

3. (7 bodova) Napisati funkciju skr at i Razl omak koja preko parametara brojnik inazivnik prima razlomak. Funkcija treba skratiti razlomak ukoliko je to moguće. Napisati i

glavni program u kojem će se učitati brojnik i nazivnik, pozvati funkcija skr at i Razl omak te u

glavnom programu ispisati skraćeni brojnik i nazivnik.

4. (6 bodova) Napisati program kojim se učitava dvodimenzionalna matrica cijelih brojevamaksimalnih dimenzija 10 x 15. Pri definiranju dimenzija matrice obavezno koristiti simboličkekonstante. Učitati stvarne dimenzije matrice (broj redaka i broj stupaca), pri čemu postupakučitavanja dimenzija treba ponavljati sve dok se ne učitaju valjane dimenzije. Učitati elemente

matrice. Ukoliko je suma elementa matrice jednaka 0 ispisati: Suma el emenat a mat r i ce j e

0. Inače ispisati koliko elemenata matrice je manje od aritmeti

čke sredine svih elemenatamatrice. 

Primjer:

Učitana matrica

1 2 3

4 5 6  Aritmetička sredina je 5 pa program ispisuje:

7 8 9 Br oj el emenat a manj i h od 5. 000000 j e 4 

Page 5: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 5/12

Rješenja

1. Zadatak#i ncl ude  <st di o. h>#def i ne  MAXZNAK 80

i nt   mai n( ) {char   r [ MAXZNAK+1] ;i nt   br Vel i ka[ ' Z' - ' A' +1] = {0};i nt   i , d, i ndex;

i nt   maxVel i koSl ovo = 0;pr i nt f ( "Unesi t e r eceni cu: \ n") ;gets ( r ) ;d = 0;whi l e  ( r [d] ){

i f ( r [ d] >= ' A' && r [ d] <= ' Z' ) {i ndex = r [ d] - ' A' ;br Vel i ka[ i ndex]++;

}d++;

}

f or   ( i =' Z' ; i >= ' A' ; i - - ){i f   ( br Vel i ka[ i - ' A' ] > br Vel i ka[ maxVel i koSl ovo] ) maxVel i koSl ovo = i - ' A' ;

}

pr i nt f ( "Sl ovo %c, poj avi l o se %d put a. \ n",maxVel i koSl ovo + ' A' , br Vel i ka[ maxVel i koSl ovo] ) ;

return  0;}

Page 6: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 6/12

2.   Zadatak 

#i ncl ude  <st di o. h>

f l oat   povrsi na( f l oat   a, f l oat   b, i nt   n) {f l oat   r ez=0, del t aX; i nt   i ;

del t aX = ( b- a) / n;

f or   ( i =0; i <n; i ++)r ez+= del t aX*( ( a+i *del t aX) *( a+i *del t aX) +3) ;

return  rez;}

i nt   mai n( ) {f l oat   a, b; i nt   broj Kor aka;pr i nt f ( "Upi si t e a, b i br oj kor aka: " ) ;

scanf ( "%f %f %d" , &a, &b, &br oj Kor aka) ;

pr i nt f ( "\ nPovr ši na i znosi : %f " , povr si na (a, b, br oj Kor aka) ) ;

return  0;}

3. Zadatak/* u rješenju NIJE bilo potrebno ispitivati jesu li brojnik *//* ili nazivnik negativni brojevi*/

voi d  skr at i Razl omak( i nt   *broj ni k, i nt   *nazi vni k){

i nt   maxd, d, i ;i nt br , na;br =( *br oj ni k>0) ?*br oj ni k: - *br oj ni k;na=( *nazi vni k>0) ?*nazi vni k: - *nazi vni k;maxd=br ;

d=1;i f ( br >na){

maxd=na;}for(i=2;i<=maxd;i++)   {

i f ( *broj ni k%i ==0 && *nazi vni k%i ==0)d=i ;

}i f ( d>1){

*br oj ni k/ =d;*nazi vni k/ =d;

}

}

i nt   mai n( ){

i nt   b, n;scanf ( "%d %d" , &b, &n) ;skr at i Razl omak( &b, &n) ;pr i nt f ( " \ n%d %d" ,b ,n ) ;return  0;

}

Page 7: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 7/12

Zadatak 4.

#i ncl ude  <st di o. h> #def i ne  MAXRED 10#def i ne  MAXSTUP 15

i nt   mai n( ) {

i nt   mat [ MAXRED] [ MAXSTUP] ;i nt   r , s ;

i nt   i , j , k=0, suma=0;f l oat   as;

do  {pr i nt f ( "Unesi br oj r edaka i br oj st upaca: " ) ;scanf ( "%d %d", &r , &s) ;

}whi l e( r <0 | | s<0 | | r >MAXRED | | s>MAXSTUP) ;

pr i nt f ( "Unesi el ement e mat r i ce: " ) ;

f or   ( i =0; i <r ; i ++) {f or   ( j =0; j <s; j ++) {

scanf ( "%d" , &mat [ i ] [ j ] ) ;suma=suma+mat [ i ] [ j ] ;}

}

i f   ( suma==0) {pr i nt f ( "Suma el ement a mat r i ce j e 0" ) ;

}

el se  {as=( f l oat ) suma/ ( r *s) ;

f or   ( i =0; i <r ; i ++)f or   ( j =0; j <s; j ++)

i f   ( mat [ i ] [ j ] <as)k++;

pr i nt f ( "Br oj el emenat a manj i h od %f j e: %d",a s , k ) ;

}

return  0;

Page 8: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 8/12

Programiranje i programsko inženjerstvoZavršni ispit

23.01.2009

Napomena za sve zadatke:

Nije dopušteno korištenje goto naredbe, te statičkih i globalnih varijabli.

1. (8 bodova). Napisati funkciju čiji je prototip:void zamijeni (char *nizStari, char *nizNovi); 

koja će niz znakova nizStari zadan u formatu "PREZIME, IME" prepisati u niz nizNovi, i to tako

da niz nizNovi bude formata "IME PREZIME".  Nije dozvoljeno mijenjanje niza nizStari.

 Napisati glavni program u kojem se učitava niz znakova u formatu "PREZIME, IME" (pretpostavite

da će niz biti unesen u tom formatu) te ispisuje u formatu "IME PREZIME". 

Primjer: Za učitani niz "ANIC, ANA" potrebno je ispisati "ANA ANIC".

2. (7 bodova) 

a) Napisati funkciju statistika_matrice koja za zadanu kvadratnu znakovnu matricu

proizvoljne veličine analizira znakove pohranjene iznad glavne dijagonale. Funkcija vraća broj

znamenki i broj slova.

 Npr. za matricu

Funkcija vraća 3 za broj znamenki i 5 za broj slova.

 b) U priloženom glavnom programu označeno je mjesto na kojem se treba nalaziti naredba za poziv

funkcije statistika_matrice. Kao rješenje b) dijela zadatka potrebno je napisati poziv

funkcije statistika_matrice (ne treba prepisivati program).

#define MAXM 100

int main() {char mat[MAXM][MAXM] = {{'1', '2', 'Z', '9', 'z'},

{'m', '*', 'a', 'a', '6'},{'0', '0', 'b', 'k', '$'},

{'3', 'H', '0', 'D', '#'},{'p', 'K', 'g', '!', 'D'}};

int broj_znamenki, broj_slova;

***OVDJE DOLAZI POZIV FUNKCIJE statistika_matrice***

printf("Broj znamenki iznad dijagonale je %d, a broj slova je %d",broj_znamenki, broj_slova);

return 0;}

1 2 Z 9 z

m * a a 6

0 0 b k $

3 H 0 D #

 p K g ! D

Page 9: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 9/12

3. (7 bodova) 

a) Napisati funkciju koja će vratiti pseudoslučajni broj u intervalu [-100, 100]. Funkcija treba imati

 prototip: int fun1(void); 

 b) Napisati funkciju koja će testirati ponašanje funkcije iz a) dijela zadatka. Funkciju fun1 treba pozvati

1000 puta te za tako generirane brojeve izračunati aritmetičku sredinu i standardnu devijaciju. Izračunate

vrijednosti vratiti u glavni program. Standardna devijacija računa se po formuli:

  ∑     , gdje je  aritmetička sredina

4. (8 bodova) Studenti procjenjuju kvalitetu nastave iz predmeta odgovaranjem na 20 postavljenih pitanjaocjenama 1 do 5. Studentske procjene spremaju se u neformatiranu datoteku anketa.bin. Jedan zapisneformatirane datoteke anketa.bin sadrži šifru predmeta (int) i 20 ocjena (int).U direktnoj neformatiranoj datoteci predmeti.bin svaki zapis sadrži šifru (long) i naziv predmeta (50+1znak). Redni broj zapisa datoteke predmeti.bin odgovara šifri predmeta. Prazan zapis prepoznaje se po

šifri predmeta 0.

 Napišite glavni program u kojem će se učitati šifra predmeta te pomoću podataka iz datotekapredmeti.bin i anketa.bin ispisati tablica učestalosti pojavljivanja pojedinih ocjena za zadani predmet usljedećem formatu(prva dva reda nije potrebno ispisavati i služe za lakše formatiranje ispisa):

2 3 4 5 6 7

1234567890123456789012345678901234567890123456789012345678901234567890

Predmet 1 2 3 4 5

----------------------------------------------------------------

Programiranje i programsko inzenjerstvo xxxx xxxx xxxx xxxx xxxx

Ukoliko je zadana šifra predmeta koja ne postoji u datoteci predmeti.bin ispisati odgovajuću poruku izavršiti s izvođenjem programa.

Nije potrebno provjeravati uspješnost obavljanja operacija nad datotekama.

Page 10: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 10/12

Rješenja

1.

void zamijeni (char *nizStari, char *nizNovi) {int duljina;char *p;p = strchr(nizStari, ',');duljina = p - nizStari + 1;

strcpy(nizNovi, nizStari + duljina + 1);strcat(nizNovi, " ");strncat(nizNovi, nizStari, duljina -1);

}

int main() {char nizStari [100], nizNovi [100];gets(nizStari);zamijeni(nizStari, nizNovi);printf("%s %s\n", nizStari, nizNovi);return 0;

}

Rješenje s pomoćnim poljima:

void zamijeni (char *nizStari, char *nizNovi) {char pom1[100], pom2[100];int i = 0, j = 0;

while(nizStari[i] != ',') {pom1[i] = nizStari[i];i++;

}pom1[i] = '\0';

i++;

while(nizStari[i] != '\0') {if (nizStari[i] != ' ') {pom2[j] = nizStari[i];j++;

}i++;

}pom2[j] = '\0';

strcpy(nizNovi, pom2);strcat(nizNovi, " ");strcat(nizNovi, pom1);

}

2.#define MAXN 10

void statistika_matrice(char *matrica, int rang, int max_rang, int* broj_znamenki,int* broj_slova){

int i=0; int j=0; char trenutni_element;*broj_znamenki=0; *broj_slova=0;for(i=0; i<rang; i++){

for(j=0; j<rang; j++){trenutni_element = *(matrica + i*max_rang + j);if(j>i){

if(isdigit(trenutni_element)){

(*broj_znamenki)++;}else if(isalpha(trenutni_element)){

(*broj_slova)++;}

Page 11: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 11/12

  }}

}}

int main() {char mat[MAXN][MAXN] = {{'1', '2', 'Z', '9', 'z'},

{'m', '*', 'a', 'a', '6'},{'0', '0', 'b', 'k', '$'},

{'3', 'H', '0', 'D', '#'},{'p', 'K', 'g', '!', 'D'}};

int broj_znamenki, broj_slova;statistika_matrice(&mat[0][0], 5, MAXN, &broj_znamenki, &broj_slova);printf("Broj znamenki iznad dijagonale je %d, a broj slova je %d",

broj_znamenki, broj_slova);return 0;

}

3.#include <stdio.h>#include <math.h>

int fun1(void) {

return rand()%201 - 100;}

void fun2(float *as, float *sd) {int i, x;int polje[1000];

*as = *sd = 0;srand(time(NULL));

for (i=0; i<1000; i++) {polje[i] = fun1();*as += polje[i];

}*as /= 1000;

for (i=0; i<1000; i++) {*sd += pow(polje[i] - *as, 2);

}*sd = sqrt(*sd/1000);

}

4.#include <stdio.h>#include <stdlib.h>

int main () {FILE *fPredmet, *fAnketa;int sifPred, i;int ocjena[5] = {0};

struct predmetZapis {long sifPred;char nazPred[50+1];

} predmet;

struct anketaZapis {int sifPred;int ocjena[20];

} anketa;

fAnketa = fopen ("anketa.bin", "rb");fPredmet = fopen ("predmeti.bin", "rb");

Page 12: rokovi_20082009

7/17/2019 rokovi_20082009

http://slidepdf.com/reader/full/rokovi20082009 12/12

  printf ("Upisite sifru predmeta: ");scanf ("%d", &sifPred);fseek (fPredmet, (long) (sifPred-1) * sizeof (predmet), SEEK_SET);fread(&predmet, sizeof (predmet), 1, fPredmet);

if (sifPred != predmet.sifPred) {printf ("Ne postoji predmet: %d \n", sifPred);exit(3);

}

while (fread(&anketa, sizeof (anketa), 1, fAnketa) == 1){if (anketa.sifPred == sifPred)

for (i=0; i<20;i++)ocjena[anketa.ocjena[i]-1]++;

}

printf ("Predmet 1 2 3 4 5 \n");printf ("----------------------------------------------------------------\n" ); printf ("%50s %4d %4d %4d %4d %4d \n", predmet.nazPred, ocjena[0], ocjena[1]

, ocjena[2], ocjena[3], ocjena[4]);

fclose(fAnketa);

fclose(fPredmet);

return 0;}