您的位置:首页 > 其它

学生成绩管理系统————课设

2017-07-30 20:31 281 查看
# 学生管理系统

概要设计:

数据录入:录入系统所需的数据,用链表组织数据。

数据存储:用文件的形式将录入的数据进行保存。

数据读写:对文件的数据可以进行读写操作。

数据修改:可以对已存在的旧数据进行修改操作。

数据插入:可以将新数据插入到任意位置。

数据删除:可以对已存在的旧数据进行删除操作。

数据查询:按要求对数据进行查询,至少包含两项简单查询以及一项组合查询。

各个模块的详述:

这里我改善融合了功能模块,因为这样可以有效减少代码量,优化运行时间,这里可以将存储操作执行在每次的其他操作之后,这样并不会减少功能,而且比较人性化,开始操作:

数据录入:利用课堂学到的链表操作,可以完成,在这里我们要注意录入的信息的数据类型,还有一个判断是否继续的操作,利用布尔判断可以完成。在录入完成之后我们直接进行存储操作,不需要在主菜单上再设计一个存储操作,存储的时候一定要写好路径。后来有用。

数据读写:这里主要的功能是读操作,写操作其实可以在存储里完成,读操作,首先,要从文件中提取数据,放到我们的链表之中,然后利用输出函数输出链表里面的数据,这里将读写步骤,有两个操作,一个是提取数据,一个是输入数据。

数据修改:这里修改操作,我们是对链表进行操作,操作完成后再利用前面的存储操作,我们可以完成这里的任务,但是,在修改时,有一个问题,我们要修改的学生怎样找到,这里我是按照学号查找来找到要修改的学生,找到之后我们有下一步详细修改的操作,这里我只写了详细修改,因为全部修改和详细修改没有区别,所以我只选取一种修改的操作,其实我建议选择详细修改,这样比较清晰。

数据插入:这步虽然要求可以插在任意的地方,但是有一个不好的地方就是,任意地方分为三种地方,前面 中间和后面。这样要增加好多的判断,和多种操作方法,无疑增加代码量,所以我们完全可以选取最简单的一种,然后利用后来 的排序操作让他移动到相应的位置。这里选择尾结点插入操作,最进行存储操作(最简单)。

数据删除:不管是插入还是删除操作,有一个重点就是结点的连接顺序不能错,一旦错了就会丢失结点,紧随数据丢失,所以在这两项操作中,尽量一边操作一边画图处理,这样可以理解我们操作的意义,在删除时,每次删除,注意的结点都不能错。最后仍然进行存储文件操作。

详细流程图



重点设计

增加模块:重点

增加模块操作,要分几步骤进行。首先找到你要增加的位置,其次插入种类不同代码不同,还有就是输入数据的时候需要进行格式判断,格式对了,录入信息,格式不对,重新录入。这里简单介绍尾插法。

代码如下:

/********************增加模块**********************/
pStudent Insert(pStudent phead)
{
system("cls");
pStudent pNew,p=phead;
/*if(phead->next==NULL)
{
printf("无信息!");
Sleep(1000);
return phead;
}*/
char choice;
while(p->next!=NULL)            //找尾结点
p=p->next;                  //移动
do                                    // 循环插入
{
pNew=(pStudent)malloc(sizeof(Student));
printf("请输入姓名:");
scanf("%s",pNew->name);
printf("请输入学号:");
scanf("%s",pNew->number);
while(strlen(pNew->number)!=8)         //格式判断
{
printf("请输入正确的8位学号:");
scanf("%s",pNew->number);
}
printf("请输入性别:");
getchar();
scanf("%c",&pNew->sex);
while(pNew->sex!='m'&&pNew->sex!='w'&&pNew->sex!='M'&&pNew->sex!='W')
{
printf("请输入正确的性别:");
fflush(stdin);
scanf("%c",&pNew->sex);
}
printf("请输入年龄:");
scanf("%u",&pNew->age);
while(pNew->age<=0||pNew->age>=100)
{
printf("请输入正确的年龄:");
scanf("%u",&pNew->age);
}
printf("请输入英语成绩:");
scanf("%lf",&pNew->english);
while(pNew->english>100||pNew->english<0)
{
printf("请输入正确的英语分数:");
scanf("%lf",&pNew->english);
}
printf("请输入C语言成绩:");
scanf("%lf",&pNew->c);
while(pNew->c>100||pNew->c<0)
{
printf("请输入正确的C语言分数:");
scanf("%lf",&pNew->c);
}
printf("请输入数学成绩:");
scanf("%lf",&pNew->math);
while(pNew->math>100||pNew->math<0)
{
printf("请输入正确的数学分数:");
scanf("%lf",&pNew->math);
}
pNew->sum=pNew->c+pNew->
1e315
english+pNew->math;
pNew->aver=(pNew->c+pNew->english+pNew->math)/3;
p->next=pNew;
p=pNew;
p->next=NULL;
iCount++;
printf("是否继续添加信息(Y or N):");
choice=getchar();
}while(panduan(choice)==1);
printf("已增加学生信息.\n");
Sleep(1000);
Save_Stu(phead);
return phead;
}


排序模块: 排序有好多类别,这里我选择冒泡排序。在排序时候,有一个严重问题,如何交换链表数据。有两种方法,第一:可以直接调用一个交换数据的函数,这样只交换数据,而不改变结点位置。第二:进行结点交换,这种交换虽然思考比较难,但是一旦理解,一劳永逸。这里我选择第二种交换方法,建议在理解同时,使用手动画图理解,方便快捷好理解。

pStudent sort(pStudent phead)    //传送头结点
{            //pj是当前结点 pj_f是pj前一个结点  pj_b是pj后一个结点
pStudent pTemp,pj,pj_f,pj_b;    //这里交换的是pj和pj_b
int i,j,flag;
for(i=0;i<iCount-1;i++)          //冒泡排序
for(j=0,flag=0,pj=phead;j<iCount-1-i;j++)
{
if(flag==0)      //当flag==0时 结点没交换
{
pj_f=pj;      //移动结点位置
pj=pj->next;
pj_b=pj->next;
}
if(flag==1)    //当flag==1时 结点交换
{
pj_f=pj_f->next;  //移动结点位置
pj_b=pj->next;
}
flag=0;
if(pj->sum<pj_b->sum)    //数据判断
{
pTemp=pj->next;      //六步操作 完成交换
pj->next=pj_b->next;
pj_b->next=pTemp;

pTemp=pj_f->next;
pj_f->next=pj_b->next;
pj_b->next=pTemp;
flag=1;     //flag==1  进行交换的结点位置移动
}
}
return phead;


//声明部分
#ifndef state_h
#define state_h
typedef struct accout
{
char pass[20];
char name[20];
struct accout *next;
}Accout,*pAccout;

typedef struct student
{
char number[15];
char name[30];
char sex;
unsigned int age;
double english;
double c;
double math;
double aver;
double sum;
struct student *next;
}Student,*pStudent;

pAccout router_acc(pAccout ahead); //读取账户信息
void save_acc(pAccout ahead); //保存账户
void login_acc(); //登录函数
void login_printf(); //登录界面
pAccout login_panduan(pAccout ahead);
pAccout login_zhuce(pAccout ahead);

pStudent Create(pStudent phead); //声明创建链表
void meun(); //综合
void print(); //主菜单
void print1(); //主界面
void print2(); //退出界面
pStudent searchmenu(pStudent phead); //查询子系统菜单
pStudent search1(pStudent phead); //学号查询
pStudent search2(pStudent phead); //姓名查询

pStudent sortmenu(pStudent phead); //排序子系统菜单
pStudent sort1(pStudent phead); //年龄排序
pStudent sort2(pStudent phead); //平均分排序
pStudent sort3(pStudent phead); //总分排序
pStudent sort(pStudent phead);

pStudent Insert(pStudent phead); //新学生信息录入
void print_stu1(pStudent phead);//打印学生信息
void print_stu2();//学生信息表格

pStudent delete_Stu(pStudent phead); //删除信息

void Save_Stu(pStudent phead);//信息保存
pStudent router_Stu(pStudent phead); //信息读取

pStudent revise(pStudent phead); //修改信息

int panduan(char choice); //布尔判断
int back(char *a); //返回整数函数
void shuai1();
void shuai2();
void saocaozuo();//颜色操作
#endif

//主函数:
oid main() //主函数
{
print1();
login_acc();
meun();
}

//其他函数:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include"state.h"
#include<conio.h>
#define change 3
int iCount;
int n;

//*****************登录*****************//
pAccout router_acc(pAccout ahead)
{
pAccout p1,p2;
FILE *fp;
int m=0;
if((fp=fopen("e:\\课设\\Accout.txt", "r"))==NULL)
{
printf("读取失败!");
return ahead;
}
ahead==NULL;
p1=(pAccout)malloc(sizeof(Accout));
while(fscanf(fp,"%s %s",p1->name,p1->pass)==2)
{
//printf("%s\n",p1->name); //读进去了
m=m+1;
if(m==1)
{
ahead->next=p1;
p2=p1;
p2->next = NULL;
}
else
{
p2->next=p1;
p2=p1;
p2->next=NULL;
}
p1=(pAccout)malloc(sizeof(Accout));
}
fclose(fp);
return ahead;
}
void save_acc(pAccout ahead)
{
FILE *fp;
if((fp=fopen("e:\\课设\\Accout.txt","w"))==NULL)
{
printf("打开失败!");
Sleep(2000);
exit(1);
}
pAccout pAcc;
pAcc=ahead->next;
while(pAcc!=NULL)
{
fprintf(fp,"%s %s\n",pAcc->name,pAcc->pass);
pAcc=pAcc->next;
}
fclose(fp);
printf("保存成功!");
}
void login_printf()
{
system("cls");
printf("\n\n\n\n");
printf("\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆\t\t\t\n");
printf("\t\t\t☆ ★\t\t\t\n");
printf("\t\t\t☆ 1.登录 ★\t\t\t\n");
printf("\t\t\t☆ 2.注册 ★\t\t\t\n");
printf("\t\t\t☆ 0.退出 ★\t\t\t\n");
printf("\t\t\t☆ ★\t\t\t\n");
printf("\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆\t\t\t\n");
}
void shuai1()
{
printf("\n");
printf("\t\t\t ----------------------------\n");
printf("\t\t\t ** ** ** \n");
Sleep(1000);
printf("\t\t\t ** ** ** \n");
printf("\t\t\t ** ** ************ \n");
Sleep(1000);
printf("\t\t\t ** ** ************ \n");
printf("\t\t\t ** ** ** ** ** \n");
Sleep(1000);
printf("\t\t\t ** ** ** ** *** \n");
printf("\t\t\t ** ** ** ** \n");
Sleep(1000);
printf("\t\t\t ** ** \n");
printf("\t\t\t ** ** \n");
Sleep(1000);
printf("\t\t\t ** \n");
printf("\t\t\t-----------------------------\n");
Sleep(1000);
printf("\t\t\t\t***************\n");
printf("\t\t\t\t恭喜!注册成功!\n");
printf("\t\t\t\t***************\n");
Sleep(2000);
}
void shuai2()
{
printf("\n");
printf("\t\t\t ----------------------------\n");
printf("\t\t\t ** ** ** \n");
Sleep(1000);
printf("\t\t\t ** ** ** \n");
printf("\t\t\t ** ** ************ \n");
Sleep(1000);
printf("\t\t\t ** ** ************ \n");
printf("\t\t\t ** ** ** ** ** \n");
Sleep(1000);
printf("\t\t\t ** ** ** ** *** \n");
printf("\t\t\t ** ** ** ** \n");
Sleep(1000);
printf("\t\t\t ** ** \n");
printf("\t\t\t ** ** \n");
Sleep(1000);
printf("\t\t\t ** \n");
printf("\t\t\t-----------------------------\n");
Sleep(1000);
printf("\t\t\t\t***************\n");
printf("\t\t\t\t恭喜!登录成功!\n");
printf("\t\t\t\t***************\n");
Sleep(2000);
}
void login_acc()
{
system("cls");
int bk;
pAccout ahead,p1;
ahead=(pAccout)malloc(sizeof(Accout));
ahead->next=NULL;
router_acc(ahead);
while(1)
{
char a[200];
login_printf();
printf("请输入:");
scanf("%s",a);
bk=back(a);
switch(bk)
{
case 1:{
ahead=login_panduan(ahead);
break;
}
case 2:{
ahead=login_zhuce(ahead);
break;
}
case 0:{
print2();
exit(0);
break;
}
default:printf("输入错误!");
Sleep(1000);
system("cls");
break;
}
if(bk==1)
break;
}
}
pAccout login_zhuce(pAccout ahead)
{
char name1[20],pass1[20];
pAccout p1,p2;
p1=ahead;
while(p1->next!=NULL)
{
p1=p1->next;
}
while(1)
{
p2=(pAccout)malloc(sizeof(Accout));
system("cls");
printf("\n\n\n\n");
printf("\t\t\t账号(8位) :");
scanf("%s",p2->name);
printf("\t\t\t密码(不超过10位):");
scanf("%s",p2->pass);
if(strlen(p2->name)<=8)
{
if(strlen(p2->pass)<=10)
{
p1->next=p2;
p2->next=NULL;
shuai1();
save_acc(ahead);
break;
}
else
{
printf("\n\n\n\n");
printf("\t\t\t\t***************\n");
printf("\t\t\t\t格式不对,请重新输入!\n");
printf("\t\t\t\t***************\n");
Sleep(2000);
}
}
else
{
printf("\n\n\n\n");
printf("\t\t\t\t***************\n");
printf("\t\t\t\t格式不对,请重新输入!\n");
printf("\t\t\t\t***************\n");
Sleep(2000);
}
}
return(ahead);
}

pAccout login_panduan(pAccout ahead)
{
char name1[20],pass1[20];
pAccout p1;
int i=0, j = 0;
char ch;
while(1)
{
i++;
p1=ahead->next;
system("cls");
printf("\n\n\n\n");
printf("\t\t\t\t账号:");
scanf("%s",name1);
printf("\t\t\t\t密码:");
while(j < 20)
{
ch = getch();
if(ch == '\b' && j > 0)
{
printf("\b \b");
}
else if(ch == 13)
{
break;
}
else
{
pass1[j] = ch;
printf("*");
j++;
}

}
pass1[j]='\0';
while(p1!=NULL)
{
if(strcmp(name1,p1->name)==0)
{
if(strcmp(pass1,p1->pass)==0)
{
shuai2();
return ahead;
}
else
{
p1=p1->next;
}
}
else
{
p1=p1->next;
}
if(p1==NULL)
{
printf("\n\n\t\t\t\t输入有误");
Sleep(2000);
break;
}
}
if(i>=change)
{
system("cls");
printf("\n\n\n\n");
printf("\t\t\t\t***************\n");
printf("\t\t\t\t你完蛋了!!!!!\n");
printf("\t\t\t\t***************\n");
Sleep(2000);
print2();
exit (0);
}
}
return ahead;
}
int panduan(char choice)
{
while(1)
{
fflush(stdin);
choice=getchar();
if(choice == 'y'|| choice =='Y')
return 1;
else if(choice == 'n'||choice == 'N')
return 0;
while(getchar() != '\n')
continue;
printf("输入错误!请重新输入您的选择:\n");
}
}
int back(char *a)
{
if(strlen(a)==1)
{
if(a[0]>='0'&&a[0]<='9')
return ((int)a[0]-48);
}
else
return 10;
}

void print1()
{
system("cls");
printf("\n\n\n\n");
printf("\t\t\t|******************************|\n");
printf("\t\t\t||****************************||\n");
printf("\t\t\t||| |||\n");
printf("\t\t\t||| 欢迎来到学生管理系统 |||\n");
printf("\t\t\t||| |||\n");
printf("\t\t\t||****************************||\n");
printf("\t\t\t|******************************|\n");
Sleep(2000);
}
void print() //主界面
{
system("cls");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 欢迎来到学生管理系统(主菜单) |\n");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 1.插入信息 |\n");
printf("\t\t\t| 2.查看信息 |\n");
printf("\t\t\t| 3.查询信息 |\n");
printf("\t\t\t| 4.修改信息 |\n");
printf("\t\t\t| 5.排序信息 |\n");
printf("\t\t\t| 6.删除信息 |\n");
printf("\t\t\t| 7.颜色变幻 |\n");
printf("\t\t\t|-------------------------------|\n");
printf("\t\t\t|-------------------------------|\n");
printf("\t\t\t| 0.退出程序 |\n");
printf("\t\t\t|===============================|\n");
}
void print2()
{
system("cls");
printf("\n\n\n\n");
printf("\t\t\t|******************************|\n");
printf("\t\t\t||****************************||\n");
printf("\t\t\t||| |||\n");
printf("\t\t\t||| 谢谢使用 |||\n");
printf("\t\t\t||| |||\n");
printf("\t\t\t||****************************||\n");
printf("\t\t\t|******************************|\n");
Sleep(2000);
}
/*******************查询模块********************/
pStudent searchmenu(pStudent phead) //查询子系统菜单
{
fflush(stdin);
system("cls");
int bk;
while(1)
{
char P[200];
system("cls");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 查询子系统菜单 |\n");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 1.按学号查询 |\n");
printf("\t\t\t| 2.按姓名查找 |\n");
printf("\t\t\t|-------------------------------|\n");
printf("\t\t\t| 0.返回上一层 |\n");
printf("\t\t\t|*******************************|\n\n");
printf("请输入指令:");
scanf("%s",P);
bk=back(P);
switch(bk)
{
case 1:
{
phead=search1(phead);
break;
}
case 2:
{
phead=search2(phead);
break;
}
case 0:break;
default:printf("输入错误!请重新输入\n");
system("pause");
break;
}
if(bk==0)
break;
}
return phead;
}
pStudent search1(pStudent phead) //学号查找
{
system("cls");
char number1[15],choice;
pStudent p;
while(1)
{
system("cls");
printf("请输入8位学号:");
scanf("%s",number1);
if(strlen(number1)!=8)
{
system("cls");
printf("**************\n");
printf("请输入8位学号!\n");
printf("**************\n");
Sleep(1000);
}
else
break;
}
while(1)
{
system("cls");
if(phead->next==NULL)
{
printf("没有信息!\n");
system("pause");
break;
}
p=phead->next;
while(strcmp(p->number,number1)!=0&&p->next!=NULL)
p=p->next;
if(strcmp(p->number,number1)==0)
{
print_stu2();
printf("%-8s ",p->number);
printf("%-8s ",p->name);
printf("%-4c ",p->sex);
printf("%-4u ",p->age);
printf("%-4.1f ",p->english);
printf("%-4.1f ",p->c);
printf("%-4.1f ",p->math);
printf("%-4.1f ",p->aver);
printf("%-4.1f",p->sum);
printf("\n");
system("pause");
}
else
{
printf("不存在的!\n");
system("pause");
}
system("cls");
fflush(stdin);

printf("是否继续查找?(Y or N)\n");
if(panduan(choice)==1)
{
while(1)
{
system("cls");
printf("请输入8位学号:");
scanf("%s",number1);
if(strlen(number1)!=8)
{
system("cls");
printf("**************\n");
printf("请输入8位学号!\n");
printf("**************\n");
Sleep(1000);
}
else
break;
}
}
else if(panduan(choice)==0)
break;
}
return phead;
}
pStudent search2(pStudent phead) //姓名查找
{
system("cls");
char name1[30],choice;
pStudent p;
while(1)
{
system("cls");
printf("请输入学生姓名:");
scanf("%s",name1);
if(strlen(name1)>=30)
{
system("cls");
printf("**************\n");
printf("请输入正确的名字!\n");
printf("**************\n");
Sleep(1000);
}
else
break;
}
while(1)
{
system("cls");
if(phead->next==NULL)
{
printf("没有信息!\n");
system("pause");
break;
}
p=phead->next;
while(strcmp(p->name,name1)!=0&&p->next!=NULL)
p=p->next;
if(strcmp(p->name,name1)==0)
{
print_stu2();
printf("%-8s ",p->number);
printf("%-8s ",p->name);
printf("%-4c ",p->sex);
printf("%-4u ",p->age);
printf("%-4.1lf ",p->english);
printf("%-4.1lf ",p->c);
printf("%-4.1lf ",p->math);
printf("%-4.1lf ",p->aver);
printf("%-4.1lf",p->sum);
printf("\n");
system("pause");
}
else
{
printf("不存在的!\n");
system("pause");
}
printf("是否继续查找?(Y or N)\n");
if(panduan(choice)==1)
{
while(1)
{
system("cls");
printf("请输入学生姓名:");
scanf("%s",name1);
if(strlen(name1)>=30)
{
system("cls");
printf("**************\n");
printf("请输入正确的名字!\n");
printf("**************\n");
Sleep(1000);
}
else
break;
}
}
else if(panduan(choice)==0)
break;
}
return phead;
}

/******************排序模块*******************/
pStudent sortmenu(pStudent phead) //排序子系统菜单
{
fflush(stdin);
system("cls");
int bk;
while(1)
{
system("cls");
char P[200];
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 排序子系统菜单 |\n");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 1.按年龄排序 |\n");
printf("\t\t\t| 2.按平均分排序 |\n");
printf("\t\t\t| 3.按总分排序 |\n");
printf("\t\t\t|-------------------------------|\n");
printf("\t\t\t| 0.返回上一层 |\n");
printf("\t\t\t|*******************************|\n\n");
printf("请输入指令:");
scanf("%s",P);
bk=back(P);
switch(bk)
{
case 1:phead=sort1(phead);
break;
case 2:phead=sort2(phead);
break;
case 3:phead=sort3(phead);
break;
case 0:break;
default:printf("输入错误,重新输入!");
Sleep(1000);
system("cls");
break;
}
if(bk==0)
break;
}
Save_Stu(phead);
return phead;
}
pStudent sort1(pStudent phead) //按年龄
{
system("cls");
if(phead->next==NULL)
{
printf("没有信息!\n");
Sleep(1000);
return phead;
}
sort(phead);
print_stu1(phead);
return phead;
}
pStudent sort2(pStudent phead) //按平均
{
system("cls");
if(phead->next==NULL)
{
printf("没有信息!\n");
Sleep(1000);
return phead;
}
sort(phead);
print_stu1(phead);
return phead;
}
pStudent sort3(pStudent phead) //按总分
{
system("cls");
if(phead->next==NULL)
{
printf("没有信息!\n");
Sleep(1000);
return phead;
}
sort(phead);
print_stu1(phead);
return phead;
}

pStudent sort(pStudent phead) //传送头结点 { //pj是当前结点 pj_f是pj前一个结点 pj_b是pj后一个结点 pStudent pTemp,pj,pj_f,pj_b; //这里交换的是pj和pj_b int i,j,flag; for(i=0;i<iCount-1;i++) //冒泡排序 for(j=0,flag=0,pj=phead;j<iCount-1-i;j++) { if(flag==0) //当flag==0时 结点没交换 { pj_f=pj; //移动结点位置 pj=pj->next; pj_b=pj->next; } if(flag==1) //当flag==1时 结点交换 { pj_f=pj_f->next; //移动结点位置 pj_b=pj->next; } flag=0; if(pj->sum<pj_b->sum) //数据判断 { pTemp=pj->next; //六步操作 完成交换 pj->next=pj_b->next; pj_b->next=pTemp; pTemp=pj_f->next; pj_f->next=pj_b->next; pj_b->next=pTemp; flag=1; //flag==1 进行交换的结点位置移动 } } return phead;
}
/********************增加模块**********************/
pStudent Insert(pStudent phead)
{
system("cls");
pStudent pNew,p=phead;
/*if(phead->next==NULL)
{
printf("无信息!");
Sleep(1000);
return phead;
}*/
char choice;
while(p->next!=NULL) //找尾结点
p=p->next; //移动
do // 循环插入
{
pNew=(pStudent)malloc(sizeof(Student));
printf("请输入姓名:");
scanf("%s",pNew->name);
printf("请输入学号:");
scanf("%s",pNew->number);
while(strlen(pNew->number)!=8) //格式判断
{
printf("请输入正确的8位学号:");
scanf("%s",pNew->number);
}
printf("请输入性别:");
getchar();
scanf("%c",&pNew->sex);
while(pNew->sex!='m'&&pNew->sex!='w'&&pNew->sex!='M'&&pNew->sex!='W')
{
printf("请输入正确的性别:");
fflush(stdin);
scanf("%c",&pNew->sex);
}
printf("请输入年龄:");
scanf("%u",&pNew->age);
while(pNew->age<=0||pNew->age>=100)
{
printf("请输入正确的年龄:");
scanf("%u",&pNew->age);
}
printf("请输入英语成绩:");
scanf("%lf",&pNew->english);
while(pNew->english>100||pNew->english<0)
{
printf("请输入正确的英语分数:");
scanf("%lf",&pNew->english);
}
printf("请输入C语言成绩:");
scanf("%lf",&pNew->c);
while(pNew->c>100||pNew->c<0)
{
printf("请输入正确的C语言分数:");
scanf("%lf",&pNew->c);
}
printf("请输入数学成绩:");
scanf("%lf",&pNew->math);
while(pNew->math>100||pNew->math<0)
{
printf("请输入正确的数学分数:");
scanf("%lf",&pNew->math);
}
pNew->sum=pNew->c+pNew->english+pNew->math;
pNew->aver=(pNew->c+pNew->english+pNew->math)/3;
p->next=pNew;
p=pNew;
p->next=NULL;
iCount++;
printf("是否继续添加信息(Y or N):");
choice=getchar();
}while(panduan(choice)==1);
printf("已增加学生信息.\n");
Sleep(1000);
Save_Stu(phead);
return phead;
}
/*****************输出模块******************/
void print_stu1(pStudent phead)
{
system("cls");
if(phead->next==NULL)
{
printf("没有信息!\n");
Sleep(1000);
return ;
}
print_stu2();
pStudent pTemp;
pTemp=phead->next;
while(pTemp != NULL)
{
pTemp->sum=pTemp->c+pTemp->english+pTemp->math;
pTemp->aver=(pTemp->c+pTemp->english+pTemp->math)/3;
printf("%-8s ",pTemp->number);
printf("%-8s ",pTemp->name);
printf("%-4c ",pTemp->sex);
printf("%-4u ",pTemp->age);
printf("%-6.1f ",pTemp->english);
printf("%-6.1f ",pTemp->c);
printf("%-6.1f ",pTemp->math);
printf("%-6.1f ",pTemp->aver);
printf("%-6.1f",pTemp->sum);
printf("\n");
pTemp=pTemp->next;
}
system("pause");
}
void print_stu2()
{
printf("成绩如下:\n");
printf("-----------------------------------------------------------------------\n");
printf("学号******姓名******性别***年龄***英语****C语言****数学****平均****总分\n");
printf("-----------------------------------------------------------------------\n");
}

/*****************保存模块***************/
void Save_Stu(pStudent phead) //定义保存函数
{
system("cls");
FILE *fp;
if((fp=fopen("e:\\课设\\Student", "wt"))==NULL)
{
printf("不能打开文件\n");
exit(1);
}
pStudent p;
p=phead->next;
while(p!=NULL)
{
fprintf(fp,"%s %s %c %u %lf %lf %lf %lf %lf\n", p->number, p->name ,p->sex,p->age,p->english,p->c,p->math,p->sum,p->aver); //把内存中的文件输入到硬盘中
p=p->next;
}
fclose(fp); //关闭文件
//printf("文件已保存\n"); //成功保存,显示提示
Sleep(1000);
}
/******************读取模块**********************/
pStudent router_Stu(pStudent phead)
{
system("cls");
FILE *fp;
int m=0;
if((fp=fopen("e:\\课设\\Student", "rw"))==NULL)
{
printf("读取失败!");
return;
}
pStudent p1,p2;

p1=(pStudent)malloc(sizeof(Student));
while(fscanf(fp,"%s %s %c %u %lf %lf %lf %lf %lf",
p1->number, p1->name, &p1->sex, &p1->age,&p1->english,&p1->c,&p1->math,&p1->sum,&p1->aver)==9)
{
m=m+1;
if(m==1)
{
phead->next=p1;
p2=p1;
p2->next = NULL;
}
else
{
p2->next=p1;
p2=p1;
p2->next=NULL;
}
p1=(pStudent)malloc(sizeof(Student));
}
fclose(fp);
//printf("读取成功!");
iCount=m;
//Sleep(1000);
return phead;
}
/******************删除模块**********************/
pStudent delete_Stu(pStudent phead)
{
system("cls");
if(phead->next==NULL)
{
printf("没有可删除的信息!\n");
system("pause");
return phead;
}
char number1[8];
pStudent pTemp,p;
printf("请输入您要查找的学生学号:");
scanf("%s",number1);
while(strlen(number1)!=8)
{
printf("请输入8位学号");
scanf("%s",number1);
}
pTemp=phead;
while(strcmp(pTemp->number,number1)!=0&&pTemp->next!=NULL)
{
p=pTemp;
pTemp=pTemp->next;
}
if(strcmp(pTemp->number,number1)==0)
{
if(p!=phead)
{
p->next=pTemp->next;
}
else
{
phead=pTemp->next;
}
printf("已删除");
Sleep(1000);
}
else
{
printf("没找到");
Sleep(1000);
}
getchar();
Save_Stu(phead);
return phead;
}
/********************修改*******************/
pStudent revise(pStudent phead)
{
system("cls");
char P[200];
int bk;
char number1[8];
pStudent pTemp;
if(phead->next==NULL)
{
printf("没有可修改的信息!\n");
system("pause");
return phead;
}
pTemp=phead->next;
printf("请输入你要修改的学生学号:");
scanf("%s",number1);
while(strlen(number1)!=8)
{
printf("请输入正确的8位学号:");
scanf("%s",number1);
}
while(strcmp(pTemp->number,number1)!=0&&pTemp->next!=NULL)
{
pTemp=pTemp->next;
}
if(strcmp(pTemp->number,number1)==0)
{
while(1)
{
system("cls");
printf("\t\t\t请输入你要修改的信息:\n");
printf("\t\t\t********************************\t\t\t\n");
printf("\t\t\t 1.修改学号 2.修改姓名 \t\t\t\n");
printf("\t\t\t 3.修改年龄 4.修改性别 \t\t\t\n");
printf("\t\t\t 5.修改C语言 6.修改数学 \t\t\t\n");
printf("\t\t\t 7.修改英语 8.显示信息 \t\t\t\n");
printf("\t\t\t 0.返回上一层 \t\t\t\n");
printf("\t\t\t********************************\t\t\t\n");
printf("请输入您的选择:");
scanf("%s",P);
bk=back(P);
switch(bk)
{
case 1:{
system("cls");
printf("请输入新学号:");
scanf("%s",pTemp->number);
while(strlen(pTemp->number)!=8)
{
printf("请输入正确的8位学号:");
scanf("%s",pTemp->number);
}
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 2:{
system("cls");
printf("请输入新的姓名:");
scanf("%s",pTemp->name);
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 3:{
system("cls");
printf("请输入新的年龄:");
scanf("%u",&pTemp->age);
while(pTemp->age<=0||pTemp->age>=100)
{
printf("请输入正确的年龄:");
scanf("%u",&pTemp->age);
}
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 4:{
system("cls");
printf("请输入新的性别:");
getchar();
scanf("%c",&pTemp->sex);
while(pTemp->sex!='m'&&pTemp->sex!='w'&&pTemp->sex!='M'&&pTemp->sex!='W')
{
printf("请输入正确的性别:");
fflush(stdin);
scanf("%c",&pTemp->sex);
}
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 5:{
system("cls");
printf("请输入新的C语言成绩(0-100):");
scanf("%lf",&pTemp->c);
while(pTemp->c>100||pTemp->c<0)
{
printf("请输入正确的C语言分数:");
scanf("%lf",&pTemp->c);
}
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 6:{
system("cls");
printf("请输入新的数学成绩(0-100):");
scanf("%lf",&pTemp->math);
while(pTemp->math>100||pTemp->math<0)
{
printf("请输入正确的数学分数:");
scanf("%lf",&pTemp->math);
}
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 7:{
system("cls");
printf("请输入新的英语成绩(0-100):");
scanf("%lf",&pTemp->english);
while(pTemp->english>100||pTemp->english<0)
{
printf("请输入正确的英语分数:");
scanf("%lf",&pTemp->english);
}
system("cls");
printf("修改成功!");
Sleep(1000);
break;
}
case 8:{
system("cls");
print_stu2();
print_stu1(phead);
Sleep(1000);
break;
}
case 0:break;
default:printf("输入错误,请重新输入");
system("pause");
}
if(bk==0)
break;
}
Save_Stu(phead);
return phead;
}
else
{
printf("无该学生信息!");
Sleep(1000);
return phead;
}
}

void saocaozuo()
{
printf("本操作为颜色变幻,按M或者N键可变换,回车键退出。");
int i=0,j=15;
char Color[8];
char suiji[16][2]={"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
char ch;
while(1)
{
ch=getch();
if(ch=='m'||ch=='M')
{
i++;
if(i==16)
i=0;
strcpy(Color,"color ");
strcat(Color,suiji[i]);
strcat(Color,suiji[j]);
system(Color);
}
else if(ch=='n'||ch=='N')
{
j--;
if(j==-1)
j=15;
strcpy(Color,"color ");
strcat(Color,suiji[i]);
strcat(Color,suiji[j]);
system(Color);
}
else if(ch==13)
{
system("cls");
break;
}

}
}

void meun()
{
pStudent phead;
phead = (pStudent)malloc(sizeof(Student));
phead->next = NULL;
router_Stu(phead);
char P,a[200];
char choice;
int bk;
while(1)
{
system("cls");
print();
fflush(stdin);
printf("请输入指令:");
scanf("%s",a);
bk=back(a);
switch(bk)
{
case 1:{phead=Insert(phead); //完成
system("cls");
break;}
case 2:{print_stu1(phead); //完成
system("cls");
break;}
case 3:{phead=searchmenu(phead); //完成
system("cls");
break;}
case 4:{phead=revise(phead); //完成
system("cls");
break;}
case 5:{phead=sortmenu(phead); //完成
system("cls");
break;}
case 6:{phead=delete_Stu(phead); //完成
system("cls");
break;}
case 7:{saocaozuo();
break;
}
case 0:{
print2();
exit(1);
}
default:{printf("输入错误!请重新输入\n");
system("pause");}
}
}
free(phead);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 设计 数据存储