#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
//以上為包含的頭文件
#define N 100 //宏定義
struct user//定義一個(gè)用戶的結(jié)構(gòu)體
{
//以下為用戶的不同數(shù)據(jù)類型
int user_id;
char user_name[19];//最大18位
char password[13];//最大13位
char like[255];
char sign[255];
};
struct student//定義一個(gè)學(xué)生的結(jié)構(gòu)體
{
//以下為學(xué)生的不同數(shù)據(jù)類型
int num;
char name[20];
char clas[20];
char courseno[20];
float score[3];
float avg;
};
int i=0;//全局變量 統(tǒng)計(jì)個(gè)數(shù)
//以下為進(jìn)入系統(tǒng)的函數(shù)定義
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);
//以下為學(xué)生信息處理的函數(shù)定義
void input(struct student a[] ); //錄入函數(shù)
void rank(struct student a[]); //排序函數(shù)
void insert(struct student a[]); //插入函數(shù)
void del(struct student a[]); //刪除函數(shù)
void display(struct student a[]);//顯示函數(shù)
void search(struct student a[]);//查詢函數(shù)
int main()
{
struct user our_users[N];//定義一個(gè) our_users[N]的結(jié)構(gòu)體變量
int count = 0;
int current_user;
struct student stu[50];//定義一個(gè) stu[50]的結(jié)構(gòu)體變量
int number;//接收選擇分支的變量
do
{
printf("\n\t\t\t學(xué)員成績(jī)管理之共同進(jìn)步,只為開源\n\n");
printf("\n*****************************************************************************\n");
printf("\n\n請(qǐng)選擇功能\n0.退出\n1.注冊(cè)\n2.登陸\n3.修改密碼\n4.錄入\n5.顯示\n6.排序\n7.插入\n8.刪除\n9.查詢\n\n------------------\n");
printf("\n請(qǐng)選擇0-9\n");
scanf("%d",&number);
printf("\n------------------\n\n");
switch (number)
{
case 1:
if(user_register(our_users,count))
{
count++;
printf("\n注冊(cè)成功!");
}
break;
//注冊(cè)
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("您的輸入不在輸入的數(shù)據(jù)范圍內(nèi)");
}
}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數(shù)字
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;
}
//檢測(cè)兩次密碼輸入是否相同
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)//定義一個(gè)結(jié)構(gòu)體指針數(shù)組變量,size為結(jié)構(gòu)體數(shù)組的元素個(gè)數(shù)
{
char password[13];
char repassword[13];
if(size==N)
{
puts("注冊(cè)人數(shù)以滿!");
return 0;
}
printf("請(qǐng)輸入注冊(cè)姓名:");
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之間,首字符為字母,后面必須為字母,數(shù)字或下劃線!!!");
return 0;
}
printf("請(qǐng)輸入注冊(cè)密碼:");
fflush(stdin);
gets(password);
printf("請(qǐng)?jiān)俅屋斎胱?cè)密碼:");
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("您輸入的密碼無效,密碼應(yīng)在6-12之間,密碼只能包含字母和數(shù)字!!!");
return 0;
}
printf("您的編號(hào)為:%d,這將是您的登陸帳號(hào).",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("請(qǐng)輸入您的帳號(hào): ");
scanf("%d",&zhanghu);
fflush(stdin);
printf("請(qǐng)輸入您的密碼: ");
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你的帳號(hào)是:%d",u.user_id);
printf("\n你注冊(cè)姓名是:%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帳號(hào)密碼不存在!");
return;
}
printf("請(qǐng)輸入新密碼: ");
scanf("%s",mima1);
printf("請(qǐng)?jiān)俅屋斎胄旅艽a: ");
scanf("%s",mima2);
if(two_password_valid(mima1,mima2) && length_password(mima1) && is_password_valid(mima1))
{
strcpy(ptr_user[i].password,mima1);//完成新舊密碼的調(diào)換
printf("\n您的的密碼修改成功!");
}
else
printf("\\您的密碼修改失敗!");
}
void input(struct student a[]) //錄入函數(shù),行參為結(jié)構(gòu)體數(shù)組a[]
{
int j;
char b;
float sum=0;
printf("請(qǐng)輸入學(xué)員信息\n");
do
{
printf("班級(jí)名稱:");
scanf("%s",a[i].clas);
printf("學(xué)號(hào):");
scanf("%d",&a[i].num);
printf("姓名:");
scanf("%s",a[i].name);
printf("課程編號(hào):");
scanf("%s",a[i].courseno);
printf("三門成績(jī)\n");
for(j=0;j<3;j++)
{
printf("成績(jī)%d:",j+1);
scanf("%f",&a[i].score[j]);
}//循環(huán)輸入成績(jī)
a[i].avg=(a[i].score[0]+a[i].score[1]+a[i].score[2])/3;
i++;
printf("是否繼續(xù)\n(Y/N)");
fflush(stdin);
scanf("%c",&b);
}while(b=='Y'||b=='y');
display(a);
}
void display(struct student a[]) //顯示函數(shù)
{
int k;
for(k=0;k<i;k++)
{
printf("班級(jí)名稱=%s,學(xué)號(hào)=%d,姓名=%s,課程編號(hào)=%s,平均值=%2f\n",a[k].clas,a[k].num,a[k].name,a[k].courseno,a[k].avg);
}
}
void rank(struct student a[]) //排序函數(shù)
{
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("排序后的學(xué)員信息如下\n");
display(a);
}
void insert(struct student a[]) //插入函數(shù)
{
int j;
int k;
struct student temp;
printf("班級(jí)名稱:");
scanf("%s",temp.clas);
printf("學(xué)號(hào):");
scanf("%d",&temp.num);
printf("姓名:");
scanf("%s",temp.name);
printf("課程編號(hào):");
scanf("%s",temp.courseno);
printf("三門成績(jī)\n");
for(j=0;j<3;j++)
{
printf("成績(jī)%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[]) //刪除函數(shù)
{
int k,j;
printf("請(qǐng)輸入要?jiǎng)h除的學(xué)號(hào):");
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("刪除后的學(xué)員信息\n");
display(a);
}
else
{
printf("沒有您要?jiǎng)h除的學(xué)員\n");
display(a);
}
}
void search(struct student a[])//查詢函數(shù)
{
int k;
char inputName[20];
printf("輸入您要查找的學(xué)生姓名: \n");
scanf("%s",inputName);
for(k=0;k<i;k++)
{
if(strcmp(a[k].name,inputName)==0)//判斷輸入的學(xué)生姓名來輸出所要查詢的學(xué)生屬性
{
printf("班級(jí)名稱=%s,學(xué)號(hào)=%d,姓名=%s,課程編號(hào)=%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對(duì)不起!沒有查到學(xué)號(hào)為 %s 的學(xué)生信息!",inputName);
}
}
//共同進(jìn)步,只為開源