简易的学生信息管理系统制作——C语言实现

时间:2024-11-16 08:40:57

菜单代码

#include "head.h"
int main(int argc, const char *argv[])
{
	int ch,k;
	//登录注册
	while(1)
	{
		printf("\t1、注册\n");
		printf("\t2、登录\n");
		printf("\t0、退出\n");
		
		printf("请输入你的选择:");
		scanf("%d",&ch);
		getchar();
		switch(ch)
		{
			case 1:
				{
					regist();//注册函数
				}
				break;
			case 2:
				{
					k = login();//登录函数
				}
				break;
			case 0:
				{
					exit(EXIT_SUCCESS);//退出函数
				}
				break;
		}
		if(k == 1)
		{
			break;
		}
	}
	while(1)
	{
		printf("\t------学生管理系统首页------\n");
		printf("\t1、录入学生信息\n");
		printf("\t2、输出学生信息\n");
		printf("\t3、任意位置删除学生信息\n");
		printf("\t4、任意位置插入学生信息\n");
		printf("\t5、任意位置修改学生信息\n");
		printf("\t6、任意位置查找学生信息\n");
		printf("\t7、表头插入一个学生信息\n");
		printf("\t8、表尾插入一个学生信息\n");
		printf("\t9、按照姓名查找学生信息并删除\n");
		printf("\t10、按年龄查找学生并修改学号为10086\n");
		printf("\t0、退出\n");

		printf("请输入你的选择:");
		scanf("%d",&ch);
		
		Plink L;
		switch(ch)
		{
		case 1:
			{
				L = create();
				input_link(L);
			}
			break;
		case 2:
			{
				output_link(L);
			}
			break;
		case 3:
			{
				int pos;
				printf("请输入需要删除的学生位置:");
				scanf("%d",&pos);
				del_pos(L,pos);
			}
			break;
		case 4:
			{
				insert_pos(L);
			}
			break;
		case 5:
			{
				int pos;
				printf("请输入需要修改的学生位置:");
				scanf("%d",&pos);
				edit_pos(L,pos);
			}
			break;
		case 6:
			{
				int pos;
				printf("请输入需要查找的学生位置:");
				scanf("%d",&pos);
				find_pos(L,pos);
			}
			break;
		case 7:
			{
				stu e;
				printf("表头插入一个学生信息\n");
				printf("请输入需要插入学生的信息:");
				scanf("%d%s%d",&e.id,e.name,&e.age);
				insert_front(L,e);
			}
			break;
		case 8:
			{
				stu e;
				printf("表尾插入一个学生信息\n");
				printf("请输入需要插入学生的信息:");
				scanf("%d%s%d",&e.id,e.name,&e.age);
				insert_rear(L,e);
			}
			break;
		case 9:
			{
				int fage;
				printf("请输入需要查找的年龄:");
				scanf("%d",&fage);
				find_age(L,fage);
			}
			break;
		case 10:
			{
				int fage;
				printf("请输入需要查找的年龄:");
				scanf("%d",&fage);
				find_age_id(L,fage);
			}
			break;
		case 0:
			{
				exit(EXIT_SUCCESS);
			}
			break;
		}
	}
	return 0;
}

功能函数代码

#include "head.h"
//登录注册部分函数
int regist()
{
	char regist_name[20];//注册登录用户名
	char regist_code[20];//注册密码
	
	printf("请输入注册用户名和密码:");
	fgets(regist_name,sizeof(regist_name),stdin);
	//scanf("%s",regist_name);
	fgets(regist_code,sizeof(regist_code),stdin);
	//scanf("%s",regist_code);
	
	regist_name[strlen(regist_name)-1] = '\0';
	regist_code[strlen(regist_code)-1] = '\0';
 	//将数据写入用户数据文件
	FILE *fp1;
	fp1 = fopen("./user_data.txt","a");
	if(fp1 == NULL)
	{
		perror("fp1");
		return -1;
	}
	fprintf(fp1,"%s %s ",regist_name,regist_code);
	printf("注册成功!\n");
	fclose(fp1);
	return 0;
}

int login()
{
	char regist_name[20];
	char regist_code[20];
	char login_name[20];
	char login_code[20];
	int login_max = 5;
	for(int i=0;i<login_max;i++)
	{
		printf("这是你第%d次输入,你还有%d次输入机会\n",i+1,login_max-i);
		printf("请输入用户名和密码:");
		fgets(login_name,sizeof(login_name),stdin);
		fgets(login_code,sizeof(login_code),stdin);


		login_name[strlen(login_name)-1] = '\0';
		login_code[strlen(login_code)-1] = '\0';

		FILE *fp2;
		fp2 = fopen("./user_data.txt","r");
		if(fp2 == NULL)
		{
			perror("fp2");
			return -1;
		}
		int flag = 0;
		while(1)
		{
			//从用户数据文件夹提取数据
			int ret = fscanf(fp2,"%s %s",regist_name,regist_code);
			//读取到文件末尾
			if(ret < 0)
			{
				break;
			}
			if(strcmp(regist_name,login_name)==0&&strcmp(regist_code,login_code)==0)
			{
				flag = 1;
				printf("登录成功!\n");
				return 1;
			}
		}
		if(flag == 0)
		{
			printf("登录失败!\n");
		}
		fclose(fp2);
	}
	printf("输入次数已用尽,系统锁定\n");
	while(1);
return 0;
}


//管理学生信息部分函数

//空间申请函数
Plink apply()
{
	Plink p = malloc(sizeof(Link));
	if(p == NULL)
	{
		printf("申请失败\n");
		return NULL;
	}
	return p;
}
//创建链表函数
Plink create()
{
	Plink p = apply();
	if(p == NULL)
	{
		printf("创建失败!\n");
		return NULL;
	}
	p->len = 0;
	p->next = NULL;
	return p;
}

//头插法创建
void insert_front(Plink L,stu e)
{
	if(L == NULL)
	{
		printf("插入失败!\n");
		return;
	}
	Plink p = apply();
	if(NULL == p)
	{
		printf("申请正常节点失败!\n");
	}
	p->data = e;
	p->next = L->next;
	L->next = p;
	L->len++;
	
}

//信息输入函数
void input_link(Plink L)
{
	stu e;
	int n,i;
	printf("请输入学生数量:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("请输入学生信息:");
		scanf("%d%s%d",&e.id,e.name,&e.age);
		insert_front(L,e);
	}
}

//信息输出函数
void output_link(Plink L)
{
	if(L == NULL)
	{
		printf("输出失败!\n");
		return;
	}
	Plink t = L->next;
	while(t != NULL)
	{
		printf("学号:%d\t姓名:%s\t年龄:%d\n",t->data.id,t->data.name,t->data.age);
		t = t->next;
	}
}

//任意位置删除学生信息

void del_pos(Plink L,int pos)
{
	
	if(pos<1||pos>L->len||L == NULL||L->len ==0)
	{
		printf("删除失败!\n");
		return;
	}
	Plink t = L;
	int i;
	for(i=0;i<pos-1;i++)
	{
		t = t->next;
	}
	Plink Q = t->next;
	t->next = Q->next;
	free(Q);
	Q = NULL;
	L->len--;;
	
}


//任意位置插入学生信息
void insert_pos(Plink L)
{
	int pos,i;
	stu e;
	printf("请输入需要插入信息的位置:");
	scanf("%d",&pos);

	if(pos<1||pos>L->len+1)
	{
		printf("插入失败!\n");
		return;
	}
	
	Plink t = L;
	for(i=0;i<pos-1;i++)
	{
		t = t->next;
	}

	Plink p = apply();

	printf("请输入需要插入的学生信息:");
	scanf("%d%s%d",&e.id,e.name,&e.age);
	p->data = e;

	p->next = t->next;
	t->next = p;
	L->len++;
}

//任意位置查找学生信息
void find_pos(Plink L,int pos)
{
	Plink t = L;
	if(pos<1||pos>L->len||L->len == 0||L == NULL)
	{
		printf("查找失败!\n");
		return;
	}
	for(int i=0;i<pos;i++)
	{
		t = t->next;
	}
	printf("第%d位学生的信息:学号:%d姓名:%s年龄:%d\n",pos,t->data.id,t->data.name,t->data.age);
}

//任意位置修改学生信息
void edit_pos(Plink L,int pos)
{
	Plink t = L;
	if(pos<1||pos>L->len||L == NULL||L->len == 0)
	{
		printf("修改失败!\n");
		return;
	}
	for(int i=0;i<pos;i++)
	{
		t=t->next;
	}
	stu e;
	printf("请输入需要修改的学生信息:");
	scanf("%d%s%d",&e.id,e.name,&e.age);
	t->data = e;
}

//表头插入一个学生(头插法插入一个学生)直接调用头插法


//表尾插入一个学生信息
void insert_rear(Plink L,stu e)
{
	Plink t = L;
	if(L == NULL)
	{
		printf("插入失败\n");
		return;
	}
	for(int i=0;i<L->len;i++)
	{
		t= t->next;
	}
	Plink p = apply();
	p->data = e;
	p->next = NULL;
	t->next = p;
	L->len++;
}

//按年龄查找学生信息
void find_age(Plink L,int fage)
{
	int pos=1;
	Plink t = L->next;
	while(t != NULL)
	{
		if(t->data.age == fage)
		{
			printf("%d年龄的学生有:学号:%d姓名:%s年龄:%d\n",fage,t->data.id,t->data.name,t->data.age);
			printf("该年龄的学生位置为:%d\n",pos);
			Plink Q = t->next;
			del_pos(L,pos);
			t = Q;
			printf("删除成功!\n");
		}
		else
		{
			pos = pos+1;
			t = t->next;
		}
	}

}

//按年龄查找学生信息,修改学号为10086
void find_age_id(Plink L,int fage)
{
	Plink t = L->next;
	while(t != NULL)
	{
		if(t->data.age == fage)
		{
			printf("将%d年龄的学生学号修改为10086\n",fage);
			t->data.id = 10086;
			t=t->next;
		}
		else
		{
			t= t->next;
		}
	}
}

头文件代码

#ifndef _HEAD_H_
#define _HEAD_H_
#include <myhead.h>
#define MAX 30


typedef struct students
{
	int id;
	char name[20];
	int age;
}stu;

typedef struct node
{
	union
	{
		int len;
		stu data;
	};
	struct node *next; 
}Link,*Plink;

int regist();

int login();

Plink apply();

Plink create();

void insert_front(Plink,stu);

void input_link(Plink);

void output_link(Plink);

void del_pos(Plink,int);

void insert_pos(Plink);

void find_pos(Plink,int);

void edit_pos(Plink,int);

void insert_rear(Plink,stu);

void find_age(Plink,int);

void find_age_id(Plink,int);
#endif

相关文章