花哥哥的瞎扯:
大一的课设学生管理系统,因为学也学不精,望各位大神轻点骂,多指点一下吖。
整体综合:
建立学生结点之后再弄一个链表,用尾插法的方式添加学生元素,主要是由主函数,自定义函数,还有菜单框架函数,及选择功能函数之间的调换,实现主要功能有:增加、删除、修改、统计排序和查询以及信息的存储功能。
理解流程图:
代码区:
//@你的花哥哥-花森制作
#include
#include
#include
#include
#include
using namespace std;
struct student//创建学生信息结构体。
{
char name[20];
char nation[10];
char sex[2];
long int idnum;
float math;
float english;
float sum;
};
struct Node//链表的结点结构。
{
struct student data;
struct Node*next;
};
//链表的创建:
Node*creatNode();//1.创建结点
//链表的删除:
struct Node*deleteNodebyname(Node*headNode);//1.按姓名删除结点
struct Node*deleteNodebynum(Node*headNode, char num[]);//2.按学号删除结点
//链表的遍历统计:
struct Node*aver(Node*headNode);//1.统计平均数
void mathnopass(Node*headNode);//2.数学未及格人数
void englishnopass(Node*headNode); //3.英语未及格人数输出与统计
void selectsex(Node*headNode);//4. 按性别统计学生人数
void selectnation(Node*headNode);//5.按民族统计学生人数
//链表的输出:
void printlist(Node*headNode); //1.遍历打印学生信息
//文件的操作:
void savefile(Node*headNode); //1.文件的保存
void readfile(Node*headNode);//2.文件的读取
void asavefile(Node*headNode);//3.文件的追加
//菜单框架:
void printstar();//1.打印横条 * 号
void print();//2.打印边边 * 号
void menu();//3.主菜单框架
void menuofdelete();//4.删除菜单框架
void menuofnumalter();//5.按学号修改
void menuofnopass();//6.不及格人数菜单
void menusort(); //排序菜单框架
//界面选择功能:
void keydown();
void keydowndelete();//2.删除菜单
void keydownbynumalter();//3.修改菜单
void keydownsort();//4.单科成绩排序菜单
void keydownnopass();//5.不及格人数菜单
//修改类函数:
Node*altername(Node*headNode);//1.修改姓名
Node*alteridnum(Node*headNode);//2.修改学号
Node*altermath(Node*headNode);//3.修改数学成绩
Node*alterenglish(Node*headNode);//4.修改英语成绩
//排序类函数:
void sortmath(Node*headNode); //1.数学成绩排序
void sortaver(Node*headNode);//2.平均成绩排序
//主程序
int main()
{
menu();
keydown();
return 0;
}
//链表的创建 :
struct Node*creatNode()//创建学生结点,并填入数据data,返回这结点的指针。
{
/*struct Node *headNode;
headNode=(struct Node*)malloc(sizeof(struct Node));//sizeof函数计算该结构体的所占的内存大小,malloc创建一个结构体大小的内存地址。
headNode->next=NULL; */
Node*pnew;
Node*ptail;
Node*p=NULL;
int i=0;
cout<>pnew->data.idnum;
if(pnew->data.idnum==0) break;
fflush(stdin);
cout<<"姓名: "; cin>>pnew->data.name;
cout<<"民族: "; cin>>pnew->data.nation;
cout<<"性别: "; cin>>pnew->data.sex;
cout<<"数学成绩: ";cin>>pnew->data.math;
cout<<"英语成绩:";cin>>pnew->data.english;
cout<next=NULL;
if(i==0)//建立第一个结点的时候
{
p=pnew;
ptail=pnew;
}
else
{
ptail->next=pnew;
ptail=ptail->next;
}
i++;
}
return p;//头指针是一个元素
}
//链表结点的删除 :
struct Node*deleteNodebyname(Node*phead)//按姓名遍历查找并删除。
{
if(phead==NULL)//头指针的判断是否为空
{
cout<<"无学生数据"<>name;
struct Node*p=phead->next;
struct Node*q=phead;
if(q!=NULL&&p==NULL)//链表只有一个元素情况
{
if(strcmp(phead->data.name,name)==0)
{
phead=phead->next;
free(q);
cout<<"删除成功"<data.name,name)==0)//如果第一个数直接是匹配的元素。
{
phead=phead->next;
free(q);
cout<<"删除成功"<data.name,name)==0)//p指针来找要匹配的元素,然后q指向p的前一个。
{
q->next=p->next;
free(p);
cout<<"删除完毕"<next;
}
if(p==NULL)//P指针走到最后
{
cout<<"无该学生数据"<>num;
struct Node*p=phead->next;
struct Node*q=phead;
if(q!=NULL&&p==NULL)
{
if(phead->data.idnum==num)
{
phead=phead->next;
free(q);
cout<<"删除成功"<data.idnum==num)//如果第一个数直接是匹配的元素。
{
phead=phead->next;
free(q);
cout<<"删除成功"<data.idnum==num)//p指针来找要匹配的元素,然后q指向p的前一个。
{
q->next=p->next;
free(p);
cout<<"删除完毕"<next;
}
if(p==NULL)
{
cout<<"无该学生数据"<data.idnum<<" "<data.name<<" "<data.math<<" "<data.english<next;
}
}
}
//遍历统计 :
struct Node*aver(Node*headNode)//计算每名学生的平均数
{
float ave;
Node*p=headNode;
Node*phead=p;
if(p==NULL)
{
cout<<"无学生信息 无法求平均数"<data.math+p->data.english)/2;
p->data.sum=ave;
cout<data.idnum<<" "<data.name<<" "<data.math<<" "<data.english<<" "<next;
}
}
return phead;
}
void mathnnopass(Node*headNode)
{
int i=0;
Node*p=headNode;
if(p==NULL)
{
cout<<"无学生信息!"<data.math<60)
{
i++;
cout<data.name<<" "<data.idnum<<" "<data.math<next;
}
}
cout<data.english<60)
{
i++;
cout<data.name<<" "<data.idnum<<" "<data.english<next;
}
}
cout<>sex;
int i=0;
Node*p=headNode;
if(p==NULL)
{
cout<<"无学生信息!"<data.sex,sex)==0)
{
i++;
}
p=p->next;
}
}
cout<>nation;
int i=0;
Node*p=headNode;
if(p==NULL)
{
cout<<"无学生信息!"<data.nation,nation)==0)
{
i++;
}
p=p->next;
}
}
cout<>num;
struct Node*p=headNode;
Node*phead=headNode;
if(p==NULL) cout<<"表格为空"<data.idnum==num)
{
char n[20];
cout<<"请输入新的姓名:"<>n;
strcpy(p->data.name,n);
cout<<"修改成功!"<next;
}
if(p==NULL)
{
cout<<"无该学生信息";
}
return phead;
}
struct Node*alteridnum(Node*headNode)//修改学号
{
cout<<"请输入要修改的学生学号:"<>num;
struct Node*p=headNode;
Node*phead=headNode;
if(p==NULL) cout<<"表格为空"<data.idnum==num)
{
long int n;
cout<<"请输入新的学号:"<>n;
p->data.idnum=n;
cout<<"修改成功!"<next;
}
if(p==NULL)
{
cout<<"无该学生信息";
}
return phead;
}
struct Node*altermath(Node*headNode)//修改数学成绩
{
cout<<"请输入要修改的学生学号:"<>num;
struct Node*p=headNode;
Node*phead=headNode;
if(p==NULL) cout<<"表格为空" <data.idnum==num)
{
float n;
cout<<"请输入新的数学成绩:"<>n;
p->data.math=n;
cout<<"修改成功!"<next;
}
if(p==NULL)
{
cout<<"无该学生信息";
}
return phead;
}
struct Node*alterenglish(Node*headNode)//修改英语成绩
{
cout<<"请输入要修改的学生学号:"<>num;
struct Node*p=headNode;
Node*phead=headNode;
if(p==NULL) cout<<"表格为空" <data.idnum==num)
{
float n;
cout<<"请输入新的英语成绩成绩:"<>n;
p->data.english=n;
cout<<"修改成功!"<next;
}
if(p==NULL)
{
cout<<"无该学生信息"<next;
}
for(i=0,p=headNode;inext)//int i 不能放在这里面,因为括号里的类型不全是int类型,还有指针的类型。
{
for( j=i+1,r=p->next;jnext)
{
if(p->data.mathdata.math)
{
float temp;
temp=p->data.math;
p->data.math=r->data.math;
r->data.math=temp;
char t[20];
strcpy(t,p->data.name);
strcpy(p->data.name,r->data.name);
strcpy(r->data.name,t);
}
}
}
int count=1;
t=headNode;
Node*pnew=(struct Node*)malloc(sizeof(struct Node));
pnew->next=t;
cout<<"名次"<<" "<<"姓名"<<" "<<"数学成绩"<data.name<<" "<data.math<next;
t=t->next;
if(t!=NULL)
{
if(pnew->data.math!=t->data.math) count++;
}
}
}
}
void sortaver(Node*headNode)
{
cout<<"开始进行平均成绩的排序..." <data.math+p->data.english)/2;
p->data.sum=ave;
p=p->next;
}
while(t!=NULL)//计算链表的长度
{
len=len+1;
t=t->next;
}
for(i=0,p=headNode;inext)//int i 不能放在这里面,因为括号里的类型不全是int类型,还有指针的类型。
{
for( j=i+1,r=p->next;jnext)
{
if(p->data.sumdata.sum)
{
float temp;
temp=p->data.sum;
p->data.sum=r->data.sum;
r->data.sum=temp;
char t[20];
strcpy(t,p->data.name);
strcpy(p->data.name,r->data.name);
strcpy(r->data.name,t);
}
}
}
int count=1;
t=headNode;
Node*pnew=(struct Node*)malloc(sizeof(struct Node));
pnew->next=t;
cout<<"名次"<<" "<<"姓名"<<" "<<"平均成绩"<data.name<<" "<data.sum<next;
t=t->next;
if(t!=NULL)
{
if(pnew->data.sum!=t->data.sum) count++;
}
}
}
}
//文件的操作:
void savefile(Node*headNode)//文件的建立保存,通过遍历把每一条数据都保存。
{
struct Node*p=headNode;
FILE*fp=fopen("student.txt","w");//*fp为一个文件的指针,fopen(文件名,创建的文件权限类型) 文件权限类型:"r","W","a","w+","a+" 。
while(p!=NULL)
{
fwrite(p,sizeof(Node),1,fp);//遍历保存记录的语句。
p=p->next;
}
fclose(fp) ;
}
void asavefile(Node*headNode)//文件的建立保存,通过遍历把每一条数据都保存。
{
struct Node*p=headNode;
FILE*fp=fopen("student.txt","a");//*fp为一个文件的指针,fopen(文件名,创建的文件权限类型) 文件权限类型:"r","W","a","w+","a+" 。
while(p!=NULL)
{
fwrite(p,sizeof(Node),1,fp);//遍历保存记录的语句。
p=p->next;
}
fclose(fp) ;
}
Node* readfile(char *filename)//文件的读取。
{
Node *phead=NULL;
FILE *fp;
if((fp=fopen(filename,"r"))==0) return phead;
Node *ptail, *pnew;
int i=0;
student s;
while(fread(&s,sizeof(Node),1,fp)!=0)
{
pnew=(Node*)malloc(sizeof(Node));
pnew->data=s;
pnew->next=NULL;
if(i==0)
{
phead=pnew;
ptail=pnew;
}
else
{
ptail->next=pnew;
ptail=pnew;
}
i++;
}
fclose(fp);
return phead;//第一个元素的指针
}
//菜单选择器
void keydown()
{
char choice;
fflush(stdin);
choice=getch();
switch(choice)
{
case '0'://退出管理系统。
break;
case '1'://学生个人信息的录入。
{
Node*headNode=creatNode();
asavefile(headNode);
system("pause");
system("cls");
menu();
keydown();
break;
}
case '2'://遍历输出所有的学生记录。
{
char filename[100];
strcpy(filename,"student.txt");
Node*headNode=readfile(filename);
printlist(headNode);
system("pause");
system("cls");
menu();
keydown();
break;
}
case '3'://平均分
{
char filename[100];
strcpy(filename,"student.txt");
Node*headNode=readfile(filename);
headNode=aver(headNode);
savefile(headNode);
system("pause");
system("cls");
menu();
keydown();
break;
}
case '4'://删除修改信息
{
system("cls");
menuofdelete();
keydowndelete();
break;
}
case '5':
{
system("cls");
menuofnopass();
keydownnopass();
break;
}
case '6':
{
system("cls");
menusort();
keydownsort();
break;
}
case '7'://按性别统计人数
{
char filename[100];
strcpy(filename,"student.txt");
Node*headNode=readfile(filename);
selectsex(headNode);
savefile(headNode);
system("pause");
system("cls");
menu();
keydown();
break;
}
case '8':
{
char filename[100];
strcpy(filename,"student.txt");
Node*headNode=readfile(filename);
selectnation(headNode);
savefile(headNode);
system("pause");
system("cls");
menu();
keydown();
break;
}
default:
{
cout<<"输入错误 请重新输入!"<
话痨:
当时弄这个鬼东西,差点没有给我累死,还好当时还有几位不遗余力的解答我的奇奇怪怪的问题,予以表扬吖。
花哥哥严肃说:
所学的知识均从课本,课外读物,网上收集资料,如果哪有侵权惹到您不开心丫,此外还有我也是小白,如果哪有认识不对的地方系统您抽我一耳光说我哪错了,联系企鹅号:184820911,有哪不明白或没事都可以找我,陪聊,陪吃不陪睡。