#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
//以上为包含的头文件
#define N 100 //宏定义
struct user//定义一个用户的结构体
{
//以下为用户的不同数据类型
int user_id;
char user_name[19];//最大18位
char password[13];//最大13位
char like[255];
char sign[255];
};
struct student//定义一个学生的结构体
{
//以下为学生的不同数据类型
int num;
char name[20];
char clas[20];
char courseno[20];
float score[3];
float avg;
};
int i=0;//全局变量 统计个数
//以下为进入系统的函数定义
int length_password(char *p);
int valid_user_name(char *p);
int is_username_valid(char *p);
int length_password(char *p);
int is_password_valid(char *p);
int two_password_valid(char *p1,char*p2);
int user_register(struct user *ptr_user,int size);
int is_my_user(struct user *p,int size);
void display_user(struct user u);
void update_password(struct user *ptr_user,int size);
//以下为学生信息处理的函数定义
void input(struct student a[] ); //录入函数
void rank(struct student a[]); //排序函数
void insert(struct student a[]); //插入函数
void del(struct student a[]); //删除函数
void display(struct student a[]);//显示函数
void search(struct student a[]);//查询函数
int main()
{
struct user our_users[N];//定义一个 our_users[N]的结构体变量
int count = 0;
int current_user;
struct student stu[50];//定义一个 stu[50]的结构体变量
int number;//接收选择分支的变量
do
{
printf("\n\t\t\t学员成绩管理之共同进步,只为开源\n\n");
printf("\n*****************************************************************************\n");
printf("\n\n请选择功能\n0.退出\n1.注册\n2.登陆\n3.修改密码\n4.录入\n5.显示\n6.排序\n7.插入\n8.删除\n9.查询\n\n------------------\n");
printf("\n请选择0-9\n");
scanf("%d",&number);
printf("\n------------------\n\n");
switch (number)
{
case 1:
if(user_register(our_users,count))
{
count++;
printf("\n注册成功!");
}
break;
//注册
case 2:
if((current_user = is_my_user(our_users,count)))
{
printf("\n登陆成功!");
display_user(our_users[current_user - 1]);
}
else
printf("\n登陆失败!");
break;
//登陆
case 3:
update_password(our_users,count);
break;
//修改密码
case 4:input(stu);break;
case 5:display(stu);break;
case 6:rank(stu);break;
case 7:insert(stu);break;
case 8:del(stu);break;
case 9:search(stu);break;
case 0:break;
default:printf("您的输入不在输入的数据范围内");
}
}while(number!=0);
printf("谢谢你已查寻完毕!下次再见!");
printf("\n");
}
int length_user_name(char *p)//字符型指针行参
{
int l;
l=strlen(p);//p为存放字符串的地址
if(l>18||l<1)
{
return 0;
}
else
return l;
}
int valid_user_name(char *p)
{
int i=0;
int len = strlen(p);
if((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <='Z')) //判断首字符是不是字母
{
for(i = 0; i < len; i++)
{
if(!(p[i] == '_' || (p[i] >= 'a' && p[i] <= 'z') || (p[i] >= 'A' && p[i] <='Z')
||(p[i] >='0' && p[i] <= '9'))) //判断后面字符是否有效
return 0;
}
return 1;
}
else
{
return 0;
}
}
int is_username_valid(char *p)
{
if((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <='Z'))
{
p++;
while(*p)
{
if(!(isalpha(*p) || *p == '_' || isdigit(*p)))//检查字符是否是字母或0到9数字
return 0;
p++;
}
return 1;
}
else
{
return 0;
}
}
int length_password(char *p)
{
int len;
len = strlen(p);
if(len<6||len>12)
{
return 0;
}
else
{
return len;
}
}
int is_password_valid(char *p)
{
int i=0;
for(;*p != '\0'; p++)
{
if(!( (*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <='Z')
||(*p >='0' && *p <= '9'))) //判断字符是否有效
return 0;
}
return 1;
}
//检测两次密码输入是否相同
int two_password_valid(char *p1,char*p2)
{
if(strcmp(p1,p2)==0)
{
return 1;
}
else
{
return 0;
}
}
int user_register(struct user *ptr_user,int size)//定义一个结构体指针数组变量,size为结构体数组的元素个数
{
char password[13];
char repassword[13];
if(size==N)
{
puts("注册人数以满!");
return 0;
}
printf("请输入注册姓名:");
fflush(stdin);
gets(ptr_user[size].user_name);
if(!(length_user_name(ptr_user[size].user_name)&&valid_user_name(ptr_user[size].user_name)))
{
printf("您输入的姓名无效,用户名在1-18之间,首字符为字母,后面必须为字母,数字或下划线!!!");
return 0;
}
printf("请输入注册密码:");
fflush(stdin);
gets(password);
printf("请再次输入注册密码:");
fflush(stdin);
gets(repassword);
if(!two_password_valid(password,repassword))
{
printf("\n两次输入的密码不一致!");
return 0;
}
else
{
strcpy(ptr_user[size].password,password);
}
if(!(length_password(ptr_user[size].password)&&is_password_valid(ptr_user[size].password)))
{
printf("您输入的密码无效,密码应在6-12之间,密码只能包含字母和数字!!!");
return 0;
}
printf("您的编号为:%d,这将是您的登陆帐号.",ptr_user[size].user_id=13579+size);
return 1;
}
int is_my_user(struct user *p,int size)
{
int i;
int zhanghu;
char mima[15];
printf("请输入您的帐号: ");
scanf("%d",&zhanghu);
fflush(stdin);
printf("请输入您的密码: ");
gets(mima);
for(i=0;i<size;i++)
{
if((zhanghu == p[i].user_id)&&(strcmp(mima,p[i].password)==0))
{
return i + 1;
}
}
return 0;
}
//显示用户信息
void display_user(struct user u)
{
printf("\n你的帐号是:%d",u.user_id);
printf("\n你注册姓名是:%s",u.user_name);
}
//修改密码
void update_password(struct user *ptr_user,int size)
{
char mima1[13],mima2[13];
int i = is_my_user(ptr_user,size);
if(i)
{
i--;
}
else
{
printf("\n帐号密码不存在!");
return;
}
printf("请输入新密码: ");
scanf("%s",mima1);
printf("请再次输入新密码: ");
scanf("%s",mima2);
if(two_password_valid(mima1,mima2) && length_password(mima1) && is_password_valid(mima1))
{
strcpy(ptr_user[i].password,mima1);//完成新旧密码的调换
printf("\n您的的密码修改成功!");
}
else
printf("\\您的密码修改失败!");
}
void input(struct student a[]) //录入函数,行参为结构体数组a[]
{
int j;
char b;
float sum=0;
printf("请输入学员信息\n");
do
{
printf("班级名称:");
scanf("%s",a[i].clas);
printf("学号:");
scanf("%d",&a[i].num);
printf("姓名:");
scanf("%s",a[i].name);
printf("课程编号:");
scanf("%s",a[i].courseno);
printf("三门成绩\n");
for(j=0;j<3;j++)
{
printf("成绩%d:",j+1);
scanf("%f",&a[i].score[j]);
}//循环输入成绩
a[i].avg=(a[i].score[0]+a[i].score[1]+a[i].score[2])/3;
i++;
printf("是否继续\n(Y/N)");
fflush(stdin);
scanf("%c",&b);
}while(b=='Y'||b=='y');
display(a);
}
void display(struct student a[]) //显示函数
{
int k;
for(k=0;k<i;k++)
{
printf("班级名称=%s,学号=%d,姓名=%s,课程编号=%s,平均值=%2f\n",a[k].clas,a[k].num,a[k].name,a[k].courseno,a[k].avg);
}
}
void rank(struct student a[]) //排序函数
{
int j;
int k;
struct student temp;
for(k=0;k<i;k++)
{
for(j=0;j<i-k;j++)
{
if(a[j].avg<a[j+1].avg)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("排序后的学员信息如下\n");
display(a);
}
void insert(struct student a[]) //插入函数
{
int j;
int k;
struct student temp;
printf("班级名称:");
scanf("%s",temp.clas);
printf("学号:");
scanf("%d",&temp.num);
printf("姓名:");
scanf("%s",temp.name);
printf("课程编号:");
scanf("%s",temp.courseno);
printf("三门成绩\n");
for(j=0;j<3;j++)
{
printf("成绩%d:",j+1);
scanf("%f",&temp.score[j]);
}
temp.avg=(temp.score[0]+temp.score[1]+temp.score[2])/3;
for(j=0;j<i;j++)
{
if(temp.avg>a[j].avg)
{
break;
}
}
for(k=i;k>j;k--)
{
a[k]=a[k-1];
}
i++;
a[j]=temp;
display(a);
}
void del(struct student a[]) //删除函数
{
int k,j;
printf("请输入要删除的学号:");
scanf("%d",&k);
for(j=0;j<i;j++)
{
if(k==a[j].num)
{
break;
}
}
if(j<i)
{
for(k=j;k<i-1;k++)
{
a[j]=a[j+1];
}
i--;
printf("删除后的学员信息\n");
display(a);
}
else
{
printf("没有您要删除的学员\n");
display(a);
}
}
void search(struct student a[])//查询函数
{
int k;
char inputName[20];
printf("输入您要查找的学生姓名: \n");
scanf("%s",inputName);
for(k=0;k<i;k++)
{
if(strcmp(a[k].name,inputName)==0)//判断输入的学生姓名来输出所要查询的学生属性
{
printf("班级名称=%s,学号=%d,姓名=%s,课程编号=%s,平均值=%2f\n",a[k].clas,a[k].num,a[k].name,a[k].courseno,a[k].avg);
break;
}
}
if(k==i)
{
printf("\n\n对不起!没有查到学号为 %s 的学生信息!",inputName);
}
}
//共同进步,只为开源