C程序之成绩管理系统

#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);
 }
 
}

//共同进步,只为开源