基于C语言的饭卡程序

Haggard

发布日期: 2019-08-02 18:03:16 浏览量: 95
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

第1部分 实训题目与要求

1. 问题提出

饭堂用饭卡卖饭,不仅提高卖饭速度,还通过计算机管理,提高了管理效率和管理质量。

2. 功能要求

重复显示如图所示的主菜单,在主菜单中选择任意一项,均实现相应功能。

在主菜单中选择1,建立名为card.dat的文件,并在其中添加若干人的饭卡号、姓名、金额、挂失信息,要求饭卡号是唯一的。

在主菜单中选择2,要求用户输入饭卡号、饭费,然后系统自动从该人的饭卡中减去饭钱,并分别显示买饭前后的金额,如果原来饭卡中的余额不足5元,则不能买饭,而且显示“余额不够,请续钱!”,如果挂失信息为真,则显示“本卡已冻结!”。

在主菜单中选择3,要求用户输入饭卡号、续钱额,续钱完成后分别显示续钱前后的金额。

在主菜单中选择4,添加新饭卡,这时要求新饭卡号和已有的饭卡号不能重号。

在主菜单中选择5,注销旧饭卡。

在主菜单中选择6,要求用户输入饭卡号和挂失信息,然后更新该饭卡的挂失信息。

在主菜单中选择7、8、9,此项功能学生自由发挥,根据本组爱好增加与本题目相关的新功能。

在主菜单中选择0,显示结束信息(如“感谢使用本软件!已正常退出,按任意键结束!”),按任意键后,退出本系统。

第2部分 设计实训题目功能

1. 总体设计

2.算法设计

2.1 Input_Choice

2.2 Build_File

2.3 Creat_new

2.4 Start_Card

2.5 Insert_Card

2.6 Use_Card

2.7 Charge_Money

2.8 Delete_Card

2.9 Lost_Card

2.10 Search_Card

2.11 Sort_Card

2.12 Print_Card

2.13 Open_File&Close_File

3. 数据结构

  1. #define C card_imf
  2. #define S struct
  3. #define I int
  4. S C
  5. {
  6. long number;
  7. char name[20];
  8. double money;
  9. I lost;
  10. S C *next;
  11. };

在这个数据结构中,以long型定义的number表示饭卡号,char型定义的name代表学生的姓名,double型money代表饭卡中的余额,int型lost代表饭卡是否挂失。

4. 程序代码设计

4.1 Input_Choice

用for循环+if\else语句把可视化框架打出来,接收用户的返回值赋给主函数中的switch语句。

4.2 Build_File

从无到有新建一个“card.dat”文件。

4.3 Creat_new

从内存上动态分配若干个长度为该结构数组的空间作为链表,把存储介质上 “card.dat”文件中的数据导入链表。

4.4 Start_Card

初次运行程序时输入的初始数据,由于不存在数据赋给头指针,若直接运行函数“Insert_Card”会造成错误,即群龙无首,所以增加“Start_Card”函数避免此问题。

4.5 Insert_Card

在通过“Start_Card”函数创建完成第一个结构数组的数据后,通过此函数创建更多的学生数据。

4.6 Use_Card

首先这个函数会调用“Check_Card”函数扫描一遍学生数据,判定该饭卡信息是否存在;如果不存在输出“饭卡不存在!”。如果存在,系统自动从该人的饭卡中减去饭钱,并分别显示买饭前后的金额,如果原来饭卡中的余额不足5元,或余额低于当前消费额,则不能买饭,并显示“余额不够,请续钱!”,以及如果挂失信息为真,则亦不能消费,并显示“本卡已冻结!”。

4.7 Charge_Money

首先这个函数会调用“Check_Card”函数扫描一遍学生数据,判定该饭卡信息是否存在;确定存在后会让用户输入充值额,充值后会显示充值前后的余额。以及如果挂失信息为真,则不能充值,并显示“本卡已冻结!”。

4.8 Delete_Card

首先这个函数会调用“Check_Card”函数扫描一遍学生数据,判定该饭卡信息是否存在;确定存在后使该行信息脱离链表,即删除该饭卡的信息,输出“旧饭卡注销成功!”。

4.9 Lost_Card

首先这个函数会调用“Check_Card”函数扫描一遍学生数据,判定该饭卡信息是否存在;确定存在后再输出此卡的挂失状态,由用户变更此卡的挂失状态。

4.10 Search_Card

首先这个函数会调用“Check_Card”函数扫描一遍学生数据,判定该饭卡信息是否存在;确定存在后输出该饭卡信息。

4.11 Sort_Card

由用户决定将所有信息升序&降序排列,程序将用“选择排序法”对所有链表信息进行排序,排完后将链表中的数据输出到“card.dat”文件。

4.12 Print_Card

遍历饭卡文件,输出到屏幕。

4.13 Open_File&Close_File

各函数打开“card.dat”文件的方式不同,由各函数传回的openmode决定以何种方式打开文件;开关文件若不成功,输出相应的提示语。

5. 测试与调试

测试数据类型 测试数据合法性 测试数据 预期结果 实测结果
Input_Choice 4 跳转至Insert_Card或Start_Card函数 跳转成功,下一步输入饭卡的详细信息
Input_Choice 10 清屏 清屏
Use_Card 任意数字(此时测试数据组饭卡余额为4) 无法消费并弹出“余额不足,请充值!”字样 与预期结果一致
Sort_Card 1 所有饭卡数据降序排列,输出“已按照您的选项进行排列!”字样 通过遍历函数输出后证明与预期结果一致
Sort_Card 3 输出“请输入正确的选项编号”字样 与预期结果一致
Search_Card (输入一个文件中不存在的饭卡编号) 输出“饭卡不存在!”字样 与预期结果一致

第3部分 实训总结

  • 通过宏定义有效减少了重复的定义名的输入,加快了编程效率;

  • 由于平时上课有认真听,课后也有更加深入地学习相关的编程知识,所以一路写下来基本没有遇到困难,唯一遇到的「群龙无首」问题也很快通过if-else语句解决了。

  • 本来想在遍历函数前写一个管理员身份验证的函数,但考虑到并没有什么卵用,毕竟“card.dat”整体未被加密,想看随时打开dat文件就能看了。再写一个验证步骤显得特别矫情。

  • 这里详细为大家讲解一下如何通过两个指针就能实现链表的冒泡排序:首先与对数组进行冒泡排序的思路一致,各相邻结构数组比较某个成员的大小,不符合当前大小排序条件的就两两互换;以按照饭卡号升序(由小到大)排列为例,整个链表中饭卡号最大的那个结构数组通过这样的交换会成为整个链表的最后成员,这样还剩余(所有成员数-1)个成员需要排列,这样使用双for语句嵌套循环即可完成对整个链表的排序。而指针扮演的是搬运工的角色:用p1、p2分别指向满足交换条件相邻的两个成员,然后把前一个成员的值赋给过渡成员temp,再让temp(前一个成员的值)的next指向后一个成员的next,再把后一个成员的值赋给前一个成员,把temp(前一个成员的值)的值赋给后一个成员,此时前后两个成员的值已经互换了,最后把前一个成员(值为之前的后一个成员)的next赋给后一个成员(值为之前的前一个成员)即可。这样p1、p2依然指向前后两个已经交换了位置的成员,相较于本人之前考虑直接断链再接时发生的p1、p2所指向的成员发生颠倒的情况,这种办法更为简洁有效。接下来p1、p2指向其对应的next,对下一组相邻的成员再次执行以上的成员交换,直到双循环结束。

  • 其实之前是想做出更好的可视化窗口的,但问了一圈各路编程大佬之后还是放弃了,他们异口同声地告诉我,现在学的C语言其实是在学核心算法,算法最重要,这些算法搞定了以后可以用其他比C更好的语言写可视化窗口。后来一想,其实道理确实是这样的,一开始我们可能做不出什么像模像样的软件,但这就是学习的必经之路,只有一步一个脚印扎扎实实把基础的编程思想学好了,以后才有能力去做那些复杂的工程。所以对于我个人而言,稍安勿躁,步步为营,把该学的学好才是重点,而不是急于求成地迫切想做出什么实质性的东西,就算做出来,也未必是最优的。

上传的附件 cloud_download 基于C语言的饭卡程序.zip ( 52.66kb, 4次下载 )
error_outline 下载需要5点积分

发送私信

所有的道别里,我还是最喜欢明天见

13
文章数
12
评论数
最近文章
eject