信息学院
课程设计Ⅰ报告
课程名称___C语言程序设计_ __
题目名称 学生学籍管理系统
学生学院_ 信息学院_ __ __
专业班级_ 计科12
学 号
学生姓名
指导教师_______ ___ __
2013 年12月26 日
目录
一、 设计目的与要求. 3
1.1 题目与设计要求. 3
1.2 本程序设计的知识点. 4
二、 功能设计. 4
2.1 总体设计. 4
2.2 详细设计. 5
4.1 测试结果及分析. 12
五、 总结. 14
六、参考文献. 14
一、 设计目的与要求
1.1 题目与设计要求
题目:学生学籍管理系统
目的:1、了解和熟悉Visual C++软件编程开发环境
2、熟练掌握结构化程序设计的步骤和模块化设计方法
3、熟练掌握C语言数据类型,熟记字符型数据和整形数据的定义和使用
4、熟练掌握用while语句、do…while语句和for语句实现循环结构程序设计的方法
5、掌握一维数组、二维数组的定义、赋值和输入输出的方法
6、掌握与数组有关的算法(特别是排序算法,熟练掌握冒泡排序法)
7、熟悉函数的定义、声明方法及全局变量和局部变量的概念与用法,掌握函数的调用方法
8、掌握结构体类型变量的定义和使用及结构体类型数组的概念和应用
设计要求:学生学籍信息管理系统设计
1、需求分析
学生基本信息、学生成绩基本信息要存入文件当中,因而要提供文件的输入输出操作;查询功能要求提供查找和显示操作;删除功能要求实现删除操作;排序功能要求实现排序操作;另外还应该提供键盘式选择菜单以实现功能选择。
2、总体设计
整个系统可以设计为数据录入模块、数据查询模块、数据删除模块和数据排序模块。
3、详细设计
设计学生基本信息和学生成绩基本信息结构体数组。
Struct
{
int stuNo; //学号
char name[20]; //姓名
char sex[2]; //性别
int domNum; //宿舍号
int tel; //电话号码
}StuInfo; //学生基本信息结构体
Struct
{
int stuNo; //学号
char courseNo; //课程编号
char courseName; //课程名称
int creditHour; //学分
Int triGrade; //平时成绩
Int experiGrade; //实验成绩
Int examGrade; //卷面成绩
Float totalGrade; //综合成绩
Float finalCreHour; //实得学分
}StuGraInfo; //学生成绩基本信息结构体
(1)数据录入模块:学生基本信息文件可以在磁盘建立,采用写文件方式录入学生成绩基本信息。综合成绩和实得学分通过计算得到。
(2)查询模块:通过菜单选择查询功能,再选择学生基本情况查询和成绩查询,若选择前者,再通过菜单选择学号、姓名或宿舍号码,按照基本查找算法查找A.TXT,然后把查找结果输出若选择后者,则先在A.TXT中查找学号对应的姓名,再在B.TXT中查找该学生的课程情况,并统计科目和实得总学分,输出结果。
(3)删除模块:通过菜单选择删除学生的功能,输入要删除学生的学号,则分别在A.TXT和B.TXT中查找该生信息,删除之;或者输入学生的姓名,先在A.TXT中得到该生的学号,删除该生信息,再在B.TXT中删除该学号对应的信息。注意:C语言中没有直接删除信息的函数,需要自己实现,可以采取读出数据,判断数据(如果不删除,则进入缓冲区,否则删除),写入数据(把缓冲区中的数据写入文件)的步骤进行。
(4)排序模块:通过菜单选择排序依据,采用排序算法(冒泡、插入、选择等)对数据进行排序并输出结果。
1.2 本程序设计的知识点
陈述开发过程中用到的知识点,如结构体、数组、指针等。
二、 功能设计
2.1 总体设计
其中包含数据录入模块、查询模块、删除模块、排序模块四大功能功能模块
2.2 详细设计
2.3分块设计
三、 程序实现
⑴利用了组合体的方式定义结构体数组,提供学生基本信息,定义如下:
typedef struct {
int Id; //学号
char name[10];//姓名
char sex[6]; //性别
int room; //宿舍号
int tel; //电话号码
} StudentInfo; //定义学生信息的结构体类型
⑵同时定义了另一结构体数组,提供学生成绩基本信息,定义如下:
typedef struct {
int Id;
char courseNo[10]; //课程编号
char courseName[20];//课程名
float a; // 课程学分
float b; // 平时成绩
float c; // 实验成绩
float d; // 卷面成绩
float e; // 综合成绩
float f; // 实际学分
} MarkInfo; //定义课程信息的结构体类型
使用以上结构体数组,使程序变得思路清晰,设计过程也变得相对简单。同时,定义并使用了如下函数,声明和定义
void ReadFile(); //读取文件
void DisplayMainMenu(); //显示主菜单
void DataInput(); //数据录入
void DataQuery(); //数据查询
void DataDelete(); //数据删除
void DataSort(); //数据排序
void QueryById(int ); //按学号查询
void QueryByRoom(int ); //按宿舍查询
void QueryMark(int ); //按成绩查询
void sort1(); //按综合成绩排序
void sort2(); //按实得学分排序
void markput(); //成绩输出
StudentInfo si[30]; // 学生信息结构数组
MarkInfo mi[150]; // 学生成绩结构数组
int sp=0; // 学生信息结构数组中学生数
int mp=0; // 学生成绩结构数组中成绩数
***************读 取 数 据 、 计 算 ***************
在这段功能模块中,利用指针变量来读取结构体数组文件中的相应信息,是程序的编写、阅读和运行变得简洁明了。此外,在这段程序中,还对文件中的数据按照题目的具体要求对综合成绩和学分做了自动计算。
void ReadFile( )
{
FILE *fp;
if((fp = fopen("A.txt","r"))==NULL)
printf("cant open the file\n");
while (!feof(fp))
{
fscanf(fp,"%d%s%s%d%d", &si[sp].Id,si[sp].name,&si[sp].sex,&si[sp].room,&si[sp].tel);
sp++;
}
fclose (fp);
fp = fopen("B.txt","r");
while (!feof(fp))
{
fscanf (fp,"%d%s%s%d%d%d%d",&mi[mp].Id,mi[mp].courseNo,mi[mp].courseName,&mi[mp].a,&mi[mp].b,&mi[mp].c, &mi[mp].d);
if (mi[mp].c == -1)
mi[mp].e = 0.3*mi[mp].b+0.7*mi[mp].d;
else
mi[mp].e = 0.15*mi[mp].b+0.15*mi[mp].c+0.7*mi[mp].d;
if ( mi[mp].e >= 90. ) mi[mp].f = mi[mp].a;
else if ( mi [mp].e >= 80. )
mi[mp].f = mi[mp].a *0.8;
else if ( mi[mp].e >= 70. )
mi[mp].f = mi[mp].a *0.75;
else if ( mi[mp].e >= 60. )
mi[mp].f = mi[mp].a *0.6;
else mi[mp].f = 0;
mp++;
}
fclose(fp);
}
*************** 显 示 主 菜 单 ***************
这部分是对本程序的主要功能做出的展示,体现了本程序的五大功能,简洁明白,一目了然。
Void DisplayMainMenu()
{
printf (“\n 1) 数据录入 \n 2) 数据查询 \n 3) 数据删除 \n 4) 数据排序 \n 5) 程序结束 \n “);
}
*************** 数 据 录 入 模 块 *******************
录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据,即对关于学生成绩基本信息的结构体数组进行输入,也就是文件B.TXT中的内容。
void DataInput()
{
FILE *fp;
int i;
printf ("学生的学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩\n");
while(1)
{scanf ("%d%s%s%d%d%d%d",&mi[mp].Id,mi[mp].courseNo,mi[mp].courseName,&mi[mp].a,&mi[mp].b,&mi[mp].c, &mi[mp].d);
if(mi[mp].Id==-1)break;
if (mi[mp].c == -1)
mi[mp].e = 0.3*mi[mp].b+0.7*mi[mp].d;
else
mi[mp].e = 0.15*mi[mp].b+0.15*mi[mp].c+0.7*mi[mp].d;
if ( mi[mp].e >= 90. ) mi[mp].f = mi[mp].a;
else if ( mi [mp].e >= 80. )
mi[mp].f = mi[mp].a *0.8;
else if ( mi[mp].e >= 70. )
mi[mp].f = mi[mp].a *0.75;
else if ( mi[mp].e >= 60. )
mi[mp].f = mi[mp].a *0.6;
else mi[mp].f = 0;
mp++;
}
fp = fopen("B.txt","r+");
for(i=0;i<mp;i++)
fprintf(fp,"%d%s%s%d%d%d%d",&mi[i].Id,mi[i].courseNo,mi[i].courseName,&mi[i].a,&mi[mp].b,&mi[i].c, &mi[i].d);
fclose(fp);
}
******************* 查 询 模 块********************
此段程序是为实现信息查询功能而设计的。总体来讲,分为两大功能模块,一是学生基本信息查询,二是对学生成绩的查询。在第一种查询,即对学生基本信息的查询中,又提供了两种查询方式,一种是按学号对学生基本信息进行查询,一种是按宿舍号码对学生基本信息进行查询。
Void DataQuery()
{
int x,y,z;
printf( “\n 1) 学生基本情况查询\n 2) 成绩查询\n”);--------------------------选择查询内容
scanf(“%d”,&x);
if (x == 1) // 查询学生信息
{
printf (“1) 按学号查询 2) 按宿舍查询\n”);-------------------------------选择查询方式
scanf(“%d”,&y);
if (y == 1 )
{
printf ( “ 输入学号\n”);-----------------------------------------------按学生学号查询
scanf (“%d”,&z);
QueryById(z);
}
if (y == 2)
{
}
if ( x ==2) // 查询成绩信息---------------------------------------查询学生成绩(输入学号)
{
printf ( “ 输入学号\n”);
scanf (“%d”,&y);
QueryMark(y);
}
}
****************** 删 除 模 块 *******************
此模块提供了按学号实现删除学生信息的功能,当在文件A.TXT中删除一个学生时,自动地在文件B.TXT中删除此人所有信息。
void DataDelete()
{
FILE *fp;
int x;
int i=0;
int k,d;
printf( "输入学号\n");
scanf( "%d",&x);
while( si[i].Id != x) i++;
if (i<sp-1)
{
for ( k=i; k<sp-1; k++)
{
si[k] = si[k+1];
}
}
if ( i<sp) sp--;
d = 0;
for (k=0;k<mp;k++)
{
if ( mi[k].Id == x ) d++;
else mi[k-d] = mi[k];
}
mp = mp - d;
fp = fopen("D:B.txt","r+");
for(i=0;i<mp;i++)
fprintf(fp,"%d%s%s%d%d%d%d",&mi[i].Id,mi[i].courseNo,mi[i].courseName,&mi[i].a,&mi[i].b,&mi[i].c, &mi[i].d);
}
*************** 排 序 模 块 ******************
利用void sort1()函数按计算所得的综合成绩进行排序。
void sort1()
{
int i,j;
MarkInfo t;
for (i=mp-1;i>=1;i--)
{
for (j=0;j<i;j++)
{
if (mi[j].e>mi[j+1].e)
{
t=mi[j];
mi[j] = mi[j+1];
mi[j+1] = t;
}
}
}
markput();
}
四、 测试分析
4.1 测试结果及分析
显示主菜单
数据录入功能。
对成绩进行录入
(2)查询功能,按学号进行查询
(3)排序功能按综合成绩排序
(4)删除功能
退出程序
五、 总结
这次学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来才能做好每一件事。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体、文件、指针等。为了解决问题,最好就是多向同学,老师请教。
六、参考文献
参考文献必须是在课程设计中真正阅读过和运用过的,文献按照在正文中的出现顺序排列。
[1] 谭浩强,《C语言程序设计》(第四版)[M],清华大学出版社,20##年
[2]谭浩强.编著.C程序设计题解与上机指导.北京:清华大学出版社,1992
[3]潭浩.田淑清编著.PASCAL语言程序设计〔第二版〕.北京:高等教育出版社,1998