大四重写大一的C语言大作业是一种怎样的体验

序言

在整理文件时偶然发现大一时的C语言大作业,故突然心血来潮想看看曾经花费一个星期的成果。

它虽然只有一个文件,却足足有829行,可见当时我下了多大功夫。回忆起当时作业的要求,大致也不过是实现一个可以增删改记录的学生成绩管理系统,何至于要写829行呢?找到源码配备的文档,想起那些我绞尽脑汁想出来的诸多花哨的功能,我不禁感慨:年轻就是能折腾啊!

而在我准备仔细拜读时,我却高兴不起来了——我根本看不懂也不想看懂我的代码!尽管我读过很多很烂的代码,但当发现自己曾经的骄傲之作其实是一片垃圾不堪入目时,我还是十分难受。

记得老师布置大作业的时候鼓励我们多写代码,多添加功能,于是我就认为代码越多越好,并添加了很多古怪的功能。而现在我很清楚:代码不是拼数量的,而是拼质量的,功能设计也不是越丰富越好,为意义不大的功能耗费精力是不值得的。

好的代码?

回顾我学习C的一点点经历,感慨曾经有太多对编程语言的误解:

我想,写代码应当努力达到作诗般简练优雅:

不追求平仄交替,只求抒发情感,表达思想不追求辞藻华丽,只求通俗易懂,,老妪能解

这样的好代码才能被人们clone、star、传诵。

重写代码!

万千的感慨令我不禁神游了一阵子,回过神,想起大四没有课,也算是有点闲时间,于是想改改这份代码。可当我发现几乎所有地方都有毛病时且不想再看逻辑混乱的代码时,我又改了主意,哎,还是重写吧!

总算是把800多行改成200多行了,程序讲解见我的Github博客,希望对刚学完C语言的同学们有所帮助。本人能力有限,如有前辈愿意点拨,敬请在本文后评论,不胜感激!

最后附上代码:

/* * Student Information Manager * https://baidut.github.io/ | Released under MIT license * Copyright (c) 2015 Zhenqiang.Ying <yingzhenqiang@gmail.com> */{char name[NAME_LEN];unsigned int score[3];unsigned int sum;} Stu_t;Stu_t stu[MAX];intnum;Stu_t input_stu(find_stu(*filename);*filename); *words);main(void) {const char *filename = “stud_info.txt”;read_stu(filename); ,num, MAX);for (;;) {char choice;int i, j;);choice = getchar();safe_flush(stdin);switch (choice) {case ‘1’: // 查找find_stu();break;(num < MAX) {stu[num] = input_stu();output_stu(num);num++;puts(“追加成功!”);}else puts(“记录已满,无法追加!”);break;case ‘3’: // 删除i = find_stu();if (-1 != i) {if (confirm(“确认删除?”)) {while (i++ != num) {stu[i-1] = stu[i];}num–;puts(“删除成功!”);}}break;case ‘4’: // 修改i = find_stu();if (-1 != i) {stu[i] = input_stu();output_stu(i);puts(“修改成功!”);}break;(i = ( stu[j].sum < stu[j+1].sum ) {Stu_t t = stu[j];stu[j] = stu[j+1];stu[j+1] = t;}puts(“排序成功!”);: // 显示for (i = 0; i < num; i++) {printf(“%4d:\t”, i+1);output_stu(i);}break;case ‘7’: // 保存write_stu(filename);break;(confirm(“推出前保存?(Y/N)”)) {write_stu(filename);}exit(0);default:puts(“没有该序号!请重新输入”);break;}} ;}void safe_flush(FILE *fp){int ch;while ( ch = fgetc(fp), ch != EOF && ch != ‘\n’);}int confirm(const char *words) {char choice;puts(words);for (;;) {choice = getchar();safe_flush(stdin);switch (choice) {default:puts(“输入非法,重新输入!”);continue;case ‘Y’:case ‘y’:puts(“已确认!”);return 1;case ‘N’:case ‘n’:puts(“已取消!”);return 0;}}}Stu_t input_stu(void) {Stu_t ret;puts(“依次输入姓名、语文、数学、外语成绩,空格分隔,成绩要求是整数:”);while ( 4 != scanf(“%s%d%d%d”, ret.name,&ret.score[0],&ret.score[1],&ret.score[2])) {safe_flush(stdin);puts(“输入有误,请重新输入!”);}safe_flush(stdin);ret.sum = ret.score[0] + ret.score[1] + ret.score[2];return ret;}void output_stu(int i) {if (i < 0 || i > MAX) return;printf(“%s\t语:%d\t数:%d\t外:%d\t总分:%d\n”,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum);}int find_stu(void) {char name[NAME_LEN];int i;printf(“输入姓名(限%d个字符):”, NAME_LEN);scanf(“%s”, name);safe_flush(stdin);for (i = 0; i < num; i++) {if (0 == strcmp(stu[i].name, name)) {output_stu(i);return i;}}puts(“没有找到记录!”);return -1;}void read_stu(const char *filename) {FILE *fp = fopen(filename, “rt”);if (NULL != fp) {fread(&num, sizeof(int), 1, fp);fread(stu, sizeof(Stu_t), num, fp);}fclose(fp);}void write_stu(const char* filename) {FILE *fp = fopen(filename, “wt”);if (NULL != fp) {fwrite(&num, sizeof(int), 1, fp);fwrite(stu, sizeof(Stu_t), num, fp);fclose(fp);puts(“保存成功!”);}else puts(“打开文件失败!”);}

伟人所达到并保持着的高处,并不是一飞就到的,

大四重写大一的C语言大作业是一种怎样的体验

相关文章:

你感兴趣的文章:

标签云: