zoukankan      html  css  js  c++  java
  • 函数式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.
    ", 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
    ", 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
  • 相关阅读:
    洛谷P3128 [USACO15DEC]Max Flow P 题解 树上差分(点差分)
    数列分块解决区间更新+区间最值问题
    ThinkPad P1 Gen3 4K 显示器出现间歇闪黑屏情况解决
    Qt自定义弹出式菜单(Qt自定义弹窗)
    软件产品易用性评价评估标准
    vue用echarts实现中国地图和世界地图
    知了业务逻辑梳理
    string.gfind string.gmatch
    无法定位程序输入点在 XXXX上...
    [Lua]c解析lua 嵌套table
  • 原文地址:https://www.cnblogs.com/code-style/p/3286984.html
Copyright © 2011-2022 走看看