本科生课程设计说明书
题 目:C语言课程设计
—— 学生基本信息管理系统
学生姓名:朱玉龙
学 号:1467159106
专 业:软件工程
班 级:软件一班
指导教师:周李涌
日 期:2015年1月9日
C语言课程设计实验报告
1.设计目的:
学生信息管理系统设计
学生信息包括:学号、姓名、年龄、电话号码、性别、出生年月、籍贯、QQ、专业、班级、奖惩信息等。试设计一学生信息管理系统,使之能提供以下功能:
1.系统以菜单方式工作
2.学生信息添加功能---输入
3.查询功能---算法
按学号查询
按姓名查询
4.学生信息的删除与修改
5.学生信息整表浏览功能---输出
2.总体设计:
程序设计组成框图
流程图
3.详细设计:
1>函数入口说明
menu()输出主菜单
load_info()载入函数:txt转为链表
add_info(STU*h) 增加学生信息
search_info(STU*h,int type) 搜索学生信息
delete_info(STU*h) 删除学生信息
update_info(STU*h) 修改学生信息
output_info(STU*h) 输出学生信息
preview_info(STU*h,int type) 预览学生信息
main() 主函数
2>调用关系
load_info() add_info(STU*h)
search_info() output_info()
main()
update_info ()
delete_info ()
preview_info () output_info()
3>参数说明
add_info(STU*h)、delete_info(STU*h)、output_info(STU*h)、preview_info(STU*h,int type) 、search_info(STU*h,int type) 、update_info(STU*h)、函数中的STU*h为传入的链表节点指针,type为搜索的方式:1为输出传入节点指针的一条学生记录,2为输出所有的学生记录。
4.调试与测试:
1>调用STU * load_info()函数(文件载入),读写出现乱码
解决方法:更改相应指针指向,及有关变量的初值设置。
2>边界测试
解决方法:用极端的或偏门的情况来探测和验证代码在处理时会发生什么。
3>执行窗口执行多次命令后显示过多,不利于输入指令及结果查看
解决方法:调用系统清屏函数system("cls");。
4>文件在打开和保存时有问题。
解决方法:调整文件的打开方式,从原来的单纯的w+修改为添加一个if语句,当没有文件时执行w+的操作,否则执行r+。避免了原存储文件被覆盖的问题。
5.源程序清单和执行结果:
#include #include #include //学生信息 结构体 typedef struct record{ char No[10]; char name[12]; unsigned int age; char sex[4]; char birth[10]; char qq[12]; char grade[20]; char phone[11]; char jg[100]; char jcxx[100]; struct record *next; }STU; //菜单函数 int menu(); //载入函数:txt转为链表 STU * load_info(); //增加学生 STU * add_info(STU *h); //搜索函数 STU * search_info(STU *h,int type); //删除学生 STU * delete_info(STU *h); //修改学生信息 void update_info(STU *h); //输出信息 void output_info(STU *h); //预览信息 void preview_info(STU *h,int type); void main() { STU *header=NULL,*sear=NULL;int cmd=1; system("title 学生信息管理系统"); //system("mode con cols=48 lines=25"); system("date /T"); system("TIME /T"); system("color 3E"); header=load_info(); //preview_info(header,2); cmd=menu(); while(cmd!=0) { switch(cmd) { case 0:break; //添加信息 case 1: header=add_info(header);output_info(header); break; //学号查询 case 2: sear=search_info(header,1); if(sear!=NULL) { preview_info(sear,1); } else printf("该学生不存在!\\n"); sear=NULL; break; //姓名查询 case 3: sear=search_info(header,2); if(sear!=NULL) { preview_info(sear,1); } else printf("该学生不存在!\\n"); sear=NULL; break; //按学号删除 case 4: header=delete_info(header); output_info(header); break; //修改 case 5: update_info(header); output_info(header); break; //整表输出 case 6: preview_info(header,2); break; default: printf("无效的命令!\\n请重新输入命令!\\n"); break; } if(cmd!=0) cmd=menu(); } } int menu() { int cmd=0; printf("\\n感谢赵亚琼同学对我课程设计的帮助\\n请输入命令:\\n\0:结束程序!\\n\1:添加记录!\\n\2:按学号查询!\\n\3:按姓名查询!\\n\4:按学号删除信息!\\n\5:按学号修改信息!\\n\6:整表浏览!\\n"); scanf("%d",&cmd); while(cmd<0 || cmd>9) { printf("无效的命令!\\n请重新输入:\\n"); scanf("%d",&cmd); } return cmd; } STU * load_info() { FILE *fp=fopen("d:\\\\stu.txt STU *h=NULL,*q=NULL,*p=NULL;char ch='0'; h=(STU *)malloc(sizeof(STU)); if(fp==NULL) { fpNew=fopen("d:\\\\stu.txt fclose(fpNew); return NULL; } rewind(fp); ch=fgetc(fp); if(ch==EOF) { return NULL; } else { rewind(fp); fscanf(fp,"%10s %12s %3d %11s %4s %10s %12s %20s %20s %20s",h->No,h->name,&h->age,h->phone,h->sex,h->birth,h->qq,h->grade,h->jcxx,h->jg); q=h; q->next=NULL; } ch=fgetc(fp); while(ch!=EOF) { p=(STU *)malloc(sizeof(STU)); p->next=NULL; fscanf(fp,"%10s %12s %3d %11s %4s %10s %12s %20s %20s %20s",p->No,p->name,&p->age,p->phone,p->sex,p->birth,p->qq,p->grade,p->jcxx,p->jg); ch=fgetc(fp); q->next=p; q=q->next; } fclose(fp); return h; } STU * add_info(STU *h) { FILE *fpin=fopen("d:\\\\stu.txt STU *stu,*p; p=h; stu=(STU *)malloc(sizeof(STU)); stu->next=NULL; system("cls"); if(h==NULL) { h=stu; printf("请输入学号:\\n"); scanf("%s",h->No); printf("请输入姓名:\\n"); scanf("%s",h->name); printf("请输入年龄:\\n"); scanf("%d",&h->age); printf("请输入籍贯: \\n"); scanf("%s",h->jg); printf("请输入手机号:\\n"); scanf("%s",h->phone); printf("请输入性别:\\n"); scanf("%s",h->sex); printf("请输入出生年月日:\\n"); scanf("%s",h->birth); printf("请输入qq:\\n"); scanf("%s",h->qq); printf("请输入专业班级: \\n"); scanf("%s",h->grade); printf("请输入奖惩信息: \\n"); scanf("%s",h->jcxx); } else { while(p->next!=NULL) { p=p->next; } p->next=stu; printf("请输入学号:\\n"); scanf("%s",stu->No); printf("请输入姓名:\\n"); scanf("%s",stu->name); printf("请输入年龄:\\n"); scanf("%d",&stu->age); printf("请输入籍贯: \\n"); scanf("%s",stu->jg); printf("请输入手机号:\\n"); scanf("%s",stu->phone); printf("请输入性别:\\n"); scanf("%s",stu->sex); printf("请输入出生年月日:\\n"); scanf("%s",stu->birth); printf("请输入qq:\\n"); scanf("%s",stu->qq); printf("请输入专业班级:\\n"); scanf("%s",stu->grade); printf("请输入奖惩信息: \\n"); scanf("%s",stu->jcxx); } fclose(fpin); return h; } STU * delete_info(STU *h) { STU *p,*q; char no[11]; p=h; if(p==NULL) { printf("\目前还没有信息记录!\\n"); return NULL; } else { printf("请输入一个学号:\\n"); scanf("%s",no); q=p->next; if(strcmp(h->No,no)==0) { printf("该学生信息已删除!\\n"); h=h->next; } else { while(q!=NULL) { if(strcmp(q->No,no)==0) { printf("\该学生的信息已删除!\\n"); p->next=q->next; return h; } else { p=q; q=q->next; } } printf("该学生不存在!\\n"); } return h; } } STU * search_info(STU *h,int type) { STU *p_temp=NULL,*q=h; p_temp=(STU *)malloc(sizeof(STU)); system("cls"); switch(type) { case 1: printf("\请输入一个学号:\\n\"); scanf("%s",p_temp->No); while(q!=NULL) { if(strcmp(q->No,p_temp->No)==0) return q; else q=q->next; } return NULL; break;//按学号查询 case 2: printf("\请输入一个名字:\\n\"); scanf("%s",p_temp->name); while(q!=NULL) { if(strcmp(q->name,p_temp->name)==0) return q; else q=q->next; } return NULL; break;//按姓名查询 default:return NULL;break; } } void update_info(STU *h) { STU *q=NULL; unsigned int cmd=1,rec=1; system("cls"); while(rec!=0) { q=search_info(h,1); if(q==NULL) printf("\该学生不存在,无法进行修改操作!\\n"); else { cmd=1; while(cmd!=0) { system("cls"); preview_info(q,1); printf("\\n\0:修改完成,回主菜单!\\n\1:修改该学生姓名!\\n\2:修改该学生年龄!\\n\3:修改该学生手机号!\\n\4:修改该学生性别!\\n\5:修改该学生生日!\\n\6:修改该学生qq号!\\n\7:修改该学生班级!\\n\8:修改下一个!\\n"); printf("请输入命令:\\n\"); scanf("%d",&cmd); switch(cmd) { case 0:cmd=0;rec=0;break; case 1: printf("\请输入学生新的姓名:\\n\"); scanf("%s",q->name); break; case 2: printf("\请输入学生新的年龄:\\n\"); scanf("%d",&q->age); break; case 3: printf("\请输入学生新的手机号:\\n\"); scanf("%s",q->phone); break; case 4: printf("\请输入学生新的性别:\\n\"); scanf("%s",q->sex); break; case 5: printf("\请输入学生新的生日:\\n\"); scanf("%s",q->birth); break; case 6: printf("\请输入学生新的qq号:\\n\"); scanf("%s",q->qq); break; case 7: printf("\请输入学生新的班级:\\n\"); scanf("%s",q->grade); break; case 8: cmd=0; break; }//switch结束 }//内层while结束 } }//外层while结束 }//函数结束 void output_info(STU *h) { FILE *fpin=fopen("d:\\\\stu.txt STU *q=NULL; q=h; if(q!=NULL) { fprintf(fpin,"%-10s %-12s %4d %11s %-4s %-8s %-11s %20s %20s %20s",q->No,q->name,q->age,q->phone,q->sex,q->birth,q->qq,q->grade,q->jcxx,q->jg); q=q->next; } while(NULL!=q) { fprintf(fpin,"\\n%-10s %-12s %4d %11s %-4s %-8s %-11s %20s",q->No,q->name,q->age,q->phone,q->sex,q->birth,q->qq,q->grade,q->jcxx,q->jg); q=q->next; } fclose(fpin); } void preview_info(STU *h,int type) { STU *p=NULL; p=h; system("cls"); switch(type) { case 1: printf("================================="); printf("\\n该学生的完整信息为:\\n\学号:%-10s\\n\姓名:%-12s\\n\年龄:%-4d\\n\电话:%-11s\\n\性别:%-4s\\n\生日:%-s\\\n\QQ号:%s\\\n\班级:%-s\\n",h->No,h->name,h->age,h->phone,h->sex,h->birth,h->qq,h->grade); printf("\\n\奖罚信息:%s\\n\籍贯:%s\\n",h->jcxx,h->jg); printf("================================="); break; case 2: if(p==NULL) { printf("文件中没有信息!\\n"); break; } printf("================================="); while(p!=NULL) { printf("\\n\学号:%-10s\\n\姓名:%-12s\\n\年龄:%-4d\\n\电话:%-11s\\n\性别:%-4s\\n\生日:%-s\\\n\QQ号:%s\\\n\班级:%-s\\n",p->No,p->name,p->age,p->phone,p->sex,p->birth,p->qq,p->grade); printf("\奖罚信息:%s\\n\籍贯:%s\\n",p->jcxx,p->jg); printf("================================="); p=p->next; } break; default:break; } } 6.实验心得: 1)对C语言的编程实践有所认识。 2)在遇到程序调试不通过时,会通过缩小范围的分析来锁定问题所在。 3)通过这次实验,熟悉了从自然语言转换成伪代码再转换为流程图的过程。 4)在程序中设定合适的全局变量,可以简化程序的编写难度。 5)运用函数可以减少编写时的代码量,也使程序条理清晰。 6)通过本次C语言上机实验,我们对这个介于人类与非人类之间的计算机编程语言有了一定的体验。随着实验的成功与报告的完成,有点微微的成就感使人难忘。伴随着学习的深入,我们发现高深的东西还有很多很多,等待着我们自己去挖掘。对C语言的学习,我们会加倍努力。