程序设计实验报告.docx

上传人:b****9 文档编号:23384627 上传时间:2023-05-16 格式:DOCX 页数:38 大小:37.07KB
下载 相关 举报
程序设计实验报告.docx_第1页
第1页 / 共38页
程序设计实验报告.docx_第2页
第2页 / 共38页
程序设计实验报告.docx_第3页
第3页 / 共38页
程序设计实验报告.docx_第4页
第4页 / 共38页
程序设计实验报告.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

程序设计实验报告.docx

《程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《程序设计实验报告.docx(38页珍藏版)》请在冰豆网上搜索。

程序设计实验报告.docx

程序设计实验报告

程序设计报告

(2012/2013学年第一学期)

 

题目:

学生信息管理系统

 

专业

学生姓名

班级学号

指导教师

指导单位计算机学院软件教学中心

日期

学生信息管理系统

一、课题要求

该系统要求对一个文件中所存储的学生数据进行各种常规操作,如:

排序、查找、计算、显示等功能。

通过此课题,熟练掌握文件、数组、结构体的各种数据描述和操作,以及一些算法思想的应用,实现一个简单的学生管理系统。

功能要求:

(1)学生信息包括:

学号,姓名,性别,出生(年,月,日),三门课成绩和总分(数学,英语,C语言,总分)。

(2)数据格式:

测试数据,以文件方式提供,studf.txt,数据文件自己建立。

(3)需要实现的功能

1)建立学生信息结构数组 从文件中读入数据

2)按姓名递增冒泡排序

3)按总分递减选择排序

4)按学号递增冒泡排序

5)显示按总分排序后学生信息

6)按学号查学生信息和平均分数

7)按姓名查学生信息和平均分数

8)查各门课平均分数

二、需求分析

本系统应具有以下功能:

1.数据输入功能:

数据包括学生学号、性别、出生(年,月,日)、三门成绩和总分(数学,英语,c语言,总分)等。

以及输入的学生姓名等操作。

2、计算功能:

在输入学生分数及学生信息时,自动查找和显示学生的成绩。

3、查询功能:

(1)按学号查学生信息和平均分数。

(2)也可以按姓名查学生信息和平均分数来显示学生信息。

4、排序功能:

可按姓名递增选择排序法排序,按学号冒泡排序法排序以及按总分递减排序。

5、数据显示功能:

可浏览输入、查询或排序后的数据,显示学生的个人信息。

三、概要设计

方案设计

(1)、输入模块:

录入需要管理的学生信息并将信息保存于文件中,以方便日后进行打印、读取、修改等操作。

(2)、输出模块:

将所有学生信息或想要查询的学生信息显示于屏幕,用于打印学生信息或查找某些学生信息。

(3)、查询模块:

可对已建立的学生信息进行查询,并且可根据需要选择按姓名,学号,总分查询。

(4)、统计模块:

对学生四门成绩平均成绩的统计。

(5)、排序模块:

对学生成绩由高到低的排序。

(6)、退出系统:

选择该项,自动退出该系统。

四、详细设计

数据结构:

structdate

{

intyear;

charmonth;

charday;

};

structstudent

{

charno[10];

charname[9];

charsex[3];

structdatebirthday;

intscore[4];

intrescore[4];

};

(1)、输入模块

voidreadsi(structstudentstud[],int*n)

{

FILE*fp;

inti;

if((fp=fopen("J:

\\studf.txt","r"))==NULL)

{

printf("无法打开studf.txt文件!

\n");

exit

(1);

}

for(i=0;!

feof(fp);i++)

{

(*n)++;

if(*n>N)

{

printf("最多处理30位学生信息!

\n");

return;

}

fscanf(fp,"%s%s%s%d%d%d%d%d%d",stud[i].no,stud[i].name,stud[i].sex,&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);

stud[i].score[3]=stud[i].score[0]+stud[i].score[1]+stud[i].score[2];

}

fclose(fp);

}

(2)、输出模块(显示学生信息)

voidprintsi(structstudent*pstud,intn)

{

inti,k=0;

printf("学号姓名性别年月日数学英语C语言总分\n");

printf("┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉\n");

printf("======================================================================\n");

for(i=0;i

{

printf("%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",pstud[i].no,pstud[i].name,pstud[i].sex,pstud[i].birthday.year,pstud[i].birthday.month,pstud[i].birthday.day,

pstud[i].score[0],pstud[i].score[1],pstud[i].score[2],pstud[i].score[3]);

k++;

}

}

(3)、查询模块

1按照学号查找学生成绩(顺序查找)的关键代码

for(i=0;i

{

if(strcmp(no,pstud[i].no)==0)

printf("已找到学号为%-8s的学生\n学号:

%-8s\n姓名:

%-8s\n性别:

%-2s\n%4d年%2d月%2d日\n数学:

%4d\n英语:

%4d\nc:

%4d\n总分%4d\n平均分数为:

%4d\n",pstud[i].no,pstud[i].no,pstud[i].name,pstud[i].sex,pstud[i].birthday.year,pstud[i].birthday.month,pstud[i].birthday.day,pstud[i].score[0],pstud[i].score[1],pstud[i].score[2],pstud[i].score[3],pstud[i].score[3]/3);

else

j++;

}

if(j==30)

printf("未找到学号为%-8s的学生\n",no);

}

2按照姓名查找学生成绩

折半查找函数intbsrch(structstudentpname[],intn,char*name)的代码:

intlower=0,upper=n-1,mid;

if(strcmp(name,pname[lower].name)==0)returnlower;

elseif(strcmp(name,pname[upper].name)==0)returnupper;

else

while(lower<=upper)

{

mid=(lower+upper)/2;

if(strcmp(name,pname[mid].name)==0)

returnmid;

elseif(strcmp(name,pname[mid].name)>0)

lower=mid+1;

else

upper=mid-1;

}

return-1;

此处按照学生姓名查找成绩是运用了折半查找的方法,根据折半查找函数的返回值确定有没有找到该学生:

i=bsrch(pname,n,name);

if(i!

=-1)

printf("已找到该学生信息:

%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",pname[i].no,pname[i].name,pname[i].sex,

pname[i].birthday.year,pname[i].birthday.month,pname[i].birthday.day,pname[i].score[0],pname[i].score[1],pname[i].score[2],pname[i].score[3]);

else

printf("%d没有找到该学生资料!

\n",name);

for(;;)

{i=i-1;

if(strcmp(name,pname[i].name)==0)printf("已找到该学生信息:

%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",

pname[i].no,pname[i].name,pname[i].sex,

pname[i].birthday.year,pname[i].birthday.month,

pname[i].birthday.day,

pname[i].score[0],pname[i].score[1],pname[i].score[2],

pname[i].score[3]);

else

break;

}

i=bsrch(pname,n,name);

for(;;)

{i=i+1;

if(strcmp(name,pname[i].name)==0)printf("已找到该学生信息:

%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",

pname[i].no,pname[i].name,pname[i].sex,

pname[i].birthday.year,pname[i].birthday.month,

pname[i].birthday.day,

pname[i].score[0],pname[i].score[1],pname[i].score[2],

pname[i].score[3]);

else

break;

3查询各门课程的平均分数

关键代码:

staticsum1=0,sum2=0,sum3=0,score=0;

inti;

for(i=0;i

{

sum1=sum1+pstud[i].score[0];

sum2=sum2+pstud[i].score[1];

sum3=sum3+pstud[i].score[2];

}

printf("数学平均分数:

%4d\n",sum1/n);

printf("英语平均分数:

%4d\n",sum2/n);

printf("c语言平均分数:

%4d\n",sum3/n);

(4)、排序模块

1根据姓名排序信息

A姓名递增选择法排序的关键代码:

structstudenttemp;

for(k=0;k

{

index=k;

for(i=k+1;i

if(strcmp(pname[i].name,pname[index].name)<0)

index=i;

if(index!

=k)

{

temp=pname[k];

pname[k]=pname[index];

pname[index]=temp;

}

B显示姓名排序后的学生信息的关键代码:

printf("学号姓名性别年月日数学英语C总分\n");

printf("=====================================================\n");

for(i=0;i

{

printf("%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",

parray[i].no,parray[i].name,parray[i].sex,

parray[i].birthday.year,parray[i].birthday.month,parray[i].birthday.day,

parray[i].score[0],parray[i].score[1],parray[i].score[2],parray[i].score[3]);

}

2根据总分排序信息

按照总分选择法排序的代码和按姓名排序代码类似,

for(i=0;i

for(j=0;j

if(ptscore[j].score[3]

{

temp=ptscore[j];

ptscore[j]=ptscore[j+1];

ptscore[j+1]=temp;

}

然后显示按总分排序后的学生信息表:

printf("按总分排序后的学生信息表\n");

printf("┏━━━━┳━━━━┳━━━┳━━━━━━┳━━━┳━━━┳━━━┳━━━┓\n");

printf("┃学号┃姓名┃性别┃年月日┃数学┃英语┃C┃总分┃\n");

 

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

for(i=0;i

{

printf("┃%-8s┃%-8s┃%-2s┃%4d%2d%2d┃%4d┃%4d┃%4d┃%4d┃\n",stud[i].no,stud[i].name,stud[i].sex,stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].score[3]);

if(i==n-1)

printf("┗━━━━┻━━━━┻━━━┻━━━━━━┻━━━┻━━━┻━━━┻━━━┛\n");

else

printf("┣━━━━╋━━━━╋━━━╋━━━━━━╋━━━╋━━━╋━━━╋━━━┫\n");

k++;

}

3根据学号排序信息

首先利用冒泡法按照学号排序;

for(i=0;i

for(j=0;j

if(strcmp(stud[j].no,stud[j+1].no)>0)

{

strcpy(t,stud[j].no);

strcpy(stud[j].no,stud[j+1].no);

strcpy(stud[j+1].no,t);

strcpy(x,stud[j].name);

strcpy(stud[j].name,stud[j+1].name);

strcpy(stud[j+1].name,x);

strcpy(y,stud[j].sex);

strcpy(stud[j].sex,stud[j+1].sex);

strcpy(stud[j+1].sex,y);

p=stud[j].birthday.year;

stud[j].birthday.year=stud[j+1].birthday.year;

stud[j+1].birthday.year=p;

q=stud[j].birthday.month;

stud[j].birthday.month=stud[j+1].birthday.month;

stud[j+1].birthday.month=q;

r=stud[j].birthday.day;

stud[j].birthday.day=stud[j+1].birthday.day;

stud[j+1].birthday.day=r;

s=stud[j].score[0];

stud[j].score[0]=stud[j+1].score[0];

stud[j+1].score[0]=s;

w=stud[j].score[1];

stud[j].score[1]=stud[j+1].score[1];

stud[j+1].score[1]=w;

u=stud[j].score[2];

stud[j].score[2]=stud[j+1].score[2];

stud[j+1].score[2]=u;

v=stud[j].score[3];

stud[j].score[3]=stud[j+1].score[3];

stud[j+1].score[3]=v;

}

然后输出信息:

for(i=0;i

{

printf("%-8s%-8s%-2s%4d%2d%2d%4d%4d%4d%5d\n",stud[i].no,stud[i].name,stud[i].sex,stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].score[3]);}

4插入补考或休学学生信息后排序

如果选择了插入补考后成绩,则会先输入该学生的学号,if(strcmp(no,rescore[i].no)==0)

printf("已找到学号为%-8s的学生\n学号:

%-8s\n姓名:

%-8s\n性别:

%-2s\n%4d年%2d月%2d日\n语文:

%4d\n数学:

%4d\n英语:

%4d\n总分%4d\n平均分数:

%4d\n",rescore[i].no,rescore[i].no,rescore[i].name,rescore[i].sex,rescore[i].birthday.year,rescore[i].birthday.month,rescore[i].birthday.day,rescore[i].score[0],rescore[i].score[1],rescore[i].score[2],rescore[i].score[3],rescore[i].score[3]/3);然后选择要修改的某一门成绩:

printf("1.插入语文补考成绩\n");

printf("2.插入数学补考成绩\n");

printf("3.插入英语补考成绩\n");

scanf("%d",&b);

switch(b)

{

case1:

printf("请输入语文补考成绩\n");

scanf("%d",&c);

rescore[i].score[0]=c;

break;

case2:

printf("请输入数学补考成绩\n");

scanf("%d",&c);

rescore[i].score[1]=c;

break;

case3:

printf("请输入英语补考成绩\n");

scanf("%d",&c);

rescore[i].score[2]=c;

break;

default:

printf("请在1--3之间选择!

\n");

break;

}

如果选择了显示补考后的总分排序情况,则会先根据选择法排序信息,接着输出信息:

for(i=0;i

for(j=0;j

if(rescore[j].score[3]

{

temp=rescore[j];

rescore[j]=rescore[j+1];

rescore[j+1]=temp;

}

(5)、统计模块

统计每门课程的平均成绩

for(i=0;i

{

sum1=sum1+pstud[i].score[0];

sum2=sum2+pstud[i].score[1];

sum3=sum3+pstud[i].score[2];

}

printf("数学平均分数:

%4d\n",sum1/n);

printf("英语平均分数:

%4d\n",sum2/n);

printf("c语言平均分数:

%4d\n",sum3/n);

五,测试

开始程序

******************欢迎使用学生信息管理系统********************

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

┃******************1.显示所有学生信息************************┃

┃******************2.根据姓名排序信息************************┃

┃******************3.根据总分排序信息************************┃

┃******************4.根据学号排序信息************************┃

┃******************5.按照学号查找学生成绩********************┃

┃******************6.按照姓名查找学生成绩********************┃

┃******************7.查询各门课程平均分数********************┃

┃******************8.插入补考或休学学生信息后排序************┃

┃******************0.退出信息管理系统************************┃

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

请选择功能<0,1,2,3,4,5,6,7,8>:

1

学号姓名性别年月日数学英语C语言总分

┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉

====================================================================

110203李红女199324877685248

110226海明男19941018677687230

110210周强男1992825878996272

110213王杰男199429564565166

110208张娟女199358877981247

110216刘明男1994918676881216

110205马克男1992812588990237

110204吕婷女199474797685240

110214张国男19941018817687244

110222李强男1

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1