Upload
pero-kvrzica
View
2
Download
0
Embed Size (px)
DESCRIPTION
Ispit i rješenja
Citation preview
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
(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);
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;
}