鉴于C语言实现的通讯录,为了巩固C语言的基础知识,试着写一个简单的学生选课系统。
思路比较简单:
1.回滚显示各种提示信息或操作信息
2.链表操作。
代码中有管理员部分功能没有实现,学生和老师的功能基本实现,但有待加固,如果初学者可是试着去完善一下。
还可以将老师,学生的信息输出到文件文本中,本代码中没有实现,但并不是很难。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 总链表——存放所有信息 */ typedef struct Sum_Node { /* 学生信息 */ char stuNo[20][20]; char stuName[20][20]; char stuSex[20][20]; /* 课程信息 */ char CourseNum[20]; char CourseName[20]; char CourseTeacher[20]; struct Sum_Node *next; }TotalNode; /* 链表管理员——暂时不需要 */ /*typedef struct Node { char Num[20]; char Name[20]; char Sex[10]; struct Node *next; }Manager_Node;*/ char studentAccount[20]; char studentPassword[20]; char teacherAccount[20]; char teacherPassword[20]; char managerAccount[20]; char managerPassword[20]; /* 定义结构体指针 */ TotalNode *pTeacher; TotalNode *pStudent; /* 函数的声明 */ void checkPerson_Msg(TotalNode *phead,int n); void CreateTeacherNode(TotalNode *head); /* 学生信息的输出-链表 */ void OutStudentNode(TotalNode *head,char *Account) { TotalNode *p; int num=0; int i,j; int flag=0; char Account_random[20]=""; pStudent=pTeacher; // 学生和老师用的链表是同一个 p=pStudent; puts("******所选课程信息******"); puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); if(pStudent==NULL) { puts("没有数据!"); puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); return; } printf("请输入所要查询人的姓名:"); gets(Account_random); // 获取所要查询的学生姓名 if(0 == Account_random[0]) { gets(Account_random); } while(p!=NULL) { for(j=0;j<20;j++) { if(0 == strcmp(p->stuName[j],Account_random)) { printf("课程代码:%st",p->CourseNum); printf("课程名称:%st",p->CourseName); printf("课程老师:%st",p->CourseTeacher); for(i=0;i<20;i++) { if(p->stuNo[i][0]!=' ') { num++; } } printf("选课学生:%dt",num); num=0; // 清0操作 putchar('n'); flag=1; } } p=p->next; } if(0 == flag) { puts("没有该学生选课信息!!!!"); } puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); putchar('n'); } /* 学生信息的插入-链表 */ void InsertStudentNode(TotalNode *head,char *Account) { TotalNode *p; int i; char courseCode[20]=""; pStudent=pTeacher; // 学生和老师用的链表是同一个,都是链表头 p=pStudent; if(p==NULL) { puts("等待教师录入选课信息,请下次再进行选择!!"); return; } printf("【请输入正确的课程代码】"); gets(courseCode); if(0 == courseCode[0]) { gets(courseCode); } while(p!=NULL) { if(0 == strcmp(p->CourseNum, courseCode)) { for(i=0;i<20;i++) { if(p->stuNo[i][0] == ' ') { printf("请输入学号:"); gets(p->stuNo[i]); printf("请输入姓名:"); gets(p->stuName[i]); printf("请输入性别:"); gets(p->stuSex[i]); puts("选课成功!!!!"); return; } } } p=p->next; } puts("$$$$$$选课失败,请重新选择$$$$$$"); } /* 删除所选课程 */ void DeleteStudentNode(TotalNode *head,char *Account) { char coursNo[20]=""; // 课程代码 char student[20]=""; // 学生姓名 TotalNode *p; int i; int flag=0; pStudent=pTeacher; // 学生和老师用的链表是同一个,都是链表头 p=pStudent; if(pStudent==NULL) { puts("没选该课程,删除失败!!!!"); return; } printf("【输入学生姓名】"); gets(student); if(0 == student[0]) { gets(student); } printf("【请输入删除的课程代码】"); gets(coursNo); if(0 == coursNo[0]) { gets(coursNo); } while(p!=NULL) { if(0==strcmp(p->CourseNum,coursNo)) // 查询所要删除的课程代码 { for(i=0;i<20;i++) { if(0==strcmp(p->stuName[i],student)) { /* 初始化清0操作 */ p->stuNo[i][0]=' '; p->stuName[i][0]=' '; p->stuSex[i][0]=' '; puts("删除成功!!!!"); flag=1; // 删除标志位 } } } p=p->next; } if(0 == flag) // 如果删除成功标志位置1 { puts("删除失败!!!!"); } } /* 教师信息的输出-链表 */ void OutTeacherNode(TotalNode *head) { TotalNode *p; int num=0; int i; p=pTeacher; puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); if(pTeacher==NULL) { puts("没有数据!"); puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); return; } while(p!=NULL) { printf("课程代码:%st",p->CourseNum); printf("课程名称:%st",p->CourseName); printf("课程老师:%st",p->CourseTeacher); for(i=0;i<20;i++) { if(p->stuNo[i][0]!=' ') { num++; } } printf("选课学生:%dt",num); num=0; // 清0操作 putchar('n'); p=p->next; } puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); putchar('n'); } /* 教师信息的插入-链表 */ void InsertTeacherNode(TotalNode *head) { TotalNode *p; TotalNode *q; int i; p=pTeacher; // 教师链表的头 if(pTeacher==NULL) { CreateTeacherNode(head); puts("添加成功!"); return; } while(p!=NULL) { if(p->next == NULL) { q=(TotalNode *)malloc(sizeof(TotalNode)); p->next=q; q->next=NULL; for(i=0;i<20;i++) { q->stuNo[i][0]=' '; } printf("请输入课程代码:"); gets(q->CourseNum); if(0 == *q->CourseNum) { gets(q->CourseNum); } printf("请输入课程名称:"); gets(q->CourseName); printf("请输入课程教师:"); gets(q->CourseTeacher); puts("添加成功!"); break; } p=p->next; } //pTeacher=head; } /* 教师信息的插入-链表 */ void CreateTeacherNode(TotalNode *head) { int i; pTeacher=(TotalNode *)malloc(sizeof(TotalNode)); pTeacher->next=NULL; for(i=0;i<20;i++) { pTeacher->stuNo[i][0]=' '; } printf("请输入课程代码:"); gets(pTeacher->CourseNum); if(0 == *pTeacher->CourseNum) { gets(pTeacher->CourseNum); } printf("请输入课程名称:"); gets(pTeacher->CourseName); printf("请输入课程教师:"); gets(pTeacher->CourseTeacher); //pTeacher=head; } /* 删除指定数据 */ void DeleteTeacherNode(TotalNode *phead) { char coursNo[20]=""; // 课程代码 TotalNode *p; TotalNode *s; p=pTeacher; // 教师链表的头 s=pTeacher; if(NULL==pTeacher) { puts("没有课程信息!!!!"); return; } printf("【请输入删除的课程代码】"); gets(coursNo); if(0 == coursNo[0]) { gets(coursNo); } if(0 == strcmp(p->CourseNum,coursNo)) { pTeacher=p->next; puts("删除成功!!"); return; } while(p != NULL) { if(0 == strcmp(p->CourseNum,coursNo)) { s->next=p->next; puts("删除成功!!"); return; } s=p; p=p->next; } } /* 功能显示 */ void display(TotalNode *phead) { int n; while(1) { puts("=========请选择登录页面========="); puts("[1]学生登录"); puts("[2]教师登录"); puts("[3]管理员登录"); puts("[4]退出系统"); while(1) // 循环检查输入的值是否正确 { printf("【请选择】"); scanf("%d",&n); if(n>4 || n<1) { puts("输入有误,请选择正确的选项:"); continue; // 输入不正确,重新输入 } else { break; // 输入正确,退出循环 } } if( 1 == n ) // 学生登录系统 { puts("=========欢迎登录学生系统========="); printf("请输入账号和密码n"); checkPerson_Msg(phead,1); } if( 2 == n ) // 老师登录系统 { puts("=========欢迎登录教师系统========="); printf("请输入账号和密码n"); checkPerson_Msg(phead,2); } if( 3 == n ) // 管理员登录系统 { puts("=========欢迎登录管理员系统========="); printf("请输入账号和密码n"); checkPerson_Msg(phead,3); } if( 4 == n ) // 退出系统 { puts("@@@@@@@@@欢迎下次登录,再见!!!@@@@@@@@@"); exit(0); } } } /* 学生登录后的操作,查询、修改 */ void Student_Mng(TotalNode *phead, char *Account,int n) { switch(n) { case 1: // 查询 OutStudentNode(phead,Account); break; case 2: // 添加 InsertStudentNode(phead,Account); break; case 3: // 删除 DeleteStudentNode(phead,Account); break; case 4: ; // 返回主页面,上层已经实现,此处不需要考虑 break; default: puts("异常!"); break; } } /* 教师登录后的操作,查询、修改 */ void Teacher_Mng(TotalNode *phead, char *Account,int n) { switch(n) { case 1: // 查询学生选课情况 OutTeacherNode(phead); break; case 2: // 添加和删除课程信息 InsertTeacherNode(phead); break; case 3: DeleteTeacherNode(phead); break; case 4: break; // 上层实现其功能 default: puts("异常!"); break; } } /* 管理员登录后的操作,查询、修改 */ void Manager_Mng(char *Account, int n) { switch(n) { case 1: break; case 2: break; case 3: break; default: puts("异常!"); break; } } /* 显示各功能登录后的信息 */ void display_Detailed(TotalNode *phead ,char *Account,int n) { int in; switch(n) { case 1: while(1) { printf("=========欢迎%s同学=========n",Account); puts("[1]查询已选课程"); // 查询自己所选的所有课程包括:课程代码、课程名称、任课老师 puts("[2]添加课程"); // 增加所选课程 puts("[3]删除所选课程"); // 删除所选课程 puts("[4]返回主页面"); printf("【请选择】"); scanf("%d",&in); if(4 == in) { return; // 返回上层登录页面 } Student_Mng(pStudent,Account, in); //puts("[4]"); } break; case 2: while(1) { printf("=========欢迎%s老师=========n",Account); puts("[1]查询学生选课信息"); // puts("[2]添加老师课程信息"); // puts("[3]删除老师课程信息"); // puts("[4]返回主页面"); printf("【请选择】"); scanf("%d",&in); if(4 == in) { return; // 返回上层登录页面 } Teacher_Mng(pTeacher,Account, in); } //puts("[4]"); break; case 3: printf("=========欢迎%s同志=========n",Account); puts("[1]查询学生所选课程信息"); puts("[2]修改选课信息"); puts("[3]返回主页面"); scanf("%d",&in); Manager_Mng(Account, in); //puts("[4]"); break; default: puts("异常!"); break; } } /* 验证账号密码 */ void checkAccountandPassword(TotalNode *phead ,char *Account, char *Password,int n) { while(1) { gets(Account); /**/ if(0 == strcmp(Account,"wantin")) { while(1) { printf("请输入密码:"); gets(Password); if(0 == strcmp(Password,"123456")) { display_Detailed(phead,Account, n); return; } } } else { printf("请输入账号:"); } } } /* 校验学生、教师、管理员的账号 密码 */ void checkPerson_Msg(TotalNode *phead , int n) { switch(n) { case 1: // 学生登录 char studentAccount[20]; char studentPassword[20]; checkAccountandPassword(phead, studentAccount,studentPassword,n); break; case 2: // 教师登录 char teacherAccount[20]; char teacherPassword[20]; checkAccountandPassword(phead, teacherAccount,teacherPassword,n); break; case 3: // 管理员登录 char managerAccount[20]; char managerPassword[20]; checkAccountandPassword(phead, managerAccount,managerPassword,n); break; default: puts("异常!"); break; } } /* */ void main() { TotalNode *phead=NULL; display(phead); }
大家可以根据下面的操作来帮助读懂这段代码。
操作结果如下:
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/482854.html