目录
题目描述:
- 设计要求:
基本功能
- 添加成绩
- 删除成绩
- 查询学生成绩
- 查询班级成绩
- 退出
创新(自拟)功能:
程序实现的其它功能由个人自拟。
- 设计要求具体说明
基本功能:
成绩记录簿中记录以下数据:
学号、姓名、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分;
输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:8位数字;课程编号:5位数字;成绩:0 -100 之间的整数,学分: 1- 5之间的实型数。
添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程成绩给出提示;
查询(班级或个人)成绩:
- 查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和已完成的总学分。
- 查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。
代码展示:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define SIZE 50
#define N 3
#define LEN sizeof(struct student)
struct student
{
char name[20]; //姓名
int stu_num; //学号
int stu_score;//学分
int less_num[N]; //课程编号
char less_name[N][20];//课程名称。
int score[N]; //成绩
}stu[SIZE];
void Menu(); //菜单
void inputstudent(); //添加学生
void printstudent(); //显示所有学生
void Delete(); //删除
void search_name(); //姓名查找
void search_stu_num(); //学号查找
void per_search(); //个人查找菜单
void class_search(); //查班级表//查班级表
int main()
{
while(1)
{
int n;
Menu();
printf("请输入您要执行的操作:");
scanf("%d",&n);
switch(n)
{
case 1:inputstudent();break;
case 2:Delete();break;
case 3:per_search();break;
case 4:class_search();break;
case 5:printstudent();break;
case 0:exit(0);break;
default:printf("输入错误,没有该操作!\n");
}
}
return 0;
}
void Menu()//菜单
{
printf("****学生成绩管理系统****\n");
printf("\n");
printf("* 1.添加 *\n");
printf("* 2.删除 *\n");
printf("* 3.查学生成绩 *\n");
printf("* 4.查单科成绩表 *\n");
printf("* 5.显示所有学生 *\n");
printf("* 0.退出 *\n");
printf("************************\n");
}
void inputstudent() //添加录入学生
{
FILE*fp;
int i, n = 0,j; //n记录学生个数
for(i=0;i<SIZE;i++)
{
printf("请输入学生的信息:\n");
printf("请输入学号(8位):");
while(stu[i].stu_num<10000000||stu[i].stu_num>=100000000)
{
printf("学号不合法!请重新输入:");
scanf("%d",&stu[i].stu_num);
}
scanf("%d",&stu[i].stu_num);
printf("请输入姓名:");
scanf("%s",stu[i].name);
printf("请输入学分(1到5之间):");
scanf("%d",&stu[i].stu_score);
while(stu[i].stu_score<1||stu[i].stu_score>5)
{
printf("学分不合法!请重新输入:");
scanf("%d",&stu[i].stu_score);
}
for(j=0;j<N;j++)
{
printf("请输入第%d门课程的编号(5位):",j+1);
scanf("%d",&stu[i].less_num[j]);
while(stu[i].less_num[j]<10000||stu[i].less_num[j]>=100000)
{
printf("编号不合法!请重新输入:");
scanf("%d",&stu[i].less_num[j]);
}
printf("请输入第%d门课程的名称:",j+1);
scanf("%s",stu[i].less_name[j]);
printf("请输入第%d门课程的成绩:",j+1);
scanf("%d",&stu[i].score[j]);
while(stu[i].score[j]<0||stu[i].score[j]>100)
{
printf("成绩不合法!请重新输入:");
scanf("%d",stu[i].score[j]);
}
}
printf("\n");
printf("添加成功!");
printf("\n\n");
n++;
printf("\n是否继续添加?(y/n):\n"); //选择继续添加数据还是停止添加
if (getch() != 'y')
break;
}
if ((fp = fopen("stu.txt", "a+")) == NULL)
{
printf("文件操作失败\n");
exit(0);
}
for (i = 0; i < n; i++)
if (fwrite(&stu[i], LEN, 1, fp) != 1)
printf("写入文件失败\n");
fclose(fp);
system("cls");
}
void printstudent() //显示所有学生信息
{
FILE*fp;
int i, n,j;
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("文件打开失败\n");
exit(0);
}
i = 0;
while (fread(&stu[i], LEN, 1, fp) != 0)
i++; //n代表学生个数
n = i;
for (i = 0; i < n; i++)
fread(&stu[i], LEN, 1, fp);
fclose(fp);
system("cls");
printf("\n\t\t*************** 所有学生信息*******************\n");
printf("\t\t姓名\t学号\t\t学分");
for(i=0;i<N;i++)
{
printf("\t%s",stu[0].less_name[i]);
}
printf("\n");
printf("\n\t\t************************************************\n");
for (i = 0; i < n; i++)
{
printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
for(j=0;j<N;j++)
{
printf("\t%d",stu[i].score[j]);
}
printf("\n");
}
printf("\n\t\t__________________按任意键继续__________________\n");
getch();
system("cls");
}
void Delete() //删除
{
FILE*fp;
int i, j, n, flag,k;
struct student temp;
int num; //学号
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
i = 0;
while (fread(&stu[i], LEN, 1, fp) != 0)
i++;
n = i; //记录个数
printf("\n请输入要删除的学号:");
scanf("%d", &num);
flag = 1;
for (i = 0; i < n; i++)
{
if (num==stu[i].stu_num) //查到了
{
for (j = i; j < n - 1; j++) //依次向前移位
{
strcpy(stu[j].name, stu[j + 1].name);
stu[j].stu_num=stu[j + 1].stu_num;
stu[j].stu_score=stu[j + 1].stu_score;
for(k=0;k<N;k++)
{
stu[j].less_num[k]=stu[j + 1].less_num[k];
stu[j].score[k]=stu[j + 1].score[k];
strcpy(stu[j].less_name[k], stu[j + 1].less_name[k]);
}
}
flag = 0; //标记已删除
n--;
}
}
fp = fopen("stu.txt", "wb");
for (i = 0; i < n; i++)
fwrite(&stu[i], LEN, 1, fp);
fclose(fp);
if (flag == 1)
{
printf("\n记录未找到!\n按任意键继续......\n\n");
getch();
system("cls");
return;
}
else
{
printf("\n\n删除成功!\n\n");
printf("按任意键重新查看所有记录\n");
getch();
system("cls");
}
fclose(fp);
fp = fopen("stu.txt", "rb");
for (i = 0; i < n; i++) //学号从小到大冒泡排序
for (j = i + 1; j < n; j++)
if (stu[i].stu_num>stu[j].stu_num)
{
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
printf("\n\t\t*************** 所有学生信息*******************\n");
printf("\t\t姓名\t学号\t\t学分");
for(i=0;i<N;i++)
{
printf("\t%s",stu[0].less_name[i]);
}
printf("\n");
printf("\n\t\t************************************************\n");
i = 0;
while (fread(&stu[i], LEN, 1, fp) != 0) //显示所有记录
{
printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
for(j=0;j<N;j++)
{
printf("\t%d",stu[i].score[j]);
}
i++;
}
printf("\n\t\t***********************************************\n");
fclose(fp);
getch();
system("cls");
}
void per_search() //个人查找
{
int sel;
system("cls");
do {
printf("\n\t\t*****************按学号或姓名查找****************\n");
printf("\n\t\t1------------------用学号查找------------------\n");
printf("\t\t2------------------用姓名查找------------------\n");
printf("\t\t3------------------退出本次查找----------------\n");
printf("\n\t\t*****************按姓名或学号查找 ***************\n");
printf("\n请选择(1~3):\n");
scanf("%d", &sel);
switch (sel)
{
case 1:search_stu_num(); break;
case 2:search_name(); break;
case 3:break;
default:printf("输入有误!\n"); break;
}
} while (sel != 3);
system("cls");
}
void search_stu_num() //学号查找
{
FILE*fp;
int i, n,j,k;
int num;
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
i = 0;
while (fread(&stu[i], LEN, 1, fp) != 0)
i++;
n = i;
for (i = 0; i < n; i++)
fread(&stu[i], LEN, 1, fp);
fclose(fp);
printf("\n输入学号:");
scanf("%d", &num);
for (i = 0; i < n; i++)
{
if (num==stu[i].stu_num)
{
printf("\n\t\t***********************************************\n");
printf("你要找的记录为:\n");
printf("\t\t姓名\t学号\t\t学分");
for(k=0;k<N;k++)
{
printf("\t%s",stu[0].less_name[k]);
}
printf("\n");
printf("\n\t\t************************************************\n");
printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
for(j=0;j<N;j++)
{
printf("\t%d",stu[i].score[j]);
}
printf("\n");
break;
}
}
printf("\n\t\t***********************************************\n");
if (i == n)
{
system("cls");
printf("\n\n\n\n\t\t未找到所需记录!\n");
getch();
}
}
void search_name() //姓名查找
{
FILE*fp;
int i, j, flag, n,k;
char name[20];
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
i = 0;
while (fread(&stu[i], LEN, 1, fp) != 0)
i++;
n = i;
for (i = 0; i < n; i++)
fread(&stu[i], LEN, 1, fp);
fclose(fp);
printf("\n请输入需要查找的学生姓名:");
scanf("%s", name);
flag = 0;
for (i = 0; i < n; i++)
{
if (strcmp(name, stu[i].name) == 0)
{
printf("\n\t\t***********************************************\n");
printf("查找的记录信息为:\n:");
printf("\t\t姓名\t学号\t\t学分");
for(k=0;k<N;k++)
{
printf("\t%s",stu[0].less_name[k]);
}
printf("\n");
printf("\n\t\t************************************************\n");
printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
for(j=0;j<N;j++)
{
printf("\t%d",stu[i].score[j]);
}
printf("\n");
flag = 1;
}
}
printf("\n\t\t***********************************************\n");
if (flag != 1)
{
system("cls");
printf("\n\n\n\n\t\t未找到所需记录!\n");
getch();
}
}
void class_search() //查班级表
{
FILE*fp;
int i,flag, n,t;
int m=0;
int b=0,c=0,d=0;
float a=0,k=0; //及格人数
float aver=0,pass;
int sum=0;
int less_num;
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
i = 0;
while (fread(&stu[i], LEN, 1, fp) != 0)
i++;
n = i;
for (i = 0; i < n; i++)
fread(&stu[i], LEN, 1, fp);
fclose(fp);
printf("\n请输入需要查找的课程编号:");
scanf("%d", &less_num);
flag = 0;
for (i = 0; i < n; i++) //统计
{
for(t=0;t<N;t++)
{
if (less_num==stu[i].less_num[t])
{
sum=sum+stu[i].score[t];
k++;
m++;
if(stu[i].score[t]>=60)
a++;
if(stu[i].score[t]>=0&&stu[i].score[t]<40)
b++; //0-40
else if(stu[i].score[t]>=40&&stu[i].score[t]<60)
c++; //40-60
else if(stu[i].score[t]>=60&&stu[i].score[t]<100)
d++; //60-100
}
}
aver=sum/k;
}
pass=a/k;
printf("\n\t\t***********************************************\n");
for (i = 0; i < n; i++) //输出
{
for(t=0;t<N;t++)
{
if (less_num==stu[i].less_num[t])
{
printf("\n\t\t***********************************************\n");
printf("\t\t姓名\t学号\t\t");
printf("%s\n",stu[i].less_name);
printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].score[t]);
flag=1;
}
}
}
printf("\n\t\t***********************************************\n");
printf("\n平均分:%f\n",aver);
printf("人数:%d人\n",m);
printf("及格率:%f\n",pass);
printf("0-40 40-60 60-100\n");
printf("%d人 %d人 %d人 \n",b,c,d);
printf("\n\n\n");
if (flag != 1)
{
system("cls");
printf("\n\n\n\n\t\t未找到所需记录!\n");
getch();
}
}