在看完C语言链表和文件部分后,我终于可以小试一下牛刀了,今天写了一个很渣的学生信息管理系统,希望大家能多多指教,多多提出改进意见.此外,这是第一次写博客,有什么不足之处,也请大家指出。下面是我的代码:
# include <stdio.h>
# include<stdlib.h>
# include<io.h>
# include<string.h>
# include<conio.h>
# define N 40
struct score
{
int mathmatic;
int English;
int xiandai;
int Clanguage;
int PE;
};
typedef struct student
{
char name[N];
char sex[N];
char grade[N];//年级
double ave;
struct score chengji;
int panming;//年级排名
struct student *pNext;
}STU,*PSTU;
struct teacher
{
char nicheng[N];
char num[N];
char mask[N];
};
//创建链表,存储学生信息
PSTU input()
{
PSTU head=(PSTU)malloc(sizeof(STU));
if(head==NULL)
{
printf("分配失败,程序中止");
exit(-1);
}
int i,len,sum;
printf("请输入你想要录入学生的个数:");
scanf("%d",&len);
PSTU tail=head;
tail->pNext=NULL;
for(i=0;i<len;i++)
{
sum=0;
PSTU pNew=(PSTU)malloc(sizeof(STU));
if(pNew==NULL)
{
printf("分配失败,程序中止");
exit(-1);
}
printf("请输入第%d个学生的信息:\n",i+1);
printf("请输入学生的姓名:");
fflush(stdin);
gets(pNew->name);
printf("请输入学生的性别:");
fflush(stdin);
gets(pNew->sex);
printf("请输入学生的年级:");
fflush(stdin);
gets(pNew->grade);
printf("请输入学生的高数成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.mathmatic);
sum+=pNew->chengji.mathmatic;
printf("请输入学生的英语成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.English);
sum+=pNew->chengji.English;
printf("请输入学生的线代成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.xiandai);
sum+=pNew->chengji.xiandai;
printf("请输入学生的C语言成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.Clanguage);
sum+=pNew->chengji.Clanguage;
printf("请输入学生的体育成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.PE);
sum+=pNew->chengji.PE;
pNew->ave=sum/5.0;
//printf("该学生的平均分为:%lf\n",pNew->ave);
tail->pNext=pNew;
pNew->pNext=NULL;
tail=pNew;
}
return head;
}
//在链表中插入节点
PSTU insert(PSTU head)
{
int n,m,i,j=0,sum;
printf("请输入你想要插入几个学生的信息:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
sum=0;
printf("请输入你想要在第几个学生信息前面插入新的学生信息:");
scanf("%d",&m);
PSTU p=head;
while(j<m-1&&p!=NULL)
{
p=p->pNext;
j++;
}
if(j>m-1||p==NULL)
return head;
PSTU pNew=(PSTU)malloc(sizeof(STU));
if(pNew==NULL)
{
printf("分配失败,程序中止");
exit(-1);
}
printf("请输入学生的姓名:");
fflush(stdin);
gets(pNew->name);
printf("请输入学生的性别:");
fflush(stdin);
gets(pNew->sex);
printf("请输入学生的年级:");
fflush(stdin);
gets(pNew->grade);
printf("请输入学生的高数成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.mathmatic);
sum+=pNew->chengji.mathmatic;
printf("请输入学生的英语成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.English);
sum+=pNew->chengji.English;
printf("请输入学生的线代成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.xiandai);
sum+=pNew->chengji.xiandai;
printf("请输入学生的C语言成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.Clanguage);
sum+=pNew->chengji.Clanguage;
printf("请输入学生的体育成绩:");
fflush(stdin);
scanf("%d",&pNew->chengji.PE);
sum+=pNew->chengji.PE;
pNew->ave=sum/5.0;
PSTU q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
}
return head;
}
//删除链表的节点
PSTU delete_(PSTU head)
{
int i,j=0,m,n;
printf("请输入你想要删除几个学生的信息:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("你想要删除第几个学生的信息:");
scanf("%d",&m);
PSTU p=head;
while(j<m-1&&p!=NULL)
{
p=p->pNext;
j++;
}
if(j>m-1||p==NULL)
return head;
PSTU q=p->pNext;
p->pNext=p->pNext->pNext;
free(q);
q=NULL;
}
return head;
}
//对链表按照平均分进行排序
PSTU sort(PSTU head)
{
int i,j,len=0;
double t;
PSTU p=head->pNext;
PSTU m,n;
while(p!=NULL)
{
p=p->pNext;
len++;
}
for(i=0,m=head->pNext;i<len-1;i++,m=m->pNext)
for(j=i+1,n=m->pNext;j<len;j++,n=n->pNext)
{
if(m->ave>n->ave)
{
t=m->ave;
m->ave=n->ave;
n->ave=t;
}
}
return head;
}
//输出遍历链表
void output(PSTU head)
{
PSTU p=head->pNext;
int i=1;
while(p!=NULL)
{
printf("第%d个学生的信息是:\n",i);
printf("学生的姓名:%s\n学生的性别是:%s\n学生的年级:%s\n",p->name,p->sex,p->grade);
printf("学生的高数成绩是:%d\n学生的线代成绩是:%d\n学生的C语言成绩是:%d\n学生的英语成绩是:%d\n学生的体育成绩是:%d\n",p->chengji.mathmatic,p->chengji.xiandai,p->chengji.Clanguage,p->chengji.English,p->chengji.PE);
printf("学生的平均分是:%lf\n",p->ave);
i++;
p=p->pNext;
}
}
void file_(PSTU head)
{
FILE * fp;
int i=1;
PSTU p=head->pNext;
fp=fopen("G:/keshe/学生信息.txt","w");
if(fp==NULL)
{
printf("文件打开失败,按任意键退出");
getchar();
exit(-1);
}
while(p!=NULL)
{
fprintf(fp,"第%d个学生的信息是:\n",i);
fprintf(fp,"学生的姓名:%s\n学生的性别是:%s\n学生的年级:%s\n",p->name,p->sex,p->grade);
fprintf(fp,"学生的高数成绩是:%d\n学生的线代成绩是:%d\n学生的C语言成绩是:%d\n学生的英语成绩是:%d\n学生的体育成绩是:%d\n",p->chengji.mathmatic,p->chengji.xiandai,p->chengji.Clanguage,p->chengji.English,p->chengji.PE);
fprintf(fp,"学生的平均分是:%lf\n",p->ave);
i++;
p=p->pNext;
}
}
int main()
{
int n,m;
PSTU head=NULL;
struct teacher yonghu;
FILE * fp;
printf("欢迎进入学生管理系统!\n");
printf("如果有账号请输入1直接进入登陆界面,如果没有请输入2进行注册:");
scanf("%d",&n);
if(n==1)
{
fp=fopen("G:/keshe/用户信息.txt","w");
if(fp==NULL)
{
printf("文件打开失败,按任意键退出");
getchar();
exit(-1);
}
printf("用户名:");
fflush(stdin);
gets(yonghu.num);
printf("密码:");
fflush(stdin);
gets(yonghu.mask);
fprintf(fp,"用户名:%s\n密码:%s\n",yonghu.num,yonghu.mask);
fclose(fp);
}
if(n==2)
{
fp=fopen("G:/keshe/用户信息.txt","w");
if(fp==NULL)
{
printf("文件打开失败,按任意键退出");
getchar();
exit(-1);
}
printf("昵称:");
fflush(stdin);
gets(yonghu.nicheng);
printf("用户名:");
fflush(stdin);
gets(yonghu.num);
printf("密码:");
fflush(stdin);
gets(yonghu.mask);
fprintf(fp,"昵称:%s\n用户名:%s\n密码:%s\n",yonghu.nicheng,yonghu.num,yonghu.mask);
fclose(fp);
}
system("cls");
for(;;)
{
printf("**********************************************************\n");
printf("1.输入学生的信息\n2.插入学生信息\n3.删除学生信息\n4.排序\n5.输出\n6.退出\n");
printf("**********************************************************\n");
printf("请选择你要执行的功能:");
scanf("%d",&m);
if(m==6)
break;
switch(m)
{
case 1:system("cls");head=input();break;
case 2:system("cls");if(head==NULL) {printf("你还没有对学生信息进行录入,请先执行功能一\n");break;};head=insert(head);break;
case 3:system("cls");if(head==NULL) {printf("你还没有对学生信息进行录入,请先执行功能一\n");break;};head=delete_(head);break;
case 4:system("cls");if(head==NULL) {printf("你还没有对学生信息进行录入,请先执行功能一\n");break;};head=sort(head);printf("按平均分升序排序后输出:\n");output(head);break;
case 5:system("cls");if(head==NULL) {printf("你还没有对学生信息进行录入,请先执行功能一\n");break;};output(head);break;
}
printf("按任意键继续");
getch();
system("cls");
}
//用文件存储所有学生的信息
printf("已将学生信息存储到G:/keshe/学生信息.txt中\n");
file_(head);
return 0;
}