C语言实现简单学生选课管理系统

本文实例为大家分享了C语言实现学生选课管理系统的具体代码,供大家参考,具体内容如下

这是我们大一C语言课程设计的最终作品,涉及文件读写操作、链表的一系列操作。

源代码由头文件all.h、主函数文件main.cpp以及功能函数文件student.cpp、manager.cpp、common.cpp组成。

涉及的文件读写操作需要先手动创建文件,文件路径可以在all.h的宏定义中更改

使用vs2017的c++编译器,兼容c语言,现贴上源代码和运行截图,供感兴趣的童鞋参考,水平有限还望多多包涵。

运行截图

all.h

#pragma once
#define MAXN 50
#define STU_F  "C:\\stu_cour_info_system\\date\\student.txt"  //文件存放路径及文件名
#define COUR_F  "C:\\stu_cour_info_system\\date\\course.txt"  //文件存放路径及文件名
#define MAN_F  "C:\\stu_cour_info_system\\date\\manager.txt"     //文件存放路径及文件名

#define STU_F_BACKUP  "C:\\stu_cour_info_system\\backup\\student.txt"  //备份文件存放路径及文件名
#define COUR_F_BACKUP  "C:\\stu_cour_info_system\\backup\\course.txt"   //备份文件存放路径及文件名
#define MAN_F_BACKUP  "C:\\stu_cour_info_system\\backup\\manager.txt"      //备份文件存放路径及文件名

struct student //学生信息结构体
{
 char name[MAXN];      //姓名
 char num[MAXN];  //学号
 char sch_cla[20];       //学院和班级
 double score_all = 0; //应选总学分
 double score_sel = 0; //已选课总学分
 char password[9];  //学生登陆密码,共8位
 int course_sum;  //选课总数
 char course[50][MAXN];  //记录选课课程的编号
 struct student *next;  //链表指针
};

struct course //课程信息结构体
{
 char num[MAXN];  //课程编号
 char name[MAXN];  //课程名称
 char nature[MAXN];  //课程性质
 char term[MAXN];  //开课学期
 double time_all;    //总学时
 double time_teach;   //授课学时
 double time_exp;   //实验或上机学时
 double score;    //该课程学分
 int stu_max;   //能够容纳的学生总数
 int stu_sum;   //已经选课学生总数
 char stu[100][MAXN];  //已经选课学生学号
 struct course *next;  //链表指针
};

/*通用函数*/
int judge_num(char *ch);         //用于检测输入的字符串ch是否全部为数字,全部为数字则返回1,否则返回0
int input_num();          //用于输入数字,如果输入的全部为数字则返回该数字,否则一直停在输入状态
double input_double();                                   //用于输入小数
int input_limit(int n);         //输入选项,控制输入的数字范围为0-n,在这个范围内则返回该数字,否则一直停在输入状态
int input_limit0(int n);
int keyexam(char *actual_key, char *input_key);   //密码检测函数,x为密码位数,actul_key[]为真实密码,input_key为输入密码,密码匹配返回1否则返回0
student* load_stu();          //将学生文件生成链表,返回链表头指针
void store_stu(student *p_head);       //将学生链表存入学生文件,需传入链表头指针
course* load_cour();          //将课程文件生成链表,返回链表头指针
void store_cour(course *p_head);       //将课程链表存入课程文件,需传入链表头指针
student* locate_end(student *head);                         //传入头节点,返回尾节点
course* locate_end(course *head);                          //传入头节点,返回尾节点
void help();            //显示帮助信息
int link_count(student* head);
int link_count(course* head);        //计算链表节点数量
int judge_ascii_num(char in[]);                             //检测输入是否全部为ASCII的数字,是返回1否则返回0

           /*管理员函数*/
int man_login();          //管理员登陆函数,密码正确返回1,否则返回0
int man_menu();           //管理员主菜单,返回对应的输入值
void student_add(student *head);        //增加学生的函数
void student_delete(student *head);        //删除学生的函数
void man_search_stu(student *head);        //搜索学生的函数
void student_modify(student *head);       //管理员修改学生信息
void course_add(course *head);        //增加课程的函数
void course_delete(course *head);       //删除课程的函数
void course_modify(course *head);       //修改课程信息的函数
void print_all();                                     //打印所有学生和课程的函数
void man_modifyKey();         //管理员修改密码
void man_backups_recover();        //管理员备份和恢复数据
void courseshowone_man(course *ad);     //管理员显示一门课程信息
void courseshowall_man(course *ad);      //管理员显示所有课程信息

          /*学生函数*/
student* stu_login(student* head);       //学生登陆函数,学号和密码都正确则返回链表中该学生的指针,错误则返回null
int stu_menu();          //学生菜单,返回对应的输入值
void student_showone(student *p);       //显示一个学生的信息
void student_showall(student *head);      //显示所有学生的信息
student *studentnamefind_char(student *head, char tar[]);   //根据学生姓名查找学生,如果学生为头节点则返回空指针,不为头节点则返回前一个节点的指针,不存在则返回尾节点
student *studentnamefind_num(student *head, char tar[]);   //根据学生学号查找学生,如果学生为头节点则返回空指针,不为头节点则返回前一个节点的指针,不存在则返回尾节点
void stu_modifyKey(student* stu);       //学生修改密码
void coursechoose(course* head, student* stu);   //选课函数,min为最少要达到的学分
void courseshow_nature(course *head);      //根据课程性质查找并显示课程信息
void courseshow_term(course *head);      //根据开课学期查找并显示课程信息
void cour_nat_te(course* head);                          //根据课程性质与开课学期组合查找课程信息
void coursenumfindtip(course *head);      //查课子函数
void coursenamefindtip(course *head);      //查课子函数2
void stu_dele_cour(course* head, student* stu);    //删除已选课程

          /*课程函数*/
void course_showone(course *ad);       //显示一门的信息
void course_showall(course *head);       //显示所有课程的信息
void search_course(course *head);        //搜索课程的函数
course *coursenamefind_char(course* head, char tar[]);    //根据课程名称查找课程节点,如果课程为头节点则返回空指针,不为头节点则返回前一个节点的指针,不存在则返回尾节点
course *coursenumfind_num(course* head, char tar[]);    //根据课程编号查找课程,如果课程为头节点则返回空指针,不为头节点则返回前一个节点的指针,不存在则返回尾节点

main.cpp

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"all.h"

student* stu_head;
course* cour_head;
course *cour_tail;
student *stu_tail;     //这四个指针是全局变量

int main()
{
 /*对四个指针变量初始化*/
 stu_head = load_stu();    //stu_head指向学生链表头
 stu_tail = locate_end(stu_head);  //stu_tail指向学生链表尾
 cour_head = load_cour();   //cour_head指向课程链表头
 cour_tail = locate_end(cour_head); //cour_tail指向课程链表尾

 //{/*这段代码用于生成原始管理员密码:10个0;
 // 编译链接后执行一次然后注释掉*/
 // FILE *fp = fopen(MAN_F, "w+");
 // for (int i = 0; i < 10; i++)
 // {
 // fputc('0', fp);
 // }
 // fclose(fp);
 //}

 printf("\n\t\t--------------------------------欢迎使用选课系统!---------------------------------\n");
 int status=-1;
 while (1)//判断登陆类型
 {
 status = -1;
 printf("\n\n\t\t*****请选择登陆类型 [1]学生  [2]管理员  [3]显示帮助  [0]退出系统:");
 status = input_limit0(3);
 if ((status == 0) || (status == 1) || (status == 2)||(status==3))
  break;
 else
  printf("\n\t\t##### 输入错误!只能选择1、2或0 #######\n");
 }

 while (1)
 {
 if (status == 2)//管理员登陆
 {
  if (man_login() == 1)
  {
  printf("\n\n\t\t-----------------------------------管理员登陆成功!--------------------------------\n\n");
  int menu_return = man_menu();
  while (1)
  {
   switch (menu_return)
   {
   case 1:
   student_add(stu_head); break;
   case 2:
   student_delete(stu_head); break;
   case 3:
   student_modify(stu_head); break;
   case 4:
   man_search_stu(stu_head); break;
   case 5:
   course_add(cour_head); break;
   case 6:
   course_delete(cour_head); break;
   case 7:
   course_modify(cour_head); break;
   case 8:
   search_course(cour_head); break;
   case 9:
   print_all(); break;
   case 10:
   man_modifyKey(); break;
   case 11:
   man_backups_recover(); break;
   case 0:
   break;
   default:
   printf("\t\t\t#####输入错误,请重新输入######!\n");
   }

   if (menu_return == 0)
   break;
   menu_return = man_menu();
  }
  }
  else
  printf("\t\t######密码错误,请重新登陆!######\n");
 }

 else if (status == 1)//student login
 {
  student* p_stu = stu_login(stu_head);
  if (p_stu != NULL)//p_stu为指向该学生的指针
  {
  printf("\t\t*******请输入登陆密码:");
  char input[100];
  scanf("%s", input);
  while (getchar() != '\n');
  if (strcmp(p_stu->password, input) == 0)
  {
   printf("\n\n\t\t-----------------------------%s 欢迎进入选课系统! ---------------------------------\n\n", p_stu->name);
   int menu_return = stu_menu();
   while (1)
   {
   switch (menu_return)
   {
   case 1:
    course_showall(cour_head); break;
   case 2:
    search_course(cour_head); break;
   case 3:
    coursechoose(cour_head,p_stu); break;
   case 4:
    stu_dele_cour(cour_head, p_stu); break;
   case 5:
    student_showone(p_stu); break;
   case 6:
    stu_modifyKey(p_stu); break;
   case 0:
    break;
   default:
    printf("\t\t######输入错误,请重新输入!######\n");
   }

   if (menu_return == 0)
    break;
   menu_return = stu_menu();
   }
  }
  else
  {
   printf("\t\t#####密码错误,请重新登陆!#######\n");
  }
  }
  else
  printf("\t\t#####该学号不存在,请重新登陆!######\n");
  p_stu = NULL;
 }

 else if (status == 3)//显示帮助信息
  help();

 else if (status == 0)//关闭系统
  return 0;

  while (1)//再次判断登陆类型
  {
  status = -1;
  printf("\n\n\t\t*****请选择登陆类型 [1]学生  [2]管理员  [3]显示帮助  [0]退出系统:");
  status = input_limit0(3);
  if ((status == 0) || (status == 1) || (status == 2) || (status == 3))
   break;
  else
   printf("\n\t\t##### 输入错误!只能选择1、2或0 #######\n");
  }
 }
}

common.cpp

#include<stdio.h>
#include<string.h>
#include"all.h"
#include<stdlib.h>
#include<malloc.h>
#include<ctype.h>

extern student* stu_head;
extern course* cour_head;
extern course *cour_tail;
extern student *stu_tail;  // 这四个指针变量在main.cpp中已经声明为全局变量

int keyexam(char *actual_key, char *input_key)//密码正确则返回1,否则返回0
{
 if (strcmp(actual_key, input_key) == 0)
 return 1;
 else
 return 0;
}

student* load_stu()//经调试已经正确
{
 int count = 0;
 FILE *fp;
 if ((fp = fopen(STU_F, "r")) == NULL)
 {
 printf("\t\tcannot open the file:STU_F\n");
 exit(0);
 }
 student* temp = (student*)malloc(sizeof(student));
 while (!feof(fp))
 {
 if (fread(temp, sizeof(student), 1, fp))
  count++;
 }
 free(temp);
 temp = NULL;

 if (count == 0)
 return NULL;
 else
 {
 rewind(fp);
 student *p_head = NULL;//文件中有链表信息,则创建一个头指针
 p_head = (student*)malloc(sizeof(student));
 fread(p_head, sizeof(student), 1, fp);//用文件内容初始化链表节点
 p_head->next = NULL;
 count--;
 student* p_new = p_head;
 student* p_end = p_head;
 for (int i = 0; i < count; i++)
 {
  p_new = (student*)malloc(sizeof(student));
  fread(p_new, sizeof(student), 1, fp);
  p_new->next = NULL;
  p_end->next = p_new;
  p_end = p_new;
 }
 fclose(fp);
 return p_head;
 }
}

void store_stu(student * p_head)//经调试已正确
{
 FILE *fp;
 if ((fp = fopen(STU_F, "w")) == NULL)//以只写方式打开文件,覆盖以前数据
 {
 printf("\t***STU_F missed,please quit the system and check for that!\n\n");
 exit(0);
 }
 while (p_head != NULL)//将链表所有节点写入缓冲区
 {
 fwrite(p_head, sizeof(student), 1, fp);//将链表一个节点写入缓冲区
 p_head = p_head->next;      //p_head指向下一个节点
 }
 fclose(fp);//保存文件,清空缓冲区
}

course * load_cour()
{
 int count = 0;
 FILE *fp;
 if ((fp = fopen(COUR_F, "r")) == NULL)
 {
 printf("\t\tcannot open the file:COUR_F\n");
 exit(0);
 }
 course* temp = (course*)malloc(sizeof(course));
 while (!feof(fp))
 {
 if (fread(temp, sizeof(course), 1, fp))
  count++;
 }
 free(temp);
 temp = NULL;

 if (count == 0)
 return NULL;
 else
 {
 rewind(fp);
 course *p_head = NULL;//文件中有链表信息,则创建一个头指针
 p_head = (course*)malloc(sizeof(course));
 fread(p_head, sizeof(course), 1, fp);//用文件内容初始化链表节点
 p_head->next = NULL;
 count--;
 course* p_new = p_head;
 course* p_end = p_head;
 for (int i = 0; i < count; i++)
 {
  p_new = (course*)malloc(sizeof(course));
  fread(p_new, sizeof(course), 1, fp);
  p_new->next = NULL;
  p_end->next = p_new;
  p_end = p_new;
 }
 fclose(fp);
 return p_head;
 }

}

void store_cour(course * p_head)
{
 FILE *fp;
 if ((fp = fopen(COUR_F, "w")) == NULL)//以只写方式打开文件,覆盖以前数据
 {
 printf("\t***COUR_F missed,please quit the system and check for that!\n\n");
 exit(0);
 }
 while (p_head != NULL)//将链表所有节点写入缓冲区
 {
 fwrite(p_head, sizeof(course), 1, fp);//将链表一个节点写入缓冲区
 p_head = p_head->next;      //p_head指向下一个节点
 }
 fclose(fp);//保存文件,清空缓冲区
}

student * locate_end(student * head)
{
 student* end = head;
 while (head != NULL)
 {
 end = head;
 head = head->next;
 }
 return end;
}

course* locate_end(course * head)
{
 course* end = head;
 while (head != NULL)
 {
 end = head;
 head = head->next;
 }
 return end;
}

void help()
{
 int input = -1;
 while (1)
 {
 printf("\n\t\t*****请选择需要的帮助类型 [1]学生帮助 [2]管理员帮助 [3]版权信息 [0]返回主页:");
 scanf("%d", &input);
 while (getchar() != '\n');
 if (input == 0)
  break;
 else if (input == 1)//学生使用说明
 {
  printf("\n\t\t--------------------------------学生使用说明---------------------------------------\n");
  printf("\t\t密码:初始密码为学号,忘记密码请联系管理员\n");
  printf("\t\t\n");
  printf("\t\t\n");
  printf("\t\t\n");
  printf("\t\t-----------------------------------------------------------------------------------\n\n");
 }
 else if (input == 2)//管理员使用说明
 {
  printf("\n\t\t-------------------------------管理员使用说明---------------------------------------\n");
  printf("\t\t密码:初始密码为10个0,首次使用务必修改密码!\n");
  printf("\t\t警告:该软件的文件夹必须放在C盘根目录下,否则不能使用!\n");
  printf("\t\t提示:请定时备份数据,防止数据丢失!\n");
  printf("\t\t提示:学生学号和课程编号只能是数字!\n");
  printf("\t\t------------------------------------------------------------------------------------\n\n");
 }
 else if (input == 3)//版权信息
 {
  printf("\n\t\t------------------------------版权信息-------------------------------------------------\n");
  printf("\t\t软件名称:学生及课程信息管理系统\n");
  printf("\t\t开发人员:焦智洋、文诗波、韩旭\n");
  printf("\t\t版本:beta1.0\n");
  printf("\t\t版权保护:版权所有,翻版必究\n");
  printf("\t\t---------------------------------------------------------------------------------------\n\n");
 }
 else
  printf("\n\t\t#####输入错误,请重新输入!#####\n");
 }
}

int link_count(student * head)
{
 int count = 0;
 while (head != NULL)
 {
 count++;
 head = head->next;
 }
 return count;
}

int link_count(course * head)
{
 int count = 0;
 while (head != NULL)
 {
 count++;
 head = head->next;
 }
 return count;
}

int judge_ascii_num(char in[])
{
 int i = 0;
 while (in[i]!='\0')
 {
 if ((in[i] < '0') || (in[i] > '9'))
  return 0;
 i++;
 }
 return 1;
}

int judge_num(char *ch)
{
 int sum = 0, len = strlen(ch);
 for (int i = 0; i < len; i++)
 {
 if (ch[i] >= '0'&&ch[i] <= '9')
  sum++;
 }
 if (sum == len)
 return 1;
 else
 return 0;
}

int input_num()
{
 int num;
 char buf[MAXN];
 while ((scanf("%s", buf) == 0) || (judge_num(buf) == 0))
 {
 while (getchar() != '\n');
 printf("\n\t\t###输入错误,请重新输入:");
 }
 num = atoi(buf);
 return num;
}

double input_double()
{
 double temp = -1.00;
 while (1)
 {
 scanf("%lf", &temp);
 while (getchar() != '\n');
 if (temp < 0)
  printf("\n\t\t#####输入错误,请重新输入:");
 else
  break;
 }
 return temp;
}

double judge_input_dou()
{
 printf("\n\t\t是否修改该项?[1]修改  [0]不修改:");
 int judge = 0;
 scanf("%d", &judge);
 while (getchar() != '\n');
 if (judge == 1)
 {
 while (1)
 {
  printf("\n\t\t请输入修改后的内容:");
  double in = 0.00;
  scanf("%lf", &in);
  while (getchar() != '\n');
  if (in<=0)
  printf("\n\t\t#####输入错误,请重新输入!######");
  else
  {
  return in;
  break;
  }
 }
 }
 else
 return -1.0;
}

course *coursenamefind_char(course* head, char tar[])//根据课程名称查找课程节点,返回前一节点地址
{
 course *p, *q;
 p = head;
 q = NULL;
 while (p != NULL)
 {
 if (strcmp(tar, p->name) == 0)
  return q;
 q = p;
 p = p->next;
 }
 return q;
}

course *coursenumfind_num(course* head, char tar[])//根据课程编号查找课程
{course *p, *q;
 p = head;
 q = NULL;
 while (p != NULL)
 {
 if (strcmp(tar, p->num)==0)
  return q;
 q = p;
 p = p->next;
 }
 return q;

}

student *studentnamefind_char(student *head, char tar[])
{
 student *p, *q;
 p = head;
 q = NULL;
 while (p != NULL)
 {
 if (strcmp(tar, p->name) == 0)
  return q;
 q = p;
 p = p->next;
 }
 return q;
}

student* studentnamefind_num(student *head, char tar[])
{
 student *p, *q;
 p = head;
 q = NULL;
 while (p != NULL)
 {
 if (strcmp(tar, p->num) == 0)
  return q;
 q = p;
 p = p->next;
 }
 return q;
}

int input_limit(int n)
{
 int m;
 while (1)
 {
 m = input_num();
 if (m > 0 && m <= n)
  break;
 printf("\n\t\t####无此选项,请重新输入!####\n");
 }
 return m;
}

int input_limit0(int n)
{
 int m;
 while (1)
 {
  m = input_num();
  if (m >= 0 && m <= n)
  break;
  printf("\n\t\t####无此选项,请重新输入!####\n");
 }
 return m;
}

void student_showone(student *p)
{
 printf("\n\t\t------------------------------------------------------");
 printf("\n\t\t学号:%s", p->num);
 printf("\n\t\t姓名:%s", p->name);
 printf("\n\t\t学院与班级:%s", p->sch_cla);
 printf("\n\t\t密码:%s", p->password);
 if (p->course_sum == 0)
 printf("\n\t\t该学生无已选课程!\n");
 else
 {
 printf("\n\t\t已选课程:\n");
 for (int i = 0; i < p->course_sum; i++)
  printf("\t\t\t[%d]:%s\n", i + 1, p->course[i]);
 }
 printf("\t\t选课总数:%d", p->course_sum);
 printf("\n\t\t已选课程总学分:%lf", p->score_sel);
 printf("\n\t\t已得学分统计:%lf", p->score_all);
 printf("\n\t\t------------------------------------------------------");
}

void student_showall(student *head)
{
 student *p;
 p = head;
 while (p != NULL)
 {
 student_showone(p);
 p = p->next;
 }
}

void course_showone(course *ad)
{
 if (ad == NULL)
 printf("\t\t无课程\n");
 else
 {
 printf("\n\t\t------------------------------------------------------");
 printf("\n\t\t课程名称:%s\n", ad->name);
 printf("\n\t\t课程编号:%s\n", ad->num);
 printf("\t\t课程性质:%s\n", ad->nature);
 printf("\t\t开课学期:%s\n", ad->term);
 printf("\t\t总学时:%lf\n", ad->time_all);
 printf("\t\t授课学时:%lf\n", ad->time_teach);
 printf("\t\t实验或上机学时:%lf\n", ad->time_exp);
 printf("\t\t学分:%lf\n\n", ad->score);
 printf("\n\t\t------------------------------------------------------");
 }
}

void course_showall(course *head)
{
 course *p;
 p = head;
 while (p != NULL)
 {
 course_showone(p);
 p = p->next;
 }
 return;
}

void cour_nat_te(course* head)
{
 while (1)
 {
 printf("\n\t\t请输入要查找课程的性质,返回上级菜单请输入0000:");
 char input1[50];
 scanf("%s", input1);
 while (getchar() != '\n');
 if (strcmp(input1, "0000") == 0)
  break;

 printf("\n\t\t请输入要查找课程的开课学期:");
 char input2[50];
 scanf("%s", input2);
 while (getchar() != '\n');

 int count = 0;
 while (head != NULL)
 {
  if ((strcmp(input1, head->nature) == 0) && (strcmp(input2, head->term) == 0))
  {
  course_showone(head);
  count++;
  }
  head = head->next;
 }
 if (count == 0)
  printf("\n\t\t#####没有符合查找条件的课程!#####\n");
 }
}

void search_course(course *head)
{
 int flag;
 while (true)
 {
 flag = 0;
 printf("\n\t\t请输入查找条件 [1]课程编号  [2]课程名称  [3]课程性质\n\t\t[4]开课学期  [5]课程性质与开课学期  [0]返回上级菜单:");
 scanf("%d", &flag);
 while (getchar() != '\n');
 switch (flag)
 {
 case(1):coursenumfindtip(head); break;
 case(2):coursenamefindtip(head); break;
 case(3):courseshow_nature(head); break;
 case(4):courseshow_term(head); break;
 case(5):cour_nat_te(head); break;
 case(0):break;
 default:
  printf("\n\t\t#####输入错误,请重新输入!#####");
 }
 if (flag == 0)
  break;
 }
}

manager.cpp

#include<stdio.h>
#include<string.h>
#include"all.h"
#include<stdlib.h>
#include<malloc.h>
#include<ctype.h>

extern student* stu_head;
extern course* cour_head;
extern course *cour_tail;
extern student *stu_tail;  // 这四个指针变量在main.cpp中已经声明为全局变量

int man_login()
{
 FILE *fp;
 if ((fp = fopen(MAN_F, "r")) == NULL)
 {
 printf("\t\t#######无法找到文件:MAN_F######\n");
 return -1;
 }
 char key[11];
 fread(key, 10, 1, fp);
 key[10] = '\0';
 fclose(fp);
 char input[1000];
 printf("\t\t*******请输入管理员密码:");
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, key) == 0)
 return 1;
 else
 return 0;
}

int man_menu()
{
 printf("\n\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~管理员菜单~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 printf("\n\t\t---[1]:添加学生");
 printf("\n\t\t---[2]:删除学生");
 printf("\n\t\t---[3]:修改学生信息");
 printf("\n\t\t---[4]:查找学生信息\n");
 printf("\n\t\t---[5]:添加课程");
 printf("\n\t\t---[6]:删除课程");
 printf("\n\t\t---[7]:修改课程信息");
 printf("\n\t\t---[8]:查找课程信息\n");
 printf("\n\t\t---[9]:打印所有课程/学生信息");
 printf("\n\t\t---[10]:修改管理员密码");
 printf("\n\t\t---[11]:数据备份与恢复");
 printf("\n\t\t---[0]:注销\n");
 printf("\n\t\t----请从<0-10>中选择操作类型:");
 int n = input_limit0(11);
 return n;
}

void student_add(student *head) //增加学生的函数
{
 while (1)
 {
 char input[50];
 while (1)
 {
  printf("\n\t\t请输入要添加学生的学号(数字),返回上级菜单请输入0000:");
  scanf("%s", input);
  while (getchar() != '\n');
  if (judge_ascii_num(input) == 1)
  break;
  else
  printf("\n\t\t####输入错误!#####");
 }
 if (strcmp(input, "0000") == 0)
  break;
 if (studentnamefind_num(stu_head, input) != stu_tail)
 {
  printf("\t\t###已存在该学生,请重新输入!####\n");
  continue;
 }

 /*初始化学生信息*/
 student* p = (student *)malloc(sizeof(student));
 strcpy(p->num, input);
 printf("\t\t请输入学生姓名:");
 scanf("%s", p->name);
 while (getchar() != '\n');
 printf("\t\t请输入学生学院和班级(用--隔开):");
 scanf("%s", p->sch_cla);
 while (getchar() != '\n');
 printf("\t\t请输入当前该学生总学分:");
 p->score_all = input_double();
 p->course_sum = 0;
 p->score_sel = 0.0;
 strcpy(p->password, p->num);

 if (stu_head == NULL)//当前链表中没有节点
 {
  p->next = NULL;
  stu_head = p;
  stu_tail = p;
 }
 else
 {
  if (strcmp(p->num, stu_head->num) < 0)//新增节点的标号比头节点还小
  {
  p->next = stu_head;
  stu_head = p;
  }
  else if (strcmp(p->num, stu_tail->num) > 0)//新增节点的标号比尾节点还大
  {
  p->next = NULL;
  stu_tail->next = p;
  stu_tail = p;
  }
  else//新增节点的标号在头节点和尾节点之间
  {
  student* temp = stu_head;
  while (temp != stu_tail)
  {
   if (strcmp(p->num, temp->num) > 0)
   {
   p->next = temp->next;
   temp->next = p;
   break;
   }
  }
  }
 }
 printf("\n\t\t学生信息录入成功!\n");
 }

 store_stu(stu_head);
}

void student_delete(student *head)
{
 while (true)
 {
 printf("\n\t\t请输入要删除学生的学号或姓名,取消删除请输入0000:");
 char input[50];
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, "0000") == 0)
  break;

 student *p;
 if ((input[0] >= 48) && (input[0] <= 57))
  p = studentnamefind_num(stu_head, input);
 else
  p = studentnamefind_char(stu_head, input);

 if (p == stu_tail)//没有该学生
 {
  printf("\n\t\t####没有该学生信息!#####");
  continue;
 }

 printf("\n\t\t确定删除%s?[1]是 [0]否:", input);
 int in = 0;
 scanf("%d", &in);
 while (getchar() != '\n');
 if (in == 1)
 {
  if (p == NULL)//链表头节点
  {
  if (stu_head->next == NULL)
  {
   stu_tail = NULL;
  }
  student* temp = stu_head;
  stu_head = stu_head->next;
  free(temp);
  temp = NULL;
  }
  else if (p->next == stu_tail)//链表尾节点
  {
  p->next = NULL;
  free(stu_tail);
  stu_tail = p;
  }
  else//链表中间节点
  {
  student* delete_point = p->next;
  p->next = delete_point->next;
  free(delete_point);
  delete_point = NULL;
  }
  printf("\n\t\t已经删除该学生的信息!\n");
 }
 else
  printf("\n\t\t####未删除该学生的信息!####\n");
 }

 store_stu(stu_head);
}

void student_modify(student *head)
{
 char input[100];
 student* find = NULL;
 while (1)
 {
 printf("\t\t请输入要修改学生的学号或姓名,取消修改请输入0000:");
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, "0000") == 0)
  break;
 if ((input[0] >= 48) && (input[0] <= 57))//按学号查找
  find = studentnamefind_num(head, input);
 else//按姓名查找
  find = studentnamefind_char(head, input);
 if (find == stu_tail)
 {
  printf("\n\t\t####你所查找的学生不存在!");
  continue;
 }
 else
 {
  char temp[50];
  if (find == NULL)
  find = head;
  else
  find = find->next;
  printf("\n\t\t请分别输入需要修改的内容,若某一项不需要修改请输入0");

  printf("\n\t\t原姓名:%s  修改后的姓名:", find->name);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  strcpy(find->name, temp);

  printf("\t\t原学院和班级:%s  修改后的学院和班级(中间用--隔开):", find->sch_cla);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  strcpy(find->sch_cla, temp);

  printf("\t\t原密码:%s  修改后的密码:", find->password);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  strcpy(find->password, temp);

  printf("\t\t原总学分:%lf  (增加学分请使用+,减少学分请使用-,例如“-10” “+10”):", find->score_all);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  {
  int change = (int)temp[0];
  temp[0] = '0';
  double number = atof(temp);
  if (change == 43)
   find->score_all += number;
  else if (change == 45)
   find->score_all -= number;
  }

  printf("\t\t修改完成!\n\n");
 }
 }

 store_stu(stu_head);
}

void course_add(course *head)
{
 while (1)
 {
 char input[50];
 while (1)
 {
  printf("\n\t\t请输入要添加课程的编号,返回上一级菜单请输入0000:");
  scanf("%s", input);
  while (getchar() != '\n');
  if (judge_ascii_num(input) == 1)
  break;
  else
  printf("\n\t\t#####输入错误!####");
 }
 if (strcmp(input, "0000") == 0)
  break;

 if (coursenumfind_num(cour_head, input) != cour_tail)
 {
  printf("\t\t###已存在该课程,请重新输入!####\n");
  continue;
 }

 course* p = (course*)malloc(sizeof(course));
 /*初始化课程信息*/
 strcpy(p->num, input);
 printf("\n\t\t请输入课程名称:");
 scanf("%s", p->name);
 while (getchar() != '\n');
 printf("\n\t\t请输入课程性质:");
 scanf("%s", p->nature);
 while (getchar() != '\n');
 printf("\n\t\t请输入课程总学时:");
 p->time_all = input_double();
 printf("\n\t\t请输入课程授课学时:");
 p->time_teach = input_double();
 printf("\n\t\t请输入课程实验或上机学时:");
 p->time_exp = input_double();
 printf("\n\t\t请输入课程最大容纳人数:");
 p->stu_max = input_num();
 printf("\n\t\t请输入课程学分:");
 p->score = input_double();
 printf("\n\t\t请输入课程开课学期:");
 scanf("%s", p->term);
 while (getchar() != '\n');
 p->stu_sum = 0;

 if (cour_head == NULL)//链表中没有节点
 {
  p->next = NULL;
  cour_head = p;
  cour_tail = p;
 }
 else
 {
  if (strcmp(p->num, cour_head->num) < 0)//新增节点的标号比头节点还小
  {
  p->next = cour_head;
  cour_head = p;
  }
  else if (strcmp(p->num, cour_tail->num) > 0)//新增节点的标号比尾节点还大
  {
  p->next = NULL;
  cour_tail->next = p;
  cour_tail = p;
  }
  else//新增节点的标号在头节点和尾节点之间
  {
  course* temp = cour_head;
  while (temp != cour_tail)
  {
   if (strcmp(p->num, temp->num) > 0)
   {
   p->next = temp->next;
   temp->next = p;
   break;
   }
  }
  }
 }
 printf("\n\t\t课程信息录入成功!\n");
 }
 store_cour(cour_head);
}

void course_delete(course *head)
{
 course *p;
 char input[50];
 while (true)
 {
 printf("\n\t\t请输入要删除课程的编号或名称,取消删除请输入0000:");
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, "0000") == 0)
  break;
 if ((input[0] >= 48) && (input[0] <= 57))
  p = coursenumfind_num(head, input);
 else
  p = coursenamefind_char(head, input);

 if (p == cour_tail)//没有该课程
 {
  printf("\n\t\t####没有该课程信息!####"); continue;
 }

 printf("\n\t\t确定删除%s?[1]是 [0]否:", input);
 int in = 0;
 scanf("%d", &in);
 while (getchar() != '\n');
 if (in == 1)
 {
  if (p == NULL)//链表头节点
  {
  if (head->next == NULL)
   cour_tail = NULL;
  course* temp = head;
  head = head->next;
  cour_head = head;
  free(temp);
  }
  else if (p->next == cour_tail)//链表尾节点
  {
  free(cour_tail);
  p->next = NULL;
  cour_tail = p;
  }
  else//链表中间节点
  {
  course* delete_point = p->next;
  p = (p->next)->next;
  free(delete_point);
  }
  printf("\n\t\t%s已经删除!\n", input);
 }
 else
  printf("\n\t\t#####未删除课程%s的信息!######\n", input);
 }
 store_cour(cour_head);
}

void course_modify(course *head)
{
 char input[100];
 course* find = NULL;
 while (1)
 {
 printf("\t\t请输入要修改课程的编号号或名称,取消修改请输入0000:");
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, "0000") == 0)
  break;
 if ((input[0] >= 48) && (input[0] <= 57))//按学号查找
  find = coursenumfind_num(head, input);
 else//按姓名查找
  find = coursenamefind_char(head, input);
 if (find == cour_tail)
 {
  printf("\n\t\t####你所查找的课程不存在!####");
  continue;
 }
 else
 {
  char temp[50];
  if (find == NULL)
  find = head;
  else
  find = find->next;
  printf("\n\t\t请分别输入需要修改的内容,若某一项不需要修改请输入0");

  printf("\n\t\t原名称:%s     修改后的名称:", find->name);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  strcpy(find->name, temp);

  printf("\t\t原性质:%s     修改后的性质:", find->nature);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  strcpy(find->nature, temp);

  printf("\t\t原开课学期:%s     修改后的开课学期:", find->term);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  strcpy(find->term, temp);

  //int time_all;    //总学时
  //int time_teach;   //授课学时
  //int time_exp;   //实验或上机学时
  //int score;    //该课程学分
  //int stu_max;   //能够容纳的学生总数

  printf("\t\t原总学时:%lf     修改后的总学时:", find->time_all);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  find->time_all = atof(temp);

  printf("\t\t原授课学时:%lf     修改后的授课学时:", find->time_teach);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  find->time_teach = atof(temp);

  printf("\t\t原实验或上机学时:%lf     修改后的实验或上机学时:", find->time_exp);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  find->time_exp = atof(temp);

  printf("\t\t原课程学分:%lf     修改后的课程学分:", find->score);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  find->score = atof(temp);

  printf("\t\t原能容纳学生总数:%d     修改后的能容纳学生总数:", find->stu_max);
  scanf("%s", &temp);
  while (getchar() != '\n');
  if (strcmp(temp, "0") != 0)
  find->stu_max = atoi(temp);

  printf("\t\t修改完成!\n\n");
 }
 }

 store_cour(cour_head);
}

void print_all()
{
 while (1)
 {
 printf("\n\t\t选择操作类型: [1]打印所有学生信息  [2]打印所有课程信息 [0]返回主菜单:");
 int input = 0;
 scanf("%d", &input);
 while (getchar() != '\n');
 if (input == 1)
 {
  printf("\n\t\t学生总数:%d", link_count(stu_head));
  student_showall(stu_head);
 }
 else if (input == 2)
 {
  printf("\n\t\t课程总数:%d\n", link_count(cour_head));
  courseshowall_man(cour_head);
 }
 else if (input == 0)
  break;
 else
  printf("\n\t\t####输入错误!请重新输入!#####\n");
 }
}

void man_modifyKey()
{
 printf("\t\t******请输入原密码(10位):");
 char input[20];
 scanf("%s", input);
 while (getchar() != '\n');

 FILE *fp;
 if ((fp = fopen(MAN_F, "r")) == NULL)
 {
 printf("\t\t-------- 无法打开文件:MAN_F\n");
 exit(0);
 }
 char keyOld[11];
 fread(keyOld, 10, 1, fp);
 keyOld[10] = '\0';
 if (strcmp(keyOld, input) == 0)//修改
 {
 fclose(fp);
 char new1[100];
 char new2[100];
 while (1)
 {
  printf("\t\t*******请输入新密码(10位):");
  scanf("%s", new1);
  while (getchar() != '\n');
  printf("\t\t******请再次确认新密码(10位):");
  scanf("%s", new2);
  while (getchar() != '\n');
  if (keyexam(new1, new2) == 1)
  {
  fp = fopen(MAN_F, "w");
  fwrite(new1, 10, 1, fp);
  fclose(fp);
  printf("\n\t\t------密码修改成功!\n");
  break;
  }
  else
  printf("\t\t####前后密码不一致,请重新输入!####\n");
 }
 }
 else
 {
 fclose(fp);
 printf("\t\t####原密码输入错误,请重新选择操作类型####\n");
 }
}

void man_backups_recover()
{
 printf("\t\t*****[1]数据备份 [2]数据恢复 [3]取消\n");
 printf("\t\t*****选择操作类型:");
 int input = 0;
 scanf("%d", &input);
 while (getchar() != '\n');
 if (input == 1)
 {
 FILE *fp_source;
 FILE *fp_destination;
 {//课程信息备份
  if ((fp_source = fopen(COUR_F, "r")) == NULL)
  {
  printf("\t\t##课程数据备份失败:无法找到COUR_F文件!##\n");
  exit(0);
  }
  fp_destination = fopen(COUR_F_BACKUP, "w");
  char temp;
  int count = 0;
  while (!feof(fp_source))
  {
  if (fread(&temp, 1, 1, fp_source))
   count++;
  }
  rewind(fp_source);
  for (int i = 0; i < count; i++)
  {
  fread(&temp, 1, 1, fp_source);
  fwrite(&temp, 1, 1, fp_destination);
  }
  fclose(fp_destination);
  fclose(fp_source);
 }
 {//学生信息备份
  if ((fp_source = fopen(STU_F, "r")) == NULL)
  {
  printf("\t\t##学生数据备份失败:无法找到STU_F文件!##\n");
  exit(0);
  }
  fp_destination = fopen(STU_F_BACKUP, "w");
  char temp;
  int count = 0;
  while (!feof(fp_source))
  {
  if (fread(&temp, 1, 1, fp_source))
   count++;
  }
  rewind(fp_source);
  for (int i = 0; i < count; i++)
  {
  fread(&temp, 1, 1, fp_source);
  fwrite(&temp, 1, 1, fp_destination);
  }
  fclose(fp_destination);
  fclose(fp_source);
 }
 {//管理员信息备份
  if ((fp_source = fopen(MAN_F, "r")) == NULL)
  {
  printf("\t\t##管理员数据备份失败:无法找到MAN_F文件!##\n");
  exit(0);
  }
  fp_destination = fopen(MAN_F_BACKUP, "w");
  char temp;
  for (int i = 0; i < 10; i++)
  {
  fread(&temp, 1, 1, fp_source);
  fwrite(&temp, 1, 1, fp_destination);
  }
  fclose(fp_destination);
  fclose(fp_source);
 }
 printf("\n\t\t所有数据已经备份完毕!备份目录为C:\ stu_cour_info_system\backup\n");
 }
 else if (input == 2)
 {
 printf("\t\t选择恢复类型:[1]课程数据  [2]学生数据 [3]管理员数据:");
 int in = 0;
 scanf("%d", &in);
 while (getchar() != '\n');
 FILE *fp_source;
 FILE *fp_destination;
 if (in == 1)//course information recover
 {  //课程信息恢复
  if ((fp_source = fopen(COUR_F_BACKUP, "r")) == NULL)
  {
  printf("\t\t###课程信息恢复失败!未能找到C:\\stu_cour_info_system\\backup\\course_back.txt###\n");
  exit(0);
  }
  fp_destination = fopen(COUR_F, "w");
  char temp;
  int count = 0;
  while (!feof(fp_source))
  {
  if (fread(&temp, 1, 1, fp_source))
   count++;
  }
  rewind(fp_source);
  for (int i = 0; i < count; i++)
  {
  fread(&temp, 1, 1, fp_source);
  fwrite(&temp, 1, 1, fp_destination);
  }
  fclose(fp_destination);
  fclose(fp_source);
  printf("\n\t\t课程信息恢复成功!\n");
  cour_head = load_cour();
  cour_tail = locate_end(cour_head);
 }
 else if (in == 2)//student information recover
 { //学生信息恢复
  if ((fp_source = fopen(STU_F_BACKUP, "r")) == NULL)
  {
  printf("\t\t###学生信息恢复失败!未能找到C:\\stu_cour_info_system\\backup\\student_back!###\n");
  exit(0);
  }
  fp_destination = fopen(STU_F, "w");
  char temp;
  int count = 0;
  while (!feof(fp_source))
  {
  if (fread(&temp, 1, 1, fp_source))
   count++;
  }
  rewind(fp_source);
  for (int i = 0; i < count; i++)
  {
  fread(&temp, 1, 1, fp_source);
  fwrite(&temp, 1, 1, fp_destination);
  }
  fclose(fp_destination);
  fclose(fp_source);
  printf("\n\t\t学生数据恢复成功!\n");
  stu_head = load_stu();
  stu_tail = locate_end(stu_head);
 }
 else if (in == 3)//manager information recover
 {
  //恢复管理员数据
  if ((fp_source = fopen(MAN_F_BACKUP, "r")) == NULL)
  {
  printf("\t\t###管理员数据恢复失败!未能找到C:\\stu_cour_info_system\\backup\\course_back\n");
  exit(0);
  }
  fp_destination = fopen(MAN_F, "w");
  char temp;
  for (int i = 0; i < 10; i++)
  {
  fread(&temp, 1, 1, fp_source);
  fwrite(&temp, 1, 1, fp_destination);
  }
  fclose(fp_destination);
  fclose(fp_source);
  printf("\n\t\t管理员数据恢复成功!\n");
 }
 else
  printf("\t\t###输入错误!###\n");
 }
 else if (input == 3)
 ;
 else
 printf("\t\t###输入错误,请重新输入!####\n");
}

void man_search_stu(student *head)
{
 while (1)
 {
 printf("\n\t\t请输入学号或姓名进行查找,返回上级菜单请输入0000:");
 char input[50];
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, "0000") == 0)
  break;

 student* p_stu;
 if ((input[0] >= 48) && (input[0] <= 57))
  p_stu = studentnamefind_num(head, input);
 else
  p_stu = studentnamefind_char(head, input);

 if (p_stu == stu_tail)
 {
  printf("\n\t\t#####没有该学生的信息,请重新输入!#####/n");
  continue;
 }

 if (p_stu == NULL)
  p_stu = head;
 else
  p_stu = p_stu->next;

 printf("\n\t\t该学生信息如下:");
 student_showone(p_stu);
 }
}

void courseshowone_man(course *ad)
{
 if (ad == NULL)
 printf("无课程");
 else
 {
 printf("\n\t\t------------------------------------------------------");
 printf("\n\t\t课程编号:%s\n", ad->num);
 printf("\t\t课程名称:%s\n", ad->name);
 printf("\t\t课程性质:%s\n", ad->nature);
 printf("\t\t开课学期:%s\n", ad->term);
 printf("\t\t总学时:%lf\n", ad->time_all);
 printf("\t\t授课学时:%lf\n", ad->time_teach);
 printf("\t\t实验或上机学时:%lf\n", ad->time_exp);
 printf("\t\t学分:%lf\n", ad->score);
 printf("\t\t总容纳学生人数:%d\n", ad->stu_max);
 printf("\t\t已选学生人数:%d\n", ad->stu_sum);
 printf("\t\t已选学生:\n");
 if (ad->stu_sum == 0)
  printf("\t\t没有人选该课程\n");
 else
  for (int i = 0; i <ad->stu_sum; i++)
  {
  if (i % 5 == 0)
   printf("\t\t");
  student* temp = studentnamefind_num(stu_head, ad->stu[i]);
  if (temp == NULL)
   temp = stu_head;
  else
   temp = temp->next;
  printf("[%d] %s", i + 1, temp->name);
  if (i > 0 && i % 5 == 0)
   printf("\n");
  }
 printf("\n\t\t------------------------------------------------------");
 }
}

void courseshowall_man(course *head)
{

 course *p;
 p = head;
 if (p == NULL)
 {
 printf("\t\t无课程\n");
 return;
 }
 while (p != NULL)
 {
 courseshowone_man(p);
 p = p->next;
 }
}

studetn.cpp

#include<stdio.h>
#include<string.h>
#include"all.h"
#include<stdlib.h>
#include<malloc.h>
#include<ctype.h>

extern student* stu_head;
extern course* cour_head;
extern course *cour_tail;
extern student *stu_tail;// 这四个指针变量在main.cpp中已经声明为全局变量

student* stu_login(student* head)
{
 student* copy_head = head;
 char input[100];
 printf("\t\t*******请输入学号:");
 scanf("%s", input);
 while (getchar() != '\n');
 student* temp;
 temp = studentnamefind_num(head, input);
 if (temp == NULL)//the first student
 return copy_head;
 else if ((temp != NULL) && (temp->next == NULL))//no such a student
 return NULL;
 else
 return temp->next;
}

int stu_menu()
{
 printf("\n\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~学生菜单~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 printf("\n\t\t---[1]:打印课程信息");
 printf("\n\t\t---[2]:查找课程信息");
 printf("\n\t\t---[3]:选择新的课程");
 printf("\n\t\t---[4]:删除已选课程");
 printf("\n\t\t---[5]:查看个人信息");
 printf("\n\t\t---[6]:修改登陆密码");
 printf("\n\t\t---[0]:注销");
 printf("\n\n\t\t---请从<0-6>中选择操作类型:");
 int n = input_limit0(6);
 return n;
}

void courseshow_nature(course *head)
{

 course *p;
 char ad[MAXN];
 while (true)
 {
 int flag = 0, sum = 0;
 p = head;
 printf("\t\t请输入要查找课程的性质,取消查找请输入0000:");
 scanf("%s", ad);
 while (getchar() != '\n');
 if (strcmp(ad, "0000") == 0)
  break;
 while (p != NULL)
 {
  if (strcmp(ad, p->nature) == 0)
  {
  course_showone(p);
  flag = 1;
  sum++;
  }
  p = p->next;
 }
 if (flag == 0)
  printf("\n\t\t没有该课程!####");
 }
 return;
}

void courseshow_term(course *head)
{

 course *p;
 char ad[MAXN];
 while (true)
 {
 int flag = 0, sum = 0;
 p = head;
 printf("\t\t请输入要查找课程的开课学期,取消查找请输入0000:");
 scanf("%s", ad);
 while (getchar() != '\n');
 if (strcmp(ad, "0000") == 0)
  break;
 while (p != NULL)
 {
  if (strcmp(ad, p->term) == 0)
  {
  course_showone(p);
  flag = 1;
  sum++;
  }
  p = p->next;
 }
 if (flag == 0)
  printf("\n\t\t#####没有该课程!#####");
 }
 return;
}

void coursechoose( course* head, student* stu)//选课函数
{
 if (stu->score_sel <stu->score_all )
 printf("\n\t\t你的总学分少于%lf,赶快去选课吧!\n", stu->score_all);
 while (1)
 {
 printf("\n\t\t请输入课程的编号或名称进行选课,取消选课请输入0000:");
 char input[50];
 scanf("%s", input);
 while(getchar()!='\n');
 if (strcmp(input, "0000")==0)
  break;
 course* find = NULL;
 if ((input[0] >= 48) && (input[0] <= 57))
  find = coursenumfind_num(head, input);
 else
  find = coursenamefind_char(head, input);

 if (find == cour_tail)
 {
  printf("\n\t\t#####该课程不存在!请重新输入#####\n");
  continue;
 }
 else if (find == NULL)
  find = head;
 else
  find = find->next;

 if (find->stu_sum == find->stu_max)
  printf("\n\t\t####该课程人数已满,无法选择!#####\n");
 else
 {
  int judge = 0;
  for (int i = 0; i < stu->course_sum; i++)
  {
  if (strcmp(stu->course[i], find->num)==0)
  {judge = 1; break;}
  }
  if (judge == 1)
  {
  printf("\n\t\t####该课程已经选择过了!####\n");
  continue;
  }
  else
  {
  stu->course_sum++;
  strcpy(stu->course[stu->course_sum - 1], find->num);
  stu->score_sel += find->score;

  find->stu_sum++;
  strcpy(find->stu[find->stu_sum - 1], stu->num);
  printf("\n\t\t该课程选择成功!\n");
  }
 }

 }

 store_cour(cour_head);
 store_stu(stu_head);
}

void coursenumfindtip(course *head)
{
 char buf[MAXN];
 course *result;
 while (true)
 {

 printf("\t\t请输入要查找课程的编号,取消查找请输入0000:");
 scanf("%s", buf);
 while (getchar() != '\n');
 if (strcmp(buf, "0000") == 0)
  break;
 result = coursenumfind_num(head, buf);
 if (result != cour_tail)
 {
  if (result == NULL)
  result = head;
  else
  result = result->next;
  course_showone(result);
 }
 else
  printf("\t\t#####没有该课程!#####\n");
 }
}

void coursenamefindtip(course *head)
{
 char buf[MAXN];
 course *result;
 while (1)
 {
 printf("\t\t请输入要查找课程的名称,取消查找请输入0000:");
 scanf("%s", buf);
 while (getchar() != '\n');
 if (strcmp(buf, "0000") == 0)
  break;
 result = coursenamefind_char(head, buf);
 if (result != cour_tail)
 {
  if (result == NULL)
  result = head;
  else
  result = result->next;
  course_showone(result);
 }
 else
  printf("\t\t#####无所查找的课程!#####\n");
 }
}

void stu_dele_cour( course * head, student * stu)
{
 while (1)
 {
 printf("\n\t\t请输入需要删除课程的编号,返回上级菜单请输入0000:");
 char input[50];
 scanf("%s", input);
 while (getchar() != '\n');
 if (strcmp(input, "0000") == 0)
  break;
 int i = 0, result = -1;

 /*删除该学生记录中选课的信息*/
 for (; i < stu->course_sum; i++)
 {
  if (strcmp(input, stu->course[i]) == 0)
  { result = i; break; }
 }
 if (result == -1)
  {printf("\n\t\t####你没有选择这门课程!请重新输入!");continue;}
 strcpy(stu->course[result], stu->course[stu->course_sum - 1]);
 stu->course_sum--;   

 course* find= coursenumfind_num(head, input);
 if (find == NULL)
  find = head;
 else
  find =find->next;

 /*删除该课程记录中学生的信息*/
 i = 0, result = 0;
 for (; i < find->stu_sum; i++)
 {
  if(strcmp(input,find->stu[i])==0)
  { result = i; break;}
 }
 strcpy(find->stu[result], find->stu[find->stu_sum - 1]);
 find->stu_sum --;                            

 printf("\n\t\t课程删除成功!\n");
 }

 store_stu(stu_head);
 store_cour(cour_head);
}

void stu_modifyKey(student* stu)
{
 printf("\t\t******请输入原密码(8位):");
 char input[20];
 scanf("%s", input);
 while (getchar() != '\n');

 char keyOld[10];
 strcpy(keyOld, stu->password);
 if (keyexam(keyOld, input) == 1)//修改
 {
 char new1[100];
 char new2[100];
 while (1)
 {
  printf("\t\t*******请输入新密码(8位):");
  scanf("%s", new1);
  while (getchar() != '\n');
  printf("\t\t******请再次确认新密码(8位):");
  scanf("%s", new2);
  while (getchar() != '\n');
  if (keyexam(new1, new2) == 1)
  {
  strcpy(stu->password, new1);
  store_stu(stu_head);
  printf("\n\t\t------密码修改成功!\n");
  break;
  }
  else
  printf("\t\t####前后密码不一致,请重新输入!####\n");
 }
 }
 else
 printf("\t\t####原密码输入错误,请重新选择操作类型####\n");
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言通讯录管理系统完整版

    C语言实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计算字节//

  • 基于C语言实现学生选课系统

    鉴于C语言实现的通讯录,为了巩固C语言的基础知识,试着写一个简单的学生选课系统. 思路比较简单: 1.回滚显示各种提示信息或操作信息 2.链表操作. 代码中有管理员部分功能没有实现,学生和老师的功能基本实现,但有待加固,如果初学者可是试着去完善一下. 还可以将老师,学生的信息输出到文件文本中,本代码中没有实现,但并不是很难. 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> /* 总链表--

  • C语言实现的学生选课系统代码分享

    好久没玩过C语言了,上一次还是在大二的时候...废话不多说,这里有一个C语言实现的学生选课系统代码,分享给大家,具体如下: #include<stdio.h> #include<stdlib.h> int N1,N2,kk1,kk2,kk3; struct couse * head1; struct student * head2; struct couse//课程信息结构体 { int num1; char name1[20]; int score; int nelepeo; /

  • C语言实现学生选课系统

    本文实例为大家分享了C语言实现学生选课系统的具体代码,供大家参考,具体内容如下 代码: #include<stdio.h> #include<windows.h> #include<stdlib.h> #include<conio.h> typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #define CLASS_CLS

  • C语言编写学生成绩管理系统

    用C语言编写学生成绩管理系统代码,供大家参考,具体内容如下 C语言实现学生成绩管理系统实战教学 https://www.jb51.net/article/154767.htm (1)给出所选课程设计题目以及本题目具体所要完成的功能要求说明. 1.课程设计题目:学生成绩管理系统 2.完成的功能要求: (1).主要实现的功能: 1---学生输入 2---学生插入 3---学生查询(按学号) 4---学生删除 5---学生输出 6---计算每名学生的平均分并输出 7---计算每科的平均分并输出 8--

  • C语言学生管理系统源码分享

    本文实例为大家分享了C语言学生管理系统源码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> //结构体可以存放的学生信息最大个数,不可变变量 int const MAX_LENGTH=100; //学生信息结构体数组,最多可以存放100个学生信息 struct student{ int id; //学号 char *name; //姓名 int age; //年龄 float c_score; //C语言成绩 float engl

  • C语言实现学生选课系统完整版

    本文实例为大家分享了C语言实现学生选课系统的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> int N1,N2,kk1,kk2,kk3; struct couse * head1; struct student * head2; struct couse//课程信息结构体 { int num1; char name1[20]; int score; int nelepeo;//课程已选人数 int Melepeo;//课

  • C语言职工信息管理系统源码

    本文实例为大家分享了C语言职工信息管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct worker { char ID[20];//工号 char name[20];//姓名 char sex[5];//性别 char born[20];//生日 char edu[20];//学历 char po

  • C语言实现简单学生选课管理系统

    本文实例为大家分享了C语言实现学生选课管理系统的具体代码,供大家参考,具体内容如下 这是我们大一C语言课程设计的最终作品,涉及文件读写操作.链表的一系列操作. 源代码由头文件all.h.主函数文件main.cpp以及功能函数文件student.cpp.manager.cpp.common.cpp组成. 涉及的文件读写操作需要先手动创建文件,文件路径可以在all.h的宏定义中更改 使用vs2017的c++编译器,兼容c语言,现贴上源代码和运行截图,供感兴趣的童鞋参考,水平有限还望多多包涵. 运行截

  • 基于C语言实现简单学生成绩管理系统

    本文实例为大家分享了C语言实现简单学生成绩管理系统的具体代码,供大家参考,具体内容如下 一.系统主要功能 1.密码登录2.输入数据3.查询成绩4.修改成绩5.输出所有学生成绩6.退出系统 二.代码实现 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 10 struct student {     char num[10];     char name[20];     int ol

  • C语言实现简单学生成绩管理系统

    本文实例为大家分享了C语言实现学生成绩管理系统的具体代码,供大家参考,具体内容如下 C语言小项目 实现一个学生成绩管理系统 系统功能: 1.实现所有学生成绩的录入(利用结构体数组),当输入字符为end时候,结束成绩的录入:  2.实现所有学生信息的输出  3.输入指定学生姓名,并能输出这名学生的信息  4.将学生成绩按照语文和数学成绩排序 思路: 1. 首先,先把这个小项目的框架打好.考虑要写几个文件,每一个文件里面实现怎样的功能.考虑到这个小项目的代码量以及程序的易读性,我决定将写三个文件.一

  • C语言实现简单学生学籍管理系统

    本文实例为大家分享了C语言实现学生学籍管理系统的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #define N 100 /*存储100个学生的学籍信息*/ int flag; /*标记是否登录*/ struct date /*出生日期*/ { int year; int month; int day; }; struct

  • C语言实现简单学生成绩管理系统项目

    本文实例为大家分享了C语言实现学生成绩管理系统的具体代码,供大家参考,具体内容如下 系统界面及相关要求 1)系统运行,打开如下界面.列出系统帮助菜单(即命令菜单),提示输入命令. 2)开始时还没有录入成绩,所以输入命令 L 也无法列出成绩.应提示“成绩表为空!请先使用命令 T 录入学生成绩.” 同理,当输入其他的成绩处理命令时也作相应的处理. 3)输入命令 T,调用Type子函数录入成绩. 界面提示输入学生人数 输入3 提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,提

  • C语言实现简单学生信息管理系统

    学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能. 在main函数里调用这8个函数 学生信息包含姓名.年龄.学号.成绩,需要定义一个结构体(结构体是全局变量,所以需要全局声明): typedef struct _student{     char name[20];     int age;     int stuNum;     int score; }student; 需要有一个存储数据的空间,所以使用单链表存储,定义如下: typedef struct _Node{     s

  • C#实现简单学生信息管理系统

    本文实例为大家分享了C#实现简单学生信息管理系统的具体代码,供大家参考,具体内容如下 一.运行环境windows,使用vs编译软件 二.主要功能 登录.添加学生信息.修改学生信息.删除学生信息.查询学生信息 三.实现步骤 1.登陆界面功能实现 老规矩,先贴下主要代码: //构造方法 public Login() { InitializeComponent(); this.label3.Parent = this; this.label1.BackColor = Color.Transparent

  • C语言实现简单员工工资管理系统

    本文实例为大家分享了C语言实现简单员工工资管理系统的具体代码,供大家参考,具体内容如下 (一)公司现状分析 1.公司主要有经理.技术员.销售员.销售经理4类岗位人员,他们都有基本信息:职工号.姓名.性别.部门.岗位.工龄.当月工资等.一个部门最多只能有一个销售经理,一个部门可以有多个销售员,一个部门可以有若干个经理和若干技术员. 2.员工数据包括基本资料数据和工资数据两部分,员工基本资料数据包括职工号.姓名.性别.部门.岗位.工龄:员工工资数据包括工作时间.小时工资.销售额.底薪.当月工资. 3

  • C语言链表实现学生信息管理系统程序设计

    本文实例为大家分享了C语言链表实现学生信息管理系统的具体代码,供大家参考,具体内容如下 事先存入的数据: 菜单 创建链表并倒序输出 输出链表中的全部信息 写入信息并保存至文件中(覆盖原有文件) 随机读取 指定查找 添加信息 指定删除 特殊查找 特殊删除 退出系统 #include<iostream> #include<string.h> #include<stdlib.h> #include<iomanip> #include<fstream>

随机推荐