函数式C代码

代码如下:

#include <stdlib.h>

#include <stdio.h>

typedef char String[32];

typedef FILE* File;



typedef struct _Employee {

        String name;

        int age;

        int salary;

        struct _Employee *next;

} *Employee;



typedef void (*Callback)(Employee);



/* High Order Functions */

void foreach(Employee e, Callback fn) {

     Employee p;

     while (p = e) {

           e = e->next; /* Avoid *next be changed in fn */

           fn(p);

     }

}



void with_open_file(String filename, String mode, Callback fn, Employee e) {

     File file = freopen(filename, mode, (mode[0] == 'r'? stdin: stdout));

     if (file == NULL) {

        fprintf(stderr, "Cannot open %s with %s mode.\n", filename, mode);

        exit(EXIT_FAILURE);

     }

     fn(e);

     fclose(file);

}



/* Destructor */

static void employee_free_node(Employee e) {

       if (e != NULL) {

          free(e);

       }

}



void employee_free(Employee e) {

     foreach(e, employee_free_node);

}



/* Input */

static void employee_read_node(Employee node) {

       Employee e = NULL, *head = (Employee*) node;

       e = *head = (Employee)calloc(1, sizeof(struct _Employee));

       if (e != NULL && scanf("%s%d%d", e->name, &e->age, &e->salary) != 3) {

          employee_free(e);

          *head = NULL;

       }

}



void employee_read(Employee list) {

     Employee e = NULL, *head = (Employee*) list, tail = NULL;

     *head = NULL;

     while (employee_read_node((Employee)&e), e) {

           if (*head != NULL) {

              tail->next = e;

              tail = e;

           } else {

             *head = tail = e;

           }

     }

}



/* Output */

static void employee_print_node(Employee e) {

       printf("%s %d %d\n", e->name, e->age, e->salary);

}



void employee_print(Employee e) {

     foreach(e, employee_print_node);

}



/* Business Logic */

static void employee_adjust_salary_node(Employee e) {

       if (e->salary < 30000) {

          e->salary += 3000;

       }

}



void employee_adjust_salary(Employee e) {

     foreach(e, employee_adjust_salary_node);

}



int main(void) {

    Employee e = NULL;

    with_open_file("work.txt", "r", employee_read, (Employee)&e);

    employee_print(e);

    employee_adjust_salary(e);

    employee_print(e);

    with_open_file("work.txt", "w", employee_print, e);

    employee_free(e);

    return EXIT_SUCCESS;

}

work.txt

William 35 28000

Kishore 41 35000

Wallace 37 23000

Bruce 39 18000

你可能感兴趣的:(函数)