《C语言程序设计实训1》报告
设 计 题 目: 基于数组的学生信息管理系统
学 院 名 称: 信息科学技术学院
专 业: 软件工程
班 级: x班
姓 名: xxx 学 号 xxx
提 交 日 期: 2014年6月
一、实验内容
编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩。N定义为符号常量(学生数)。全局类型的定义如下:
二、实验要求
(1) main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
STU student[N]; //保存输入的N名学生信息
(2) 定义函数Input:从键盘输入N个学生的信息。
(3) 定义函数Save:将学生信息存入文件。
(4) 定义函数Output:将某个学生信息表格化屏幕输出。
(5) 定义函数Fetch:从文件中随机读取第n个(0<=n<=N-1)学生的信息。
(6) 定义函数Max:求所有学生某门课程的最高分和分数最高的学生的姓名。
(7) 定义函数Sort_select:对所有学生,按平均成绩由低到高进行简单选择排序。
(8) 定义函数Sort_buble:对某个班级的学生,按平均成绩由高到低进行起泡排序。并调用Output输出。
定义局部变量:
STU stu_class_ave[N]; //按平均成绩排序后的某个班级的学生信息;
int count; //实际元素个数
(9) 定义函数Sort_insert:对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出。
定义局部变量:
STU stu_class_ subject [N]; //按某门课程成绩排序后的某个专业的学生信息;
int count; //实际元素个数
(10)定义函数Search:实现班级和成绩的综合查找(如1班,总分240分以上同学)。
三、算法流程图
函数Sort_select的算法流程图
四、程序清单(关键语句和变量加注释)
#include<stdio.h>//预编译的文件包含指令
#include<stdlib.h>//exit()的函数声明
#include<string.h>//字符串的头文件
//------------------------------------------类型定义--------------------------------------------------------------
struct Student
{ char num[15];//学号
char name[15];//姓名
char major[10];//专业(computer,software,network)
int classNo;//班级(1-2)
int score[3];//3门课的成绩(0-2)
};
typedef struct Student STU;
//---------------------------------------------函数声明-----------------------------------------------------------
void input(STU *p);//从键盘输入N个学生的信息
void save(STU *p,int n);//将学生信息存入文件
void output(STU *p);//将某个学生信息表格化屏幕输出
void fetch();//从文件中随机读取第n个(0<=n<=N-1)学生的信息
void Max();//求所有学生某门课程的最高分和分数最高的学生的姓名
void sort_buble();//对某个班级的学生,按平均成绩由高到低进行起泡排序。并调用Output输出
void sort_insert();//对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出
void sort_select();//对所有学生,按平均成绩由低到高进行简单选择排序
void search();//实现班级和成绩的综合查找(如1班,总分240分以上同学)
//----------------------------------------主函数开始--------------------------------------------------------------
#define N 10//数组长度定义为10
void main()//以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数
{
int j,id;
STU student[N];//用于保存输入的N名学生信息
while(1)
{
printf("\n请输入功能编号,运行系统相应功能\n");
printf("1-输入学生信息\n2-信息存盘\n3-从文件中随机读取某个学生的信息\n");
printf("4-输出所有学生某门课程的最高分和分数最高的学生的姓名\n5-对所有学生按总平均成绩由低到高排序\n");
printf("6-对某个班级学生按总平均成绩由高到低排序\n7-对某个专业的学生按某门课程成绩由低到高排序\n");
printf("8-实现班级和成绩的综合查找\n");
scanf("%d",&id);//输入功能编号,运行系统相应功能
getchar();//吸收回车键
switch(id)
{
case 1:
{
for(j=0;j<N;j++)//输入信息
{
printf("第%d个\n",j+1);
input(student+j);
}
break;
}
case 2:
{
save(student,N);//存储信息
break;
}
case 3:
{
fetch();//随机读取
break;
}
case 4:
{
Max();//最高分
break;
}
case 5:
{
sort_select();//所有总平均成绩排序
break;
}
case 6:
{
sort_buble();//某班级总平均成绩排序
break;
}
case 7:
{
sort_insert();//某专业课程排序
break;
}
case 8:
{
search();//综合查找
break;
}
default://不符合8个常量
{
break;
}
}
if((id)<1||(id)>8)
break;//break while
}
}
//--------------------------------------------------输入函数---------------------------------------------------
void input(STU *p)
{
int i;
printf("学号(回车结束): ");
scanf("%s",&((*p).num));//获得字符串1
getchar();//吸收回车键
printf("姓名(回车结束): ");
gets(p->name);//获得字符串2
printf("专业(回车结束): ");
gets(p->major);
printf("班级(回车结束): ");
scanf("%d",&((*p).classNo));
printf("三门成绩(每门回车结束):");
for(i=0;i<=2;i++)
{
scanf("%d",&((*p).score[i]));
}
getchar();
}
//--------------------------------------------------写文件函数----------------------------------------------
void save(STU *p,int n)
{
FILE *fp;//定义指向文件额指针变量
int i;
char filename[20];//定义文件名长度为20
printf("输入要保存的文件名:\n");
gets(filename);//获取文件名
if((fp=fopen(filename,"w"))==NULL)//以写的方式在当前目录打开(创建)文件
{
printf("open error!\n");
exit(0);//如果文件无法打开,关闭已经打开的其他文件,结束程序
}
for(i=0;i<n;i++)
{
if(fwrite(p++,sizeof(STU),1,fp)!=1)//向文件中国一次写一个结构体量值
printf("write error!\n");
}
fclose(fp);//关闭文件
}
//--------------------------------------------------输出文件------------------------------------------------------
void output(STU *p)
{
printf("%-10s%-10s%-10s%d %d %d %d\n", p->num, p->name,p->major,
p->classNo,p->score[0],p->score[1],p->score[2]);
}
//--------------------------------------------------随机读取-----------------------------------------------------
void fetch()
{
FILE *fp;
STU student;
int i;
char filename[20];
printf("输入要读取的文件名:\n");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("open error!\n");
exit(0);
}
printf("请输入要查找某个的学生号码(0-9):");
scanf("%d",&i);
fseek(fp,i*sizeof(STU),0); //根据参数n调整文件指针位置
if((fread(&student,sizeof(STU),1,fp))!=1)//从文件中一次读1个结构体量值
exit(0);
printf("学号 姓名 专业 班级 成绩0 成绩1 成绩2\n");//输出结构体
output(&student);
fclose(fp);
}
//--------------------------------------------------------最大值---------------------------------------------------
void Max()
{
int i,j;
FILE *fp;
STU student[N],*max;//最大值的指针变量
char filename[20];
printf("输入要读取的文件夹名:\n");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("read error!\n");
exit(0);
}
for(i=0;i<N;i++)
if((fread(&student[i],sizeof(STU),1,fp))!=1)//从文件一次读一个结构体量值
exit(0);
printf("请输入要查找的课程(0-2):");
scanf("%d",&j);//获取课程编号
if(j>2||j<0)printf("您查找的内容不存在!");
max=&student[0];
for(i=0;i<N-1;i++)//筛选出最大值
if(max->score[j]<student[i+1].score[j])
{
max=&student[i+1];
}
printf("%d课程的最高分是%d,学生姓名为%s\n",j,max->score[j],max->name);//!!
fclose(fp);
}
//-------------------------------------------------所有学生选择排序----------------------------------------
void sort_select()
{
int i,j,k;
double ave[N];//平均成绩
FILE *fp;
STU student[N],t;
char filename[20];
printf("输入要读取的文件夹名:\n");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("open error!\n");
exit(0);
}
for(i=0;i<N;i++)
if((fread(&student[i],sizeof(STU),1,fp))!=1)
{printf("read error!\n");
exit(0);}
for(i=0;i<N;i++)//计算平均分
ave[i]=(student[i].score[0]+student[i].score[1]+student[i].score[2])/3.0;
for(i=0;i<N-1;i++)//选择排序
{
k=i;
for(j=i+1;j<N;j++)
if(ave[j]<ave[k])
{ k=j;//如果j的平均分高于i,成绩和编号进行交换
t=student[k];
student[k]=student[i];
student[i]=t;
}
}
printf("按平均成绩由低到高排序依次为:\n");
printf("学号 姓名 专业 班级 成绩0 成绩1 成绩2\n");
for(i=0;i<N;i++)
output(student+i);//由低到高输出
fclose(fp);
}
//---------------------------------------班级起泡排序------------------------------------------------------------
void sort_buble()
{
STU stu_class_ave[N];//按平均成绩排序后的某个班级的学生信息
FILE *fp;
STU student[N],stu;
char se_maj[15];//专业
double ave[N];//平均成绩
int count=0;//实际元素个数
int i,j,se_no;//班级
char filename[20];
printf("输入要读取的文件夹名:\n");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("open error!\n");
exit(0);
}
for(i=0;i<N;i++)
if((fread(&student[i],sizeof(STU),1,fp))!=1)
{printf("read error!\n");
exit(0);}
fclose(fp);
printf("请输入要查找的专业(computer,software,network ):");
gets(se_maj);
printf("请输入要查找的班级(1-2):");
scanf("%d",&se_no);
for(i=0;i<N;i++)
{
if(strcmp(student[i].major,se_maj)==0&&student[i].classNo==se_no)//用比较法将相同专业和班级人员的计数
{
stu_class_ave[count]=student[i];
count++;
}
}
for(i=0;i<count-1;i++)//计算实际元素的平均分
ave[i]=(stu_class_ave[i].score[0]+stu_class_ave[i].score[1]+stu_class_ave[i].score[2])/3.0;
for(i=0;i<count-1;i++)//起泡排序
{
for(j=0;j<count-i-1;j++)
{
if(ave[j]<ave[j+1])//当后一个数大于前一个数,交换数值
{
stu=stu_class_ave[j+1];
stu_class_ave[j+1]=stu_class_ave[j];
stu_class_ave[j]=stu;
}
}
}
printf("学号 姓名 专业 班级 成绩0 成绩1 成绩2\n");
for(i=0;i<count;i++)
output(&stu_class_ave[i]);//由高到低输出
fclose(fp);
}
//---------------------------------------------------某课程插入排序--------------------------------------------
void sort_insert()
{
int count=0;//实际元素个数
int i,j,k,c;
char se_major[15];//专业
STU student[N],stu[N];
STU stu_class_subject[N];//按某门课程成绩排序后的某个专业的学生信息
FILE *fp;
char filename[20];
printf("输入要读取的文件夹名:\n");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("open error!\n");
return;
}
for(i=0;i<N;i++)
if((fread(&student[i],sizeof(STU),1,fp))!=1)
return;
printf("请输入您要查找的专业(computer,software,network):");
gets(se_major);
printf("请输入您要查找的课程(0-2):");
scanf("%d",&c);
for(i=0;i<N;i++)
{ if(strcmp(student[i].major,se_major)==0)//计数
{
stu_class_subject[count]=student[i];
count++;
}
}
for(i=1;i<count;i++)//插入排序
{
for(j=i-1;j>=0;j--)
{ if(stu_class_subject[j].score[c]<stu_class_subject[i].score[c])
break;
}
if(j!=i-1)
{ stu[0]=stu_class_subject[i];
for(k=i;k>=j+1;k--)
{stu_class_subject[k]=stu_class_subject[k-1];}
stu_class_subject[j+1]=stu[0];//插入位置
}
}
printf("排序后的信息为:\n");
printf("学号 姓名 专业 班级 成绩0 成绩1 成绩2\n");
for(i=0;i<count;i++)
{output(&stu_class_subject[i]);}//由低到高输出
fclose(fp);
}
//-----------------------------------------------------------查找---------------------------------------------------
void search()
{
int i,k,count=0;
int sum[N],fscore;
FILE *fp;
STU student[N],stu[N];
char filename[20];
printf("输入要读取的文件夹名:\n");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("open error!\n");
exit(0);
}
for(i=0;i<N;i++)
if((fread(&student[i],sizeof(STU),1,fp))!=1)
exit(0);
for(i=0;i<N;i++)
{sum[i]=student[i].score[0]+student[i].score[1]+student[i].score[2];}//计算总分
printf("请输入要查找的班级、分数下限:");
scanf("%d%d",&k,&fscore);
for(i=0;i<N;i++)
{
if(student[i].classNo==k&&fscore<=sum[i])//计数
{stu[count]=student[i];
count++;}
}
printf("学号 姓名 专业 班级 成绩0 成绩1 成绩2\n");
for(i=0;i<count-1;i++)
output(stu+i);
fclose(fp);
}
五、程序测试(输入、输出的截图及文件的内容)
六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)