c语言之一个简单的《学生教师管理系统》小结记录(一)
大体流程图
大概的一个项目要实现如上功能
首先大体分块写函数
1、先实现界面的相关功能
写一个简单的界面登录函数
终端界面编辑相关参数见 c语言linux终端花里胡哨输出
先做一个简单的登录界面
千万不要觉得界面编辑没有用,上图!感受一下差距吧!
编辑界面之前
编辑之后
差别应该很明显了吧!!!!美感提升一个档次。
此博文是在基本完成之后回顾所做,所以进行了界面优化,使用起来舒适度得到了极大的提升。
1 /*登录界面菜单*/ 2 int login(Node *pHead, TeaNode *pTHead) 3 { 4 system("clear"); 5 printf("\t\t\t"); 6 printf("\033[32m\033[1m\033[44m欢迎来到师生管理系统\n\033[0m\n"); 7 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \033[1m登录选项\033[0m\033[33m✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 8 printf("|\t\t\t\t\t\t\t\t|\n"); 9 printf("\t\t\t1.管理员登录\n"); 10 printf("|\t\t\t\t\t\t\t\t|\n"); 11 printf("\t\t\t2.教师登录\n"); 12 printf("|\t\t\t\t\t\t\t\t|\n"); 13 printf("\t\t\t3.学生登录\n"); 14 printf("|\t\t\t\t\t\t\t\t|\n"); 15 printf("\t\t\t0.退出\n"); 16 printf("|\t\t\t\t\t\t\t\t|\n"); 17 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 18 printf("请选择:"); 19 char ch; 20 ch = getchar(); 21 switch(ch) 22 { 23 case '1': 24 { 25 int ret = adminlogin(); 26 if(ret != 1) 27 { 28 printf("管理员登入失败!\n\n\n"); 29 printf("按任意键退出系统!!!"); 30 char ch1; 31 ch1 = getchar();//利用字符获取函数实现简单的界面停留 32 return 0; 33 } 34 else if(ret == 1) 35 return 1;//返回1,回在主函数中根据不同的返回值进入不同的操作菜单 36 } 37 case '2': 38 { 39 40 int ret = tealogin(pTHead); 41 while(ret != 1 && ret != 2) 42 { 43 system("clear"); 44 printf("教师登入失败!\n"); 45 printf("请重新输入!\n"); 46 ret = tealogin(pTHead);//调用教师登录函数 47 getchar(); 48 } 49 if(ret == 1) 50 //由于教师是班主任和任课老师执行是有差别的,所以函数中返回值为1时为班主任,返回值为2时为任课老师 51 { 52 getchar(); 53 return 2; 54 break; 55 } 56 if(ret == 2) 57 { 58 getchar(); 59 return 3; 60 break; 61 } 62 } 63 case '3': 64 { 65 int retstu = stulogin(pHead);//学生登录函数 66 getchar(); 67 while(retstu != 1) 68 { 69 system("clear"); 70 printf("学生登入失败!\n"); 71 printf("请重新输入!\n"); 72 retstu = stulogin(pHead); 73 getchar(); 74 } 75 if(retstu == 1) 76 { 77 return 4;//返回值为4 78 break; 79 } 80 } 81 case '0': 82 { 83 return 0;//返回0,退出管理系统 84 } 85 default: 86 { 87 printf("\n选项输入错误!请重新输入"); 88 login(pHead, pTHead); 89 }; 90 } 91 }
主函数利用while循环可以保证菜单不退出
1 void main() 2 { 3 int retlogin = login(pHead, pTHead);//读取登录菜单返回值,不同返回值代表不同用户在操作 4 while(retlogin != 0)//为0时退出,不为0时一直循环,实现系统的持续运行 5 { 6 while(retlogin == 1)//管理员身份登入 7 { 8 if(admindo(pTHead) == 1)//管理员执行函数 9 { 10 getchar();//吸收字符 11 retlogin = login(pHead, pTHead); 12 } 13 } 14 while(retlogin == 2)//班主任 15 { 16 if(headteacherdo(pHead, pTHead,IDhao) == 1) 17 { 18 getchar(); 19 retlogin = login(pHead, pTHead); 20 } 21 } 22 while(retlogin == 3)//任课老师 23 { 24 if(teacherdo(pTHead, pHead) == 1) 25 { 26 getchar(); 27 retlogin = login(pHead, pTHead); 28 } 29 } 30 while(retlogin == 4)//学生登录 31 { 32 if(studo(pHead) == 1)//学生执行菜单 33 { 34 getchar(); 35 retlogin = login(pHead, pTHead); 36 } 37 } 38 } 39 }
执行选项菜单
1 /*管理员执行选项*/ 2 int admindo(TeaNode *pTHead) 3 { 4 printf("\033[32m\033[1m\033[44m ☃ 管理员admin,您好!\n\033[0m\n"); 5 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 操作选项✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 6 printf("|\t\t\t\t\t\t\t\t|\n"); 7 printf("\t\t\t ❁ 1.教师信息录入\n"); 8 printf("|\t\t\t\t\t\t\t\t|\n"); 9 printf("\t\t\t ❁ 2.查看教师信息\n"); 10 printf("|\t\t\t\t\t\t\t\t|\n"); 11 printf("\t\t\t ❁ 3.修改教师信息\n"); 12 printf("|\t\t\t\t\t\t\t\t|\n"); 13 printf("\t\t\t ❁ 4.删除教师信息\n"); 14 printf("|\t\t\t\t\t\t\t\t|\n"); 15 printf("\t\t\t ❁ 0.注销\n"); 16 printf("|\t\t\t\t\t\t\t\t|\n"); 17 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 18 printf("请选择:"); 19 char ch; 20 ch = getchar(); 21 switch(ch) 22 { 23 case '1': 24 { 25 entertea(pTHead); 26 break; 27 } 28 case '2': 29 { 30 getchar(); 31 examintea(pTHead); 32 char ch1 = '\0'; 33 printf("\n"); 34 printf("按Enter退回菜单!\n"); 35 ch1 = getchar(); 36 break; 37 } 38 case '3': 39 { 40 modifytea(pTHead); 41 break; 42 } 43 case '4': 44 { 45 printf("请输入要删除教师工号:"); 46 int teaID; 47 scanf("%d", &teaID); 48 getchar(); 49 deltea(pTHead, teaID); 50 break; 51 } 52 case '0': 53 { 54 return 1; 55 } 56 default : 57 { 58 getchar(); 59 system("clear"); 60 printf("\n选项输入错误!请重新输入"); 61 } 62 } 63 }
学生和教师的菜单类似。
登录界面一览登录界面一览
登录函数 login.c全部
1 #include "login.h" 2 3 int IDhao; 4 int IDstuhao; 5 int resID[10] = {0};//申请辞职待处理的教师ID存储 6 int resdID[10] = {0};//申请辞职未处理的教师ID 7 int resnum = 0; 8 int resokID[10] = {0};//批准辞职的教师ID 9 10 void main() 11 { 12 Node *pHead = makeNode(); 13 pHead = readFromFile(pHead); 14 TeaNode *pTHead = makeTeaNode(); 15 pTHead = readFromTeaFile(pTHead); 16 /*if(pTHead == NULL) 17 { 18 TeaNode *pTHead = makeTeaNode(); 19 writeToTeaFile(pTHead); 20 }*/ 21 22 int retlogin = login(pHead, pTHead);//读取登录菜单返回值,不同返回值代表不同用户在操作 23 while(retlogin != 0)//为0时退出,不为0时一直循环,实现系统的持续运行 24 { 25 int flag = 0; 26 while(retlogin == 1)//管理员身份登入 27 { 28 if(flag == 0) 29 { 30 resinformation(pTHead);//辞职信息窗口显示 31 flag = 1; 32 } 33 if(admindo(pTHead) == 1)//管理员执行函数 34 { 35 flag = 0; 36 getchar();//吸收字符 37 retlogin = login(pHead, pTHead); 38 } 39 } 40 while(retlogin == 2)//班主任 41 { 42 int nn = resfeedback(pTHead); 43 if(nn == 2) 44 { 45 if(headteacherdo(pHead, pTHead,IDhao) == 1) 46 { 47 directdeltea(pTHead,IDhao); 48 getchar(); 49 retlogin = login(pHead, pTHead); 50 } 51 } 52 else 53 { 54 if(headteacherdo(pHead, pTHead,IDhao) == 1) 55 { 56 getchar(); 57 retlogin = login(pHead, pTHead); 58 } 59 } 60 } 61 while(retlogin == 3)//任课老师 62 { 63 int nn = resfeedback(pTHead); 64 if(nn == 2) 65 { 66 if(teacherdo(pTHead, pHead) == 1) 67 { 68 directdeltea(pTHead,IDhao); 69 getchar(); 70 retlogin = login(pHead, pTHead); 71 } 72 } 73 else 74 { 75 if(teacherdo(pTHead, pHead) == 1) 76 { 77 getchar(); 78 retlogin = login(pHead, pTHead); 79 } 80 } 81 } 82 while(retlogin == 4)//学生登录 83 { 84 if(studo(pHead) == 1)//学生执行菜单 85 { 86 getchar(); 87 retlogin = login(pHead, pTHead); 88 } 89 } 90 } 91 92 // readFromFile(pHead); 93 // showList(pHead) 94 } 95 96 97 /*登录界面菜单*/ 98 int login(Node *pHead, TeaNode *pTHead) 99 { 100 system("clear"); 101 printf("\t\t\t"); 102 printf("\033[32m\033[1m\033[44m欢迎来到师生管理系统\n\033[0m\n"); 103 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \033[1m登录选项\033[0m\033[33m✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 104 printf("|\t\t\t\t\t\t\t\t|\n"); 105 printf("\t\t\t1.管理员登录\n"); 106 printf("|\t\t\t\t\t\t\t\t|\n"); 107 printf("\t\t\t2.教师登录\n"); 108 printf("|\t\t\t\t\t\t\t\t|\n"); 109 printf("\t\t\t3.学生登录\n"); 110 printf("|\t\t\t\t\t\t\t\t|\n"); 111 printf("\t\t\t0.退出\n"); 112 printf("|\t\t\t\t\t\t\t\t|\n"); 113 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 114 printf("请选择:"); 115 char ch; 116 ch = getchar(); 117 switch(ch) 118 { 119 case '1': 120 { 121 int ret = adminlogin(); 122 if(ret != 1) 123 { 124 printf("管理员登入失败!\n\n\n"); 125 printf("按任意键退出系统!!!"); 126 char ch1; 127 ch1 = getchar();//利用字符获取函数实现简单的界面停留 128 return 0; 129 } 130 else if(ret == 1) 131 return 1;//返回1,回在主函数中根据不同的返回值进入不同的操作菜单 132 } 133 case '2': 134 { 135 136 int ret = tealogin(pTHead); 137 while(ret != 1 && ret != 2) 138 { 139 system("clear"); 140 printf("教师登入失败!\n"); 141 printf("请重新输入!\n"); 142 ret = tealogin(pTHead);//调用教师登录函数 143 getchar(); 144 } 145 if(ret == 1) 146 //由于教师是班主任和任课老师执行是有差别的,所以函数中返回值为1时为班主任,返回值为2时为任课老师 147 { 148 getchar(); 149 return 2; 150 break; 151 } 152 if(ret == 2) 153 { 154 getchar(); 155 return 3; 156 break; 157 } 158 } 159 case '3': 160 { 161 int retstu = stulogin(pHead);//学生登录函数 162 getchar(); 163 while(retstu != 1) 164 { 165 system("clear"); 166 printf("学生登入失败!\n"); 167 printf("请重新输入!\n"); 168 retstu = stulogin(pHead); 169 getchar(); 170 } 171 if(retstu == 1) 172 { 173 return 4;//返回值为4 174 break; 175 } 176 } 177 case '0': 178 { 179 return 0;//返回0,退出管理系统 180 } 181 default: 182 { 183 printf("\n选项输入错误!请重新输入"); 184 login(pHead, pTHead); 185 }; 186 } 187 } 188 189 /*管理员登录菜单*/ 190 int adminlogin() 191 { 192 char sname[MAX_SIZE]; 193 char spwd[MAX_SIZE]; 194 system("clear"); 195 for(int i = 0; i < 3; i++) 196 { 197 //printf("\n\n\n"); 198 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 管理员登录✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n\n\n"); 199 printf("\t\t ☞ 用户名:"); 200 scanf("%s",sname); 201 getchar(); 202 printf("\n\n\n"); 203 printf("\t\t ☞ 密 码:"); 204 set_disp_mode(STDIN_FILENO,0); 205 getpasswd(spwd, MAX_SIZE); 206 set_disp_mode(STDIN_FILENO,1); 207 if(strcmp(sname,"admin") == 0 && strncmp(spwd,"123456",6) == 0) 208 { 209 //getchar();//吸收多余字符 210 system("clear"); 211 return 1; 212 } 213 else 214 { 215 if(i == 2) 216 { 217 return -1; 218 } 219 else 220 { 221 system("clear"); 222 printf("\t\033[31m ✖ ✖ ✖ 提示:用户名或者密码输入错误!"); 223 printf("还有%d次机会\033[0m\n\n\n", 2-i); 224 } 225 } 226 } 227 } 228 229 /*辞职信息显示*/ 230 int resinformation(TeaNode *pTHead) 231 { 232 system("clear"); 233 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \033[1m辞职信息提醒\033[0m\033[33m✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n"); 234 TeaNode *temp = makeTeaNode(); 235 if(resID[0] == 0) 236 { 237 printf("|\t\t\t\t\t\t\t\t|\n\n"); 238 printf("|\t\t\t\t\t\t\t\t|\n"); 239 printf("\t\t\t无辞职信息!\n"); 240 printf("|\t\t\t\t\t\t\t\t|\n\n"); 241 printf("|\t\t\t\t\t\t\t\t|\n\n"); 242 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 243 printf("按Enter继续..."); 244 getchar(); 245 } 246 else 247 { 248 printf("有 %d 条辞职信息待处理!\n",resnum); 249 int i =0; 250 while(i < 10) 251 { 252 if(resID[i] != 0) 253 { 254 temp = findteanode(pTHead,resID[i]); 255 printf("该教师信息为:\n"); 256 printf("--%-4d -- %-8s -- %-10s --\n", 257 temp->data.ID, temp->data.name, temp->data.password); 258 printf("-- %-3d -- %-3d -- %-3c -- %-10s --\n", 259 temp->data.age,temp->data.classes, temp->data.sex, temp->data.position); 260 getchar(); 261 printf("是否同意辞职[Y/N]"); 262 char ch = '\0'; 263 while(ch != 'Y' && ch != 'N' && ch != 'y' && ch != 'n') 264 { 265 scanf("%c",&ch); 266 getchar(); 267 } 268 if(ch == 'Y' || ch == 'y') 269 { 270 int j = 0; 271 while(j < 10) 272 { 273 if(resokID[j] == 0) 274 { 275 resokID[j] = temp->data.ID; 276 break; 277 } 278 j++; 279 } 280 } 281 else if(ch == 'N' || ch == 'n') 282 { 283 printf("不同意辞职!\n"); 284 } 285 } 286 i++; 287 } 288 printf("处理完毕!\n"); 289 getchar(); 290 char ch1 = '\0'; 291 printf("按Enter进入操作菜单!\n"); 292 ch1 = getchar(); 293 system("clear"); 294 } 295 for(int z = 0; z < 10; z++) 296 { 297 resID[z] = 0; 298 } 299 resnum = 0; 300 temp = NULL; 301 } 302 303 /*辞职信息回馈*/ 304 int resfeedback(TeaNode *pTHead) 305 { 306 TeaNode *temp = makeTeaNode(); 307 temp = findteanode(pTHead, IDhao); 308 int i = 0; 309 while(i < 10) 310 { 311 // printf("%d\n",resdID[i]); 312 // printf("%d\n",resID[i]); 313 if(resdID[i] == IDhao) 314 { 315 int j = 0; 316 while(j < 10) 317 { 318 if(resID[j] == IDhao) 319 { 320 printf("辞职申请管理员还未处理,请耐心等待!\n"); 321 return 1;//辞职申请还未处理; 322 break; 323 } 324 if(resokID[j] == IDhao) 325 { 326 resokID[j] = 0; 327 resdID[i] = 0; 328 printf("辞职申请已通过,此次为最后一次登录!\n"); 329 return 2;//辞职申请已经处理并且已经批准; 330 break; 331 } 332 j++; 333 } 334 resdID[i] = 0; 335 printf("管理员未通过您的辞职申请,有事请面谈!\n"); 336 return 3;//申请辞职处理过但是不同意辞职; 337 break; 338 } 339 i++; 340 } 341 return 0;//未申请过辞职 342 } 343 344 /*管理员执行选项*/ 345 int admindo(TeaNode *pTHead) 346 { 347 system("clear"); 348 printf("\033[32m\033[1m\033[44m ☃ 管理员admin,您好!\n\033[0m\n"); 349 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 操作选项✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 350 printf("|\t\t\t\t\t\t\t\t|\n"); 351 printf("\t\t\t ❁ 1.教师信息录入\n"); 352 printf("|\t\t\t\t\t\t\t\t|\n"); 353 printf("\t\t\t ❁ 2.查看教师信息\n"); 354 printf("|\t\t\t\t\t\t\t\t|\n"); 355 printf("\t\t\t ❁ 3.修改教师信息\n"); 356 printf("|\t\t\t\t\t\t\t\t|\n"); 357 printf("\t\t\t ❁ 4.删除教师信息\n"); 358 printf("|\t\t\t\t\t\t\t\t|\n"); 359 printf("\t\t\t ❁ 0.注销\n"); 360 printf("|\t\t\t\t\t\t\t\t|\n"); 361 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 362 printf("请选择:"); 363 char ch; 364 ch = getchar(); 365 switch(ch) 366 { 367 case '1': 368 { 369 entertea(pTHead); 370 break; 371 } 372 case '2': 373 { 374 getchar(); 375 examintea(pTHead); 376 char ch1 = '\0'; 377 printf("\n"); 378 printf("按Enter退回菜单!\n"); 379 ch1 = getchar(); 380 break; 381 } 382 case '3': 383 { 384 modifytea(pTHead); 385 break; 386 } 387 case '4': 388 { 389 deltea(pTHead); 390 break; 391 } 392 case '0': 393 { 394 return 1; 395 } 396 default : 397 { 398 getchar(); 399 system("clear"); 400 printf("\n选项输入错误!请重新输入"); 401 } 402 } 403 } 404 405 /*教师登录菜单*/ 406 int tealogin(TeaNode *pTHead) 407 { 408 int teaID; 409 char teapwd[MAX_SIZE]; 410 system("clear"); 411 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 教师登录✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n\n\n"); 412 printf("\t ☞ 用户名(工号):"); 413 scanf("%d",&teaID); 414 getchar(); 415 IDhao = teaID; 416 printf("\n\n\n"); 417 printf("\t ☞ 输 入 密 码:"); 418 set_disp_mode(STDIN_FILENO,0); 419 getpasswd(teapwd, MAX_SIZE); 420 set_disp_mode(STDIN_FILENO,1); 421 //getchar();//吸收字符 422 TeaNode *p = makeTeaNode(); 423 p = findteanode(pTHead, teaID); 424 if(p == NULL) 425 { 426 return -1; 427 } 428 if(strncmp(p->data.password,teapwd,strlen(p->data.password)) == 0) 429 { 430 if(strcmp(p->data.position,"head") == 0) 431 { 432 system("clear"); 433 return 1; 434 } 435 else 436 { 437 system("clear"); 438 return 2; 439 } 440 } 441 else 442 { 443 printf("教师密码输入错误!\n"); 444 } 445 } 446 447 448 449 /*班主任执行选项*/ 450 int headteacherdo(Node *pHead, TeaNode *pTHead, int ID) 451 { 452 TeaNode *temp = makeTeaNode(); 453 temp = findteanode(pTHead, ID); 454 char name1[16]; 455 strcpy(name1, temp->data.name); 456 printf("\033[32m\033[1m\033[44m ☃ %d 班班主任 %s,您好!\n\033[0m\n",temp->data.classes,name1); 457 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 班主任操作选项 ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 458 printf("|\t\t\t\t\t\t\t\t|\n"); 459 printf("\t\t\t1.录入本班学生信息\n"); 460 printf("|\t\t\t\t\t\t\t\t|\n"); 461 printf("\t\t\t2.查看本班学生信息\n"); 462 printf("|\t\t\t\t\t\t\t\t|\n"); 463 printf("\t\t\t3.修改学生相关信息\n"); 464 printf("|\t\t\t\t\t\t\t\t|\n"); 465 printf("\t\t\t4.删除学生所有信息\n"); 466 printf("|\t\t\t\t\t\t\t\t|\n"); 467 printf("\t\t\t5.按总分排名查看成绩\n"); 468 printf("|\t\t\t\t\t\t\t\t|\n"); 469 printf("\t\t\t6.修改自己登录密码\n"); 470 printf("|\t\t\t\t\t\t\t\t|\n"); 471 printf("\t\t\t7.辞职\n"); 472 printf("|\t\t\t\t\t\t\t\t|\n"); 473 printf("\t\t\t0.注销\n"); 474 printf("|\t\t\t\t\t\t\t\t|\n"); 475 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 476 printf("请选择:"); 477 char ch = '\0'; 478 ch = getchar(); 479 switch(ch) 480 { 481 case '1': 482 { 483 enterstu(pHead); 484 break; 485 } 486 case '2': 487 { 488 getchar(); 489 examinestu(pTHead, pHead, IDhao); 490 char ch1 = '\0'; 491 printf("\n"); 492 printf("按Enter退回菜单!\n"); 493 ch1 = getchar(); 494 break; 495 } 496 case '3': 497 { 498 modifystu(pHead); 499 break; 500 } 501 case '4': 502 { 503 printf("请输入要删除学生学号:"); 504 int stuID; 505 scanf("%d", &stuID); 506 getchar(); 507 delstu(pHead, stuID); 508 break; 509 } 510 case '5': 511 { 512 getchar(); 513 bublesort(pHead); 514 writeToFile(pHead); 515 lookrank(pTHead, pHead, IDhao); 516 char ch1 = '\0'; 517 printf("\n"); 518 printf("按Enter退回菜单!\n"); 519 ch1 = getchar(); 520 break; 521 } 522 case '6': 523 { 524 changepasswd(pTHead, IDhao); 525 return 1; 526 break; 527 } 528 case '7': 529 { 530 int n; 531 n = resignation(pTHead, IDhao); 532 if(n == 0) 533 { 534 break; 535 } 536 else if(n != 0) 537 { 538 resID[resnum] = IDhao; 539 resdID[resnum] = IDhao; 540 resnum++; 541 return 1; 542 } 543 } 544 case '0': 545 { 546 return 1; 547 } 548 default : 549 { 550 getchar(); 551 system("clear"); 552 printf("\n选项输入错误!请重新输入"); 553 }; 554 } 555 } 556 557 /*任课教师执行菜单*/ 558 int teacherdo(TeaNode *pTHead, Node *pHead) 559 { 560 printf("任课教师操作选项:\n"); 561 printf("\t1.查看学生科目成绩以及排名\n"); 562 printf("\t2.修改自己登录密码\n"); 563 printf("\t3.辞职\n"); 564 printf("\t0.注销\n"); 565 printf("请选择:"); 566 char ch = '\0'; 567 ch = getchar(); 568 switch(ch) 569 { 570 case '0': 571 { 572 return 1; 573 break; 574 } 575 case '1': 576 { 577 getchar(); 578 onebublesort(pTHead, pHead, IDhao); 579 writeToFile(pHead); 580 lookrank(pTHead, pHead, IDhao); 581 char ch1 = '\0'; 582 printf("\n"); 583 printf("按Enter退回菜单!\n"); 584 ch1 = getchar(); 585 break; 586 } 587 case '2': 588 { 589 changepasswd(pTHead, IDhao); 590 return 1; 591 break; 592 } 593 case '3': 594 { 595 int n; 596 n = resignation(pTHead, IDhao); 597 if(n == 0) 598 { 599 break; 600 } 601 else if(n != 0) 602 { 603 resID[resnum] = IDhao; 604 resdID[resnum] = IDhao; 605 resnum++; 606 return 1; 607 } 608 } 609 default : 610 { 611 getchar(); 612 system("clear"); 613 printf("\n选项输入错误!请重新输入"); 614 } 615 } 616 } 617 618 619 620 /*学生登录菜单*/ 621 int stulogin(Node *pHead) 622 { 623 int stuID; 624 char stupwd[MAX_SIZE]; 625 system("clear"); 626 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 学生登录✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n\n\n"); 627 printf("\t ☞ 用户名(ID号):"); 628 scanf("%d",&stuID); 629 IDstuhao = stuID; 630 printf("\n\n\n"); 631 printf("\t ☞ 输 入 密 码:"); 632 scanf("%s",stupwd); 633 //getchar();//吸收字符 634 Node *p = makeNode(); 635 p = findnode(pHead, stuID); 636 if(p == NULL) 637 { 638 return -1; 639 } 640 if(strcmp(p->data.password,stupwd) == 0) 641 { 642 system("clear"); 643 return 1; 644 } 645 else 646 { 647 printf("密码输入错误!\n"); 648 return 0; 649 } 650 } 651 652 /*学生执行菜单*/ 653 int studo(Node *pHead) 654 { 655 Node *temp = makeNode(); 656 temp = findnode(pHead, IDstuhao); 657 char name1[16]; 658 strcpy(name1, temp->data.name); 659 printf("\033[32m\033[1m\033[44m ☃ %d 班同学 %s,您好!\n\033[0m\n",temp->data.classes,name1); 660 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 学生操作选项 ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 661 printf("|\t\t\t\t\t\t\t\t|\n"); 662 printf("\t\t\t1.学生信息查询\n"); 663 printf("|\t\t\t\t\t\t\t\t|\n"); 664 printf("\t\t\t2.登录密码修改\n"); 665 printf("|\t\t\t\t\t\t\t\t|\n"); 666 printf("\t\t\t3.成绩班级排名\n"); 667 printf("|\t\t\t\t\t\t\t\t|\n"); 668 printf("\t\t\t4.成绩学校排名\n"); 669 printf("|\t\t\t\t\t\t\t\t|\n"); 670 printf("\t\t\t0.退出\n"); 671 printf("|\t\t\t\t\t\t\t\t|\n"); 672 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 673 printf("请选择:"); 674 675 char ch = '\0'; 676 ch = getchar(); 677 switch(ch) 678 { 679 680 case '1': 681 { 682 getchar(); 683 mynews(pHead, IDstuhao); 684 char ch1 = '\0'; 685 printf("\n"); 686 printf("按Enter退回菜单!\n"); 687 ch1 = getchar(); 688 system("clear"); 689 break; 690 } 691 case '2': 692 { 693 stuchangepsw(pHead, IDstuhao); 694 return 1; 695 break; 696 } 697 case '3': 698 { 699 getchar(); 700 classranking(pHead, IDstuhao); 701 char ch1 = '\0'; 702 printf("\n"); 703 printf("按Enter退回菜单!\n"); 704 ch1 = getchar(); 705 system("clear"); 706 break; 707 } 708 case '4': 709 { 710 getchar(); 711 schoolranking(pHead, IDstuhao); 712 char ch1 = '\0'; 713 printf("\n"); 714 printf("按Enter退回菜单!\n"); 715 ch1 = getchar(); 716 system("clear"); 717 break; 718 } 719 case '0': 720 { 721 return 1; 722 break; 723 } 724 default : 725 { 726 getchar(); 727 system("clear"); 728 printf("\n选项输入错误!请重新输入"); 729 } 730 } 731 732 } 733 734 //函数getpasswd用于获得用户输入的密码,并将其存储在指定的字符数组中 735 int getpasswd(char* passwd, int size) 736 { 737 int c; 738 int n = 0; 739 740 do{ 741 c=getchar(); 742 if (c != '\n'|c!='\r'){ 743 passwd[n++] = c; 744 } 745 }while(c != '\n' && c !='\r' && n < (size - 1)); 746 passwd[n] = '\0'; 747 return n; 748 } 749 //函数set_disp_mode用于控制是否开启输入回显功能 750 //如果option为0,则关闭回显,为1则打开回显 751 int set_disp_mode(int fd,int option) 752 { 753 int err; 754 struct termios term; 755 if(tcgetattr(fd,&term)==-1){ 756 perror("Cannot get the attribution of the terminal"); 757 return 1; 758 } 759 if(option) 760 term.c_lflag|=ECHOFLAGS; 761 else 762 term.c_lflag &=~ECHOFLAGS; 763 err=tcsetattr(fd,TCSAFLUSH,&term); 764 if(err==-1 && err==EINTR){ 765 perror("Cannot set the attribution of the terminal"); 766 return 1; 767 } 768 return 0; 769 }
头文件 login.h
1 #include <termios.h> 2 #include <unistd.h> 3 #include <errno.h> 4 #include "teacherdo.h" 5 6 #define MAX_SIZE 20 7 #define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL) 8 9 /*管理员登录菜单*/ 10 int adminlogin(); 11 12 /*学生登录菜单*/ 13 int stulogin(Node *pHead); 14 15 /*学生执行菜单*/ 16 int studo(); 17 18 /*管理员执行选项*/ 19 int admindo(TeaNode *pHead); 20 21 /*主菜单*/ 22 int login(Node *pHead, TeaNode *pTHead); 23 24 /*教师登录菜单*/ 25 int tealogin(TeaNode *pTHead); 26 27 /*班主任执行菜单*/ 28 int headteacherdo(Node *pHead, TeaNode *pTHead, int ID); 29 30 /*任课教师执行菜单*/ 31 int teacherdo(TeaNode *pTHead, Node *pHead); 32 33 /*辞职信息显示*/ 34 int resinformation(TeaNode *pTHead); 35 36 /*辞职信息回馈*/ 37 int resfeedback(TeaNode *pTHead); 38 39 //函数getpasswd用于获得用户输入的密码,并将其存储在指定的字符数组中 40 int getpasswd(char* passwd, int size); 41 42 //函数set_disp_mode用于控制是否开启输入回显功能 43 //如果option为0,则关闭回显,为1则打开回显 44 int set_disp_mode(int fd,int option);
整个项目分开写到了很多个文件里,有些函数没有讲到,后续会一个一个介绍。
本着一个记录自己学习成果的态度,也希望能够给其他人有一个参考。