C语言课程设计报告学生成绩管理系统.docx
《C语言课程设计报告学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告学生成绩管理系统.docx(37页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告学生成绩管理系统
《学生成绩管理系统》
课程设计报告
2010-7-9
一、程序整体规划:
1.系统的基本功能
✧数据的录入:
如录入学生的基本信息,以及该学生选修课程的基本信息;
✧数据的修改:
如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;
✧数据的插入:
插入某个学生信息;
✧数据的查询:
如按学号查询、按姓名查询等;
✧数据的删除:
如删除指定学号、或者指定姓名的学生及其选修课程信息;
✧平均成绩的计算:
计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息;
✧考虑用文件把数据保存起来
2、首先是结构体的定义:
typedefstructmessage_student
charnumber[6];
charname[20];
charsex[4];
floatsubject[numsubs];
floatscore;
floataverage;
intindex;
}student;
intnumstus;定义学生数目
student*pointer;指向结构体数组
intlens;次迟到时候分配内存
3、部分重要函数声明:
intmenu_select();决定主界面的函数
intopenfile(studentstu[]);打开文件的函数
intfindrecord(studentstud[]);查找信息的函数
intwritetotext(studentstud[]);保存文件的函数
voidsort(studentstu[]);查找信息的函数
voiddeleterecord(studentstu[],inti);删除信息的函数
voidaddrecord(studentstud[]);增加学生信息的函数
voiddisplay(studentstud[],intn1,intn2);数据的显示函数
voidsortnum(studentstud[]);以下几个均为排序函数
voidsortnum2(studentstud[]);
voidsortname(studentstud[]);
voidsortname2(studentstud[]);
voidsortcount(studentstud[]);
voidsortcount2(studentstud[]);
4、设计思路
1、主函数以switch和case语句引出其他子函数。
然后进行其他子函数的调用。
2、定义结构体student,让其包含如姓名性别等基本信息。
同时定义结构体指针,以便后面子函数对某一项排序后输出该学生的全部信息。
LENS给结构体数组分配内存。
3、各个函数运行并相互调用其他子函数,例如几个排序函数全部被其它函数调用并输出结果。
具体各子函数之间的关系见源代码。
4、studentstu[i]表示的是一个结构体,[]内填大于等于0的数,这可以解释各个子函数中出现此类情况:
例如strcmp(str,stud[i].name)==0是该结构体内的第i+1个学生满足上述条件。
由Stud[i].变量来引用各结构体中的变量,然后用输出函数相应输出该结构体内的信息。
二.程序模板细致分析:
1.程序涉及的模板:
主程序模板.查询模块.删除模板.将所有记录写入文件.输出模板.修改信息模板.录入信息模板.和排序模板.
排序模板可按如下进行分类:
按学号:
按学号降序排序模块.按学号升序排序模块.
按姓名:
按姓名降序排序模块.按姓名升序排序模块.
按名次:
按名次降序排序模块.按名次升序排序模块.
2.功能结构联系图如下图所示:
现对各个功能的实现及个人认为每个功能中所用到的程序的闪光点和难点:
1.增加学生记录
2.已有记录是否覆盖:
if(numstus!
=0)
{
printf("已有记录存在是否覆盖?
(y/n)\n");
fflush(stdin);
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
当输入数据过多时内存的扩展:
(通过定义LENS开辟增加内存)
if(numstus>lens)
{
lens+=50;
pointer=(student*)realloc(pointer,lens*LEN);
输入数字为1.0,但是结果输出为男.女:
printf("请输入性别(男/女1/0):
");
gets(stud[i].sex);
if(stud[i].sex[0]=='0')strcpy(stud[i].sex,"女");
elsestrcpy(stud[i].sex,"男");
2.查询学生记录
例:
按学号查找:
if(str[0]=='1')
{
printf("请输入学号:
");
fflush(stdin);亮点:
清除数据缓冲区间
gets(str);
for(i=0;i<=numstus;i++)
{
if(strcmp(str,stud[i].number)==0)亮点:
利用该函数将结构体数组中相应相同项联系在一起,确定其相应位置,便于输出。
{
display(stud,i,i);子函数又调用了其他子函数
break;
}
elsecontinue;
3.修改学生记录
例:
inti=-1,j;
if(numstus==0)/*没有记录返回*/
printf("没有可供修改的记录!
");
while(i<0)
{
i=findrecord(stud);
if(i>=0)
{
printf("要删除这个学生的信息吗?
(y/n)");
此处有一个难点就是while函数和调用其他子函数findrecord,以及解释为什么一开始要定义i为-1
4.学生纪录排序
按学号:
按学号降序排序模块.按学号升序排序模块.
按姓名:
按姓名降序排序模块.按姓名升序排序模块.
按名次:
按名次降序排序模块.按名次升序排序模块.
在排序过程中比较名次,成绩大小是不难的事情,名字通过STRCMPY函数来解决排序问题,但排序中的难点在于指针,结构体变量,结构体数组的综合应用,通过比较你的一组数据要输出所有该成员相应的信息,几个排序中指针既指明了变量的地址,也指明了结构体数组的地址。
此处感觉很棘手
详细如下一条典型的例子:
(其余的大致相同)
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j].name,stud[j+1].name)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
5.打开文件和保存文件
fgetc(fp);
while(i{
fscanf(fp,"%s",stu[i].number);
fscanf(fp,"%s",stu[i].name);
fscanf(fp,"%s",stu[i].sex);
for(j=0;jfscanf(fp,"%f",&stu[i].subject[j]);
fscanf(fp,"%f",&stu[i].score);
fscanf(fp,"%f",&stu[i].average);
fscanf(fp,"%d",&stu[i].index);
i++;
}
打开文件用函数fopen,fclose实现文件的打开,文件的关闭。
其中按格式将内存中的数据转换成对应的ASCII字符,并以码形式输出到文本文件中
保存文件先给所要保存的文件一个内存地址fp,然后将数据输入,数据存储过程中所用到的fscanf将数据通过一个文件指针指向一个已打开的文本文件。
此处的难点见函数的整体规划的详细说明。
三、部分运行的图像
主界面:
纪录排序:
信息查找和修改
文件保存和显示
数据统计
四.程序主要代码
include"stdio.h"
#include"string.h"
#include"malloc.h"
#defineH_STUDENT_HH
#defineLENsizeof(structmessage_student)/*一个结构体数组元素的长度*/
#definenumsubs4/*学科数目*/
typedefstructmessage_student/*结构体定义*/
{
charnumber[6];
charname[20];
charsex[4];
floatsubject[numsubs];
floatscore;
floataverage;
intindex;
}student;
intnumstus;/*学生数目*/
student*pointer;/*指向结构体数组*/
intlens;
intmenu_select();/*函数声明*/
intopenfile(studentstu[]);
intfindrecord(studentstud[]);
intwritetotext(studentstud[]);
voiddisplay1();
voidshowtable();
voidsort(studentstu[]);
voiddeleterecord(studentstu[],inti);
voidaddrecord(studentstud[]);
voiddisplay(studentstud[],intn1,intn2);
voidamendrecord(studentstud[]);
voidcount(studentstud[]);
voidsortnum(studentstud[]);
voidsortnum2(studentstud[]);
voidsortname(studentstud[]);
voidsortname2(studentstud[]);
voidsortcount(studentstud[]);
voidsortcount2(studentstud[]);
voidstatistic(studentstud[]);
voiddisplay1();
intmenu_select()
{
charc;
intnum;
printf("\n\n中南大学电气信息类学生信息管理系统");
printf("\n\n");
printf("*制作人:
陈光尧电气0916班学号0909091611\n\n");
printf("\n\n");
printf("**************************系统功能菜单**********************\n\n");
printf("--------------------------------------------\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("☆☆\n");
printf("☆1.增加学生记录5.统计信息☆\n");
printf("☆********************************************☆\n");
printf("☆2.查询学生记录6.打开文件☆\n");
printf("☆********************************************☆\n");
printf("☆3.修改学生记录7.保存文件☆\n");
printf("☆********************************************☆\n");
printf("☆4.学生纪录排序☆\n");
printf("☆********************************************☆\n");
printf("☆☆\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请选择1-8:
");
fflush(stdin);
c=getchar();
return(c);
}
/*-----------------------------查询模块-------------------------------*/
intfindrecord(studentstud[])/*查找信息*/
{
system("cls");
charstr[20];
inti,num;
if(numstus==0)
{
printf("没有可被查找的记录\n");
printf("按回车键退出");
fflush(stdin);
getchar();
return-1;
}
else
{
printf("以何种方式查找?
\n1.学号\t2.姓名\t3.名次\n");
fflush(stdin);
gets(str);
if(str[0]=='1')/*按学号查找*/
{
printf("请输入学号:
");
fflush(stdin);
gets(str);
for(i=0;i<=numstus;i++)
{
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
elsecontinue;
}
}
elseif(str[0]=='2')/*按姓名查找*/
{
printf("请输入姓名:
");
gets(str);
for(i=0;i<=numstus;i++)
{
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
elsecontinue;
}
}
elseif(str[0]=='3')/*按名次查找*/
{
printf("请输入名次:
");
fflush(stdin);
scanf("%d",&num);
for(i=0;i<=numstus;i++)
{
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
elsecontinue;
}
}
if(i>numstus)
{
printf("没有查找所要的信息。
\n");
printf("按回车键退出");
fflush(stdin);
getchar();
return-1;
}
returni;
}
}
intopenfile(studentstu[])
{
inti=0,j;
FILE*fp;
charfilename[20],str[2];
if(numstus!
=0)
{
printf("已经有记录存在,是否保存?
(y/n)");
fflush(stdin);
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(stu);
}
printf("请输入文件名:
");
fflush(stdin);
gets(filename);
numstus=0;
if((fp=fopen(filename,"rb+"))==NULL)
{
printf("无法打开该文件\n");
return(-1);
}
fscanf(fp,"%d",&numstus);
fgetc(fp);
while(i{
fscanf(fp,"%s",stu[i].number);
fscanf(fp,"%s",stu[i].name);
fscanf(fp,"%s",stu[i].sex);
for(j=0;jfscanf(fp,"%f",&stu[i].subject[j]);
fscanf(fp,"%f",&stu[i].score);
fscanf(fp,"%f",&stu[i].average);
fscanf(fp,"%d",&stu[i].index);
i++;
}
fclose(fp);
printf("文件读取成功\n");
printf("是否显示纪录?
(y/n)");
fflush(stdin);
gets(str);
if(str[0]=='y'||str[0]=='Y')
display(stu,0,numstus-1);
if(str[0]!
='y'&str[0]!
='Y'&str[0]!
='n'&str[0]!
='N')
{
printf("请输入n或者y!
");
gets(str);
if(str[0]=='y'||str[0]=='Y')
display(stu,0,numstus-1);
}
return(0);
}
/*------------------------------排序模块---------------------------*/
voidsort(studentstud[])
{
inti,j=0;
charstr[5];
student*p;
p=stud;
if(numstus==0)
{
printf("没有可供查询的记录!
");
}
while
(1)
{
for(i=0;;i++)
{
printf("请输入查询方式:
");
printf("(直接输入回车则结束查询操作)\n");
printf("1.按照学号\t");
printf("2.按照姓名\t");
printf("3.按照名次\n");
fflush(stdin);
gets(str);
if(strlen(str)==0)break;
if(str[0]=='1')
{
printf("请输入排序次序:
\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortnum2(p);
else
sortnum(p);
display(stud,0,numstus-1);
}
elseif(str[0]=='2')
{
printf("请输入排序次序:
\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortname2(p);
else
sortname(p);
display(stud,0,numstus-1);
}
elseif(str[0]=='3')
{
printf("请输入排序次序:
\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortcount2(p);
else
sortcount(p);
display(stud,0,numstus-1);
}
elseprintf("请输入1~3");
printf("是否退出排序?
(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')break;
}
return;
}
}
/*----------------------按学号降序排序模块---------------------------*/
voidsortnum(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j+1].number,stud[j].number)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
/*--------------------------按学号升序排序模块------------------------*/
voidsortnum2(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j].number,stud[j+1].number)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
/*--------------------------按姓名降序排序模块--------------------*/
voidsortname(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j+1].name,stud[j].name)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
/*-------------------------按姓名升序排序模块-------------------------*/
voidsortname2(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;i