/*1按学期 班级完成录入,修改
2按班级统计学生成绩,求学生的总分及平均分,并能根据平均分进行排序
3能查询学生成绩,不及格科目以及学生名单
4能按班级输出学生的成绩单
*/
/***********************************************************************************
本作品作者:danyuan 湖南理工学院 专业:信息工程
***********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct stu{ //学生结点
char name[20];
char id_number[20];
double chinese_score;
double english_score;
double math_score;
double c_program;
double total_score;
double averge_score;
struct stu *next;
}Student;
typedef struct cla{ //班级结点
char class_name[20];
int pass_number;
int total_number;
struct cla *cnext;
Student *first_next;
}Class;
typedef struct t{ //学期结点
char term_number[20];
struct t *tnext;
Class *first_class;
}Term;
typedef struct inf{ //头结点
Term *head;
}Infor;
void init_head(Infor *I)//初始化头结点
{
I->head=NULL;
}
void caculate_score(Student *S)//计算总分和平均分
{
S->total_score = S->c_program + S->chinese_score + S->english_score + S->math_score;
S->averge_score = S->total_score/3.0;
}
void input_student(Class *C)//输入学生信息
{
Student *p=(Student*)malloc(sizeof(Student));
p->next=C->first_next;
C->first_next=p;
printf("\t\t请输入学生信息:(输入每一步骤完毕后,请按回车进行下一步操作)\n");
printf("\t\t学号:");
scanf("%s",p->id_number);
printf("\t\t姓名:");
scanf("%s",p->name);
printf("\t\t英语成绩:");
scanf("%lf",&p->english_score);
printf("\t\t语文成绩:");
scanf("%lf",&(p->chinese_score));
printf("\t\t数学成绩:");
scanf("%lf",&p->math_score);
printf("\t\tc语言成绩:");
scanf("%lf",&p->c_program);
caculate_score(p);
C->total_number++;
if(p->chinese_score>=60&&p->english_score>=60&&p->c_program>=60&&p->math_score>=60)
C->pass_number++;
}
void show(Student *S)//显示学生信息
{
printf("%s\t%s\t%.1f\t%.1f\t%.1f",S->id_number,S->name,S->chinese_score,S->english_score,S->math_score);
printf("\t%.1f\t%.1f\t%.1f\n",S->c_program,S->total_score,S->averge_score);
printf("**********************************************************************\n");
}
int junge(char*a,char*b) //判断姓名是否一致(按名字查找)
{
char *p=a,*q=b;
while(*p!='\0')
{
if(*p==*q)
{
p++;
q++;
continue;
}
else
break;
}
if(*p=='\0'&&*q=='\0')
return 1;
else
return 0;
}
void delet_student(Class *C)//删除某学生信息
{
char s[20];
Student *t,*p=C->first_next;
printf("请输入您想要删除的学生姓名:");
scanf("%s",s);
while(p)
{
if(!p->next)
{
if(junge(p->name,s))
{
C->first_next=NULL;
printf("已成功删除%s同学的信息!\n",p->name);
free(p);
break;
}
}
else
{
if(p)
{
t=p->next;
if(junge(p->next->name,s))
{
p->next=p->next->next;
printf("已成功删除%s同学的信息!\n",p->next->name);
free(t);
break;
}
}
}
p=p->next;
}
if(!p)
printf("\t\t没有找到该学生!\n");
if(p->chinese_score>=60&&p->english_score>=60&&p->c_program>=60&&p->math_score>=60)
;
else
C->pass_number--;
}
/*void count_pass(Class *C)
{
Student*p=C->first_next;
while(p)
{
if(p->chinese_score>=60&&p->english_score>=60&&p->c_program>=60&&p->math_score>=60)
C->pass_number++;
p=p->next;
}
}*/
void id_sort(Class *C)//给某班上所有人排序
{
Student *p=C->first_next,*t;
Student *temp=(Student*)malloc(sizeof(Student));
while(p)
{
t=p->next;
while(t)
{
if(p->id_number>t->id_number)
{
*temp=*p;
*p=*t;
*t=*temp;
}
t=t->next;
}
p=p->next;
}
}
void show_one(Class *C) //查找并显示某学生信息
{
Student *p=C->first_next;
char s[20];
printf("请输入您想要查找的学生姓名:");
scanf("%s",s);
while(p)
{
if(junge(p->name,s))
{
printf("\t\t找到该人信息如下:\n学号\t姓名\t语文\t英语\t数学\tc语言\t总分\t平均分\n");
printf("**********************************************************************\n");
show(p);
break;
}
p=p->next;
}
if(!p)
printf("\t\t没有找到该学生!\n");
}
void show_all(Class *C)//显示某班所有人信息
{
id_sort(C);
Student *p=C->first_next;
if(!p)
printf("\t\t该班级还未储存学生信息!\n");
printf("学号\t姓名\t语文\t英语\t数学\tc语言\t总分\t平均分\n");
printf("**********************************************************************\n");
while(p)
{
show(p);
p=p->next;
}
}
void change_one(Class *C)//修改某人信息
{
Student *p=C->first_next;
int Operate3;
char s[20];
printf("请输入您想要更改信息的学生姓名:");
scanf("%s",s);
while(p)
{
if(junge(p->name,s))
{
while(1)
{
printf("请输入您想要更改的信息的相应指令:\n\t1姓名\t2学号\t3语文\t4英语\t 5数学\t6 c语言\t 0.完成\n");
scanf("%d",&Operate3);
switch(Operate3)
{
case 1:printf("姓名:");scanf("%s",p->name);break;
case 2:printf("学号:");scanf("%s",p->id_number);break;
case 3:printf("语文:");scanf("%lf",&p->chinese_score);break;
case 4:printf("英语:");scanf("%lf",&p->english_score);break;
case 5:printf("数学:");scanf("%lf",&p->math_score);break;
case 6:printf("c语言:");scanf("%lf",&p->c_program);break;
case 0:printf("\t\t已返回!\n");break;
default:printf("\t\t输入错误,请重新输入!\n");
}
if(Operate3==0)
break;
}
break;
}
p=p->next;
}
if(!p)
printf("\t\t没有找到该学生!\n");
}
void Operate_student(Class *p)//对某班上同学的信息基本操作
{
int Operate2;
while(1)
{
printf("\t\t请输入指令:\n\t\t1添加学生信息\n\t\t2删除学生信息\n\t\t3查找并显示以为学生信息\n");
printf("\t\t4显示该班级所有学生信息\n\t\t5改变某学生信息\n\t\t0返回上一级菜单\n\t\t否者请从新输入\n请输入:");
scanf("%d",&Operate2);
printf("\n");
switch(Operate2)
{
case 1:input_student(p);break;//插入并按学号排序
case 2:delet_student(p);break;
case 3:show_one(p);break;
case 4:show_all(p);break;
case 5:change_one(p);break;
case 0:;break;
default:printf("\t\t输入错误!请重新输入!\n");
}
if(Operate2==0)
{
printf("已返回上一级操作!\n");
break;
}
}
}
//对班级的操作
void input_class(Term *T)//增加一个班级
{
Class *p=(Class*)malloc(sizeof(Class));
p->first_next=NULL;
p->total_number=0;
p->pass_number=0;
printf("请输入班级号:");
scanf("%s",p->class_name);
p->cnext=T->first_class;
T->first_class=p;
Operate_student(p);
}
void delet_all(Class *C)//删除一个班的所有人的信息
{
Student *t,*p=C->first_next;
while(p)
{
t=p;
p=p->next;
free(t);
}
if(!p)
printf("\t\t已成功删除该班级\n");
}
void delet_class(Term *T)//删除一个班级
{
Class *p=T->first_class;
if(!p)
{ printf("您还未添加任何班级!\n");
return;
}
char s[20];
printf("请输入班级名字:");
scanf("%s",s);
while(p)
{
if(junge(p->class_name,s))
{
delet_all(p);
break;
}
p=p->cnext;
}
}
void delet_all_class(Term*T)
{
Class *p=T->first_class;
while(p)
{
delet_all(p);
p=p->cnext;
}
if(!p)
printf("\t\t删除该学期成功!\n");
}
void find_show_class(Term*T)//找到一个班级先显示所有人的信息再对其进行基本操作
{
Class *p=T->first_class;
if(!p)
printf("您还未添加任何班级!\n");
char s[20];
printf("请输入班级名字:");
scanf("%s",s);
while(p)
{
if(junge(p->class_name,s))
{
id_sort(p);
show_all(p);
break;
}
p=p->cnext;
}
Operate_student(p);
}
void show_all_class_student(Term*T)//显示本学期的汇总成绩表单
{
Class *p=T->first_class;
if(!p)
{
printf("您还未添加任何班级!\n");
return;
}
printf("\t\t这是%s的总成绩表单\n",T->term_number);
while(p)
{
printf("\t\t班级名:%s\t总人数:%d\t过关人数:%d\n",p->class_name,p->total_number,p->pass_number);
id_sort(p);
show_all(p);
p=p->cnext;
}
}
void class_Operate(Term *p)//对班级的基本操作
{
int Operate1;
while(1)
{
printf("\t\t请输入指令:\n\t\t1增加一个班级并进入到下一级菜单:\n\t\t2删除一个班级\n\t\t3查找某班级并显示所有学生信息\n\t\t4显示所有班级学生信息\n");
printf("\t\t0返回上级菜单\n\t\t其它:请从新输入:\n请输入:");
scanf("%d",&Operate1);
switch(Operate1)
{
case 1:input_class(p); break;
case 2:delet_class(p); break;
case 3:find_show_class(p);break;
case 4:show_all_class_student(p);break;
case 0:;break;
default:printf("\t\t输入错误!请重新输入!\n");
}
if(Operate1==0)
{
printf("已返回上一级操作!\n");
break;
}
}
}
//对学期的操作
void input_term(Infor *I)//增加某一学期
{
Term *p=(Term*)malloc(sizeof(Term));
p->first_class=NULL;
printf("请输入学期号:");
scanf("%s",p->term_number);
p->tnext=I->head;
I->head=p;
class_Operate(p);
}
void delet_term(Infor *I)//删除某一学期
{
Term *p=I->head;
if(!p)
{
printf(" \t\t您还未向表单中添加任何资料!\n");
return;
}
while(p)
{
delet_all_class(p);
p=p->tnext;
}
}
void into_term(Infor*I)//查找进入操作某一学期的信息
{
Term *p=I->head;
char s[20];
printf("请输入你要操作的学期名:");
scanf("%s",s);
while(p)
{
if(junge(p->term_number,s))
{
class_Operate(p);
break;
}
p=p->tnext;
}
if(!p)
printf("\t\t抱歉!未找到该学期的相关信息!\n");
}
void show_all_information(Infor*I)//输出每一学期的所有信息
{
Term*p=I->head;
while(p)
{
printf("\t\t如下是%s的学生信息!\n\n");
show_all_class_student(p);
p=p->tnext;
}
}
void term_operate(Infor *I)//学期操作菜单
{
int Operate;
while(1)
{
printf("\t\t1增加一个学期的表单\n\t\t2删除一个学期的表单\n\t\t3找到一个表单并进入其基本操作\n");
printf("\t\t4.显示所有学期的所有信息\n\t\t0已完成本系统操作,请退出\n\t\t其它:重新输入\n请输入:");
scanf("%d",&Operate);
switch(Operate)
{
case 1:input_term(I);break;
case 2:delet_term(I);break;
case 3:into_term(I);break;
case 4:show_all_information(I);break;
case 0:;break;
default:;
}
if(Operate==0)
{
int Sure;
printf("确定要退出本系统:(1表示是,其它输入表示否)\n请输入:");
scanf("%d",&Sure);
if(Sure==1)
{
printf("\t\t您已已退出本系统!感谢您的使用!\n");
break;
}
}
}
}
//main函数的操作
void main()
{
//FILE *sp;
//sp=freopen("in2.txt","r+",stdin);
Infor I;
init_head(&I);
term_operate(&I);
//fclose(sp);
}
/******************************************************************************
编程心得:这次犯了个错误,次级链表的初始化忘了,导致耽搁了鄙人2~3个小时是在是不应该啊!
最后还忘了加控制变量的取地址符,更不应该啊!
--------------2013年6月25日作
*********************************************************************************/