背景
帮一个学生写的课程设计,支持文件读写,支持自动读取文件数据代替手动输入测试数据。
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <string.h>
int StuNum; //学生人数,可以改
#define StuPrj 3//课程数,可以改
#define MAX 100
double EnlishAVE;
double MathAVE;
double ChineseAVE;
typedef struct student
{
int studentID;
int ClassId;
char studentName[20];
char stuSex[10]; //man or woman
int EnlishSco;//英语分数
int MathSco;//数学分数
int ChineseSco;//语文分数
double stuAVE;//平均分
int AllSco;
}STU;
STU stu[MAX];
//统计每个学生的平均成绩
void CalcuStuAVE()
{
for (int i = 0; i < StuNum; i++) {
stu[i].AllSco = stu[i].ChineseSco + stu[i].MathSco + stu[i].EnlishSco;
stu[i].stuAVE = stu[i].AllSco/StuPrj;
}
}
void CalcuProACE()
{
int ToEn = 0, ToMa = 0, ToCh = 0;
for (int i = 0; i < StuNum; i++) {
ToEn += stu[i].EnlishSco;
ToMa += stu[i].MathSco;
ToCh += stu[i].ChineseSco;
}
EnlishAVE = ToEn/StuNum;
MathAVE = ToMa/StuNum;
ChineseAVE = ToCh/StuNum;
}
//数据输入
void Input()
{
FILE *fp;
fp=fopen("olddata.txt","w");
if(fp==NULL) {
printf("不能打开文件\n");
}
fprintf(fp,"%d\n",StuNum);
int i, j;
for(i = 0; i< StuNum; i++) {
printf("输入第%d个学生的学号: ", i+1);
scanf("%d",&stu[i].studentID);
fprintf(fp,"%d\n",stu[i].studentID);
printf("输入此学生姓名: ");
scanf("%s",stu[i].studentName);
fprintf(fp,"%s\n",stu[i].studentName);
printf("输入此学生性别: ");
scanf("%s",stu[i].stuSex);
fprintf(fp,"%s\n",stu[i].stuSex);
printf("输入此学生英语成绩: ");
scanf("%d",&stu[i].EnlishSco);
fprintf(fp,"%d\n",stu[i].EnlishSco);
printf("输入此学生数学成绩: ");
scanf("%d",&stu[i].MathSco);
fprintf(fp,"%d\n",stu[i].MathSco);
printf("输入此学生语文成绩: ");
scanf("%d",&stu[i].ChineseSco);
fprintf(fp,"%d\n",stu[i].ChineseSco);
printf("输入此学生班级 :");
scanf("%d",&stu[i].ClassId);
fprintf(fp,"%d\n",stu[i].ClassId);
}
fclose(fp);
CalcuProACE();
CalcuStuAVE();
}
void SecondRead()
{
FILE *fp;
fp=fopen("olddata.txt","r");
if(fp==NULL) {
return;
}
int conutSum = 0;
fscanf(fp,"%d",&conutSum);
StuNum = conutSum;
for(int i = 0;i < StuNum;i++) {
fscanf(fp,"%d", &stu[i].studentID);
fscanf(fp,"%s", stu[i].studentName);
fscanf(fp,"%s", stu[i].stuSex);
fscanf(fp,"%d", &stu[i].EnlishSco);
fscanf(fp,"%d", &stu[i].MathSco);
fscanf(fp,"%d", &stu[i].ChineseSco);
fscanf(fp,"%d", &stu[i].ClassId);
}
CalcuProACE();
CalcuStuAVE();
}
//数据修改,通过学号修改学生信息
void ModifyInfo()
{
//1 修改 0不修改
int Id;
int flag = 0;
int i;
while(1){
printf("是否需要修改学号:");
scanf("%d", &flag);
if(flag ==0) {
break;
}
else {
flag = 0;
}
printf("输入需要修改的学号: ");
scanf("%d", &Id);
for (i = 0; i < StuNum; i++) {
if (stu[i].studentID == Id) {
flag = 1;
break;;
}
}
if (flag == 0) {
printf("学号不存在\n");
continue;
}
flag = 0;
printf("姓名是否需要修改:");
scanf("%d", &flag);
if(flag ==1) {
printf("输入修改后姓名 ");
scanf("%s",stu[i].studentName);
}
flag = 0;
printf("姓别是否需要修改:");
scanf("%d", &flag);
if(flag == 1) {
printf("输入修改后姓别 ");
scanf("%s",stu[i].stuSex);
}
flag = 0;
printf("英语成绩是否需要修改:");
scanf("%d", &flag);
if(flag == 1) {
printf("输入修改后的英语成绩 ");
scanf("%d",&stu[i].EnlishSco);
}
flag = 0;
printf("数学成绩是否需要修改:");
scanf("%d", &flag);
if(flag == 1) {
printf("输入修改后的数学成绩 ");
scanf("%d",&stu[i].MathSco);
}
flag = 0;
printf("语文成绩是否需要修改:");
scanf("%d", &flag);
if(flag ==1) {
printf("输入修改后的语文成绩 ");
scanf("%d",&stu[i].ChineseSco);
}
flag = 0;
printf("班级是否需要修改:");
scanf("%d", &flag);
if(flag ==1) {
printf("输入修改后的班级 ");
scanf("%d",&stu[i].ClassId);
}
flag = 0;
printf("是否需要继续修改学号:");
scanf("%d", &flag);
if(flag ==0) {
break;
}
else {
flag = 0;
continue;
}
}
}
//排序,按学号从小到大排序
void Sortinfo()
{
struct student t;
for(int i = 1; i < StuNum; i++) {
for(int j = 0;j < StuNum - i; j++) {
if(stu[j].studentID > stu[j+1].studentID) {
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
}
}
//查询,按学号查询输出成绩
void QueryInfo()
{
int Id;
int flag = 0;
printf("请输入待查找的学生学号:");
scanf("%d",&Id);
for (int i = 0; i < StuNum; i++) {
if (Id == stu[i].studentID) {
printf("\n学号\t姓名\t性别\t班级\t数学\t英语\t语文\t总成绩\t平均分\n");
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%lf\n",stu[i].studentID,stu[i].studentName,stu[i].stuSex,stu[i].ClassId
, stu[i].MathSco,stu[i].EnlishSco,stu[i].ChineseSco,stu[i].AllSco, stu[i].stuAVE);
printf("打印出查找结果!\n");
flag = 1;
break;
}
}
}
void Studelete()
{
int Id;
int result;
printf("请输入待删除的学生学号:");
scanf("%d",&Id);
result= -1;
for (int i = 0; i< StuNum; ++i) {
if (Id == stu[i].studentID){
result = i;
break;
}
}
if (result == -1) {
printf("没有该学生信息!\n");
}
else { //删除当前学生信息即为将数组从result的位置依次前挪一个位置
for(int i = result; i < StuNum - 1; ++i) { //最后在main函数中,要将n的值减1
stu[i].studentID = stu[i+1].studentID;
strcpy(stu[i].studentName,stu[i+1].studentName);
stu[i].MathSco = stu[i+1].MathSco;
stu[i].EnlishSco = stu[i+1].EnlishSco;
stu[i].ChineseSco = stu[i+1].ChineseSco;
stu[i].AllSco = stu[i+1].AllSco;
stu[i].stuAVE = stu[i+1].stuAVE;
}
}
StuNum = StuNum - 1;
}
void Print()
{
int i;
printf("\n学号\t姓名\t性别\t班级\t数学\t英语\t语文\t总成绩\t平均分\n");
printf("----------------------------------------------------------\n");
for(i = 0; i< StuNum; i++) {
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%lf\n",stu[i].studentID,stu[i].studentName,stu[i].stuSex,stu[i].ClassId
, stu[i].MathSco,stu[i].EnlishSco,stu[i].ChineseSco,stu[i].AllSco, stu[i].stuAVE);
}
printf("-------------------------------------------------------\n");
}
void PreserData()
{
FILE *fp;
fp=fopen("newdata.txt","w");
if(fp==NULL) {
printf("不能打开文件\n");
}
int i;
for(i = 0; i< StuNum; i++) {
//printf("保存第%d个学生的学号: ", i+1);
fprintf(fp,"%d",stu[i].studentID);
//printf("保存此学生姓名: ");
fprintf(fp,"%s\n",stu[i].studentName);
//printf("保存此学生性别: ");
fprintf(fp,"%s\n",stu[i].stuSex);
//printf("保存此学生英语成绩: ");
fprintf(fp,"%d\n",stu[i].EnlishSco);
//printf("保存此学生数学成绩: ");
fprintf(fp,"%d\n",stu[i].MathSco);
//printf("保存此学生语文成绩: ");
fprintf(fp,"%d\n",stu[i].ChineseSco);
//printf("保存此学生班级 :");
fprintf(fp,"%d\n",stu[i].ClassId);
//printf("保存此学生平均成绩 :");
fprintf(fp,"%d\n",stu[i].stuAVE);
}
fclose(fp);
}
int main()
{
int flag;
SecondRead();
while(1) {
printf("*************************************\n");
printf("欢迎使用学生成绩管理系统\n");
printf("[1] 输入所有学生信息\n");
printf("[2] 输出所有学生成绩\n");
printf("[3] 输入学号可以修改学生信息\n");
printf("[4] 按学号对学生排序\n");
printf("[5] 按学号查询学生成绩\n");
printf("[6] 统计学生平均学生成绩和课程平均\n");
printf("[7] 按学号删除某个学生信息\n");
printf("[8] 将数据存在文件中\n");
printf("[9] 退出程序\n");
printf("请输入您的选择(1 - 9):");
scanf("%d",&flag);
printf("**************************************)\n");
switch (flag) {
case 1://录入;
printf("请输入学生个数: ");
scanf("%d",&StuNum);
Input();
break;
case 2://输出;
Print();
break;
case 3://根据学号可以修改学生信息
ModifyInfo();
break;
case 4://按学号排序
Sortinfo();
break;
case 5://按学号查询学生成绩
QueryInfo();
break;
case 6://统计学生平均学生成绩和课程平均
CalcuProACE();
CalcuStuAVE();
break;
case 7://按学号删除某个学生信息
Studelete();
break;
case 8://将数据存在文件中
PreserData();
break;
case 9://退出程序
printf("退出程序\n");
printf("程序结束,谢谢使用!\n");
exit(0);
default:
printf("您输入的菜单有误。请重新输入!\n");
}
}
return 0;
}
以上,欢迎留言交流~