“是”-C语言学生管理系统初学超详细版

花哥哥的瞎扯:

大一的课设学生管理系统,因为学也学不精,望各位大神轻点骂,多指点一下吖。

整体综合:

建立学生结点之后再弄一个链表,用尾插法的方式添加学生元素,主要是由主函数,自定义函数,还有菜单框架函数,及选择功能函数之间的调换,实现主要功能有:增加、删除、修改、统计排序和查询以及信息的存储功能。

理解流程图:

“是”-C语言学生管理系统初学超详细版_第1张图片

 代码区:

//@你的花哥哥-花森制作
#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,有哪不明白或没事都可以找我,陪聊,陪吃不陪睡。

你可能感兴趣的:(“忽”-,浅谈调戏C语言)