Snippets

Created by lion 137 last modified
/*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)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.