📄 学生成绩管理.cpp
字号:
// 学生成绩管理.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //头文件
#define N 60
#define M 8 //预处理定义
static char name[12];
static int count; //静态变量声明
int i,j;
FILE *fp; //全局变量声明
////////////////////////////////////////////////////////////////////
//
struct student //学生资料
{
char num[11]; //学生学号
char name[11]; //学生姓名
char sex[3]; //学生性别
float score[M]; //学生各科分数
float total; //总分
float average; //平均分
}stu[N],temp; //存放学生资料的结构变量,临时结构变量
///////////////////////////////////////////////////////////////////
//
void exit1() //退出函数
{
printf(" ============================ \n\n");
printf(" 谢谢使用,再见! \n\n");
printf(" ============================ \n\n");
exit(0);
}//
///////////////////////////////////////////////////////////////////
//
void go_on() //是否继续函数
{
char j[1];
void menu();
void operate();
void goback();
printf("\n\t\t是否继续操作该系统?(y/n)");
while(1)
{
scanf("%s",j);
if(strlen(j)>1) //判断输入是否合法
{
printf("\n\t输入不合法,请重新输入!(y/n)");
continue;
}
if(j[0]=='y') //清屏后显示返回菜单
{
system("cls");
goback();
}
else if(j[0]=='n') //调用退出函数
exit1();
else
printf("\n\t输入不合法,请重新输入!(y/n)");
}
}//
////////////////////////////////////////////////////////////////////
//
void goback() //返回菜单函数
{
char m[1];
void menu();
void operate();
printf(" *************************************************** \n\n");
printf(" 1.返回到主界面 \n\n");
printf(" 2.返回到操作界面 \n\n");
printf(" 0.退出 \n\n");
printf(" *************************************************** \n\n");
printf("\n\t请在上面选择你所需要的操作:");
while(1)
{
scanf("%s",m);
if(strlen(m)>1) //判断输入是否合法
{
printf("\n\t输入不合法,请重新输入!(0-2)");
continue;
}
switch(m[0]) //进行菜单选择
{
case '1' :system("cls");menu();break; //清屏后调用主菜单函数
case '2' :system("cls");operate();break; //清屏后调用操作菜单函数
case '0' :exit1();break; //调用退出函数
default:printf("输入不合法,请重新输入!(0-2)");
}
}
}//
//////////////////////////////////////////////////////////////////////
//
void save() //资料输入后的存储
{
char m[1];
void show2();
fp=fopen(name,"wb"); //打开可写文件
for(i=0;i<count;i++)
fwrite(&stu[i],sizeof(struct student),1,fp); //将记录逐个写进文件
fclose(fp);
printf(" *************************************************** \n\n");
printf(" 已成功将资料存储到磁盘! \n\n");
printf(" *************************************************** \n\n");
printf("若想查看是否已存储请按1,若想退出请按0.\t");
while(1)
{
scanf("%s",m);
if(strlen(m)>1) //判断输入是否合法
{
printf("\n\t输入不合法,请按照提示重新输入:");
continue;
}
if(m[0]=='1') //查看存储的记录
{
show2();
go_on();
}
else if(m[0]=='0') //调用退出函数
exit1();
}
}//
////////////////////////////////////////////////////////////////////
//
void save2() //进入操作菜单的资料存储
{
char w[1],p[1];
void getin();
printf("\n\t\t是否已完成资料输入?(y/n)");
while(1)
{
scanf("%s",w);
if(strlen(w)>1) //判断输入是否合法
{
printf("\n\t输入不合法,请按照提示重新输入:");
continue;
}
if(w[0]=='y') //准备调用资料输入函数
{
printf("\n\t\t你还没输入资料,是否现在就录入资料?(y/n)");
while(1)
{
scanf("%s",p);
if(strlen(p)>1) //判断输入是否合法
{
printf("\n\t输入不合法,请按照提示重新输入:");
continue;
}
if(p[0]=='y')
getin(); //调用输入函数
else if(p[0]=='n')
exit1(); //调用退出函数
else //判断输入是否合法
{
printf("\n\t输入不合法,请按照提示重新输入:");
continue;
}
}
}
else if(w[0]=='n') //准备调用资料输入函数
{
printf("\n\t\t是否现在就录入资料?(y/n)");
while(1)
{
scanf("%s",p);
if(strlen(p)>1) //判断输入是否合法
{
printf("\n\t输入不合法,请按照提示重新输入:");
continue;
}
if(p[0]=='y')
getin(); //调用输入函数
else if(p[0]=='n')
go_on(); //调用是否继续函数
else //判断输入是否合法
{
printf("\n\t输入不合法,请按照提示重新输入:");
continue;
}
}
}
}
}//
//////////////////////////////////////////////////////////////////////
//
void getin() //资料输入
{
int k,q=1,t=0;
char m[1],l[1],g[1];
void save();
system("cls"); //先清屏
while(1) //开始进行资料录入
{
printf("请输入要录入的班级(如:04计算机1班):");
scanf("%s",name);
if(strlen(name)!=11) //判断文件名是否合法
{
printf("输入长度不符,请重新输入!\n");
continue;
}
if((fp=fopen(name,"rb"))!=NULL) //检查输入的文件名是否存在
{
printf("已经存在该班级的资料,请重新输入!\n");
continue;
}
else
break;
}
printf("\n\n\t\t\t\t你正在输入%s的成绩!\n\n",name); //科目显示
printf("本学期所修科目如下:\n\n");
printf(" \t\t1大学英语(2) 2高等数学(下) 3线性代数 4毛泽东思想概论\n\n");
printf(" \t\t5大学物理-a 6大学体育(2) 7法律基础 8电路与电子技术\n\n");
printf("\n\t\t请按下面提示输入学生的资料:\n");
for(i=0;i<N;i++) //学生记录逐个录入
{
while(1)
{
printf("学生%d\t学号(10位)",q++);
scanf("%s",stu[i].num); //输入学号
k=0;
if(strlen(stu[i].num)!=10) //学号长度判断
{ printf("输入长度不符,请重新输入!\n");
q--;
continue;
}
t=i+1;
while(t-->0) //学号是否重复
if(strcmp(stu[i].num,stu[t-1].num)==0)
{ printf("学号重复,请重新输入!\n");
k=1;
q--;
break;
}
if(k==1)continue; //是否成功输入后判断
if(k==0)break;
}
printf(" \t姓名(中文):"); //输入名字
scanf("%s",stu[i].name);
while(1)
{
printf(" \t性别(1.男 2.女):"); //性别输入
scanf("%s",l);
if(strlen(l)>1)
{
printf("输入不合法,请重新输入!\n"); //判断输入是否正确
continue;
}
if(l[0]!='1'&&l[0]!='2') //不合法输入判断
{
printf("输入不合法,请重新输入!\n");
continue;
}
else if(l[0]=='1') //输入正确后转换存储
{
strcpy(stu[i].sex,"男");
break;
}
else if(l[0]=='2')
{
strcpy(stu[i].sex,"女");
break;
}
}
stu[i].total=0; //总分赋初值0
for(j=0;j<M;j++) //循环输入分数
{
while(1) //输入分数后判断是否合法
{
printf(" \t分数%d(0-100):",j+1);
scanf("%f",&stu[i].score[j]);
gets(g);
if(strlen(g)>=1)
{
printf("输入不合法,请重新输入!\n");
continue;
}
else if(stu[i].score[j]>100||stu[i].score[j]<0)
printf("输入不合法,请重新输入!\n");
else
break;
}
stu[i].total+=stu[i].score[j]; //累加各科分数
}
stu[i].average=float(stu[i].total/M); //计算平均分
count++;
printf("你已输入%d个同学的成绩,并且系统已帮你计算好总分和平均分!\n",count);
printf("是否继续录入?(y/n)"); //显示是否继续输入
while(1)
{
scanf("%s",m); //判断输入是否合法
if(strlen(m)>1)
{
printf("输入不合法,请重新输入:");
continue;
}
if(m[0]=='y') //跳出循环继续录入
break;
else if(m[0]=='n')
{
printf("你已输入%d个同学的成绩,是否想存储资料?(y/n)",count);
while(1)
{
scanf("%s",m); //判断输入是否合法
if(strlen(m)>1)
{
printf("输入不合法,请重新输入:");
continue;
}
if(m[0]=='y')save(); //将录入的资料存储
else if(m[0]=='n')exit1(); //退出系统
}
}
}
}
}//
/////////////////////////////////////////////////////////////////////
//
void show() //资料显示
{
char c[1];
void go_on();
printf("\n\t请输入要查看的班级(如:04计算机1班):");
scanf("%s",name); //输入要查看的文件名
if((fp=fopen(name,"rb"))==NULL) //判断是否存在输入文件的资料
{
printf("\n\t\t对不起,不存在任何资料!\n");
printf("\n\t\t是否要录入资料(y/n)?");
while(1)
{
scanf("%s",c); //判断输入是否合法
if(strlen(c)>1)
{
printf("\n\t输入不合法,请重新输入(y/n):");
continue;
}
if(c[0]=='y') //输入要求录入资料
getin();
else if(c[0]=='n') //退出系统
exit1();
else printf("\n\t输入不合法,请重新输入:(y/n)"); //输入不合法,重新输入
}
}
else
{
system("cls"); //清屏后显示资料
printf("你现在所查看的是:\n\n");
printf("\t\t %s\n\n",name);
printf(" 学号 姓名 性别 英语 高数 线数 毛论 物理 体育 法律 电路 总分 平均 名次\n");
for(i=0;i<N;i++)
{
if(fread(&stu[i],sizeof(struct student),1,fp)==1)
{
printf("\n%s%7s %2s",stu[i].num,stu[i].name,stu[i].sex);
for(j=0;j<M;j++)
printf(" %3.1f",stu[i].score[j]);
printf(" %3.1f",stu[i].total);
printf(" %3.1f",stu[i].average);
printf(" %d\n",i+1);
}
else
break;
}
}
fclose(fp); //关闭文件指针
printf("\n");
go_on(); //显示是否继续函数
}//
/////////////////////////////////////////////////////////////////////////////
//
void copy() //资料备份
{
FILE *in,*out; //定义文件指针
char infile[10],outfile[10]; //定义文件名字符串变量
while(1)
{
printf("\n\t请输入原存储在磁盘的班级名:"); //输入原来文件名
scanf("%s",infile);
if((in=fopen(infile,"rb"))==NULL) //判断是否存在该文件名
{
printf("\n\t不存在你所输入的原有磁盘文件名!\n"); //不存在,重新输入
continue;
}
else
break;
}
while(1)
{
printf("\n\t请输入新复制到磁盘的文件名:"); //输入新的要复制到的文件名
scanf("%s",outfile);
if((out=fopen(outfile,"rb"))!=NULL)
{
printf("\n\t该文件名已经存在,请重新输入!\n"); //判断存在,重新输入其它的
continue;
}
else
break;
}
if((out=fopen(outfile,"wb"))==NULL)
printf("不能打开此文件!");
while(!feof(in))fputc(fgetc(in),out); //将原来的资料复制到新的文件
fclose(in);
fclose(out); //关闭两个指针
printf("\n");
printf(" ******************************************************* \n\n");
printf(" 你已成功将资料备份! \n\n");
printf(" ******************************************************* \n\n");
go_on(); //显示是否继续函数
}//
///////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -