函数式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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2012-08-28 ubuntu下apache&php&虚拟主机开发环境配置