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
  • 相关阅读:
    sun.misc.BASE64Encoder找不到的解决方法
    eclipse里大小写转化的快捷键是什么
    jface viewer 理解
    如何在遗留代码基础上开发
    谈谈技术文档的编写
    jre build path 中的限制问题导致一些代码无法编译..如果设置
    android update automatically ( android 自动升级)
    各大集群存储产品点评
    关于@Autowired 注释为何不需要get Set
    VRML之desk
  • 原文地址:https://www.cnblogs.com/code-style/p/3286984.html
Copyright © 2011-2022 走看看