我是想聊一聊这段时间的课设经历的 我拿到的题目是班级档案管理系统 基本的功能就是增删改查 保存到文件里,由于刚开始着实项目时,对c语言文件这一块的知识可以说是完全不了解,所以在整个设计思路上出现了问题。开始先着手写添加学生信息的功能,开始学习结构体数组,去百度学生的各类信息的数据类型,其中对于字符串数据类型里面的长度不是很理解,只知道大一点好,例如char name[20],我只知道一个汉字是占两个字符,但我不理解这个数组长度20的具体意义,就这样稀里糊涂的尽可能写大点。其次,开始对于结构体也不是很了解,了解后觉得结构体的好处就是可以讲不同类型的数据存放在一个房间里面,把这些不同类型的数据绑在一起。结构体和结构体数组,结构体数组[]里面的数字是什么意思,目前我觉得它可能代表有几个这样的结构体数组,但其实可能理解有误,依旧理解不是很通透。
开始是这样想的,在键盘上输入用户信息,然后将信息保存到结构体数组里面,就实现了录入。其次,在执行显示功能时,再利用循环将结构体数组里面的数据输出,显示到屏幕上,实现显示功能。然后就是保存到文件功能,先是通过一篇文字去学习了文件,FILT*fp;fp=fopen("student.txt","w");打开文件在将信息写入文件里面的时候,一开始是使用fwrite函数写入,但fwrite函数写入到文件里面是二进制乱码,但我想从文件里面输出的时候转化为文本就ok,即通过fread函数,但写好函数后,在运行中总会出现乱码,效果很不理想,这里对文件里面的这两个函数不熟悉(但是淘宝所写出来的程序也是用这两个函数,但是它文本文件里面显示的是文本,而不是二进制乱码,同时每次都可以正确从文件里面读出数据到链表,值得去学习反思),后来又去了解了fprint函数和fscanf函数,通过fprintf可以写入文本文件,不是乱码,但好像这个函数相比于fwrite函数在输入格式上要求更严格,具体也不是很清楚。这里对于从文件里面读出数据到链表或者结构体不会,不管是fscanf函数还是fwrite函数。保存功能实现后,先跳过了删除和修改,因为要用链表去实现,查询功能的设计,利用字符串比较函数strcmp遍历结构体数组,找到匹配的学生时,输出该结构体数组的所有信息,查询功能也解决。
补充,最开始设计的是菜单,通过switch-case让用户选择功能,每一个case里面实现一个功能,调用功能函数,但是难在每次执行完一次功能函数后要求返回主菜单界面,而选择g功能选项时要求跳出系统,int k=1;while(k){menu();}case a:preserve();break;我想的是break跳出switch后,k的值依然为1,继续循环,重新进入菜单函数,然后case g:k=0;break;这里给k赋值0进而跳出循环,结束。但是会报错,似乎是k的定义出现了错误,这里对变量的宏定义,全局变量,局部变量,变量定义的位置的影响等都不清楚。
后来,开始做删除和修改功能,要使用链表,但是键盘输入的学生信息我已经保存到结构体数组里面了,所有我想要把结构体数组里面的信息再赋给链表,使用字符串赋值函数,实现了链表里面的数据赋值给结构体,但是在后面功能使用时,会出现错误(不理解),第二天问老师,给了我新思路,同一个程序里面,链表的使用和结构体的使用并不冲突,是要先把录入的信息保存到文件里面,然后每次执行一个功能前,要先把文件里面的数据读取出来,存放到链表或者结构体数组里面。如果你该功能要求用链表实现,你就从文件里面读出数据存放到链表,结构体亦然。这个思路真的是让我迷糊灌顶,但上文也说了,自己对于从文件里面读出数据不会,因此又遇到瓶颈止步了,但淘宝那个思路很正确,就与上文老师所说思路大同小异(先定义了文件读出函数,每次使用功能前先调用)。
同时,对于功能函数里面的return语句很不会,不理解return会回到哪里!!!这个要去着重去学!!
总之,不管是用结构体数组实现还是链表还是结构体数组和链表的结合使用,都是可以解决该项目的,对于项目开始的整体把握设计思路就有错误,没有一个宏观的设计,只是忙于敲代码,回头看来,对于c的循环,数据类型,文件,结构体,指针,链表等各个板块都是有一定问题的,需要去学习,去深入理解,查漏补缺。