该管理系统通过使用全局定义结构体存储学生信息,因此每个函数不用在形参调用;
使用了少量go to语句实现层级跳转;
注意:
1.学号一般是很长的几位数,而int型只有4个字节,会出现数据溢出,所以定义long long;
long long n;
2.查询遍历等操作不需要修改原数据,所以形参不用设置指针,但要传值判断结构体是否为空;但如删除操作则需要定义指针。(实参--单向传递-->形参);
3.冒泡排序,单趟把最小的数据放在结构体最后面
for (i = 0; i < sn - 1; i++)
{
for (j = 0; j < sn - 1 - i; j++) //每一趟比较把最小的数放在最下面
{
if (stu[j].grades < stu[j + 1].grades)
{
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
完整代码:
/*******************学生成绩管理系统******************
************************阿布君***************** ******/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SN 50
struct ST //定义数据模板
{
char name[10];
int age;
char sex;
long long int xuehao;
int grades;
}stu[SN]; //直接定义数组变量
void firstface() //设置首页
{
printf(" 功能菜单如下:\n");
printf("**0.重新查看功能表\n**1.查看系统中所有学生信息\n**2.检索个人信息(以学号)\n**3.录入学生信息\n**4.删除学生信息\n**5.学生成绩排名\n**6.导出学生成绩为txt文件\n**7.本地导入数据到系统\n**8.退出系统!\n\n请选择操作:\n");
}
void ckall(int sn) //1.查看所有学生信息
{
if(sn==0) //sn传入当前数组的数据个数
{
printf("当前系统内无任何学生信息,请选择录入!\n");
return;
}
int i;
for(i=0;i<sn;i++)
{
printf("姓名:%s\n",stu[i].name);
printf(" 年龄:%d\n",stu[i].age);
printf(" 性别:%c\n",stu[i].sex);
printf(" 学号:%lld\n",stu[i].xuehao);
printf(" 成绩:%d\n",stu[i].grades);
printf("\n");
}
}
void one(int sm) //2.通过学号检索学生信息
{
if(sm==0)
{
printf("当前系统内无任何学生信息,请选择录入!\n");
return;
}
int i;
long long n; //学号很长,int型只有4个字节,会出现数据溢出
printf("请输入要查询的学生的学号:\n");
bg2:
scanf("%d",&n);
for(i=0;i<sm;i++)
{
if(stu[i].xuehao==n)
{
printf("查询结果为:\n");
printf(" 姓名:%s\n",stu[i].name);
printf(" 年龄:%d\n",stu[i].age);
printf(" 性别:%c\n",stu[i].sex);
printf(" 学号:%lld\n",stu[i].xuehao);
printf(" 成绩:%d\n",stu[i].grades);
printf("\n");
goto bg1;
}
}
printf("未查询到该生信息,请重新确认学号并输入!\n");
goto bg2;
bg1:
return;
}
void add(int *sm,int *p) //3.批次录入学生信息
{
int k,i,j=0;
bg2:
printf("请确认要录入多少位学生的信息:\n");
bg1:
scanf("%d",&k);
if(k>SN-*sm)
{
printf("超出系统容量!最多只能录入%d位学生,请重新确认输入人数!\n",SN);
goto bg1;
}
if(k<=0)
{
printf("输入错误,是否取消录入?\n**1.取消录入回到主界面\n**2.重新录入\n**3.退出系统!\n");
bg3:
scanf("%d",&j);
if(j==1)
{
firstface();
return;
}
else if(j==2)
goto bg2;
else if(j==3)
*p=0;
else
{
printf("输入错误。请重新输入!");
goto bg3;
}
}
bg4:
printf("请依次输入学生的:姓名 年龄 性别(M%cm或者W%cw) 学号 成绩",92,92); //92是'\'的ASCII码
for(i=0;i<k;i++)
{
printf("\n请输入第%d名同学的信息:",i+1);
scanf("%s %d %c %lld %d",stu[*sm+i].name,&stu[*sm+i].age,&stu[*sm+i].sex,&stu[*sm+i].xuehao,&stu[*sm+i].grades); //注意:第一个stu[*sm+i].name不用加&
if(stu[*sm+i].sex!='M'&&stu[*sm+i].sex!='W'&&stu[*sm+i].sex!='m'&&stu[*sm+i].sex!='w')
{
printf("请按照要求格式输入!\n");
goto bg4;
}
}
printf("录入成功,请选择查看!\n");
*sm+=k;
}
void delete(int *sm) //4.通过学号删除学生信息
{
if(*sm==0)
{
printf("当前系统内无任何学生信息,请选择录入!\n");
return;
}
bg1:
printf("请输入要删除的学生的学号进行删除:");
int i,j;
long long n;
scanf("%d",&n);
for(i=0;i<*sm;i++)
{
if(stu[i].xuehao==n)
{
for(;i<*sm-1;i++)
{
stu[i]=stu[i+1];
}
stu[i].xuehao=0;
//system("CLS");
printf("删除成功!\n");
firstface();
return;
}
}
printf("未找到该学生信息,请选择重新输入或返回\n**1.重新输入\n**2.返回上一级\n");
bg2:
scanf("%d",&j);
if(j==1)
goto bg1;
else if(j==2)
{
//system("CLS");
firstface();
return;
}
else
{
printf("输入错误。请重新输入!");
goto bg2;
}
}
void com(int sn) //5.成绩排名(冒泡)
{
if (sn == 0)
{
printf("当前系统内无任何学生信息,请选择录入!\n");
return;
}
int i, j;
struct ST temp;
for (i = 0; i < sn - 1; i++)
{
for (j = 0; j < sn - 1 - i; j++) //每一趟比较把最小的数放在最下面
{
if (stu[j].grades < stu[j + 1].grades)
{
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
printf("学生成绩排名如下:\n");
for (i = 0; i < sn; i++)
{
printf("姓名:%s\n", stu[i].name);
printf(" 年龄:%d\n", stu[i].age);
printf(" 性别:%c\n", stu[i].sex);
printf(" 学号:%lld\n", stu[i].xuehao);
printf(" 成绩:%d\n", stu[i].grades);
printf("\n");
}
}
void dataout(int sn) //6.导出到txt
{
if (sn == 0)
{
printf("当前系统内无任何学生信息,请选择录入!\n");
return;
}
FILE *fp;
fp = fopen("students.txt", "w");
if (fp == NULL)
{
printf("打开文件失败!\n");
return;
}
int i;
for (i = 0; i < sn; i++)
{
fprintf(fp, "姓名:%s\n", stu[i].name);
fprintf(fp, " 年龄:%d\n", stu[i].age);
fprintf(fp, " 性别:%c\n", stu[i].sex);
fprintf(fp, " 学号:%lld\n", stu[i].xuehao);
fprintf(fp, " 成绩:%d\n", stu[i].grades);
fprintf(fp, "\n");
}
fclose(fp); //记得关闭文件
printf("导出成功!请在桌面查看students.txt文件。\n");
}
void insert(int *sn)
{
FILE *fp;
fp=fopen("students.txt","r");
if (fp == NULL)
{
printf("打开文件失败!\n");
return;
}
*sn=0;
while(!feof(fp)&&*sn<SN)
{
fscanf(fp, "姓名:%s\n 年龄:%d\n 性别:%c\n 学号:%lld\n 成绩:%d\n", stu[*sn].name, &stu[*sn].age, &stu[*sn].sex, &stu[*sn].xuehao, &stu[*sn].grades);
*sn++;
}
// 输出读取到的学生信息
int i;
for(i = 0; i < *sn; i++)
{
printf("姓名:%s\n", stu[i].name);
printf("年龄:%d\n", stu[i].age);
printf("性别:%c\n", stu[i].sex);
printf("学号:%lld\n", stu[i].xuehao);
printf("成绩:%d\n\n", stu[i].grades);
}
printf("文件导入成功!");
*sn--;
}
void exitt(int *p) //8.退出系统! 6
{
*p=0;
}
int main()
{
int ex=1,*p=ex; //定义一个指针,通过指针来实现退出循环(系统)
int snum=0;
printf("******欢迎进入学生成绩管理系统!******\n");
firstface();
memset(&stu,0,sizeof(struct ST)*SN);
while(ex)
{
int n;
scanf("%d",&n);
switch(n)
{
case 0:
firstface();break;
case 1:
ckall(snum);break;
case 2:
one(snum);break;
case 3:
add(&snum,p);break;
case 4:
delete(&snum);break;
case 5:
com(snum);break;
case 6:
dataout(snum);break;
case 7:
insert(&snum);break;
case 8:
exitt(p);break;
default:
printf("输入有误,请重新输入!");
}
}
return 0;
}
该代码有一个问题就是当导出为txt文件之后,下次想要直接导入,会因为格式错误而导入失败,目前还不知道怎么解决,请求高人指点,谢谢啦。