学生信息管理系统--C语言课程设计

学生信息管理系统

可实现的主要功能:
1.对学生信息的增、删、改
2.查找学生姓名/学号
3.排序学生姓名/学号/成绩

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define MAXNUM 100

struct student{
	int num;  //学号
	char name[20];   //姓名 
	float price;  //成绩 
};

struct stuList{
	struct student stu[MAXNUM];  //学生信息 
	int length;   //实际学生数 +1
}; 

struct stuList* L;

void welcome()//欢迎界面
{
  printf("  --------------------------------------\n");
  printf("                  欢迎来到         \n");
  printf("         《C语言数据结构课程设计》 \n");
  printf("              学生信息管理系统   \n");
  printf("  --------------------------------------\n");
  printf("        设计者学院:新工科产业学院  \n");
  printf("              班级:智能193        \n");
  printf("              学号:2019129xxxxx    \n");
  printf("              姓名:liuyi      ");
  printf("\n\t    ");system("date/t");
  printf("\n");
} 

void inputstu(int n){//初始化学生信息 
	L=(struct stuList*)malloc(sizeof(struct stuList));	 //分配存储单元
	L->length=9; 
	L->stu[1].num=201903;strcpy(L->stu[1].name,"张三");L->stu[1].price=89.0; 
	L->stu[2].num=201904;strcpy(L->stu[2].name,"李四");L->stu[2].price=80.0;
	L->stu[3].num=201905;strcpy(L->stu[3].name,"王五");L->stu[3].price=100.0;
	L->stu[4].num=201901;strcpy(L->stu[4].name,"小明");L->stu[4].price=79.0;
	L->stu[5].num=201908;strcpy(L->stu[5].name,"李华");L->stu[5].price=90.0;
	L->stu[6].num=201902;strcpy(L->stu[6].name,"赵六");L->stu[6].price=84.0;
	L->stu[7].num=201906;strcpy(L->stu[7].name,"刘嘻");L->stu[7].price=78.0;
	L->stu[8].num=201907;strcpy(L->stu[8].name,"陈情");L->stu[8].price=93.0;
	int i;
	for(i=1;i<=n;i++){
		L->length++;
		printf(">>>输入第%d个学生学号:",i);
		scanf("%d",&(L->stu[i+8].num));
		printf(">>>输入第%d个学生姓名:",i);
		scanf("%s",&(L->stu[i+8].name));
		printf(">>>输入第%d个学生成绩:",i);
		scanf("%f",&(L->stu[i+8].price)); 
		printf("\n");
	}
	printf("--------信息初始化完成,按任意键继续--------");
	getch();
	system("cls");
}

void outputstu(){//显示学生信息功能函数 
	int i;
	printf("编号  学号\t");printf("    姓名\t");printf("成绩\t\t");
	printf("\n-------------------------------------------------\n");
	for(i=1;i<L->length;i++){
		printf(" %-5d%-9d\t",i,L->stu[i].num);
		printf("    %-10s\t",L->stu[i].name);
		printf("%.1f\n",L->stu[i].price);
	} 
	printf("-------------------------------------------------");
	printf("\n返回上一级菜单请按任意键!");
	getch();
	system("cls"); 
}

void sortNum(int low,int high){//按学号排序(快速排序)
    int pos; 
	if(low<high){
			pos=Quicksort(low,high);
			sortNum(low,pos-1);// 左部分快速排序 
			sortNum(pos+1,high);//右部分快速排序  
		}
	return;	
}


int insertstu(int i){
	int k,xuehao;
	if(L->length==MAXNUM) //顺序表满,插入失败
	    return 0;
	if(i<1 || i>L->length)//插入位置不合法,插入失败
	    return 0;
		
		 
     printf(">>>输入插入学生学号:");
	 scanf("%d",&xuehao);
	 sortNum(1,L->length-1);
	 int find=searchNum(xuehao);
	 if(find!=-1){
	 	printf("该学生学号已存在!");
	 	printf("\n学号:%d,姓名:%s\n",L->stu[find].num,L->stu[find].name);
	 	return 0;
	 }
	 //将数据(i到length-1)后移
	 for(k=L->length-1;k>=i;k--)
	     L->stu[k+1]=L->stu[k];
	 L->stu[i].num=xuehao;   
     printf(">>>输入插入学生姓名:",i);
	 scanf("%s",&(L->stu[i].name));
	 printf(">>>输入插入学生成绩:",i);
	 scanf("%f",&(L->stu[i].price)); 
	 printf("\n"); 
	 //修改顺序表长度
	 L->length++;
	 
	 return 1;	 
}

int deletestu(int i){
	int k;
	if(L->length==1) //顺序表空,删除失败
	    return 0;
	if(i<1 || i>L->length)//删除位置不合法,删除失败
	    return 0;
		
     //1.将数据(i到length-1)前移
	 for(k=i;k<=L->length-1;k++)
	     L->stu[k]=L->stu[k+1];
		 
	 //2.修改顺序表长度
	 L->length--;
	 
	 return 1;	 
}

void insert_tip(){//插入提示 
	int i;
	printf(">>>输入插入位置:");
	scanf("%d",&i);
	if(insertstu(i)==1){
		printf("插入成功!\n"); 
	}else{
		printf("插入失败!\n"); 
	}
}

void delete_tip(){//删除提示 
	int i;
	printf(">>>输入删除位置:");
	scanf("%d",&i);
	if(deletestu(i)==1){
		printf("删除成功!\n"); 
	}else{
		printf("删除失败!\n"); 
	}
}

void show(){
	int i;
	printf("编号  学号\t");printf("    姓名\t");printf("成绩\t");
	printf("\n-------------------------------------------------\n");
	for(i=1;i<L->length;i++){
		printf(" %-5d%-9d\t",i,L->stu[i].num);
		printf("    %-10s\t",L->stu[i].name);
		printf("%.1f\n",L->stu[i].price);
	} 
	printf("-------------------------------------------------");
	printf("\n学生排序已完成!");
}

void sortName()//按姓名排序(折半排序) 
{
	int i,j,low,high,mid,num;
	float price;
	for(i=2;i<L->length;i++){
        L->stu[0]=L->stu[i];
		for(low=1,high=i-1;low<=high;){
			mid=(low+high)/2;
			if(strcmp(L->stu[0].name,L->stu[mid].name)<0)
			   high=mid-1;
			else
			   low=mid+1;   
		}
		for(j=i-1;j>=high+1;j--){//将low开始的有序记录向后移动一个位置 
			L->stu[j+1]=L->stu[j];
		}
        L->stu[high+1]=L->stu[0];
	}
}


int Quicksort(int low,int high){//按学号排序(快速排序) 
    L->stu[0]=L->stu[low];
    int x=L->stu[low].num;
	while(low<high){
			while(low<high&&L->stu[high].num>=x)  high--;//从右向左找第一个小于x的数
			if(low<high){
				L->stu[low]=L->stu[high];
				low++;
			}
			while(low<high&&L->stu[low].num<=x) low++;//从左向右找第一个大于x的数
			if(low<high){
				L->stu[high]=L->stu[low];
				high--;
			}
		}
        L->stu[low]=L->stu[0];
		return low;
	}

void sortPrice(){//按成绩排序(直接插入排序) 
	int i,j;
	for(i=2;i<L->length;i++){
		if(L->stu[i].price<L->stu[i-1].price){
			L->stu[0]=L->stu[i];
			L->stu[i]=L->stu[i-1];
			for(j=i-2;L->stu[0].price<L->stu[j].price;--j){
				L->stu[j+1]=L->stu[j];
			}
			L->stu[j+1]=L->stu[0];//插入到正确位置 
		}
	}
	return; 
}

void sortmenu()//排序菜单 
{
	int num1;
	do{
		printf("\n\n\n");
		printf("\t\t\t☆☆学生信息排序☆☆\n");
		printf("\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---------------------------------------\n");
		printf("\t\t\t请输入菜单选项1-3:");
		scanf("%d",&num1);
		system("cls");
		switch(num1){
			case 1:sortName();show();break;//按姓名排序
			case 2:sortNum(1,L->length-1);show();break;//按学号排序
			case 3:sortPrice();show();break;//按成绩排序 
			case 4:menu();
			default:printf("选项错误!按任意键继续!");
			getch();
			system("cls");
		} 
	}while(num1);
}

int searchName(int low,int high,char name[]){//按姓名查找(折半查找,递归) 
	int mid;
	if(low<=high){
		mid=(low+high)/2;
		if(strcmp(L->stu[mid].name,name)==0){
			return mid;
		}
		else if(strcmp(name,L->stu[mid].name)<0){
			return searchName(low,mid-1,name);
		}
		else{
			return searchName(mid+1,high,name);
		}
	}
	return -1;
}

void searchName_tip(){
	sortName();
	char findname[30];
	int index;
	printf(">>>输入查找的学生姓名:");
	scanf("%s",&findname);
	index=searchName(1,L->length-1,findname);
	if(index==-1){
		printf("查找失败,不存在此姓名的学生。");
	}
	else{
		printf("查找成功,此学生的学号为:%d,成绩为:%.2f",L->stu[index].num,L->stu[index].price);
	} 
}

int searchNum(int num){//按学号查找(折半,非递归) 
	int left=1,right=L->length-1,mid;
	while(left<=right){
		mid=(left+right)/2;
		if(num==L->stu[mid].num) return mid;
		if(num>L->stu[mid].num) left=mid+1;
		else right=mid-1;
	}
	return -1;
}

void searchNum_tip(){
	sortNum(1,L->length-1);
	int findnum;
	int index;
	printf(">>>输入查找的学号:");
	scanf("%d",&findnum);
	index=searchNum(findnum);
	if(index==-1){
		printf("查找失败,不存在此学号的学生。");
	}
	else{
		printf("查找成功,此学生的姓名为:%s,成绩为:%.2f",L->stu[index].name,L->stu[index].price);
	} 
}

void searchmenu()//查询菜单 
{
	int num1;
	do{
		printf("\n\n\n");
		printf("\t\t\t☆☆学生信息排序☆☆\n");
		printf("\t\t---------------------------------------\n");
	    printf("\t\t\t  1 按姓名查找          \n");
		printf("\t\t\t  2 按学号查找          \n");
		printf("\t\t\t  3 返回上一级          \n");
		printf("\t\t---------------------------------------\n");
		printf("\t\t\t请输入菜单选项1-3:");
		scanf("%d",&num1);
		system("cls");
		switch(num1){
			case 1:searchName_tip();break;
			case 2:searchNum_tip();break;
			case 3:menu();
			default:printf("选项错误!按任意键继续!");
			getch();
			system("cls");
		} 
	}while(num1);
}

void Price(){
	sortPrice();
	int x=L->length,i; 
	float sum=0.0;
	for(i=1;i<=x;i++){
		sum+=L->stu[i].price;
	}
	printf("\t -----------------------------------------------------\n");
    printf("\t    ☆☆☆     学生成绩情况     ☆☆☆                 \n");
    printf("\t -----------------------------------------------------\n");
    printf("\n\n\t\t该系统现共有学生%d人",x-1); 
	printf("\n\n\t\t最高分:%.1f,姓名:%s,学号:%d",L->stu[x-1].price,L->stu[x-1].name,L->stu[x-1].num);
	printf("\n\n\t\t最低分:%.1f,姓名:%s,学号:%d",L->stu[1].price,L->stu[1].name,L->stu[1].num);
	printf("\n\n\t\t平均分:%.2f",1.0*sum/x); 
	getch();
	system("cls");
} 

void xiugai(){
	show();
	int index,s;
	printf("请输入修改学生的编号:");
	scanf("%d",&index); 
	if(index>L->length-1){
		printf("编号输入错误!\n");
		return;
	}
	printf("请输入要修改的内容 姓名1/成绩2:");
	scanf("%d",&s);
	switch(s){
		case 1:
			printf("请输入修改后的姓名:");
			scanf("%s",&(L->stu[index].name));
			break;
		case 2:
			printf("请输入修改后的成绩:");
			scanf("%f",&(L->stu[index].price));
			break;
		default:
		    printf("输入错误!\n");    	
	}
	return;
}

void menu()//主菜单
{
	int num;
	    printf("\t -----------------------------------------------------\n");
        printf("\t                                                          \n");
        printf("\t    ☆☆☆     欢迎使用莆院学生信息管理系统     ☆☆☆                 ");
        printf("\t                                                          \n");
        printf("\t -----------------------------------------------------\n");
        printf("\t          |      1 → 显示学生信息             |\n");
        printf("\t          |      2 → 添加学生信息             |\n");
        printf("\t          |      3 → 删除学生信息             |\n");        
        printf("\t          |      4 → 排序学生信息             |\n");
		printf("\t          |      5 → 修改学生信息             |\n");  
        printf("\t          |      6 → 查找学生信息             |\n");
        printf("\t          |      7 → 学生成绩分析             |\n");
        printf("\t          |      8 → 退出学生系统             |\n");
	    printf("\t -----------------------------------------------------\n");
        printf("\t\t\t\t\t\t");system("date/t");
        printf("\t\t\t\t\t\t   ");system("time/t");
	    printf("\t请选择菜单选项1-6:");
		scanf("%d",&num);//设置菜单,通过num来选择
		switch(num){
			    case 1:system("cls");outputstu();break;//学生信息显示
				case 2:system("cls");insert_tip();break; //输入提示 _添加学生信息
				case 3:system("cls");delete_tip();break;//删除提示_删除学生信息 
				case 4:system("cls");sortmenu();break;//排序 
				case 5:system("cls");xiugai();break;//修改 
				case 6:system("cls");searchmenu();break;//查找 
				case 7:system("cls");Price();break;//成绩分析 
				case 8:printf("\n\t\t★★★感谢您的使用,期待下一次相遇★★★\n");exit(0);break;
				default: printf("选项错误!按任意键继续!");
				getch();
				system("cls"); 
		} 
		menu();
		return;
 } 

void password(int j)//用户登录验证
{      // j定义为3次
       int i;
	   char name[10],pw[10],c;
	   printf("请输入用户名:");
	   scanf("%s",name); 
	   printf("请输入密码:");
       while((c=getch())!='\r'){//当输入回车时,结束循环 
       	     pw[i]=c;
       	     i++;
       	     if(c!='\b'){
       	     	    printf("*");//当输入内容不是退格时就显示"*"号 
				}
				else{
					printf("\b \b");//当输入内容是退格时,删除前一个"*"号 
				}
	   }
	   
	   if((strcmp(name,"liuyi")||strcmp(pw,"123"))!=0){
       if(j-1==0)
                {
                    printf("\n\n\n");
                    printf("\t\t\t连续错误三次,登录失败,系统即将关闭!\n\n");
                    exit(0);
                }else{
                	printf("\t\t\t用户名或密码错误,您还有%d次机会重新输入\n\n",--j);         
                    password(j);    	
				}
                
      }
	  else
      {     
	                system("cls");
	                printf("登入成功!\n\n请输入初始化学生个数:");
	                int n;
	                scanf("%d",&n);
	                printf("\n");
	                inputstu(n);//学生信息初始化 
					menu(); 
	  }
}

int main(){
	system("title PTU学生管理系统");
	system("color F4");//设置系统背景色和前景色
	system("mode 100,30");
	welcome(); 
	password(3);
}
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值