该学生成绩管理系统为我大一的一次课设,只是用结构体和链表实现了,“增删查改”功能,后续修改时我又加入了按学生总分进行链表排序和保存简单的txt文件。
首先介绍我建立的结构体,它可以储存学号,学生姓名,各科成绩和总成绩,并定义了,新类型stu。
typedef struct student
{
char xuehao[1000];//学号
char name[20];//姓名
char Class[20];//班级
float mathgrade;//数学成绩
float eglishgrade;//英语成绩
float computeregrade;//计算机成绩
float pingjun;//平均成绩
float zong;//总分
struct student *next;
} stu;
stu *head;
下面是主函数,包括一个简易的登录界面,并进入初始化界面(函数)
int main()
{
head = (stu*)malloc(sizeof(stu));
head->next=NULL;
char zhanghao1[20] = "a"/*储存注册账号*/,zhanghao2[20]/*储存登录账号*/;
char mima1[20]="a"/*储存注册密码*/,mima2[20]/*储存登录密码*/;
int j;
for(int i=0;i!=1;)
{
printf("\t\t****************************\n");
printf("\t\t******学生成绩管理系统******\n");
printf("\t\t****************************\n");
printf("\t\t请选择\n\t\t1.登录\n\t\t2.注册\n\t\t");
char a[100];
scanf("%s",a);
if(strcmp(a,"1")==0 && strcmp(zhanghao1,"a")==0 && strcmp(mima1,"a")==0)//建立了一个简陋的注册登录界面
{
printf("\t\t请先注册账号\n");
printf("\t\t请输入需要创建的账号;");
scanf("%s",zhanghao1);
printf("\t\t请输入需要注册的密码:");
scanf("%s",mima1);
system("pause");
system("cls");
continue;
}else if(strcmp(a,"1")==0 && strcmp(zhanghao1,"a")!=0 && strcmp(mima1,"a")!=0)
{
printf("\t\t请输入登录账号:");
scanf("%s",zhanghao2);
printf("\t\t请输入登录密码:");
scanf("%s",mima2);
for(;;)
{
if(strcmp(zhanghao1,zhanghao2)!=0 || strcmp(mima1,mima2)!=0)
{
printf("\t\t账号密码错误\n\t\t请重新输入账号:");
scanf("%s",zhanghao2);
printf("\t\t请重新输入密码:");
scanf("%s",mima2);
j++;
if(j==3)
{
break;
}
}
else
{
printf("成功登录\n");
i=1;
break;
}
}
}else if(strcmp(a,"2")==0)
{
printf("\t\t请输入账号:");
scanf("%s",zhanghao1);
printf("\t\t请输入密码:");
scanf("%s",mima1);
system("pause");
system("cls");
continue;
}else
{
printf("\t\t请输入1或2");
system("pause");
system("cls");
continue;
}
if(j==3)
{
printf("\t\t输入错误次数过多");
break;
}
chushi();
if (tui == 1) {
break;
}
system("pause");
system("cls");
}
return 0;
}
初始化函数,创建初始化界面,并利用switch选择结构进入其他功能函数。
void chushi()//初始化界面
{
system("pause");
system("cls");
void pai(stu *head);
void baocun(stu*head);
while (1)
{
printf("\t\t****************************\n");
printf("\t\t******学生成绩管理系统******\n");
printf("\t\t****************************\n");
printf("\t\t 1、新增学生成绩信息并保存\n");
printf("\t\t 2、显示所有学生成绩信息\n");
printf("\t\t 3、查询学生成绩信息\n");
printf("\t\t 4、修改学生成绩信息\n");
printf("\t\t 5、删除学生成绩信息\n");
printf("\t\t 6、按照学生总成绩排序\n");
printf("\t\t 7、生成text文件保存\n");
printf("\t\t 0、退出系统\n");
printf("\t\t 请输入你的选择:");
int a,b;
b=scanf("%d",&a);
while(b!=1)
{
while((getchar())!='\n')
{
printf("警告:只能输入数字");
}
b = scanf("%d",&a);
}
system("cls");
switch(a)//利用switch选择结构
{
case 1:
zeng(head);
break;
case 2:
xianshi(head);
break;
case 3:
find(head);
break;
case 4:
chance(head);
break;
case 5:
cancel(head);
break;
case 6:
pai(head);
break;
case 7:
baocun(head);
break;
case 0:
tui = 1;
printf("感谢你使用学生通信录管理系统,请关掉程序!!!\n");
break;
}
if(tui==1)
{
break;
}
}
}
下面是功能函数我就不做过多的赘述大家自己看即可:
链表增函数:
void zeng(stu*head)//增加学生成绩信息
{
while (1)
{
stu *p, *tail, *q;
tail = head;
while (tail->next != NULL) { //尾插法
tail = tail -> next;
}
q = head->next;
int a = 0;
char xuehao1[20];
printf("请输入学生号\n");
scanf("%s",xuehao1);
while(q != NULL)
{
if(strcmp(q->xuehao,xuehao1) == 0)//判断是否输入重复学号
{
a=1;
printf("学号无法重复请输入\n");
break;
}else
{
q=q->next;
}
}
if(a==1)
{
continue;
}
p=(stu*)malloc(sizeof(stu));//为新结构体申请空间
strcpy(p->xuehao,xuehao1);//复制学号到结构体中
printf("请输入姓名");
scanf("%s",p->name);
printf("请输入班级");
scanf("%s",p->Class);
float mathgrade1,eglishgrade1,computeregrade1,pingjun1;
int j;
printf("请输入数学成绩:");
while (1)//该循环为防止输入错误类型和小于1大于100的分数
{
j=scanf("%f",&mathgrade1);
if(j==0||getchar()!='\n')
{
printf("非法输入字符,请重新输入数字:");
while(getchar() != '\n');//清除缓存区
continue;
}
if(mathgrade1<=100 && mathgrade1>=1)
{
p->mathgrade=mathgrade1;
break;
}else
{
printf("非法输入成绩,请重新输入:");
continue;
}
}
printf("请输入英语成绩:");
while (1)
{
j=scanf("%f",&eglishgrade1);
if(j=