⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 学生信息管理系统.c

📁 本数据结构学习包
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<malloc.h>
#include<windows.h>



//函数声明
void Menu();
int menu_select();
void CreatFile();
void init();
void insert();
void Delete();
void print();
void sort();
void search();
int  findnum();
void findname();
void findmath();
void findprogram();
void findscore();
void Fn(); 

typedef struct link_node
{
	long id;
	char name[15];
	int MathGrade;
	int ChinGrade;
	int EnglGrade;
	int score;
	struct link_node *next;
}node;

node *head;                       //头结点

int i; 

void main()
{
	Menu();
}


void Menu()
{
	
 for(;;)             
   {
      switch(menu_select())          /*调用主菜单函数,返回值整数作开关语句的条件,值不同,执行的函数不同*/
      {  case 1:CreatFile();break;   /*新建数据档案,并初始化,然后输入档案*/  
	     case 2:insert();break;      /*添加数据*/
	     case 3:Delete();break;      /*删除数据*/
		 case 4:sort();break;        /*排序*/
	     case 5:search();break;      /*检索*/
	     case 6:print();break;       /*显示全部记录*/
	     case 7:exit(0);             /*如菜单返回值为8程序结束*/	 
      }  
	  printf("\n\n\n\n\n\n\n\t\t\t完成!\n\t\t\t按任何键回到主菜单!");
      getch();                      
 } 
} 

int menu_select()
{
   char *menu[]={"******************************MENU******************************",
   " 1. 新建数据档案",                                       /*新建数据档案*/
   " 2. 添加一个学生档案",                                   /*添加数据*/
   " 3. 删除一个学生档案",                                   /*删除数据*/
   " 4. 按总分排序",                                         /*排序*/
   " 5. 查找",                                               /*查找*/
   " 6. 打印所有学生档案 ",                                  /*输出档案*/
   " 7. 退出",                                               /*退出*/
                 "****************************************************************"};
   int c,j;
   system("cls");
   printf("\n\t\t\t 欢迎使用学生信息管理系统 \n\n");
   printf("\t\t\t\t   作者 : 孙柳林 \n\t\t\t\t   学号 : 0308060220\n");
   for(j=0;j<=8;j++)                                        /*输出主菜单数组*/
	   printf("\n\t%s\n",menu[j]);
   do{
      printf("\nEnter you choice(1---7):[ ]\b\b");          /*在菜单窗口外显示提示信息*/
      scanf("%d",&c);                                       /*输入选择项*/
   }while(c<1||c>7);                                        /*选择项不在1~7之间重输*/                                                   
   return c;                                                /*返回选择项,主程序根据该数调用相应的函数*/
}



void CreatFile()
{                                            //序号
 long a;                                              //如果学号为 0,则退出新建档案
 node *p=NULL;
 system("cls"); 
 init(); 
 i=1;
 printf("\n创建新档案\n\n ");
 printf("\n请按以下格式输入!\n");
 printf("eg:\n     学号         姓名   数学   语文  英语\n");
 printf("     0308060225   李宁   90     85    96 \n");
 do{
       printf("%-5d",i);
	   scanf("%ld",&a);
	   if(a)
	   {
		   p=(node*)malloc(sizeof(node));              //为使不为退出的0学号分配一个空间
		   p->next=NULL;		                                 
		   while(findnum(a))                           //查找是否己经存在这个学号   此功能尚未完成!
		   {
			   printf("这个学号己经存在! 请重新输入\n");
			   printf("%-5d",i);
			   scanf("%ld",&a);		         
		   }
		   p->id=a;		            
		   scanf("%s %d %d %d",p->name,&p->MathGrade,&p->ChinGrade,&p->EnglGrade);
	       p->score=p->MathGrade+p->ChinGrade+p->EnglGrade;    
		   p->next=head->next;
		   head->next=p; 
		   i++;
	   }
 }while(a);
}

void init()
{
 head=(node*)malloc(sizeof(node));
 head->next=NULL; 
}

void insert()                             //退出的两种途径, 一.不按Y, 二.学号输入0
{ 
 long a; 
 node *p;
 char c;                                 // 是否继续输入
 system("cls");
 if(!head)                                 //如果用户没有创建新档案,则补充
 {
	 init(); 
	 i++;
 }
 printf("\n添加一个学生的档案\n\n"); 
 printf("\n请按以下格式输入!\n");
 printf("eg:\n     学号         姓名   数学   语文  英语\n");
 printf("     0308060225   李宁   90     85    96 \n");
 do{
       printf("%-5d",i);
	   scanf("%ld",&a);
	   if(a)
	   {
		   p=(node*)malloc(sizeof(node));              //为使不为退出的0学号分配一个空间
		   p->next=NULL;		                                 
		   while(findnum(a))                           //查找是否己经存在这个学号   此功能尚未完成!
		   {
			   printf("这个学号己经存在! 请重新输入\n");
			   printf("%-5d",i);
			   scanf("%ld",&a);		         
		   }
		   p->id=a;		            
		   scanf("%s %d %d %d",p->name,&p->MathGrade,&p->ChinGrade,&p->EnglGrade);
	       p->score=p->MathGrade+p->ChinGrade+p->EnglGrade;    
		   p->next=head->next;
		   head->next=p; 
		   i++;
	   }
	   printf("\n继续插入,请输入: y 或 Y \n");
	   getchar();
	   c=getchar();
	   if(c!='y'&&c!='Y')                             //c==y 或 c==Y 的反面
		   break;
 }while(a);
}

void Delete()
{
 node *pre=head,*p; 
 long a;
 int k;
 system("cls");
 printf("\n\t\t************** 删除一个学生信息 ******************\n");
 if(head) 
 {
	 p=head->next;    
     printf("请输入你要删除的学生的学号:   ");
     scanf("%d",&a);
     if(!findnum(a))
    	  printf("\n这个学生的信息不存在!\n");
     else 
	 {
	     while(p&&p->id!=a)
		 {
	    	pre=p;
	    	p=p->next;
		 }
         printf("\n这个学生的信息: \n");
         for(k=1;k<80;k++)
    	     printf("*");
    	 printf("\n学号\t  姓名\t         数学        语文       英语       总分\n");   
         printf("%-10ld%-15s%-3d\t     %-2d  \t%-3d    \t%6d\n",p->id,p->name,p->MathGrade,p->ChinGrade,p->EnglGrade,p->score);
	     for(k=1;k<80;k++)
    	     printf("*");            
    	 pre->next=p->next;
		 free(p);
		 i--;  
		 printf("\n删除成功\n");
	 }
 }
 else
	 printf("\n请先创建一个档案!\n");
}

void print()
{
 int j;
 node *p=head;              //不用 p=head->next,是防止用户没建立档案就用此功能
 system("cls");
 for(j=1;j<80;j++)
	 printf("*");
 printf("\n学号\t  姓名\t         数学        语文       英语       总分\n");          
 while(p&&p->next)         //此技术好啊,防止最后一个结点,到下一个,则是空,
 {
	 p=p->next;
	 printf("%-10ld%-15s%-3d\t     %-2d  \t%-3d    \t%6d\n",p->id,p->name,p->MathGrade,p->ChinGrade,p->EnglGrade,p->score);
 }                                        
 for(j=1;j<80;j++)
	 printf("*");
 printf("\n");
}


void sort()
{
 node *p=head,*pre,*q;
 system("cls");
 printf("\n\t\t************** 按总分对所有学生排序 ******************\n");
 if(!p) 
	 printf("\n请先创建一个档案!\n");
 else 
 {
	 p=p->next;
	 if(!p)
		 printf("\n这档案没有任何学生信息!\n");
     else
		 while(p) 
		 {   
			 pre=p;
			 q=p->next;
			 while(q)
			 {
				 if(p->score<q->score)
				 {
					 pre->next=q->next;
					 p=q;
					 q=pre->next;
					 p->next=head->next;
					 head->next=p;
				 }
				 q=q->next;
			 }
			 p=p->next;
		 }		    
 }
}

void search()
{	
 int f;
 system("cls");
 printf("\n\t\t*************** 查找 ******************\n");
 printf("\n\t 请选择查找方式!");
 printf("\n\n\t\t 1.按学号查找\n\n\t\t 2.按姓名查找\n\n\t\t 3.回到主菜单\n\n");
 do {
	 printf("\n\t\t You choice is[1--6]:__\b\b ");
	 scanf("%d",&f);
 }while((f<1)||(f>3));
 switch(f)
  {case 1:Fn(); break;
   case 2:findname(); break; 
   case 3:Menu(); break;
   default :printf("ERROR");
  }
}

void Fn()
{
 
 long a;
 system("cls");
 printf("\nEnter the NUM of the student you want to search for:\n");
 scanf("%d",&a);
	findnum(a);
}
int findnum(long a)
{
	node *p=head;
	while(p&&p->next)
	{
		p=p->next;
		if(p->id==a)
			return 1;
	}
	return 0;	
}

void findname()
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -