Upload
pero-kvrzica
View
215
Download
2
Embed Size (px)
DESCRIPTION
Ispit
Citation preview
Zadaća iz Programiranja
15.9.2005
1. (40 bodova)
Napisati funkciju: void ispisiRijec(char *recenica)
koja će ispisati slučajno odabranu riječ iz zadanog znakovnog niza. U zadanom znakovnom
nizu se nalaze samo slova engleske abecede i jednostruki razmaci.
Npr. ispisiRijec("danas je lijep dan");
može ispisati: je
2. (30 bodova)
Napisati funkciju: char* izbaciOstaleZnakove(char *recenica)
koja će stvoriti novi znakovni niz koji se tvori tako da se zadanom nizu izbace svi znakovi
koji nisu slova engleske abecede i razmaci.
Npr. printf("%s", izbaciOstaleZnakove(".danas je lijep dan!?"));
će ispisati: danas je lijep dan
3. (40 bodova)
Napisati funkciju prototipa: int *ucitaj(char *imeDatoteke, int *brRed, int *brStup)
koja će iz datoteke zadanoga imena učitati cjelobrojnu matricu u memoriju i vratiti pokazivač
na novostvorenu matricu. U datoteci se u prvom retku nalaze broj redaka i broj stupaca
matrice, a zatim slijedi retci matrice pri čemu su elementi u retcima odvojeni prazninom.
Npr. datoteci: odgovara matrica:
matrica.txt
3 4
1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8
9 10 11 12 9 10 11 12
4. (40 bodova)
Neformatirana datoteka "roditelji.dat" sadrži podatke o roditeljima:
imePrezime polje od 50 znakova
brDjece int
sifreDjece polje od 50 long brojeva
Svaki roditelj ima polje koje pokazuje na njegovu djecu u datoteci "djeca.dat".
Direktna neformatirana datoteka "djeca.dat" sadrži podatke o tome koliko djeci ispita
nedostaje za prolaz godine na fakultetu na kojem studiraju:
sifraDjeteta long
imePrezime polje od 50 znakova
brIspita int
pri čemu sifraDjeteta odgovara rednom broju zapisa u datoteci.
Potrebno je napisati program koji će ispisati ime i prezime roditelja čijoj djeci ukupno
nedostaje najviše ispita za prolaz. Ukoliko ima više takvih, ispisati bilo kojega.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
/*
1. (40 bodova)
Napisati funkciju:
void ispisiRijec(char *recenica)
koja će ispisati slučajno odabranu riječ iz zadanog znakovnog niza. U
zadanom znakovnom nizu se nalaze samo slova engleske abecede i jednostruki
razmaci.
Npr.
ispisiRijec("danas je lijep dan");
može ispisati:
je
*/
void ispisiRijec(char *recenica){
int poc = rand()%strlen(recenica);
while (poc>0 && recenica[poc-1]!=' ')
poc--;
while (recenica[poc]!=' ' && recenica[poc]!='\0')
printf("%c", recenica[poc++]);
}
// drugo riješenje u kojem se prvo prebroji broj riječi i gdje riječi imaju
jednaku šansu da budu odabrane bez obzira na duljinu:
void ispisiRijec2(char *recenica){
int brr = 1, slr, i;
char *pom = recenica;
while ((pom=strstr(pom, " "))!=NULL){
brr++;
pom++;
}
slr = rand()%brr;
pom = recenica;
while (slr>0){
pom = strstr(pom, " ");
pom++;
slr--;
}
i=0;
while (pom[i]!=' ' && pom[i]!='\0')
printf("%c", pom[i++]);
}
/*
2. (30 bodova)
Napisati funkciju:
char* izbaciOstaleZnakove(char *recenica)
koja će stvoriti novi znakovni niz koji se tvori tako da se zadanom nizu
izbace svi znakovi koji nisu slova engleske abecede i razmaci.
Npr.
printf("%s", izbaciOstaleZnakove(".danas je lijep dan!?"));
će ispisati:
danas je lijep dan
*/
char *izbaciOstaleZnakove(char *recenica){
int i=0, br=0;
char *retval;
while (recenica[i]){
if (isalpha(recenica[i]) || recenica[i]==' ')
br++;
i++;
}
retval = (char *)malloc((br+1) * sizeof(char));
if (retval == NULL) return NULL;
i=br=0;
while (recenica[i]){
if (isalpha(recenica[i]) || recenica[i]==' ')
retval[br++] = recenica[i];
i++;
}
retval[br]=0;
return retval;
}
/*
3. (40 bodova)
Napisati funkciju prototipa:
int *ucitaj(char *imeDatoteke, int *brRed, int *brStup)
koja će iz datoteke zadanoga imena učitati cjelobrojnu matricu u memoriju i
vratiti pokazivač na novostvorenu matricu. U datoteci se u prvom retku
nalaze broj redaka i broj stupaca matrice, a zatim slijedi retci matrice
pri čemu su elementi u retcima odvojeni prazninom.
Npr. datoteci: odgovara matrica:
matrica.txt
3 4
1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8
9 10 11 12 9 10 11 12
*/
int *ucitaj(char *imeDatoteke, int *brRed, int *brStup){
FILE *f;
int *m;
int i, j;
f=fopen(imeDatoteke, "r");
if (f==NULL) return NULL;
fscanf(f, "%d %d%*c", brRed, brStup);
m = (int *) malloc((*brRed) * (*brStup) * sizeof(int));
if (m==NULL) return NULL;
for (i=0; i<*brRed; i++){
for (j=0; j<*brStup; j++)
fscanf(f, "%d", &m[i*(*brStup)+j]);
fscanf(f, "%*c"); // moze i bez ovoga
}
return m;
}
/*
4. (40 bodova)
Neformatirana datoteka "roditelji.dat" sadrži podatke o roditeljima:
imePrezime polje od 50 znakova
brDjece int
sifreDjece polje od 50 long brojeva
Svaki roditelj ima polje koje pokazuje na njegovu djecu u datoteci
"djeca.dat".
Direktna neformatirana datoteka "djeca.dat" sadrži podatke o tome koliko
djeci ispita nedostaje za prolaz godine na fakultetu na kojem studiraju:
sifraDjeteta long
imePrezime polje od 50 znakova
brIspita int
pri čemu sifra_djeteta odgovara rednom broju zapisa u datoteci.
Potrebno je napisati program koji će ispisati ime i prezime roditelja čijoj
djeci ukupno nedostaje najviše ispita za prolaz. Ukoliko ima više takvih,
ispisati bilo kojega.
*/
typedef struct{
char imePrezime[50];
int brDjece;
long sifreDjece[50];
} roditelj;
typedef struct{
long sifraDjeteta;
char imePrezime[50];
int brIspita;
} dijete;
void main(){
int *m;
int i,j, brRed, brStup;
// varijable od 4.zadatka ********
int sum, max=-1;
char maxRoditelj[50];
roditelj r;
dijete d;
FILE *fr, *fd;
// ******************************
srand(time(NULL));
// 1.
ispisiRijec("danas je lijep dan");
printf("\n");
ispisiRijec2("danas je lijep dan");
// 2.
printf("\n%s", izbaciOstaleZnakove(".danas je #$%#&%& dan!?"));
printf("\n");
// 3.
m = ucitaj("d:\\temp\\matrica.txt", &brRed, &brStup);
for (i=0; i<brRed; i++){
for (j=0; j<brStup; j++)
printf("%5d", m[i*brStup+j]);
printf("\n");
}
//4. je program:
fr = fopen("roditelji.dat", "rb");
fd = fopen ("djeca.dat", "rb");
if (fd==NULL || fr==NULL)
return;
while (fread(&r, sizeof(r), 1, fr)==1){
sum=0;
for (i=0; i<r.brDjece; i++){
fseek(fd, sizeof(d) * r.sifreDjece[i], SEEK_SET);
fread(&d, sizeof(d), 1, fd);
sum += d.brIspita;
}
if (sum>max){
max = sum;
strcpy(maxRoditelj, r.imePrezime);
}
}
printf("%s", maxRoditelj);
}