Exercise 12-3 - CBD page 424 - Kurt Nørmark og Lone Leth Thomsen

Solution index                   Textual C program


#include <stdio.h>
#include <stdlib.h>

struct restaurant {
        char *name;
        char *address;
        int average_cost;
        char *type_of_food;
       };
typedef struct restaurant restaurant;

restaurant my_restaurants[] =
    {
      {"Maxies", "Bredgade 2", 205, "fisk"},
      {"Minies", "Tyvej 22", 100, "kinesisk"},
      {"Fiskies", "Jyllandsgade 23", 150, "fisk"},
      {"Blondies", "Fredrik Bajers Vej 122", 117, "fisk"},
      {"Brownies", "Bredgade 2222", 502, "fisk"}
    };

int compare_cost(const void *ell1, const void *ell2){
        restaurant *el1 = (restaurant*)ell1;
        restaurant *el2 = (restaurant*)ell2;
        if (el1 ->average_cost == el2->average_cost) return 0;
        else if (el1->average_cost < el2->average_cost) return -1;
        else return 1;
};


/* print the name of those restaurants with food of kind.
   Sort the restaurants according to prices. n is the number of restaurants passed. */

void print_food(char *kind, restaurant restaurants[], int n){
  int i;

   qsort(restaurants,n,sizeof(restaurant),&compare_cost);

   for (i=0; i < n; i++)
     if (!strcmp(kind,restaurants[i].type_of_food)) printf("%s\n",restaurants[i].name);        

};

int main(void){
  int number_of_restaurants = sizeof(my_restaurants)/sizeof(restaurant);
  print_food("fisk", my_restaurants, number_of_restaurants);
}




  

struct restaurant {
        char *name;
        char *address;
        int average_cost;
        char *type_of_food;
       };
typedef struct restaurant restaurant;
defines a structure used to describe a restaurant including name, address, average cost and type of food
 

restaurant my_restaurants[] =
    {
      {"Maxies", "Bredgade 2", 205, "fisk"},
      {"Minies", "Tyvej 22", 100, "kinesisk"},
      {"Fiskies", "Jyllandsgade 23", 150, "fisk"},
      {"Blondies", "Fredrik Bajers Vej 122", 117, "fisk"},
      {"Brownies", "Bredgade 2222", 502, "fisk"}
    };
Declares a variable my_restaurants as an array of restaurants. Please notice the nice initializer.
 

int compare_cost(const void *ell1, const void *ell2){
        restaurant *el1 = (restaurant*)ell1;
        restaurant *el2 = (restaurant*)ell2;
        if (el1 ->average_cost == el2->average_cost) return 0;
        else if (el1->average_cost < el2->average_cost) return -1;
        else return 1;
};
Defines a function compare_cost that compares the average_cost field of two pointers to elements of type restaurant. The function returns 0 if they are equal, -1 if the first is the smallest and 1 otherwise. Before the comparison is carried out a type cast is performed. This looks strange, but later on the compare_cost function will be given as an argument to the library function qsort, and qsort has certain type requirements (see p. 546).
 

void print_food(char *kind, restaurant restaurants[], int n){
  int i;

   qsort(restaurants,n,sizeof(restaurant),&compare_cost);

   for (i=0; i < n; i++)
     if (!strcmp(kind,restaurants[i].type_of_food)) printf("%s\n",restaurants[i].name);        

};
A function which sorts the restaurants, and print those of a given kind.
 

int main(void){
  int number_of_restaurants = sizeof(my_restaurants)/sizeof(restaurant);
  print_food("fisk", my_restaurants, number_of_restaurants);
}
The main function which just calls print_food. Notice the way we calculate the number of restaurants by means of the sizeof operator.
 

The result of the program is
Blondies
Fiskies
Maxies
Brownies
 


Generated: Wednesday, March 29, 2006, 12:33:37
This program dissection page is generated from an XML-in-LAML source file