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 op. Operacija može da bude:
A– zameni svaki broj njegovom apsolutnom vrednošću,S– zameni svaki broj njegovim kvadratom,I– uvećaj svaki broj za jedan.
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);
}