大一新生,学生管理系统

大一新手,给大家借鉴一下。呜呜,求个点赞和关注。

/* 
1。界面
2.数据结构设计
3。交互
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

//结构体保存管理员信息 
struct guanli
 {
 	char gname[15];
 	char gid[15];
 	char tel[10];
 };
 //结构体保存学生信息 
struct student
{
	char id[15]; 
	char name[10];
    char specialty[10];
	char sex[5];
};

//结点 
struct Node
{
	struct student date;
	struct Node *next;
};

//创建头结点 
struct Node *createList() 
{
	struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
	headNode->next = NULL;
	return headNode;
}

//创建结点 
struct Node *createNode(struct student date) 
{
	struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
	newNode->date = date;
	newNode->next = NULL;
	return newNode;
}

//不同功能使用函数完成

//插入结点 
//1录入学生信息 
void insertNodeByHead(struct Node *headNode, struct student date)
{
	struct Node *newNode = createNode(date);
	newNode->next = headNode->next;
	headNode->next = newNode;
}

//2打印全部学生信息 
void printList(struct Node *headNode)
{
	struct Node *pMove = headNode->next;
	printf("学号\t\t姓名\t专业\t性别\n");
	 while(pMove)
	 {
	 	printf("%s\t%s\t%s\t%s\n",pMove->date.id,pMove->date.name,
		 pMove->date.specialty,pMove->date.sex);
	 	pMove = pMove->next;
	} 
	printf("\n"); 
}

//3根据学号搜索学生信息 
struct Node *searchInfoByDate(struct Node *headNode, char *id)
{
	struct Node *pMove = headNode->next;
	while(pMove != NULL)
	{
		if(strcmp(pMove->date.id,id) == 0)
		{
			return pMove;
		}
		else
		{
			pMove = pMove->next;
		}
	}
	return pMove;
}

//4根据学号修改学生信息 
struct Node *amend(struct Node *headNode,char *id)
{

	struct Node *pMove = headNode->next;
	while( pMove != NULL)
	{
		if(strcmp(pMove->date.id,id)==0) 
		break; 
	    else
	    pMove = pMove->next;
	}
	if(pMove!=NULL)
	{
		printf("请输入修改后的信息:\n");
	    printf("请输入学生信息:\n学号\t\t姓名\t专业\t性别:\n");
		fflush(stdin);
		scanf("%s %s %s %s",pMove->date.id,pMove->date.name,
		 pMove->date.specialty,pMove->date.sex);
	}
	else
	{
		printf("没有找到该学生信息!请重新输入!\n");
	}
}

//5根据学号指定删除学生信息
void deleteNode(struct Node *headNode, char *id) 
{
	struct Node *posNode = headNode->next;
	struct Node *posFrontNode = headNode;
	if(posNode == NULL)
	{
		printf("数据为空,无法删除!\n");
		return ;
	}
	while(strcmp(posNode->date.id,id) != 0)
	{
		posFrontNode = posNode;
		posNode = posNode->next;
		if(posNode == NULL)
		{
			printf("没有该名学生,请重新输入!\n");
			return ;
		}
    }
	posFrontNode->next = posNode->next;
	printf("该名学生信息已经被删除!");
	free(posNode);
}

//5删除全部学生信息 
int deleteall(struct Node *headNode) 
{
	printf("你确定需要删除全部学生信息吗?确定请输入1返回请输入0\n"); 
	int q;
	scanf("%d",&q);
	if(q)
	{
	struct Node *posNode = headNode->next;
	while(posNode)
	{
			posNode = posNode->next;
	}
	headNode->next = posNode;
	printf("已经删除全部学生信息!"); 
    } 
    
}

//6按照专业进行分类 
void fenlei(struct Node *headNode,char *specialty)
{
    struct Node *pMove = headNode->next;
    printf("学号\t\t姓名\t专业\t性别\n");
    int k = 1;
	while(pMove)
	{
		if(strcmp(pMove->date.specialty,specialty) == 0)
		{
			printf("%s\t%s\t%s\t%s\n",pMove->date.id,pMove->date.name,
		    pMove->date.specialty,pMove->date.sex);
		    k = 0;
		}
		pMove = pMove->next;
	}
	if(k == 1)
		{
			printf("系统里没有储存该专业学生信息。\n");
		} 
}

//7按照性别进行分类
void fenleibysex(struct Node *headNode,char *sex)
{
    struct Node *pMove = headNode->next;
    printf("学号\t\t姓名\t专业\t性别\n");
    int k = 1;
	while(pMove)
	{
		if(strcmp(pMove->date.sex,sex) == 0)
		{
			printf("%s\t%s\t%s\t%s\n",pMove->date.id,pMove->date.name,
		    pMove->date.specialty,pMove->date.sex);
		    k = 0;
		}
		pMove = pMove->next;
	}
	if(k)
	{
		printf("系统里没有储存该性别学生信息。\n");
	}
}

//8按照学号从小到大排序 
void BubbleSortByName(struct Node *headNode)
{
	
	for (struct Node* p = headNode->next; p != NULL; p = p->next)
	{
		for (struct Node* q = headNode->next; q->next != NULL; q = q->next)
		{
			if (strcmp(q->date.id, q->next->date.id)>0)
			{
				struct student tempData = q->date;
				q->date = q->next->date;
				q->next->date = tempData;
			}
		}
	}
	printList(headNode);
}

//输入密码登陆 
int password()
{
	char gname[]={"辜果"};
	char gid[]={"202031061014"};
	char name[10];
	char id[20];
	struct guanli number[10];
	FILE* fp = fopen("E:\\管理.txt", "r");  
	if (fp == NULL) 
	{	
		fp = fopen("E:\\管理.txt", "w+");
	}
	int i = 0;
	while (fscanf(fp, "%s %s\n", number[i].gname,number[i].gid) != EOF)
	{
		i++;
	}
	fclose(fp);
	int n = 3;
	while(n)
	{
		printf("您还有%d次机会登陆\n",n);
		printf("请输入姓名和密码值!(备注:初始姓名和密码是最帅气的那一位)\n");
		scanf("%s %s",name,id);
		if((strcmp(gname,name)==0)&&(strcmp(gid,id)==0))
		{
			printf("登陆成功!加油奥力给!\n");
	        return 1;		
		}
		int k = 0;
		while(k<i)
		{
		 	if((strcmp(number[k].gname,name)==0)&&(strcmp(number[k].gid,id)==0))
		 	{
		 		printf("登陆成功!加油奥力给!\n");
		 		return 1;
		    }
		    else
		 	k++;
		}
		n--;
	}
	if(n == 0)
	printf("密码错误三次!正常退出系统!");
	exit(0);
}

//注册管理员信息 
int sign_in ()
{
	char gname[]={"辜果"};
	char gid[]={"202031061014"};
	char name[10];
	char id[20];
	struct guanli number;
	struct guanli tnumber[10];
    FILE *fp = fopen("E:\\管理.txt","r");
	if(fp == NULL)
	{
		fp = fopen("E:\\管理.txt","w+");
	}
	int i = 0;
	while (fscanf(fp, "%s %s %s\n", tnumber[i].gname,tnumber[i].gid,tnumber[i].tel) != EOF)
	{
		i++;
	}
	fclose(fp);
	fp = fopen("E:\\管理.txt", "a");
	printf("最多可以新添10位管理员信息。(现在已新添%d名管理)\n",i); 
	printf("请输入初始姓名和密码!\n");
	scanf("%s %s",name,id);
	if((strcmp(gname,name)==0)&&(strcmp(gid,id)==0)) 
	{
		printf("输入需要注册的姓名密码和号码:\n");
		scanf("%s %s %s",number.gname,number.gid,number.tel); 
		fprintf(fp,"%s %s %s\n",number.gname,number.gid,number.tel);
		fclose(fp);
		printf("注册完成!重新登陆!\n");
		return -1;
    }
    else
    {
      	printf("初始密码错误!请重新输入!");
      	return -1;
	}
}

//管理员信息查看
void information()
{
	struct guanli number[10];
	FILE* fp = fopen("E:\\管理.txt", "r");  
	if (fp == NULL) 
	{	
		fp = fopen("E:\\管理.txt", "w+");
	}
	int i = 0;
	while (fscanf(fp, "%s %s %s\n", number[i].gname,number[i].gid,number[i].tel) != EOF)
	{
		i++;
	}
	i--;
	fclose(fp);
	while(i>=0)
	{
		printf("%s %s\n",number[i].gname,number[i].tel);
		i--;
	}
} 

//管理员登陆界面 
int  login()
{
	
	printf("\t\t\t\t\t╭╮ __\|/__╭╮\n");
	printf("\t\t\t\t\t│   ~│       |\n");
	printf("\t\t\t\t\t│ ≥ ╭———╮ ≤│    \n");
	printf("\t\t\t\t\t│//  │0 0  │//│\n ");
	printf("\t\t\t\t\t│    ╰—— —    │\n");
	printf("\t\t\t\t\t╰——┬O————┬—O╯\n");
	printf("\t\t\t\t\t●│    │ \n");
	printf("\t\t\t\t\t╰│  O  │ \n");
	printf("\t\t\t\t\t╰||-||╯\n");
	printf("\n\n"); 
	printf("\t\t\t-------------亲爱的管理员你好啊m( =. ω.= )m-----------\n"); 
	printf("\n"); 
	printf("\t\t\t--------------   今天也要元气满满哟    ---------------\n"); 
	printf("\n");
	printf("\n");
	printf("\t\t\t\t\t 管理登陆请输入(1)\n\t\t\t\t\t 管理注册请输入(2)\n\t\t\t\t\t 任意输入其他值退出\n");
	int i;
	scanf("%d",&i);
	if(i == 1)
	{	
	    password();
	}
	else if(i == 2)
	{
	    sign_in();
	}
	else
	{
		printf("正常退出!"); 
		exit(0);
	}
		
}

	
//界面 
void menu()
{
	printf("            ☆☆☆  ∧_∧  ☆☆ ☆\n");
	
	printf("---------------{学生管理系统}-----------\n\n");
	printf("                 0.退出系统             \n\n");
	printf("                 1.录入信息             \n\n");
	printf("                 2.浏览信息             \n\n");
	printf("                 3.查找信息             \n\n");
	printf("                 4.修改信息             \n\n");
	printf("                 5.删除信息             \n\n");
	printf("                 6.按照专业分类         \n\n");
	printf("                 7.按照性别分类         \n\n");
	printf("                 8.按照学号排序从小到大 \n\n");
    printf("                 9.查看管理员信息       \n\n");
    printf("         每次进行一次输入后使用空格隔开\n");
	printf("---------------{学生管理系统}-----------\n");
	
}

//创建一个头结点,便于后面操作 
struct Node *list = createList(); 
//链表与文件的读入信息和读出信息 
//文件写操作 
void saveInfoToFile(const char* fileName, struct Node* headNode) 
{
	FILE *fp = fopen(fileName, "w");
	struct Node* pMove = headNode->next;
	while (pMove != NULL) 
	{
		fprintf(fp, "%s\t%s\t%s\t%s\n", pMove->date.id, pMove->date.name, 
		pMove->date.specialty,pMove->date.sex);
		pMove = pMove->next;
	}
	fclose(fp);
}

//文件读操作
void readInfoFromFile(const char* fileName, struct Node* headNode) 
{
	FILE* fp = fopen(fileName, "r");  //第一次打开文件肯定不存在
	if (fp == NULL) 
	{	
		fp = fopen(fileName, "w+");//不存在就创建出来这个文件
	}
	struct student tempData;
	while (fscanf(fp, "%s\t%s\t%s\t%s\n", tempData.id,tempData.name,
	 tempData.specialty,tempData.sex) != EOF) 
	{
		insertNodeByHead(list, tempData);
	}
	fclose(fp);
}

//根据菜单项,做相应的事情
void keyDown()
{
	
	int choice ;
	struct student date;
	struct Node *pMove = NULL;
	scanf("%d",&choice);
	switch(choice)
	{
		
		case 0:
			system("color 75");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("正常退出!\n");
			system("pause");
			exit(0);
		break;
		
		case 1:
			system("color 72");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("----------录入信息---------\n"); 
		    printf("请输入需要添加信息的学生人数:");
            int n;
            scanf("%d",&n);
            printf("\n");
            printf("请输入学生信息:\n学号\t\t姓名\t专业\t性别:\n");
            
            for(int i = 1;i<=n;i++)
           {
	            fflush(stdin);
	            scanf("%s%s%s%s",date.id,date.name,
		        date.specialty,date.sex);
	            insertNodeByHead(list,date);
	            saveInfoToFile("student.txt", list);
            }
	    break;
	    
		case 2:
			system("color 74");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("----------浏览信息---------\n");
			printf("浏览学生信息:\n");
			printList(list);
		break;
		
		case 3:
			system("color 73");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("----------查找信息---------\n");
			printf("请输入需要查找的的学生学号:\n");
			scanf("%s",date.id);
			pMove = searchInfoByDate(list,date.id);
			if(pMove==NULL) 
			{
				printf("未找到该学生\n");
				//system("pause");
			}
			else
			{
				printf("学号\t\t姓名\t专业\t性别:\n");
				printf("%s\t%s\t%s\t%s\n",pMove->date.id,pMove->date.name,
		 pMove->date.specialty,pMove->date.sex);
			}
		break;
		
		case 4:
			system("color 7A");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("----------修改信息---------\n");
			printf("请输入需要修改的学生学号:\n");
			scanf("%s",date.id);
			amend(list,date.id);
		    saveInfoToFile("student.txt", list);
		break;
		
		case 5:
			system("color 74");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("----------删除信息---------\n");
			printf("\t1.指定删除 。   \t2.全部删除。");
			printf("\n");
            int j;
            scanf("%d",&j);
            if(j == 1)
            {
	        printf("请输入需要删除的学生学号:\n");
			scanf("%s",date.id);
			deleteNode(list,date.id);
	        saveInfoToFile("student.txt", list);
           } 
            else if(j == 2)
          {
	         deleteall(list);
	         saveInfoToFile("student.txt", list);
          }
           else
          {
	      printf("你输错了,请重新输入!"); 
          } 
		break;
		
		case 6:
			system("color 79");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
		    printf("请输入需要查看的专业:");
			scanf("%s",date.specialty);
			fenlei(list,date.specialty);
		break;
		 
		case 7:
			system("color 79");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
		    printf("请输入需要查看的性别:");
			scanf("%s",date.sex);
			fenleibysex(list,date.sex);
		break;
		
		case 8:
			system("color 76");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("按照学号排序:\n");
			BubbleSortByName(list);
		break;
		
		case 9:
		    system("color 7");
			printf("☆☆☆  ∧_∧  ☆☆ ☆\n");
			printf("查看管理员信息:\n");
			information(); 
			printf("遇到困难可以联系以上管理员!");
			break;
			
		default:
			printf("输入错误,请重新输入!\n");
		break;
	} 
 } 

//主函数 
int main()
{
	system("color 30");
	readInfoFromFile("student.txt", list);
	
		while(1)
		{
	        int k = login(); 
			while(k == 1)
			{
			system("pause");
		    system("cls"); 
			    while(1)
			    {
				printf("\## 标题t请进行你的操作!(只能输入0-8哟)\n"); 
				menu();
				keyDown();
				system("pause");
				system("cls"); 
			    }
		    }
		    system("pause");
			system("cls"); 
  	   }
   
}
学生管理系统(用C++实现) 1.2.2 各项功能说明 (1)学生基本信息的录入和保存: 这部分的功能主要包括信息的录入和保存和总分、平均分的计算,首先按程序提示输入所要输入的学生人数,接着是分别输入有关学生的相关信息包括学号、姓名、性别以及学生各科成绩的分数等。在录入数据的同时,系统将对信息的合法性进行检验(学号范围为1001~1020、姓名在7个字节之内、性别只能输入m(男male)或f(女fmale)、各科成绩均限定在0~100之间),若用户录入了不合法的数据系统将会作出提示,并且要求重新输入。如果合法性成立则录入完毕后系统将显示全部学生相关信息,信息中已包含对学生成绩总分的计算和其平均分的计算结果。最后输出学生的信息表,与是否保存提示,选择存盘后,系统则自动将学生信息存入(list.dat)电脑。 (2)读取学生信息: 此功能是将原录入并保存的的学生信息读出,并在屏幕上显示出来。 (3)删除学生信息: 进入该项功能界面后,用户可以通过学生的姓名对谋个学生信息进行删除。 (4)追加学生信息: 进入插入界面,系统将提示输入新学生的相关信息,程序则会将新的信息插入原学生信息清单中,并将新的学生信息列表输出,以方便用户的确认。 (5)按学号查找学生信息: 此项功能可以根据拥护输入的学生学号查出该学生的所有信息。 (6)按照平均分输出学生信息清单。 选择次项功能后,系统将自动在屏幕上显示出所有学生按照平均成绩的高低排序后的清单。 (7)退出系统,结束任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值