C语言课程设计报告-选题8学生籍贯信息记录簿(共28页).docx
精选优质文档-倾情为你奉上目 录专心-专注-专业第1章 课题分析1.1软件的目的课程设计题目:学生籍贯信息记录簿;该软件主要是编辑一个学生籍贯信息记录簿每个学生信息包括:学号、姓名、籍贯。具体功能:(1) 创建信息链表并以磁盘文件保存;(2) 读取磁盘文件并输出所有学生的籍贯信息;(3) 按学号或姓名查询其籍贯(4) 按籍贯查询并输出该籍贯的所有学生(5) 能添加、删除和修改学生的籍贯信息(6) 显示输出四川籍和非四川籍的所有学生的信息并可分别存盘. 1.2各项功能分析(1)学生基本信息的录入:这部分的功能主要包括信息的录入,首先按程序提示输入学生的学号,接着是分别输入有关学生的相关信息包括姓名、籍贯等。在录入数据的同时,系统将对信息的合法性进行检验,若用户录入了不合法的数据系统将会作出提示,并且要求重新输入。如果合法性成立则录入完毕后系统将返回主业面。主业面中还有显示学生全部信息,按学号和姓名查询,输出四川籍和非四川籍的学生,退出等功能,并且这些函数用后的信息都会写到你所指定的文本文件中。(2)显示学生信息: 此功能是将原录入的学生信息读出,并在屏幕上显示出来,并且录入到你所指定的文本文件中。(3)学生信息读取: 进入该项功能界面后,用户可以对学生的个人信息进行查看,并且录入到你所指定的文本文件中。(4)按学号或姓名查找学生信息: 此项功能可以根据用户输入的选择查出该学生的所有信息。并且录入到你所指定的文本文件中。(5)删除和修改个人信息: 选择次项功能后,系统将自动在屏幕上显示按姓名学号录入原来同学的个人信息,输入后进行修改,并且录入到你所指定的文本文件中。(6)显示输出四川籍和非四川籍的所有学生的信息: 选择此项功能后,系统将自动在屏幕上显示四川籍学生分为一组,非四川籍学生分成一组。(7)退出系统,结束任务。第2章 软件设计环境与原理2.1软件设计环境Microsoft Visual C+ 6.02.2各项功能(模块层次图):该软件主要组成模块和各个模块之间的调用关系如图2-1:学生籍贯信息记录簿系统 主菜单 主函数(在主函数调用的框架函数中包含以下所有函数) 按籍贯查询并输出该籍贯的所有学生显示输出四川籍和非四川籍的所有学生的信息并可能添加、删除和修改学生的籍贯信息学生信息查找与读取取 按学号或姓名查询其籍贯数据的显示与读取学生基本信息录入 退出系统 图2-1模块层次图2.3 各函数程序流程图Main()流程如图2-2所示:图2-2 Main()程序流程图Save2()流程如图2-3所示:图2-3 Save2()程序流程图Input()流程如图2-4所示:图2-4 Input()程序流程图Save1()流程如图2-5所示:图2-5 Save1()程序流程图Display()流程如图2-6所示:图2-6 Display()程序流程图Find()流程如图2-7所示:图2-7 Find()程序流程图Modify()流程如图2-8所示:图2-8 Modify()程序流程图Readfile()流程如图2-9所示:图2-9 Readfile()程序流程图Dis()流程如图2-9所示:图2-10 Dis()程序流程图第3章 详细设计及程序实现3.1 程序采用主要的结构类型分析该程序采用的是结构体类型来处理学生的所有基本信息,如下所述。包含的库函数有:#include<stdio.h>#include<string.h>#include<windows.h> /用于界面的设计#include <stdlib.h> /文件的使用 包含的函数有:main() /主函数 recordplatform() /系统标题函数 xuanzekuangjia() /选择框架函数 tuichuxitong() /0.退出学生籍贯管理系统函数 shuruxinxi() /1.输入学生信息函数 Xianshixinxi() /2.显示信息函数 xinxitongji() /3.学生信息统计函数 xiugaishanchuxinxi()/4.学生信息修改删除函数 tiaojianchaxun() /5.学生条件查询函数 tiaojianshuchu() /6.条件输出函数 gengxinxinxi() /7.更新学生信息函数3.2 程序中各函数分析表3-1 程序中的函数列表(1)main()该函数的主要功能是调用其他8个函数来实现主菜单的5项功能,通过switch选择语句选择操作,然后通过调用各种函数实现调用: scanf("%s",&choose); switch(choose) case '1':Input();Save1();break; case '2': Readfile();Display();break; case '3':Find(1);Readfile();break; case '4': Find(0); Readfile();break; case '5':Readfile(); Dis();break; default:printf("输入错误,请重新输入:n");(2)Input()该函数的功能是输入信息。输入结束的条件是输入”EXIT”,用了一个strcmp()实现了字符串的比较:void Input() /输入信息 n=0;doprintf("请输入第%d个学生信息,输入EXIT结束输入(输入格式:学号 姓名 籍贯)n",n+1);scanf("%s",stun.num);if(strcmp(stun.num,"EXIT")=0) break;scanf("%s",stun.name);scanf("%s",stun.address);n+;while(1);(3)Display()该函数的功能是读取最初输入的信息并显示,具体实现如下:void Display() /2.读取信息并显示 int i;printf(" 学号 姓名 籍贯:n");for(i=0;i<n;i+) printf("%5s %5s %5sn",stui.num ,stui.name ,stui.address);(4)Readfile()该函数的功能是读取文件student.dat的信息, 利用fscanf()函数输入信息,如下:fscanf(fp,"%s%s%s",stun.num,stun.name,&stun.address);(5)Modify(int i)() 该函数的功能是修改第i个学生的姓名和籍贯,通过结构体成员stu的替换实现,如下:for(i=t;i<n-1;i+)stui=stui+1;n-;(6)Save1()将最初输入的内容存档到student.dat文件中,利用了格式化输出实现功能,如下:for(i=0;i<n;i+) fprintf(fp,"%s %s %sn",stui.num,stui.name,stui.address);/用格式化输出函数输出内容到student.dat(7)Save2()该函数的功能是传送格式化输出到student.dat文件,如下:void Save2(int t) /传送格式化输出到student.dat文件中FILE* fp;fp=fopen("student.dat","w"); /以只写的方式打开文件fprintf(fp,"%s %s %sn",stut.num,stut.name,stut.address);/格式化输出:学号姓名地址fclose(fp);(8)Dis()该函数的功能是显示输出四川、非四川学生信息,显示的两个都分别用了strcmp用于字符串大小比较来实现功能,如下:for(i=0;i<n;i+)if(strcmp(stui.address,"四川")=0)/比较字符串大小printf("%s %5s %5sn",stui.num,stui.name,stui.address);printf("n");printf("n");printf("非四川学生:n");printf("学号 姓名 籍贯n");for(i=0;i<n;i+)if(strcmp(stui.address,"四川")!=0)printf("%s %7s %5sn",stui.num,stui.name,stui.address);(9)Find(int i)该函数的功能是按学号或姓名查询籍贯,首先用了一个if选择语句用于选择按学号或者姓名查询,之后用了strcmp()用于查找符合条件的信息,如下:void Find(int f) /3.按学号或姓名查询籍贯int i;int choose,k;char ans50; /定义字符串型数组,用于查找doprintf("1.按学号查询n");printf("2.按姓名查找n");printf("3.返回主菜单n");scanf("%d",&choose);if(choose=1|choose=2)printf("请输入姓名或学号n");scanf("%s",ans);k=-1;if(choose=1)for(i=0;i<n;i+)if(strcmp(ans,stui.num)=0) k=i;break;else for(i=0;i<n;i+) if(strcmp(ans,stui.name)=0) k=i;break; if(k=-1) printf("不存在该学生信息n");else if(f=1)printf("%s %s %sn",stuk.num,stuk.name,stuk.address);else Modify(k);/执行修改第t个学生的姓名和籍贯的函数else return;while(1);第4章 问题与解决编写程序的过程中遇到了很多问题,但是通过询问老师和与同组同学讨论都一一解决了,这些问题主要是以下几种类别:一、对题目的要求的理解Q1:一开始仔细查阅资料和思考,还是难以构架出各软件模块之间的调用方式;A1:程序中各个模块之间的调用方式主要是通过函数的调用实现的。先使用主函数调用框架函数,然后在框架函数中调用不同功能的函数,达到对学生信息管理的目的;Q2:之后又有一个问题就是各种数据保存的方式以及格式;A2:本学生信息系统将能自动把输入的学生信息保存为C:/1 .txt文件中,在文件的读取时,系统将能自动把该二进制文件读出,并在屏幕上显示出学生信息。前提是必须在C盘中创建1 .txt文件。;二、程序实现时遇到的问题Q1程序的主页面,供使用者选择任务。如何实现在输入任务是必须选择1-5这几个数字,如果输入字母或别的数字则会出现错误提示?;A1:解决方案:先用判断数字的方式只取1-5这几个数字,别的数字错误。同时用while(s=getchar()!='n');语句吃掉字母,从而解决上面的错误;第5章 程序测试图5-1利用#include<windows.h>设计的界面图5-2程序的主页面上面是我设计的程序的主页面,供使用者选择任务。在输入任务是必须选择1-5这几个数字,如果输入字母或别的数字则会出现下面的错误提示:图5-3 错误提示图5-4 输入信息的界面上面是输入信息的界面和代码:输入信息是只能按提示输入,否则输入错误。图5-5 退出输入姓名可以输入字母,数字和别的字符。输入EXIT可以结束输入。图5-6显示的信息界面上面是输入学生信息后显示的信息界面和代码。图5-7查询界面上面是按学号和姓名查询出的结果。图5-8错误时的界面如果输入错误则出现以上界面图5-9修改学生信息的画面上图便是修改学生信息的画面,一切按画面提示来操作图5-10显示是否为四川籍的界面上面画面是输出四川和非四川的学生。第6章 总 结学习C这门课程已经两个学期了,就向人们所说的那样,的确不容易学好。我以前没有从事程序设计的实际经验,而且觉得将来也不一定是C专业开发人员,所以对于学习C的目的是什么,以及应该学到什么程度都没有很明确的目标,一直就是跟着课程教学计划按部就班的进行着:上课上机写报告,而且还觉得自己学的还不错,自己可以写一些简单的程序,复杂的程序经过钻研也能看懂。但是这次的课程设计让我看到自己原来的想法有多么荒唐,而且这一周的学习让我认识到很多C语言的内在要素:1、程序设计语言是程序设计的工具。这是我通过三周课程设计深深体会的一点,并且发现如果想有效的进行程序设计,正确地应用程序设计语言表达算法,必须准确的运用程序设计语言,掌握其语法知识。2、学习程序设计必须重视时间环节,多读程序,多编写程序,多上机实践。这次的课程设计就使得课堂教学、式样和实践之间的关系更为紧密。对我的学习有着很深远的影响。3、我发现作为一个程序设计人员,需要掌握面向过程的程序设计,也要掌握面向对象的程序设计。从前,人们通过C语言学习面向过程的程序设计,再通过C语言学习面向对象的程序设计。其实C语言并不是纯粹的面向对象的语言,它是一种混合语言。学习C语言既可以编写面向过程的程序,也可以编写面向对象的程序。这一点是我通过可课程设计所的实践发现的。4、深切的感受到了C语言语法的复杂,内容的繁多。发现如果对它缺乏系统的了解,将难以真正的运用,编出来的程序错误百出,编译出错,事倍功半。这次的C语言课程设计很快就要结束了,想说的是,这一周实践所学到的东西比我一个学期在教室学到的东西要多。 参考文献1 谭浩强,C+语言程序设计(第二版).北京:北京清华大学出版社,2008.3.2 谭浩强,张基温.C语言程序设计教程(第三版).北京:高等教育出版社,2008.4. 3 Beck Zaratian.Microsoft Visual Visual C+ 6.0程序员指南(第一版).北京:北京希望电脑公司出品,19984Richard C.Leinecker,Tom Archer. Visual C+ 6 宝典(第二版).北京:电子工业出版社,19995 李强,贾云霞. Visual C+项目开发实践.北京:中国铁道出版社,2004附录:源代码清单#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<windows.h> /开始界面#define MAX 50 /宏定义最多输入人数typedef struct char num50; char name50; char address50;Student; /定义了一个新的结构体类型StudentStudent stuMAX; /定义结构体型数组int n; /定义一个全局变量,表示第n个学生int t;int s=0;void Input(); /输入信息void Display(); /2.读取最初输入的信息并显示void Readfile(); /读取文件student.dat的信息void Modify(int i); /4.修改第i个学生的姓名和籍贯void Save1(); /将最初输入的内容存档到student.dat文件中void Save2(); /传送格式化输出到student.dat文件void Dis(); /5.显示输出 四川,非四川 学生信息void Find(int i); /3.按学号或姓名查询籍贯 void main()char choose;doif(s=0)int M=35;Sleep(1); printf("n");printf("现在载入完成n");Sleep(200);printf("n"); printf("n"); Sleep(10);printf("n");Sleep(10);printf(" 欢迎大家进入-【郑林儒】-籍贯管理系统n");Sleep(200); /延时 system("pause"); /暂停 system("cls"); /清屏 fflush(stdin); /清空输入缓冲区s+; printf(" *");printf(" 1.输入信息并存档n"); printf(" 2.读取信息并显示n");printf(" 3.按学号或姓名查询籍贯n");printf(" 4.修改(删除)指定姓名或学号的学生的姓名和籍贯n"); printf(" 5.显示输出 四川,非四川 学生信息n");printf(" *");printf("n");scanf("%s",&choose); switch(choose)case '1':Input();Save1();break;case '2':Readfile();Display();break;case '3':Readfile();Find(1);break;case '4':Readfile();Find(0);break;case '5':Readfile();Dis();break;default:printf("输入错误,请重新输入:n"); while(1);void Save2(int t) /传送格式化输出到student.dat文件中FILE* fp;fp=fopen("student.dat","w"); /以只写的方式打开文件fprintf(fp,"%s %s %sn",stut.num,stut.name,stut.address);/格式化输出:学号姓名地址fclose(fp);void Input() /输入信息 n=0;doprintf("请输入第%d个学生信息,输入EXIT结束输入(输入格式:学号 姓名 籍贯)n",n+1);scanf("%s",stun.num);if(strcmp(stun.num,"EXIT")=0) break;scanf("%s",stun.name);scanf("%s",stun.address);n+;while(1);void Save1() /将最初输入的内容存档到student.dat文件中int i;FILE* fp;if(fp=fopen("student.dat","a+")=NULL)/以读写的方式打开student.dat文件fp=fopen("student.dat","w"); /以只写的方式打开student.dat文件for(i=0;i<n;i+) fprintf(fp,"%s %s %sn",stui.num,stui.name,stui.address);/用格式化输出函数输出内容到student.datfclose(fp);void Display() /2.读取信息并显示 int i;printf(" 学号 姓名 籍贯:n");for(i=0;i<n;i+) printf("%5s %5s %5sn",stui.num ,stui.name ,stui.address);void Find(int f) /3.按学号或姓名查询籍贯int i;int choose,k;char ans50; /定义字符串型数组,用于查找doprintf("1.按学号查询n");printf("2.按姓名查找n");printf("3.返回主菜单n");scanf("%d",&choose);if(choose=1|choose=2)printf("请输入姓名或学号n");scanf("%s",ans);k=-1;if(choose=1)for(i=0;i<n;i+)if(strcmp(ans,stui.num)=0) k=i;break;else for(i=0;i<n;i+) if(strcmp(ans,stui.name)=0) k=i;break; if(k=-1) printf("不存在该学生信息n");else if(f=1)printf("%s %s %sn",stuk.num,stuk.name,stuk.address);else Modify(k);/执行修改第t个学生的姓名和籍贯的函数else return;while(1);void Modify(int t) /4.修改第t个学生的姓名和籍贯int choose;int i;printf("1.删除n");printf("2.修改n");scanf("%d",&choose);if(choose=1) for(i=t;i<n-1;i+)stui=stui+1;n-;else printf(">>>>请重新输入该学生信息:n");scanf("%s %s %s",stut.num,stut.name,&stut.address); Save2(t); /传送修改过的格式化输出到student.dat文件中void Readfile() /读取文本文件student.dat的信息FILE *fp;if(fp=fopen("student.dat","r")=NULL) return ;/以只读的方式打开student.dat文件n=0;while(!feof(fp) /判断文件指针是否指向文件结束处 fscanf(fp,"%s%s%s",stun.num,stun.name,&stun.address);/利用fscanf()函数输入信息n+;fclose(fp);void Dis() /5.显示输出 四川,非四川 学生信息int i;printf("四川学生:n");printf("学号 姓名 籍贯n");for(i=0;i<n;i+)if(strcmp(stui.address,"四川")=0)/比较字符串大小printf("%s %5s %5sn",stui.num,stui.name,stui.address);printf("n");printf("n");printf("非四川学生:n");printf("学号 姓名 籍贯n");for(i=0;i<n;i+)if(strcmp(stui.address,"四川")!=0)printf("%s %7s %5sn",stui.num,stui.name,stui.address);