Snippets
Created by
lion 137
last modified
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | /*Reduce, map and filter implementation*/
#include <stdio.h>
void print_array(int a []);
int size(int a []); /* O(n)*/
int square(int a){return a * a;}
int sum (int n, int l){return n + l;}
int pred_greater_than2(int a){
if (a > 2) {
return 1;
}
else return 0;
}
/* Function map takes a pointer to a function, pointer to array and returns a pointer to array.
* It doesn't create any side effects. */
int * map(int (*fun) (int), int a []){
int * res = malloc(size(a) * sizeof(int));
for (int i = 0; i < size(a); ++i ){
res[i] = (*fun)(a[i]);
}
return res;
}
/* Reduce similar to map, but returns an integer.*/
int reduce (int (*fun)(int, int), int a [], int start){
while (1){
if (*a == NULL){
return start;
}
else {
start = (*fun)(start, *a);
*(a++);
}
}
}
/* Filter returns a pointer to array, no side effects too.*/
int * filter(int (*pred)(int), int a []){
int len = size(a);
int cnt = 0;
int * res = malloc(size(a) * sizeof(int));
int k = 0;
for (int i = 0; i < len; ++i){
if ((*pred)(a[i])){
res[k] = a[i];
k++;
cnt++;
}
}
res = realloc(res, 4*cnt);
return res;
}
int main(int argc, char** argv) {
static int s [5] = {1, 2, 3, 4, 5};
int (*f2_ptr) (int);
int (*f3_ptr) (int, int);
printf("Initial array:\n");
print_array(s);
f2_ptr = square;
f3_ptr = sum;
int *k = map(f2_ptr, s);
printf("map square onto it: \n");
print_array(k);
int start = 0;
printf("reduce + array: \n");
printf("%d\n",reduce(f3_ptr, s, start));
f2_ptr = pred_greater_than2;
int *l = filter(f2_ptr, s);
printf("filter greater than 2 items: \n");
print_array(l);
/* Output:
*
*
Initial array:
[1,2,3,4,5]
map square onto it:
[1,4,9,16,25]
reduce + array:
15
filter greater than 2 items:
[3,4,5]
*
*
* */
return 0;
}
void print_array(int a []){
int len = size(a);
if (len == 0){
printf("[]\n");
}
else{
printf("[");
for (int i = 0; i < len; ++i){
printf("%d", a[i]);
if (i < len -1)
printf(",");
}
printf("]\n");
}
}
int size(int a []){
if (a == NULL) return 0;
static int res = 0;
int i = 0;
while (*a != NULL ){
*(a++);
i += 1;
}
res = i;
return res;
}
|
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.