2 דוגמאות בתרגיל אחד
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_SIZE 10
#define SCALE 1000
void sort(void** arr, size_t size, int (*comperator)(void* elem_1, void* elem_2));
int intDescending(void* elem_1, void* elem_2);
int intAscending(void* elem_1, void* elem_2);
void printArray(void** arr, size_t size, void (*printer)(void* element));
void intPrinter(void* element);
int main(int argc, char** argv)
{
int arr[ARR_SIZE];
int i;
srand((unsigned)time(NULL));
for (i = 0; i < ARR_SIZE; i++)
{
arr = (rand() % SCALE) + 1; // fill up with numbers [1, 1000]
}
printf("Random order: ");
/* notice the same printArray function can print different types of arrays */
printArray((void**)arr, ARR_SIZE, intPrinter);
printf("Descending order: ");
/* notice the same sorting function to sort ascending and descending */
sort((void**)arr, ARR_SIZE, intDescending);
printArray((void**)arr, ARR_SIZE, intPrinter);
printf("Ascending order: ");
/* notice the same sorting function to sort ascending and descending */
sort((void**)arr, ARR_SIZE, intAscending);
printArray((void**)arr, ARR_SIZE, intPrinter);
return 0;
}
/* simple bubble sort implementation */
void sort(void* arr[], size_t size, int (*comperator)(void* elem_1, void* elem_2))
{
int i;
int j;
void* temp;
for(i = 0; i < size; i++)
{
for (j = i; j < size; j++)
{
/* notice how I use only 1 sorting implementation with different comperators */
if (comperator(arr, arr[j]) >= 1)
{
temp = arr;
arr = arr[j];
arr[j] = temp;
}
}
}
}
int intDescending(void* elem_1, void* elem_2)
{
return (int)elem_2 - (int)elem_1;
}
int intAscending(void* elem_1, void* elem_2)
{
return (int)elem_1 - (int)elem_2;
}
void printArray(void* arr[], size_t size, void (*printer)(void* element))
{
int i;
printf("[");
for (i = 0; i < size; i++)
{
printer(arr);
if (i != size -1)
{
printf(", ");
}
}
printf("]\n");
}
void intPrinter(void* element)
{
printf("%d", (int)element);
}