5
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.

15.9.2005

Embed Size (px)

DESCRIPTION

Ispit

Citation preview

Page 1: 15.9.2005

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.

Page 2: 15.9.2005

#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;

Page 3: 15.9.2005

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".

Page 4: 15.9.2005

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;

Page 5: 15.9.2005

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);

}