#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1000
typedef struct student{
char ID[10];
char name[20];
char sex;
float score[5];
float total;
float avg;
}STU;
void display(void); /*显示主菜单*/
void load(STU stu[], int *nPtr); /*把学生信息加载到内存*/
void save(STU stu[], int n); /*将数据保存到磁盘*/
void sort(STU stu[], int n); /*排序*/
void InputRecord(STU stu[],int i); /*输入一条记录*/
void find(STU stu[], int n); /*查找*/
void del(STU stu[], int *nPtr); /*删除*/
void add(STU stu[], int *nPtr); /*添加一条记录*/
void edit(STU stu[],int n); /*修改一条记录*/
void output(STU stu[], int n); /*输出所有信息*/
int main(){
STU stu[N];
int n, select;
load(stu, &n); /*加载数据到stu数组*/
while(1)
{
display(); /*显示主菜单*/
scanf("%d", &select);
switch(select)
{
case 1: /*添加*/
add(stu, &n); break;
case 2: /*修改*/
edit(stu, n); break;
case 3: /*排序*/
sort(stu, n); break;
case 4: /*查找*/
find(stu, n); break;
case 5: /*删除*/
del(stu, &n); break;
case 6: /*输出*/
output(stu, n); break;
case 7: /*退出*/
return 0;
}
}
}
/*调用InputRecord函数添加若干学生信息,
并把新添加的学生信息依次保存到文件中*/
void add(STU stu[], int *nPtr)
{
char sel = 'y';
while(sel == 'y')
{
InputRecord(stu, (*nPtr)++ ); /*添加第n+1个学生信息*/
save(stu, *nPtr);
printf("是否继续添加(yes--y,no--n)\n");
scanf(" %c", &sel);
}
}
/*显示主菜单*/
void display(void)
{
system("cls");
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");
}
int FindByNum(STU stu[], int n, char *str){
int i;
for(i = 0; i < n; i++){
if(strcmp(stu[i].ID, str) == 0){
return i;
}
}
return -1;
}
/*输出指针sPtr所指记录的内容*/
void PrintRecord(STU *sPtr){
int i;
printf("%8s%8s%4c", sPtr->ID, sPtr->name, sPtr->sex);
for(i = 0; i < 5; i++){
printf("%8.2f", sPtr->score[i]);
}
printf("%8.2f%8.2f", sPtr->total, sPtr->avg);
printf("\n");
}
void load(STU stu[], int *nPtr)
{
FILE *fp;
int i;
if((fp = fopen("student.dat", "r")) == NULL)
{
*nPtr = 0;
return;
}
/*把文件中的信息全部读取到stu中*/
for(i = 0; fread(&stu[i], sizeof(STU), 1, fp) != 0; i++)
*nPtr = i; /* *nPtr记录文件中当前学生数量 */
fclose(fp); /*关闭文件*/
}
void edit(STU stu[],int n){
int i, index;
char sel;
char str[20];
printf("请输入学号:\n");
scanf("%s", str);
index = FindByNum(stu,n,str);
if(index < 0){
printf("该学生不存在!\n");
return;
}
printf("修改前的信息:\n");
PrintRecord(&stu[index]);
//修改姓名
printf("是否修改姓名?请输入y or n:\n");
getchar();
scanf("%c",&sel);
if(sel == 'y'){
printf("请输入姓名:\n");
scanf("%s", stu[index].name);
}
//修改性别
printf("是否修改性别?请输入y or n:\n");
getchar();
scanf("%c", &sel);
if(sel == 'y'){
printf("请输入f or m:\n");
getchar();
scanf("%c", &stu[index].sex);
}
//修改成绩
printf("是否修改成绩?请输入y or n:\n");
getchar();
scanf("%c", &sel);
if(sel == 'y'){
stu[index].total = 0;
printf("请输入5门课程成绩:\n");
for(i = 0; i < 5; i++){
scanf("%f", &stu[index].score[i]);
stu[index].total = stu[index].total + stu[index].score[i];
}
stu[index].avg = stu[index].total / 5;
}
save(stu, n);
}
void InputRecord(STU stu[], int i){
int j;
printf("请输入第%d个学生的信息",i+2);
printf("请输入学生的学号(学号小于9位数字)\n");
scanf("%s", stu[i+1].ID);
printf("请输入学生的姓名\n");
scanf("%s", stu[i+1].name);
printf("请输入学生的性别(f代表女,m代表男)\n");
scanf(" %c", &stu[i+1].sex);
printf("请输入五门课的成绩(0~100)\n");
stu[i+1].total = 0;
for(j = 0; j < 5; j++){
scanf("%f",&stu[i+1].score[j]);
stu[i+1].total += stu[i+1].score[j];
}
stu[i+1].avg = stu[i+1].total / 5;
}
void save(STU stu[], int n)
{
FILE *fp;
if( (fp = fopen("student.dat","w")) == NULL)
{
printf("打开文件失败\n");
exit(0);
}
fwrite(stu, (n+1)* sizeof(stu[0]), 1, fp); //将n个记录写入文件
fclose(fp);
}
void output(STU stu[],int n){
int i;
/*打印表头*/
printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX","SCORE1","SCORE2","SCORE3","SCORE4","SCORE5","total","avg");
/*打印所有记录*/
for(i = 0;i <=n;i++){
PrintRecord(&stu[i]);
}
system("pause");
}
void sort(STU stu[], int n){
int select, i, j;
int (*cmp)(STU a, STU b);
int ScoreAsc(STU a, STU b);
int ScoreDes(STU a, STU b);
int NameAsc(STU a, STU b);
printf("1 按总分升序排列\n");
printf("2 按总分降序排列\n");
printf("3 按姓名升序排列\n");
scanf("%d",&select) ;
switch(select){
case 1: cmp = ScoreAsc;break;
case 2: cmp = ScoreDes;break;
case 3: cmp = NameAsc;break;
default:return;
}
for(i = 0; i < n; i++){
for(j = 0; j < n-i; j++){
if((*cmp)(stu[j],stu[j+1])){
STU t;
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
}
output(stu, n);
}
int ScoreAsc(STU a,STU b){
return a.total <b.total ? 1 : -1;
}
int ScoreDes(STU a,STU b){
return a.total >b.total ? 1 : -1;
}
int NameAsc(STU a,STU b){
return strcmp(a.name, b.name)>0? 1:-1;
}
void find(STU stu[], int n){
int index;
char str[20];
printf("请输入学号:\n");
scanf("%s", str);
index = FindByNum(stu, n+1, str);
if(index >= 0){
printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX","SCORE1","SCORE2","SCORE3","SCORE4","SCORE5","total","avg");
PrintRecord(&stu[index]);
}
else
printf("该学生信息不存在!\n");
system("pause");
}
void del(STU stu[], int *nPtr){
int i, index;
char str[20];
printf("请输入学号:\n");
scanf("%s", str);
index = FindByNum(stu, *nPtr, str);
if(index < 0){
printf("\n 该学生信息不存在!\n");
return ;
}
for(i = index; i < *nPtr - 1; i++){
stu[i] = stu[i+1];
}
(*nPtr)--;
printf("\n删除成功!\n");
save(stu, *nPtr);
}
学生成绩管理系统
于 2022-03-28 22:09:30 首次发布