学籍管理
这是我们自己编的一个考试题。说实话对C不太懂,也看着书就烦。编的过于简单,可读性就更差了。希望大家指点下。同时请那位大虾给个菜单编程的方法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char num[10]; /*学号,便于查询故设置为数组*/
char name[20];
char sex[4];
char add[20];
int age;
int clas;
int gaoshu;
int yingyu;
int xiandai;
int lisan;
int wuli;
int deyu;
int tiyu;
int totle;
float jiaquan;
};
typedef struct NODE /*自定义类型说明*/
{
struct student data;
struct NODE *next;
}NODE,*Link;
int count=0; /*学生人数数据计数器*/
/*==========此函数用于输出数据=======*/
void printe(NODE *p)
{
printf("姓名: %s\n籍贯:%s\n性别:%s\n年龄:%d\n",p->data.name,p->data.add,p->data.sex,p->data.age);
printf("高等数学: %d\n英语: %d\n线性代数: %d\n离散数学: %d\n",p->data.gaoshu,p->data.yingyu,p->data.xiandai,p->data.lisan);
printf("高等物理: %d\n思想品德教育: %d\n体育 :%d\n加权成绩: %.1f\n",p->data.wuli,p->data.deyu,p->data.tiyu,p->data.jiaquan);/*学分积点
}
/*=========查询函数===========*/
NODE *search(Link l,char nameornum[],int way) /*用于查询的指针函数*/
{
NODE *r;
if(way==1) /*按学号查找*/
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,nameornum)==0)
return r;
r=r->next;
}
}
else if(way==2) /*按姓名查找*/
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,nameornum)==0)
return r;
r=r->next;
}
}
return 0;
}
/*=========添加学生信息===========*/
void add(Link l)
{
NODE *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /*将指针置于学生档案数据最末尾*/
while(1)
{
printf("请输入学号(输入'exit'则完成输入返回上级菜单:)");
scanf("%s",num);
if(strcmp(num,"exit")==0)
break;
p=(NODE *)malloc(sizeof(NODE));
strcpy(p->data.num,num);
printf("请输入姓名:");
scanf("%s",p->data.name);
printf("请输入性别:");
scanf("%s",p->data.sex);
printf("请输入籍贯:");
scanf("%s",p->data.add);
printf("请输入班级:");
scanf("%d",&p->data.clas);
printf("请输入年龄:");
scanf("%d",&p->data.age);
printf("请输入高等数学成绩:");
scanf("%d",&p->data.gaoshu);
printf("请输入英语成绩:");
scanf("%d",&p->data.yingyu);
printf("请输入线性代数成绩:");
scanf("%d",&p->data.xiandai);
printf("请输入离散数学成绩:");
scanf("%d",&p->data.lisan);
printf("请输入高等物理成绩:");
scanf("%d",&p->data.wuli);
printf("请输入思想品德教育成绩:");
scanf("%d",&p->data.deyu);
printf("请输入体育成绩:");
scanf("%d",&p->data.tiyu);
p->data.jiaquan=(p->data.gaoshu*3+p->data.yingyu*3+p->data.xiandai*2+p->data.lisan*2+p->data.wuli*2+p->data.deyu+p->data.tiyu*2)/15; /*计算加权成绩*/
count++; /*学生人数加1*/
p->next=NULL;
r->next=p;
r=p; /*构造单链表*/
}
}
/*=========删除学生信息===========*/
void del(Link l)
{
int way;
NODE *p,*r;
char nameornum[20];
printf("\n>1按学号删除\n>2按姓名删除\n");
scanf("%d",&way);
if(way==1)
printf("请你输入要删除的学号:");
else if(way==2)
printf("请你输入要删除的姓名:");
else
printf("\n=====输入错误!=====\n");
scanf("%s",nameornum);
p=search(l,nameornum,way);
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====该学生已经成功删除!=====\n");
count--; /*学生人数减1*/
}
else
printf("\n=====没有找到该学生!=====\n");
}
/*=========修改学生信息===========*/
void update(Link l)
{
int way;
char nameornum[20];
NODE *p,*r;
printf("\n>1按学号修改\n2按姓名修改\n");
scanf("%d",&way);
if(way==1)
printf("请你输入要修改者的学号:");
else if(way==2)
printf("请你输入要修改者的姓名:");
else
printf("\n=====输入错误!=====\n");
scanf("%s",nameornum);
r=search(l,nameornum,way);
if(r)
{
p=l;
while(p!=r)
p=p->next;
printf("\n>1修改学生基本情况\n>2修改学生成绩\n");
scanf("%d",&way);
if(way==1)
{
printf("请输入姓名:");
scanf("%s",p->data.name);
printf("请输入班级:");
scanf("%d",&p->data.clas);
printf("请输入性别:");
scanf("%s",p->data.sex);
printf("请输入籍贯:");
scanf("%s",p->data.add);
printf("请输入年龄:");
scanf("%d",&p->data.age);
}
else
if(way==2)
{
printf("请输入高等数学成绩:");
scanf("%d",&p->data.gaoshu);
printf("请输入英语成绩:");
scanf("%d",&p->data.yingyu);
printf("请输入线性代数成绩:");
scanf("%d",&p->data.xiandai);
printf("请输入离散数学成绩:");
scanf("%d",&p->data.lisan);
printf("请输入高等物理成绩:");
scanf("%d",&p->data.wuli);
printf("请输入思想品德教育成绩:");
scanf("%d",&p->data.deyu);
printf("请输入体育成绩:");
scanf("%d",&p->data.tiyu);
p->data.jiaquan=(p->data.gaoshu*3+p->data.yingyu*3+p->data.xiandai*2+p->data.lisan*2+p->data.wuli*2+p->data.deyu+p->data.tiyu*2)/15;
}
else
printf("\n=====输入错误!=====\n");
}
else
printf("\n=====没有找到该学生!=====\n");
}
/*=========查询学生信息===========*/
void find(Link l)
{
int way;
char nameornum[20];
NODE *p;
printf("\n>1 按学号查找\n>2 按姓名查找\n");
scanf("%d",&way);
if(way==1)
printf("请你输入要查找的学号:");
else if(way==2)
printf("请你输入要查找的姓名:");
else
printf("\n=====输入错误!=====\n");
scanf("%s",nameornum);
p=search(l,nameornum,way); /*返回值为指向被查找者的NODE型指针*/
if(p)
{
printf("━━━━━━━━━━━━━━━查找结果━━━━━━━━━━━━━━━━\n");
printe(p);
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
}
else
printf("\n=====没有找到该学生!=====\n");
}