Map funkcija

Napisati funkciju void map(int *a, size_t n, int (*op)(int)) koja sve elemente niza a dužine n menja pozivanjem prosleđene funkcije op. Funkcija op vraća novu vrednost elementa, a map je upisuje na odgovarajuće mesto.

Ulaz

Sa standardnog ulaza se najpre unosi ceo broj $n$ ($1 \leq n \leq 1000$), zatim $n$ celih brojeva koji čine niz, a na kraju karakter operacije op. Operacija može da bude:

Izlaz

Na standardni izlaz ispisati transformisani niz nakon primene funkcije map.

Primer

Ulaz

5
-3 2 -1 4 0
A

Izlaz

3 2 1 4 0

Primer

Ulaz

4
1 -2 3 -4
S

Izlaz

1 4 9 16

Primer

Ulaz

3
0 -1 9
I

Izlaz

1 0 10

Rešenje

main.c

#include <stdio.h>
#include <stdlib.h>

typedef int (*map_fn)(int);

void map(int *a, size_t n, map_fn op)
{
	if (op == NULL) { // id operation
		return;
	}

	for (size_t i = 0; i < n; i++) {
		a[i] = op(a[i]);
	}
}

static int op_abs(int x)
{
	return x < 0 ? -x : x;
}

static int op_square(int x)
{
	return x * x;
}

static int op_inc(int x)
{
	return x + 1;
}

static map_fn select_op(char op)
{
	switch (op) {
	case 'A':
		return op_abs;
	case 'S':
		return op_square;
	case 'I':
		return op_inc;
	default:
		return NULL;
	}
}

int main(void)
{
	size_t n;

	if (scanf("%zu", &n) != 1) {
		exit(EXIT_FAILURE);
	}

	int *arr = malloc(n * sizeof (int));
	if (arr == NULL) {
		exit(EXIT_FAILURE);
	}

	for (size_t i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}

	char op;
	scanf(" %c", &op); // consume newline before reading char

	map_fn fn = select_op(op);
	if (fn == NULL) {
		free(arr);
		exit(EXIT_FAILURE);
	}

	map(arr, n, fn);

	for (size_t i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");

	free(arr);

	exit(EXIT_SUCCESS);
}