3
Zadaća iz Programiranja 9. rujna 2004. 1. (30 bodova) Napisati funkciju čiji je prototip: int PitagorinaTrojka(int c, int *a, int *b) koja će za prirodan broj c, ako postoje, pronaći brojeve a i b (0<a<=b) takve da je a 2 +b 2 =c 2 . Ako su a i b pronađeni, funkcija vraća 1, inače vraća 0. int PitagorinaTrojka(int c, int *a, int *b){ double temp; for(*a=1; *a<c; (*a)++){ temp = sqrt(c*c - *a * *a); if (temp == (int) temp){ *b=(int) temp; return 1; } } return 0; } 2. (35 bodova) Neka se u matrici dimenzija n x n (n može biti proizvoljan) nalaze rezultati nogometnih utakmica odigranih između n ekipa na način da element u retku i i stupcu j označava koliko je golova postigla ekipa i u susretu protiv ekipe j. Potrebno je napisati funkciju koja će za slučajno odabranu ekipu ispisati broj prikupljenih bodova te ekipe (pobjeda nosi 3 boda, neriješeno 1 bod, poraz 0 bodova), kao i njenu gol razliku. Napomena: Matrica rezultata je ulazni parametar u funkciju i treba predvidjeti da njene dimenzije mogu biti proizvoljne. void izracunaj(int *mat, int n, int maxstup){ int j,ekipa,gol_razlika=0,br_bod=0,temp; ekipa=rand()%n; for(j=0 ; j<n ; j++){ if (j==ekipa) continue; temp=mat[ekipa * maxstup + j] - mat[j * maxstup + ekipa]; if (temp>0) br_bod+=3; else if (temp==0) br_bod+=1; gol_razlika+=temp; } printf("Odabrana je ekipa %d, broj bodova %d, gol razlika %d", ekipa, br_bod, gol_razlika); } 3. (45 bodova) Neka se u slijednoj formatiranoj datoteci nalaze podaci o prolaznim vremenima vozača rally- a tijekom 2 dionice i to u sljedećem formatu: Ime vozača # Vrijeme # Vrijeme na # Vrijeme \n

14_z2004-09-09-rjesenja

Embed Size (px)

DESCRIPTION

Ispit i rješenja

Citation preview

Page 1: 14_z2004-09-09-rjesenja

Zadaća iz Programiranja

9. rujna 2004.

1. (30 bodova)

Napisati funkciju čiji je prototip: int PitagorinaTrojka(int c, int *a, int *b)

koja će za prirodan broj c, ako postoje, pronaći brojeve a i b (0<a<=b) takve da je

a2+b2=c2. Ako su a i b pronađeni, funkcija vraća 1, inače vraća 0.

int PitagorinaTrojka(int c, int *a, int *b){

double temp;

for(*a=1; *a<c; (*a)++){

temp = sqrt(c*c - *a * *a);

if (temp == (int) temp){

*b=(int) temp;

return 1;

}

}

return 0;

}

2. (35 bodova)

Neka se u matrici dimenzija n x n (n može biti proizvoljan) nalaze rezultati nogometnih

utakmica odigranih između n ekipa na način da element u retku i i stupcu j označava koliko

je golova postigla ekipa i u susretu protiv ekipe j. Potrebno je napisati funkciju koja će za

slučajno odabranu ekipu ispisati broj prikupljenih bodova te ekipe (pobjeda nosi 3 boda,

neriješeno 1 bod, poraz 0 bodova), kao i njenu gol razliku.

Napomena: Matrica rezultata je ulazni parametar u funkciju i treba predvidjeti da njene

dimenzije mogu biti proizvoljne.

void izracunaj(int *mat, int n, int maxstup){

int j,ekipa,gol_razlika=0,br_bod=0,temp;

ekipa=rand()%n;

for(j=0 ; j<n ; j++){

if (j==ekipa) continue;

temp=mat[ekipa * maxstup + j] - mat[j * maxstup + ekipa];

if (temp>0)

br_bod+=3;

else if (temp==0)

br_bod+=1;

gol_razlika+=temp;

}

printf("Odabrana je ekipa %d, broj bodova %d, gol razlika %d",

ekipa, br_bod, gol_razlika);

}

3. (45 bodova)

Neka se u slijednoj formatiranoj datoteci nalaze podaci o prolaznim vremenima vozača rally-

a tijekom 2 dionice i to u sljedećem formatu:

Ime vozača # Vrijeme # Vrijeme na # Vrijeme \n

Page 2: 14_z2004-09-09-rjesenja

(max 50

znakova)

starta kontrolnoj

točki

na cilju

Vremena su zapisana u formatu hh:mm:ss. Sva vremena su unutar istog dana.

Napisati program koji će ispisati koji je vozač bio najbrži na kontrolnoj točki i na cilju i s

kojim vremenom. U slučaju da dva ili više vozača imaju isto vrijeme za kontrolnu točku,

odnosno cijelu stazu, uzeti onoga koji se prije nalazi u datoteci.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

main(){

FILE *f;

char ime[50+1],najbrzi_kon[50+1], najbrzi_cilj[50+1];

int min_kon,min_cilj,vr_kon, vr_cilj;

int prvi_minimum_postavljen=0;

int h1,m1,s1,h2,m2,s2,h3,m3,s3;

if ( (f=fopen("vozaci.txt","r"))==NULL){

printf("ne mogu otvoriti datoteku");

exit(1);

}

while(fscanf(f,"%50[^#]#%d:%d:%d#%d:%d:%d#%d:%d:%d%*c",

ime,&h1,&m1,&s1,&h2,&m2,&s2,&h3,&m3,&s3)==10){

vr_kon=(h2*3600+m2*60+s2) - (h1*3600+m1*60+s1);

vr_cilj=(h3*3600+m3*60+s3) - (h1*3600+m1*60+s1);

if (!prvi_minimum_postavljen){

min_kon = vr_kon;

min_cilj = vr_cilj;

strcpy(najbrzi_kon,ime);

strcpy(najbrzi_cilj,ime);

prvi_minimum_postavljen=1;

}

else{

if (vr_kon<min_kon){

min_kon = vr_kon;

strcpy(najbrzi_kon,ime);

}

if (vr_cilj<min_cilj){

min_cilj = vr_cilj;

strcpy(najbrzi_cilj,ime);

}

}

}

printf("Najbrzi vozac na kontrolnoj tocki bio je %s s vremenom

%02d:%02d:%02d\n",

najbrzi_kon,min_kon/3600,(min_kon%3600)/60,min_kon%60);

printf("Najbrzi vozac na cilju bio je %s s vremenom

%02d:%02d:%02d\n",

najbrzi_cilj,min_cilj/3600,(min_cilj%3600)/60,min_cilj%60);

fclose(f);

Page 3: 14_z2004-09-09-rjesenja

return 0;

}

4. (40 bodova)

Neka je zadana direktna neformatirana datoteka koja sadrži cijele brojeve, čije se ime u

program zadaje preko argumenata komandne linije.

Potrebno je napisati program koja će ispisati sadržaj datoteke od sredine prema vani, tj. prvo

će se ispisati broj u sredini datoteke, zatim brojevi koji su udaljeni jedno mjesto od njega, pa

zatim dva mjesta itd... Primjer:

Ako se u datoteci redom nalaze brojevi:

1 2 3 4 5 6 7 8 9 izlaz programa bit će: 5 6 4 7 3 8 2 9 1

Ako se u datoteci redom nalaze brojevi:

1 2 3 4 5 6 7 8 9 10 izlaz programa bit će: 5 6 4 7 3 8 2 9 1 10

main(int argc, char *argv[]){

FILE *f;

int i,br_zapisa,sr, x;

if (argc<2){

printf("Programu je potrebno predati ime datoteke");

exit(1);

}

if ( (f=fopen(argv[1],"rb"))==NULL){

printf("Datoteka se ne moze otvoriti");

exit(2);

}

fseek(f,0,SEEK_END);

br_zapisa=ftell(f)/4;

/* udaljenost srednjeg elementa od početka datoteke*/

sr=(br_zapisa-1)/2 ;

fseek(f, sr * sizeof(int), SEEK_SET);

fread(&x,sizeof(int), 1, f);

printf("%d", x);

for(i=1; i<=sr ;i++){

fseek(f,( sr + i ) * sizeof(int), SEEK_SET);

fread(&x,sizeof(int), 1, f);

printf(" %d", x);

fseek(f,( sr - i ) * sizeof(int), SEEK_SET);

fread(&x,sizeof(int), 1, f);

printf(" %d", x);

}

if (br_zapisa%2==0){

fseek(f, -1 * (signed) sizeof(int),SEEK_END);

fread(&x,sizeof(int), 1, f);

printf(" %d", x);

}

fclose(f);

return 0;

}