本人通行工程专业,现在主要涉及的方向有单片机和人工智能方向,主要还是硬件方向,如果有相同专业爱好的小伙伴,可以加qq2441860278进行交流!
大一生活结束了,写了一个学生成绩管理端来复习C语言的期末考试,其涵盖了本学期所学习的大部分知识点。
如果有误,欢迎各位指正。
本系统的功能主要有6个,如下图:可以通过菜单栏选择不同的功能。程序每完成一项功能,能够返回起始菜单页去选择其他功能选项。
话不多说,直接上代码。
#include
#include
#include
//函数声明
void jisuan();//计算学生的平均分及总分,方便处理,ps:先读入再计算
void show();//显示主菜单栏
void choose();//选择不同的功能
void fileread();//从stuscore.in文件中读入学生信息和成绩
void paverage();//进行个人成绩分析
void count();//进行单科成绩分析
void sort();//按总分对学生从高到低排序
void filewrite();//将学生成绩及统计分析结果写入到文件stuscore.out
//定义一个学生结构体,包含学生信息
typedef struct
{
int id[11],score[4],sum;
char name[11];
double aver;
}stu;
//定义课程结构体,包含课程相关信息
typedef struct
{
int sum,max,min,num[5];
double aver;
}course;
stu stu1[8];//放8位学生
course grade[4];//放4科目成绩
//4个科目
char *subject[4]={"数学","物理","英语","计算机"};
void main()
{
{
choose();
}
}
//计算学生的平均分及总分,方便处理
void jisuan()
{
int i,j;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
if(stu1[i].score[j]<60)
(grade[j].num[0])++;
if(stu1[i].score[j]>=60 && stu1[i].score[j]<70)
(grade[j].num[1])++;
if(stu1[i].score[j]>=70 && stu1[i].score[j]<80)
(grade[j].num[2])++;
if(stu1[i].score[j]>=80 && stu1[i].score[j]<90)
(grade[j].num[3])++;
if(stu1[i].score[j]>=90 && stu1[i].score[j]<=100)
(grade[j].num[4])++;
}
}
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
grade[j].sum+=stu1[i].score[j];
grade[j].aver = grade[j].sum/8.0;
}
}
}
void showmain()
{
printf("\t\t\t *********************************\n");
printf("\t\t\t * 欢迎使用学生成绩管理系统 *\n");
printf("\t\t\t * 1.读入学生成绩 *\n");
printf("\t\t\t * 2.个人成绩分析 *\n");
printf("\t\t\t * 3.单科成绩分析 *\n");
printf("\t\t\t * 4.学生成绩排序 *\n");
printf("\t\t\t * 5.生成成绩文件 *\n");
printf("\t\t\t * 6.结束 *\n");
printf("\t\t\t *********************************\n");
printf("\t\t\t 请选择1~6: ");
}
void choose()
{
int choice;
do{
showmain();
scanf("%d",&choice);//输入选择
switch(choice)
{
case 1:
fileread();//读入
jisuan();//先读入再计算
break;
case 2:
paverage();
break;
case 3:
count();
break;
case 4:
sort();
break;
case 5:
filewrite();
break;
case 6:
printf("成功退出!\n");
break;
default:
printf("input error!");
break;
}
}while(choice!=6);
}
//读入函数
void fileread()
{
FILE *fp = fopen("D:/Users/123/Desktop/stuscore.in","r+");//填写文件绝对路径
int i,j,k;
if(fp==NULL)//判误
{
printf("\nopen file failed!\n");
}
for(i=0;i<8;i++)//循环读取8位学生信息
{
for(j=0;j<11;j++)
{
fscanf(fp,"%1d",&stu1[i].id[j]);//读学号
}
fscanf(fp,"%s",&stu1[i].name); //读姓名
for(k=0;k<4;k++)
{
fscanf(fp,"%d",&stu1[i].score[k]);//读分数
}
}
printf(" \t\t\t数据读入完毕,请选择其他操作!\n");
fclose(fp);//关闭文件
}
//
void paverage()
{
int i,j,k;
printf(" \t\t\t\t各学生成绩统计分析:\n");
printf(" 学号 姓名 数学 物理 英语 计算机 总分 平均成绩\n" );
for(i=0;i<8;i++)
{
stu1[i].sum=0;
stu1[i].aver=0;
for(j=0;j<11;j++)
{
printf("%d",stu1[i].id[j]);//打印出学号
}
for(k=0;k<4;k++)
{
stu1[i].sum+=stu1[i].score[k];//求总分
}
stu1[i].aver=stu1[i].sum/4.0;//算平均分
printf("%11s %2d %2d %2d %2d %3d %4.2f\n",\
stu1[i].name,stu1[i].score[0],stu1[i].score[1],stu1[i].score[2],stu1[i].score[3],stu1[i].sum,stu1[i].aver);}
printf("\t\t\t各学生成绩分析完毕,请选择其他操作!\n");
}
void count()
{
int i,j;
printf(" \t\t\t\t单科成绩统计分析:\n");
printf(" 课程 最高分 最低分 平均分 不及格 及格 中等 良好 优秀\n");
for(i=0;i<4;i++)
{
grade[i].min = 100;
grade[i].max = 0;
for(j=0;j<8;j++)
{
if(stu1[j].score[i]>grade[i].max)
grade[i].max=stu1[j].score[i];
if(stu1[j].score[i]<grade[i].min)
grade[i].min=stu1[j].score[i];
}
}
for(i=0;i<4;i++)
{
printf(" %6s %2d %2d %4.2f %2d %2d %2d %2d %2d\n",\
subject[i],grade[i].max,grade[i].min,grade[i].aver,grade[i].num[0],grade[i].num[1],grade[i].num[2],grade[i].num[3],grade[i].num[4]);
}
printf(" \t\t\t单科成绩分析完毕,请选择其他操作!\n");
}
//交换函数,注意形参必须为指针,不然无法交换(文末解释)
void Swap(stu *a,stu *b)
{
stu temp;
temp=*a;
*a=*b;
*b=temp;
}
//排序
void sort()
{
int i,j;
for (j = 0; j < 8; j++)
{
for (i = 0; i < 8; i++)
{
if (stu1[i+1].sum > stu1[i].sum)//按照总分由高到低排序
{
Swap(&stu1[i+1],&stu1[i]);
}
}
}
printf("\t\t\t\t\t学生成绩排序:\n");
printf(" 学号 姓名 数学 物理 英语 计算机 总分 平均成绩 名次\n" );
for (i = 0; i < 8; i++)
{
for(j=0;j<11;j++)
{
printf("%d",stu1[i].id[j]);//打印出学号
}
printf("%11s %2d %2d %2d %2d %3d %4.2f %2d\n",\
stu1[i].name,stu1[i].score[0],stu1[i].score[1],stu1[i].score[2],stu1[i].score[3],stu1[i].sum,stu1[i].aver,i+1);
}
printf(" \t\t\t成绩排序完毕,请选择其他操作!\n");
}
void filewrite()
{
int i,j;
FILE *fp;
fp=fopen("D:/Users/123/Desktop/stuscore.out","w+");
fprintf(fp,"\t\t\t\t\t学生成绩排序:\n");//写入格式
fprintf(fp," 学号 姓名 数学 物理 英语 计算机 总分 平均成绩 名次\n" );
for (i = 0; i < 8; i++)//
{
for(j=0;j<11;j++)
{
fprintf(fp,"%d",stu1[i].id[j]);//写入学号
}
fprintf(fp,"%11s %2d %2d %2d %2d %3d %4.2f %2d\n",\
stu1[i].name,stu1[i].score[0],stu1[i].score[1],stu1[i].score[2],stu1[i].score[3],stu1[i].sum,stu1[i].aver,i+1);//写入学生成绩相关信息
}
fprintf(fp," \t\t\t\t单科成绩统计分析:\n");
fprintf(fp," 课程 最高分 最低分 平均分 不及格 及格 中等 良好 优秀\n");
for(i=0;i<4;i++)
{
fprintf(fp,"%6s %2d %2d %4.2f %2d %2d %2d %2d %2d\n",\
subject[i],grade[i].max,grade[i].min,grade[i].aver,grade[i].num[0],grade[i].num[1],grade[i].num[2],grade[i].num[3],grade[i].num[4]);//写入成绩排序
}
fclose(fp);
printf("\t\t\t已将成绩成功输入到文件,请选择其他操作!\n");
}
我们分析一下其中的交换顺序函数,首先形参必须为指针,因为形参在函数运行结束后会释放分配的内存,值传递(传递的只是一份副本)导致无法交换,应该为地址传递。
因此定义一个结构体变量(中间变量),对传进来的地址进行指针运算,得到实际的变量,对其进行交换。
再解释下为什么会将计算分数封装成函数。首先使程序模块化,思路更清晰。其次是如果将其写在函数内部,若对函数进行多次调用,则数据会出现重复计算的情况。
今天的分享就到这了,大家晚安!