利用结构体数组 实现学生信息管理系统(模块化编程)

核心功能(必须实现):

                        新增信息 查询信息 修改信息 删除信息 信息排序

扩展功能:

                        按字符串索引, 插入信息 

提升功能:

                        账号注册 账号登录 

相关代码:

main.c

#include "enroll.h"
#include "app.h"

int main(void)
{
	srand(time(0));	//随机数种子
	while(1)
	{
		char val=menu();
		switch(val)
		{
			
			case '1':
				printf("开始注册:\n");
				enroll();	//注册
				break;
			case '2':
				printf("开始登录:\n");
				if(sign_in())	//登录
				{
					printf("欢迎用户:%d\n",people.zhanghao);
					APP();
				}
				break;
			case '3':
				show();		//查看账户信息
				break;
			case '4':
				destory();	//注销
				break;
			case '5':
				return 0;
			default :
				printf("input err!");
		}
	}
	return 0;
}

enroll.c

#include "enroll.h"

struct zhanghu people;	//定义一个结构体变量,做为1个账户

void enroll(void)	//注册账户、设置密码
{
	while(1)
	{
	UP:	people.zhanghao =rand()%9000+1000;	//随机生成一个4位账号
			printf("账号为:%d\n",people.zhanghao);
			
			int val=0;
			printf("输入:1.确认账号、2.换个账号、3.退出注册\n");
			scanf("%d",&val);
			while(getchar()!='\n');
			if(val==1)
				break;
			else if(val==2)
				goto UP;
			else if(val==3)
				return ;
	}
	
	char mima[2][7];
UP1:	printf("设置密码:\n");
	scanf("%s",mima[0]);
	while(getchar()!='\n');
	if(strlen(mima[0])<6)
	{
		printf("输入密码少于6位,请重新输入!");
		goto UP1;
	}
	
	printf("确认密码:\n");
	scanf("%s",mima[1]);
	while(getchar()!='\n');
	
	if(strcmp(mima[0],mima[1])==0)
    {
        printf("密码设置成功!\n");
        strcpy(people.mima,mima[0]);
    }
    else
    {
        printf("两次密码不相同,请重新输入!!!\n");
        goto UP1;
    }

}

int sign_in(void)
{
	int zhanghao=0;	//账号
	char mima[7]={0};	//6位密码
	int flag=0;
	
	printf("请输入账号:\n");
	scanf("%d",&zhanghao);
	while(getchar()!='\n');
	
	printf("请输入密码:\n");
	char pwd[7]={0};
	int num=1;
	while(num<=3)
	{
		printf("请输入一个6位密码:(输入quit退出此模块)\n");
		scanf("%s",pwd);
		while(getchar()!='\n');
		
		if(strcmp(pwd,"quit")==0)	//检测到quit就退出此功能
			return 0;

		if((zhanghao==people.zhanghao) && strcmp(pwd,people.mima)==0)
			break;
		else
			num++;
		if(num==2)
			printf("密码错误,你还有两次机会!(输入quit退出此模块)\n");
		if(num==3)
			printf("密码错误,你还有一次机会!(输入quit退出此模块)\n");
	}
	if(num>3)
	{
		printf("密码输入超过三次错误,强制推出!!!\n");
		return 0;
	}
	
	printf("登录成功! 下面开始进行学生信息操作!!!\n");
	printf("******************************************************\n");
	
	return 1;	//返回1,则代表登录成功

}
void show(void)
{
	printf("账号为:%d\n",people.zhanghao);
	printf("密码为:%s\n",people.mima);
}
void destory(void)
{
	people.zhanghao=0;
	people.mima[7]=(char)0;
	
	printf("注销成功!\n");
}

char menu(void)	//菜单栏
{
	char val=0;
	printf("1.注册、2.登录、3.查看账户信息、4.注销、5.退出\n");
	scanf("%c",&val);
	while(getchar()!='\n');
	
	return val;
}

enroll.h

#ifndef _ENROLL_H_
#define _ENROLL_H_


#include <stdio.h>	//引用头文件
#include <string.h>
#include <time.h>
#include <stdlib.h>

struct zhanghu
{
	int zhanghao;	//账号
	char mima[7];	//6位密码
};

extern struct zhanghu people;

void enroll(void);	//enroll.c中的函数声明
int sign_in(void);
void show(void);
void destory(void);
char menu(void);	//菜单栏


#endif

app.c

#include "app.h"
//********************************学生信息操作:增、删、查、改、插入、排序*******************************************\\

struct info			//定义学生信息结构体
{
	int id;			//id唯一,加上判断保证id的唯一性,用来进行信息修改及信息删除
	char name[20];
	char sex;
	int old;

}man[3]={0};		//定义结构体数组
struct info *p=man;	//定义结构体数组指针 其中:p=man; p[i]=man[i];

union person{		//定义一个共用体,保存常用的name及id,来节省空间
	char name[20];
	int id;
};
union person stu;	//共用体变量

int num=0;			//记录即将输入学生的人数,用于实现输入、输出等其他功能时的循环 及初始化操作

void input(void)	//新增所有学生的信息
{
	printf("输入你要输入学生信息的人数(<=3)\n");
	scanf("%d",&num);
	while(getchar()!='\n');
	
	if(num>3)		//限定输入学生人数<=结构体数组的个数3
	{
		printf("输入信息已满!!!");
		return ;
	}
	
	for(int i=0;i<num;i++)	//循环遍历所有结构体数组,并进行相应输入限定
	{
		printf("输入第%d个人的 \n学号、姓名、性别(m或f)、年龄:\n",i+1);
		scanf("%d %s %c %d",&(p+i)->id,(p+i)->name,&(p+i)->sex,&(p+i)->old);
		while(getchar()!='\n');
		
		while( ((p+i)->id==(p+i-1)->id) || (p[2].id==p[0].id))	//判断输入id是否重复   (p+i)->id为当前id;(p+i-1)->id为前一个输入的id;p[2].id为最后一个输入的id
		{														//判断最后一个输入的id 与第一个输入的id以及第二个id是否重复
			printf("录入学生id重复!请重新输入该学生信息!\n");
			printf("下面重新输入这个人的: 学号、姓名、性别(m或f)、年龄:\n");
			scanf("%d %s %c %d",&(p+i)->id,(p+i)->name,&(p+i)->sex,&(p+i)->old);
			while(getchar()!='\n');
		}
		while(((p+i)->sex!='m') && ((p+i)->sex!='f'))			//限定输入的性别为字符‘m’或‘f’之中的一个,否则就一直死循环,直到输入正确
		{
			printf("录入学生sex错误!请重新输入该学生信息!\n");
			printf("下面重新输入这个人的: 学号、姓名、性别(m或f)、年龄:\n");
			scanf("%d %s %c %d",&(p+i)->id,(p+i)->name,&(p+i)->sex,&(p+i)->old);
			while(getchar()!='\n');
		}
			
	}
}
void output(void)	//输出所有学生的信息
{
	if(num<=0)
	{
		printf("暂无信息!!!\n");
		return ;
	}
	
	printf("//************************学生信息********************************\\\n");
	printf("%s\t%s\t%s\t%s\n","学号","姓名","性别","年龄");
	for(int i=0;i<num;i++)
	{
		printf("%d\t%s\t%c\t%d\n",(p+i)->id,(p+i)->name,(p+i)->sex,(p+i)->old);
	}
	printf("//*************************end**********************************\\\n");
}
int search(void)	//根据条件查询信息
{
	char val=0;
	printf("输入你要查询的条件:1.姓名、2.学号、3.退出\n");
	scanf("%c",&val);
	while(getchar()!='\n');

	switch(val)
	{
		case '1':
	UP2:	printf("请输入姓名:\n");
			scanf("%s",stu.name);
			while(getchar()!='\n');
			
			int flag1=0;
			int j1=0;
			for(int i=0;i<num;i++)
			{
				if((strcmp(stu.name,(p+i)->name)==0))	//遍历所有结构体数组的信息,发现相等name就把整个数组的信息输出
				{	
					printf("%d\t%s\t%c\t%d\n",(p+i)->id,(p+i)->name,(p+i)->sex,(p+i)->old);
					j1++;
					flag1=i;
				}
				if(i==num-1 && j1==0)
				{
					int val=0;
					printf("查询无果!1.开始重新输入;其它任意建退出:\n");
					scanf("%d",&val);
					while(getchar()!='\n');
					if(val==1)
						goto UP2;
					else
						break;
				}
			}
			return flag1;
		case '2':
	UP3:	printf("请输入学号:\n");
			scanf("%d",&stu.id);
			while(getchar()!='\n');
			
			int flag2=0;
			int j2=0;
			for(int i=0;i<num;i++)
			{
				if(stu.id==(p+i)->id)
				{
					printf("%d\t%s\t%c\t%d\n",(p+i)->id,(p+i)->name,(p+i)->sex,(p+i)->old);
					j2++;
					flag2=i;
				}
				if(i==num-1 && j2==0)
				{
					int val=0;
					printf("查询无果!1.开始重新输入;其它任意建退出:\n");
					scanf("%d",&val);
					while(getchar()!='\n');
					if(val==1)
						goto UP3;
					else
						break;
				}
			}
			return flag2;	
		case '3':
			return 0;
		default:
				printf("input err\n");
				break;
	}

}

void revise(void)	//信息修改
{
	int i=search();
	
	printf("下面重新输入这个人的: 学号、姓名、性别(m或f)、年龄:\n");
	scanf("%d %s %c %d",&(p+i)->id,(p+i)->name,&(p+i)->sex,&(p+i)->old);	//重新在该位置输入信息,将原信息覆盖
	while(getchar()!='\n');
	
	printf("下面输出所有学生的信息:\n");
	output();
}
void delete(void)				//删除指定学生的信息
{
	search();
	for(int i=0;i<num;i++)		//循环遍历所有每个结构体数组
	{
		if((stu.id==(p+i)->id) || (strcmp(stu.name,(p+i)->name)==0))				//检测到有相等的id号或者姓名,将指定的信息删除
		{
			for(;i<num;i++)		//从i到num开始循环遍历,让后面每个结构体数组的所有值向前移动1个
			{	
				p[i]=p[i+1];
			}
			num--;				//运行一次if()语句就让学生总数num-1
		}
	}
	printf("下面输出所有学生的信息:\n");
	output();
}
void sort(void)	//信息排序(从小到大)
{
	char val=0;
	printf("输入你要排序(从小到大)的条件:0.学号、1.年龄、2.退出\n");	//让数组分别按照 id以及old进行排序
	scanf("%c",&val);
	while(getchar()!='\n');

	switch(val)
	{	
		case '0':
			for(int j=0;j<num-1;j++)
			{
				for(int i=0;i<num-j-1;i++)
				{
					if((p+i)->id>(p+i+1)->id)
					{						//重新定义一个新的结构体变量,用来作为中间变量,进行结构体数组之间的交换;man[0]、man[1]、man[2]
						struct info q=p[i];	//q=man[i]当前结构体数组
						p[i]=p[i+1];		//man[i]=man[i+1]
						p[i+1]=q;			//man[i+1]=man[i]
					}
				}
				
			}
			printf("下面输出所有学生的信息:\n");
			output();
			break;	
			
		case '1':
			for(int j=0;j<num-1;j++)
			{
				for(int i=0;i<num-j-1;i++)
				{
					if((p+i)->old>(p+i+1)->old)
					{
						struct info q=p[i];
						p[i]=p[i+1];
						p[i+1]=q;
					}
				}
				
			}
			printf("下面输出所有学生的信息:\n");
			output();
			break;	
			
		case '2':
			return ;
		default:
				printf("input err\n");
				break;
	}
}

void reset(void)	//初始化
{
	num=0;
	printf("初始化成功!!!\n");
}
void insert(void)	//按字符串索引,插入信息       //(有点问题没有解决)
{
	int m=0,n=0;
	int number=num;	//暂时存放num的值,防止数组个数改变
	char val=0;
	printf("输入:1.在两者之间插入信息、2.在某个位置插入信息\n");
	scanf("%c",&val);
	while(getchar()!='\n');
	
	switch(val)
	{
		case '1':
			printf("输入你想要在哪两个索引中间插入信息(0&1、1&2、2&3):\n");
			scanf("%d %d",&m,&n);
			while(getchar()!='\n');
			
			for(int i=n;i>m;i--)
			{
				p[i+1]=p[i];	//数据后移
			}
			num=number;	//将存放的num的值,返还给它
			printf("请输入索引:%d与%d之间需要插入学生的信息:\n",m,n);
			break;
		case '2':
			printf("输入你想要在个索引(0、1、2):\n");
			scanf("%d",&n);
			while(getchar()!='\n');
			
			for(int i=n;i<number;i++)
			{
				p[i+1]=p[i];	//数据后移
			}
			num=number;	//将存放的num的值,返还给它
			num++;	//插入一个数据,学生个数加1
			printf("请输入索引:%d需要插入学生的信息:\n",n);
			break;
		default:
				printf("input err\n");
				break;
	
	}
	
	printf("下面输入这个人的: 学号、姓名、性别(m或f)、年龄:\n");
	scanf("%d %s %c %d",&(p+n)->id,(p+n)->name,&(p+n)->sex,&(p+n)->old);
	while(getchar()!='\n');
	
	printf("下面输出所有学生的信息:\n");
	output();
}

void APP(void)
{
	
	while(1)
	{
		char val=0;
		//system ("clear");	//清屏让每次功能选择都在第一行
		printf("输入:   0.返回上一级、1.录入信息、2.查询信息、3.修改信息 4.删除信息\n\t5.信息排序、6.输出信息、7.初始化、8.插入信息\n");
		scanf("%c",&val);
		while(getchar()!='\n');
		
		switch(val)
		{
			case '0':
				return ;	//返回上一级
			case '1':
				input();	//信息输入
				break;
			case '2':
				search();	//信息查询
				break;
			case '3':
				revise();	//修改信息
				break;
			case '4':
				delete();	//删除信息
				break;
			case '5':
				sort();		//信息排序
				break;
			case '6':
				output();	//总信息输出
				break;
			case '7':
				reset();	//初始化
				break;
			case '8':
				insert();	//插入信息
				break;
			default:
				printf("input err\n");
				break;
		}
	}
}

app.h

#ifndef _APP_H_
#define _APP_H_

#include <stdio.h>
#include <string.h>


void input(void);
void output(void);
int search(void);
void revise(void);
void delete(void);
void sort(void);	//信息排序(从小到大)
void reset(void);	//初始化
void insert(void);
void APP(void);


#endif

运行结果展示:

用户注册和登录:

结构体数组功能:

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值