Opgaver i denne lektion   Gå til annoteret slide, hvor denne opgave er tilknyttet -- Tastaturgenvej: 'u'   Alfabetisk indeks   Kursets hjemmeside   

Opgaveløsning:
Reduktion af et array


Her er min løsning:

#include <stdio.h>

double max(double, double);
double min(double, double);
double plus(double, double);
double minus(double, double);

double combine_right(double a[], int n, double (*combiner)(double, double));
double combine_right(double a[], int n, double (*combiner)(double, double));
double combine_left(double a[], int n, double (*combiner)(double, double));

int main(void) {
  double result;
  double numbers[] = {5, 7, 8 , 11};
  int n = sizeof(numbers) / sizeof(double);

  result = combine_left(numbers, n, &minus);  /* minus(5, minus(7, minus(8, 11))) = 5 - (7 - (8 - 11)) = -5 */
  printf("Minus combination result: %f\n", result);

  result = combine_left(numbers, n, &plus); 
  printf("Plus combination result: %f\n", result);

  result = combine_left(numbers, n, &min); 
  printf("Min combination result: %f\n", result);

  result = combine_left(numbers, n, &max); 
  printf("Max combination result: %f\n", result);

  return 0;
}


double combine_right(double a[], int n, 
                     double (*combiner)(double, double)){
  double result;
  int i;

  for(i = n-2; i >= 0; --i){
    if (i == n-2)
       result = combiner(a[i], a[i+1]);
    else
       result = combiner(a[i], result);
  }
    
  return result;  
}

double combine_left(double a[], int n, 
                     double (*combiner)(double, double)){
  double result;
  int i;

  for(i = 1; i < n; ++i){
    if (i == 1)
       result = combiner(a[i-1], a[i]);
    else
       result = combiner(result, a[i]);
  }
    
  return result;  
}


double max (double a, double b){
  return a > b ? a : b;
}

double min (double a, double b){
  return a > b ? b : a;
}

double plus(double a, double b){
  return a + b;
}

double minus(double a, double b){
  return a - b;
}