核心功能(必须实现):
新增信息 查询信息 修改信息 删除信息 信息排序
扩展功能:
按字符串索引, 插入信息
提升功能:
账号注册 账号登录
相关代码:
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