C语言综合作业.doc_第1页
C语言综合作业.doc_第2页
C语言综合作业.doc_第3页
C语言综合作业.doc_第4页
C语言综合作业.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2010冬季学期程序设计基础(C语言)综合作业【提交要求】综合作业是程序设计基础(C语言)课程的综合实验,作为课堂教学和课内正常上机实验的补充,大作业考核成绩占平时成绩的40%。综合作业采用分组形式,一般3人为一组,最多4人为一组,每组选择一个题目(可选择教师给的参考题目,也可自定题目),作业内容应要包含文件、链表、结构体、数组、函数等综合性的知识点,作业由小组共同完成,每个成员必须独立完成该作业的一个部分。 作业要求调试通过;最后上交时间不晚于教学周第10周的星期二。【基本信息】作业题目:学生信息管理系统开发工具:Vc6.0设计组人数:1设计组队名:Leo序号学号姓名学院分工说明百分比109121358崔凯环化学院全部内容100%说明:序号等同于作业内部排名,百分比总和为100%代码行数:551函数个数:19调试总述:基本能运行,但有一处问题序函数名称函数说明功能说明正确性1mainvoid main()主函数2menuvoid menu()打印主菜单3printstartvoid printstart()打印虚线4Wrongvoid Wrong()打印错误提醒5Nofindvoid Nofind()打印未找到提醒6printcvoid printc()打印成绩表头7printccvoid printcc()打印基本信息表头8printevoid printe(Node *p)打印成绩9printeevoid printee(Node *p)打印基本信息10Addvoid Add(Link l)添加学生11Qurvoid Qur(Link l)查询学生成绩12Qurrvoid Qurr(Link l)查询学生基本信息13Delvoid Del(Link l)删除学生信息14Modifyvoid Modify(Link l)修改学生信息15Tongjivoid Tongji(Link l)比较、显示学生成绩总体分布16Savevoid Save(Link l)保存17menuuvoid menuu()打印学生信息管理下的子菜单18managevoid manage(Link l)子菜单下的选项功能执行19scorepoinfloat scorepoint(int s)绩点运算技术点:一维数组 二维数组 函数 指针 结构体 链表 文件 其他算法点: 程序使用到的常规算法列表,如选择法排序,最大值,二分法查找等关键词: int,char,break,return,while,float,void,if,switch库函数: stdio.h stdlib.h string.h【问题定义】目标:实现学生信息的查找、添加、删除、修改、浏览、保存、从文件读取、查看奖学金信息8个功能,每个功能模块均能实现随时从模块中退出,而且可以选择不同的方式实现所需功能,从而完成一个学生管理系统所需功能。实际效果:8大功能基本能够完成。但奖学金信息不够完善,未继续分类为特等、一等、二等;对于退出设置,基本信息和成绩信息都是通过打印后return直接实现,未设置一选项实现“按XX返回上一级菜单”(未简便起见),只有信息管理子菜单,设置了此功能;还想实现对学生成绩的排序,但考虑到若排序则各科成绩、总成绩、平均绩点都要排序,稍微有点麻烦,所以只设置了一个“学生成绩总体对比”,对最高分进行浏览,缺陷在于成绩相同者,只能显示后者。【数据结构】主要运用了整型、字符型、实型(单精度float)、数组类型、结构体类型、指针类型、空类型。【模块与算法描述】由于此程序有19个函数,不能一一描述,所以选择一个模块进行描述。Del模块描述:定义整型变量sel,结构体指针p,r,字符串findmess20;如果所给链表l除”,假如选择按学号删除,在链表中找到相应指针p,由循环确定其上一级地址r,把r的next指向p的next,再释放p,即把p的空间删除掉了。假如没有找到相应指针p,则显示未找到。如果为按要求选择1或2,则显示出错。按姓名删除和按学号删除运行方式相同。【运行示例说明】举一简单事例说明:进入程序后 3 学生信息管理 3 添加学生信息 输入信息 保存学生信息 6 返回上一级菜单 1 学生基本信息查询 0 退出程序附图:【调试情况说明】 出现最大的问题是退出程序后在进入时,数据导入不进去,以至于查询不能正常运行。后来发现,原因是导入数据时指针的next不能指向下一个,陷入死循环,经修改把改成了同时把Locate函数里的r=l-next改成r=l,问题终于解决了。其他地方调试时,未出现异常。【参考文献与网站】c语言常见问题解答,易学,程序设计语言【原创性声明】此程序中部分函数为书上所见,经改编利用。个人编写成分居多。【个人心得与总结崔凯】此程序为学生信息管理系统,从寒假开始制作,学期第九周完成。虽然最终完成的系统不是尽善尽美,但作为一名化学工程专业的学生,已颇感欣喜。寒假起初的想法是做一个ATM系统,但身边不常见取款机,所以决定做一个学生信息管理系统,一方面可以完成作业,另一方面此系统也能用于班级成员或部门成员的信息管理,一举两得。工作开始之前,首先查找了很多相关资料,主要是两本书程序设计语言,c语言常见问题解答,二者皆有学生信息管理系统的制作练习,为本人的程序编写提供了丰富的理论基础。但缺陷在于,它们所用到的很多运行方式是我们未曾学过的,所以,回归教科书成为必然选择。整个制作过程中,遇到了很多问题。结构体、链表、文件尚未学习,只能摸索着自学,然后慢慢尝试。尤其是链表,很难理解,指针、地址的定义也非常模糊,不能做出正确的辨析。有时,提示XXX之前缺少“”,但实际上不缺少,以至于内心相当焦灼,不知何去何从。最大的问题在于数据的导入上,每次退出程序后再进入,已存有的数据就不能正常运行了,曾为了这个问题对着电脑发过一上午呆,还好最终一名计算机学院的同学帮我解决了这个问题,原来指针的指向上出现了问题。当然,平时也会出现一些让人哭笑不得的错误,例如,scanf里应该加&,比较简单的输入时,我们不会忘记,但scanf(“d%”,&p str.n)这种相对复杂的形式,往往会忘记加&。出现问题后,一遍遍查找,但始终不知错误所在,真得很纠结,它告诉我们c语言的确需要耐心。程序的编写虽然需要付出很多精力,可个人觉得也收获不少。不懂之处通过查阅书籍和询问他人得到解决后,自己顺便学到了相应知识点。Break是跳出循环,return是跳出函数,while(1)是无限循环,if(p)是p!=NULL,if(!p)是p=NULL,free(p)是释放p所申请的空间这些老师上课讲过,但未能理解的很清楚的内容,在编写过程中得到了巩固。当自己的某个想法运行通过时,那种成功的满足感又是让人如此神清气爽。所以,我经常和同学说,这次作业和一句话很匹配:痛苦并快乐着。个人觉得,本次程序编写自身态度比较端正,在总结教训和吸取经验的同时,确实成长不少。如果打分的话,那就取一个吉利的数字:86分,希望自己能够继续努力,在以后的学习生涯中做个持之以恒、有决心、有创意的小伙子。C语言不是我们的专业,但锻炼了我们的思维模式,期待着这种科学的头脑强化能在我们以后的生活中发挥其巨大的潜在效力。以下附: 源程序代码由于代码较长,复制粘贴后在形式上会有一定改变,望见谅(以c文件内容为准)。#include stdio.h #include stdlib.h #include string.h int shoudsave=0,count=0; struct student char num10;/* 学号 */ char name20; char sex10; int age;char home10;int cgrade; int mgrade; char scholarship;int egrade; int totle; int ave; ; typedef struct node struct student data; struct node *next; Node,*Link; float scorepoint(int s) if(s=90)return 4.0; if(s=85&s=82&s=78&s=75&s=72&s=68&s=66&s=64&s=60&sdata.num,,p-data.egrade,p-data.mgrade,p-data.cgrade,p-data.totle,p-data.ave); e=scorepoint(p-data.egrade);m=scorepoint(p-data.mgrade);c=scorepoint(p-data.cgrade);d=(e*4+m*6+c*5)/15;printf( 绩点 %.1f %.1f %.1f %.1fn,e,m,c,d); void printee(Node *p) printf(%-12s%s %s %d %s %cn,p-data.num,,p-data.sex,p-data.age,p-data.home,p-data.scholarship); Node* Locate(Link l,char findmess,char nameornum) /* 定位连表中符合要求的接点,并返回该指针 */ Node *r; if(strcmp(nameornum,num)=0) /* 按学号查询 这里课堂上没讲 c语言常见问题解答中见到的 */ r=l; while(r!=NULL) if(strcmp(r-data.num,findmess)=0) return r; r=r-next; else if(strcmp(nameornum,name)=0) /* 按姓名查询 */ r=l; while(r!=NULL) if(strcmp(,findmess)=0) return r; r=r-next; return 0; void Add(Link l) /* 增加学生 */ Node *p,*r,*s; char num10,tstr5; r=l; s=l-next; while(r-next!=NULL) r=r-next; /* 将指针置于最末尾 */ while(1) printf(请你输入学号(以0返回上一级菜单:); scanf(%s,num); if(strcmp(num,0)=0) /*字符串用双引号*/break; /*break是跳出循环、return是跳出函数体*/while(s) if(strcmp(s-data.num,num)=0) printf(提示:学号为%s的学生已经存在,若要修改请你选择 2 修改!n,num); printstart(); printc(); printe(s); printstart(); printf(n); return; s=s-next; p=(Node *)malloc(sizeof(Node); strcpy(p-data.num,num); /*与上面的strcpm对应*/printf(请你输入姓名:); scanf(%s,); printf(请你输入性别:); scanf(%s,p-data.sex); printf(请你输入年龄:); scanf(%d,&p-data.age); printf(请你输入祖籍:); scanf(%s,p-data.home); printf(请你输入c语言成绩:); scanf(%d,&p-data.cgrade); printf(请你输入数学成绩:); scanf(%d,&p-data.mgrade); printf(请你输入英语成绩:); scanf(%d,&p-data.egrade); printf(请你输入获奖学金情况(y/n):); gets(tstr);/*不知道为什么要加这个,不加会有警告,计算机学院同学检查时要求加.*/scanf(%c,&p-data.scholarship); p-data.totle=p-data.egrade+p-data.cgrade+p-data.mgrade; p-data.ave=p-data.totle / 3; /* 信息输入已经完成 */ p-next=NULL; r-next=p; r=p; shoudsave=1; printf(n); void Qur(Link l) /* 查询学生成绩 */ int sel; char findmess20; Node *p; if(!l-next) printf(n提示:没有资料可以查询!n); return; printf(n 1按学号查找n 2按姓名查找n); scanf(%d,&sel); if(sel=1)/* 学号 */ printf(请你输入要查找的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(tttt查找结果n); printstart(); printc(); printe(p); printstart(); else Nofind(); else if(sel=2) /* 姓名 */ printf(请你输入要查找的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) printf(tttt查找结果n); printstart(); printc(); printe(p); printstart(); else Nofind(); else Wrong(); void Qurr(Link l) /* 学生基本信息 */ int sel; char findmess20; Node *p; if(!l-next) printf(n提示:没有资料可以查询!n); return; printf(n 1按学号查找n 2按姓名查找n); scanf(%d,&sel); if(sel=1)/* 学号 */ printf(请你输入要查找的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(tttt查找结果n); printstart(); printcc(); printee(p); printstart(); else Nofind(); else if(sel=2) /* 姓名 */ printf(请你输入要查找的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) printf(tttt查找结果n); printstart(); printcc(); printee(p); printstart(); else Nofind(); else Wrong(); void Del(Link l) /* 删除 */ int sel; Node *p,*r; char findmess20; if(!l-next) printf(n提示:没有资料可以删除!n); return; printf(n 1按学号删除n 2按姓名删除n); scanf(%d,&sel); if(sel=1) printf(请你输入要删除的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else if(sel=2) printf(请你输入要删除的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else Wrong(); void Modify(Link l) Node *p; char findmess20; if(!l-next) printf(n提示:没有资料可以修改!n); return; printf(请你输入要修改的学生学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(请你输入新学号(原来是%s):,p-data.num); scanf(%s,p-data.num); printf(请你输入新姓名(原来是%s):,); scanf(%s,); getchar(); printf(请你输入新性别(原来是%s):,p-data.sex); scanf(%s,p-data.sex); printf(请你输入新的c语言成绩(原来是%d分):,p-data.cgrade); scanf(%d,&p-data.cgrade); getchar(); printf(请你输入新的数学成绩(原来是%d分):,p-data.mgrade); scanf(%d,&p-data.mgrade); getchar(); printf(请你输入新的英语成绩(原来是%d分):,p-data.egrade); scanf(%d,&p-data.egrade); p-data.totle=p-data.egrade+p-data.cgrade+p-data.mgrade; p-data.ave=p-data.totle/3; printf(n提示:资料修改成功!n); shoudsave=1; else Nofind(); void Tongji(Link l) Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */ Node *r=l-next; if(!r) printf(n提示:没有资料可以统计!n); return ; pm=pe=pc=pt=pa=r; while(r!=NULL) if(r-data.cgrade=pc-data.cgrade) pc=r; if(r-data.mgrade=pm-data.mgrade) pm=r; if(r-data.egrade=pe-data.egrade) pe=r; if(r-data.totle=pt-data.totle) pt=r; if(r-data.ave=pa-data.ave) pa=r; r=r-next; /*此处缺陷在于,成绩相同者,只能显示后者*/ printf(-统计结果-n); printf(总分最高者:t%s %d分n,,pt-data.totle); printf(平均分最高者:t%s %d分n,,pa-data.ave); printf(英语最高者:t%s %d分n,,pe-data.egrade); printf(数学最高者:t%s %d分n,,pm-data.mgrade); printf(c语言最高者:t%s %d分n,,pc-data.cgrade); printstart(); void Save(Link l) FILE* fp; Node *p; int flag=1,count=0; fp=fopen(c:student,wb); if(fp=NULL) printf(n提示:重新打开文件时发生错误!n); exit(1); p=l-next; while(p) if(fwrite(p,sizeof(Node),1,fp)=1) p=p-next; count+; else flag=0; break; if(flag) printf(n提示:文件保存成功.(有%d条记录已经保存.)n,count); shoudsave=0; fclose(fp); void menuu()printf(*); printf( 1 删除学生信息 2 修改学生信息 n); printf( 3 添加加学生信息 4 保存学生信息 n); printf( 5 学生成绩总体对比 6 返回上一级菜单 n);printf(*n); void manage(Link l)int sel,flag=0;char ch;while(1) menuu();scanf(%d,&sel);if(sel=0) if(shoudsave=1) getchar(); printf(n提示:资料已经改动,是否将改动保存到文件中(y/n)?n); scanf(%c,&ch); if(ch=y|ch=Y) Save(l); break; switch(sel) case 1:Del(l);break; /* 删除学生 */ case 2:Modify(l);break; /*修改学生信息*/ case 3:Add(l);break;/* 添加学生信息 */ case 4:Save(l);break; /* 保存学生 */ case 5:Tongji(l);break; /*学生成绩总体对比 */ case 6:fla

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论