← Natrag

Vjezba za međuispit

PDF - Zadatci

Zadatak 01

Napišite program koji učitava prirodni broj n za koji je potrebno osigurati da ne bude veći od 100. Potom učitati n točaka u 2D prostoru (n parova realnih brojeva). Izračunati centar mase tih točaka, te ispisati točke uzlazno poredane po udaljenosti od centra mase…

Upisati n > 10
Upisati clanove > 1 2 1 3 1 4 2 1 2 2 2 3 3
1 3 2 3.5 4.5 3.14 3.14
Centar mase: (2.16, 2.56)
Tocke: (2.00, 3.00)(2.00, 2.00)(3.00,
2.00)(3.14, 3.14)(1.00, 3.00)(1.00,
2.00)(2.00, 1.00)(3.00, 1.00)(1.00,
4.00)(3.50, 4.50)
Rješenje zadatka
#include <stdio.h>
#include <math.h>

typedef struct {
	double x;
	double y;
} tocka_t;


double udaljenost(tocka_t t1, tocka_t t2) {
	double dx = t1.x - t2.x;
	double dy = t1.y - t2.y;

	return sqrt(dx*dx + dy*dy);
}

int main(void) {
	int n;

	do {
		printf("Upiši broj točaka <0, 100>:");
		scanf("%d", &n);
	} while (n <= 0 || n > 100);

	tocka_t tocke[n], centar_mase = {0};

	for (size_t i = 0; i < n; i++) {
		printf("Upiši točku: ");
		scanf("%lf %lf", &tocke[i].x, &tocke[i].y);
		centar_mase.x += tocke[i].x;
		centar_mase.y += tocke[i].y;
	}

	centar_mase.x /= n;
	centar_mase.y /= n;

	for (size_t i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			if (udaljenost(tocke[j], centar_mase) < udaljenost(tocke[i], centar_mase)) {
				tocka_t temp = tocke[i];
				tocke[i] = tocke[j];
				tocke[j] = temp;
			}
		}
	}

	for (size_t i = 0; i < n; i++) {
		printf("(%.2lf, %.2lf)", tocke[i].x, tocke[i].y);
	}
}

Zadatak 02

S tipkovnice učitati dva niza znakova (string), nizA i nizB, pri čemu nizovi sigurno neće biti dulji od 40 znakova (uključujući eventualni znak za novi red).

U novi niz znakova (string) izlaz redom prepisati znakove niza nizA koji se tri ili više puta pojavljuju u nizu nizB. Na kraju, niz izlaz ispisati na zaslon s pomoću konverzijske specifikacije %s. `

Napomena: dopušteno je koristiti samo funkcije iz stdio.h, a agregatni tipovi podataka smiju se koristiti isključivo za pohranu nizova nizA, nizB i izlaz.

Primjeri izvršavanja programa:

Upiši znakovni niz A: Prema Jupiteru, pitam!?
Upiši znakovni niz B: Peti Planet Jutros Pluta!!!
Izlaz > P t t!
Rješenje zadatka
#include <stdio.h>
#include <string.h>

#define CAP 40

int main(void) {
	char nizA[CAP + 1];
	char nizB[CAP + 1];
	char nizOut[CAP + 1];

	printf("Upiši znakovni niz A: ");
	fgets(nizA, CAP, stdin);
	printf("Upiši znakovni niz B: ");
	fgets(nizB, CAP, stdin);

	// Broji ponavljanje znakova niza B
	int freq[256] = {0};
	for (size_t i = 0; i < strlen(nizB); i++) {
		freq[nizB[i]]++;
	}

	// trenutni znak izlaznog niza
	size_t p = 0;
	for (size_t i = 0; i < strlen(nizA); i++) {
		if (freq[nizA[i]] >= 3) {
			nizOut[p++] = nizA[i];
		}
	}
	nizOut[p] = '\0';

	printf("Izlaz > %s\n", nizOut);
}

Zadatak 03

Napišite funkciju: unsigned int ciklRshift(unsigned int br, int shift) koja će vratiti broj koji se dobije ako ciklički pomaknemo zadani broj za zadani broj bitova udesno.

Na primjer, ako broj 7 pomaknemo ciklički za dva mjesta udesno, dobit ćemo:

00000000000000000000000000000111 // 7

11000000000000000000000000000001 // ciklRshift(7, 2)

Potom napisati program koji učitava dva cijela broja bez predznaka i računa koliko bitova treba pomaknuti svaki od tih brojeva udesno kako bi se ostvarila maksimalna vrijednost XOR operacije između ta dva (pomaknuta) broja.

Primjeri izvršavanja programa:

Upisi dva broja: 18 3
Maksimalni XOR je 4026531840
- pritom a treba pomaknuti za 5 udesno kako bi dobili: 2415919104
- pritom b treba pomaknuti za 3 udesno kako bi dobili: 1610612736
a >> 5 = 10010000000000000000000000000000
b >> 3 = 01100000000000000000000000000000
-------------------------------------------- ^
11110000000000000000000000000000
Rješenje zadatka
#include <stdio.h>

size_t ciklRshift(size_t br, size_t shift) {
	shift %= 8*sizeof(br);
	size_t ostatak = br << (8*sizeof(br) - shift);
	size_t shifted = br >> (shift);

	return shifted || ostatak;
}

int main(void) {

	size_t br1, br2;
	printf("Upiši dva broja: ");
	scanf("%zu %zu", &br1, &br2);

	size_t max = 0;
	size_t max_i = 0;
	size_t max_j = 0;

	for (size_t i = 0; i < 8*sizeof(br1); i++) {
		size_t c1 = ciklRshift(br1, i);
		for (size_t j = 0; j < 8*sizeof(br2); j++) {
			size_t c2 = ciklRshift(br2, j);

			if ((c1 ^ c2) > max) {
				max = c1 ^ c2;
				max_i = i;
				max_j = j;
			}


		}
	}

	// printf("Izlaz > %s\n", );
}
Caution

Završiti zadatak