1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 6 struct Student 7 { 8 char id[4]; 9 char name[10]; 10 int score; 11 }; 12 13 typedef struct User 14 { 15 char userName[20]; 16 char userPassword[10]; 17 }UserInfo; 18 19 void inputNameAndPassword(); 20 void logon(); 21 void creatDataBace(); 22 void selectServe(); 23 void checkAchievement(); 24 void addAchievement(); 25 void delectAchievement(); 26 void changeAchievement(); 27 void sortAchievement(); 28 void start(); 29 30 int main(int argc, const char * argv[]) 31 { 32 start(); 33 //清屏未实现 34 system("clear"); 35 36 FILE *file; 37 file=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt", "r+"); 38 struct Student aStudent; 39 if (fread(&aStudent, sizeof(struct Student), 1, file)==0) { 40 creatDataBace(); 41 } 42 fclose(file); 43 //清屏未实现 44 45 selectServe(); 46 47 return 0; 48 } 49 50 void start() 51 { 52 int land; 53 printf("1.注册 2.登陆 "); 54 scanf("%d",&land); 55 if (land==1) { 56 logon(); 57 }else 58 { 59 if (land==2) 60 inputNameAndPassword(); 61 else 62 { 63 printf("输入有误,请重新选择 "); 64 start(); 65 } 66 } 67 } 68 69 void logon() 70 { 71 UserInfo userInput; 72 printf(" ------------------注册用户------------------"); 73 printf(" 请输入注册用户名:"); 74 scanf("%s",userInput.userName); 75 printf("请输入密码:"); 76 scanf("%s",userInput.userPassword); 77 FILE *fp; 78 if((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/user_password.txt", "a+"))==NULL) 79 { 80 printf("注册失败!"); 81 exit(0); 82 } 83 if ((fwrite(&userInput, sizeof(UserInfo), 1, fp))!=1) { 84 printf("注册失败!"); 85 exit(0); 86 } 87 fclose(fp); 88 inputNameAndPassword(); 89 } 90 91 void inputNameAndPassword() 92 { 93 UserInfo userInput,userBase[50]; 94 int i=0,count=0,chance=0; 95 96 FILE *fp; 97 if((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/user_password.txt", "r"))==NULL) 98 { 99 printf("登陆失败!"); 100 exit(0); 101 } 102 103 while(fread(&userBase[i], sizeof(UserInfo), 1, fp)!=0) 104 i++; 105 count=i; 106 fclose(fp); 107 108 printf(" ------------------用户登陆------------------ "); 109 while (1) 110 { 111 printf("用户名:"); 112 scanf("%s",userInput.userName); 113 printf("密码:"); 114 scanf("%s",userInput.userPassword); //密码用星号代替未实现 115 116 for (i=0; i<count; i++) { 117 if((strcmp(userInput.userName, userBase[i].userName)==0)&&(strcmp(userInput.userPassword, userBase[i].userPassword)==0)) 118 return; 119 } 120 if (chance!=3) 121 printf(" 用户名或密码输入错误,请重新输入(还有 %d 次机会): ",3-chance); 122 chance++; 123 if (chance>=4) { 124 printf(" 尝试超出次数!退出程序。"); 125 exit(0); 126 } 127 } 128 } 129 130 void selectServe() 131 { 132 int serveNumber; 133 printf(" ------------------操作菜单------------------"); 134 printf(" 1.查询学生成绩 2.添加学生成绩 3.删除学生成绩 4.修改学生成绩 5.查看成绩排名 "); 135 printf(" 请选择您需要的操作(输入序号选择,输入其它退出程序):"); 136 scanf("%d",&serveNumber); 137 switch (serveNumber) { 138 case 1: 139 checkAchievement(); 140 break; 141 case 2: 142 addAchievement(); 143 break; 144 case 3: 145 delectAchievement(); 146 break; 147 case 4: 148 changeAchievement(); 149 break; 150 case 5: 151 sortAchievement(); 152 break; 153 default: 154 break; 155 } 156 printf(" ^^ 再见....."); 157 } 158 159 void creatDataBace() 160 { 161 FILE *fp; 162 struct Student student[100]; 163 int flag=0; 164 int i=0; 165 int k=0; 166 int count=0; 167 int m=0; 168 char ch; 169 170 if((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt", "r"))==NULL) 171 { 172 printf("打开文件错误!"); 173 exit(0); 174 } 175 176 for (i=0;fread(&student[i], sizeof(struct Student), 1, fp)!=0;i++); 177 count=i; 178 fclose(fp); 179 180 printf(" ------------------初始化数据库------------------"); 181 i=0; 182 while (1) { 183 printf(" 请输入学生的基本信息: "); 184 do 185 { 186 printf("第 %d 个学生的ID号:",i+1); 187 scanf("%s",student[i].id); 188 189 for (k=i-1; k>=0; k--) { 190 if(strcmp(student[i].id, student[k].id)==0) 191 { 192 printf(" ID号已存在,请重新输入 "); 193 flag=1; 194 break; 195 } 196 } 197 198 for (k=0; k<count; k++) { 199 if(strcmp(student[i].id, student[k].id)==0) 200 { 201 printf(" ID号在整个数据库中已存在,请重新输入 "); 202 flag=1; 203 break; 204 } 205 } 206 }while(flag); 207 208 do 209 { 210 flag=0; 211 printf("学生名称:"); 212 scanf("%s",student[i].name); 213 }while (flag); 214 215 do 216 { 217 flag=0; 218 printf("学生成绩:"); 219 scanf("%d",&student[i].score); 220 if (student[i].score>100||student[i].score<0) { 221 flag=1; 222 continue; 223 } 224 }while (flag); 225 226 i++; 227 m++; 228 printf(" 是否继续创建学生成绩信息?输入'y'或'Y'继续,输入其它进入下一步:"); 229 getchar(); 230 scanf("%c",&ch); 231 if (ch!='Y'&&ch!='y') 232 break; 233 } 234 235 236 if((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt", "a"))==NULL) 237 { 238 printf("打开文件错误!"); 239 exit(0); 240 } 241 242 for (i=0; i<m; i++) { 243 if (fwrite(&student[i], sizeof(struct Student), 1, fp)!=1) 244 printf("数据保存失败"); 245 } 246 247 fclose(fp); 248 } 249 250 void checkAchievement() 251 { 252 struct Student student; 253 char id[4]; 254 FILE *fp; 255 256 printf(" ------------------查询学生成绩------------------ "); 257 printf("请输入需要查询的学生ID:"); 258 scanf("%s",id); 259 while (1) 260 { 261 if ((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt","r"))==NULL) 262 { 263 printf("打开文件错误!"); 264 selectServe(); 265 } 266 267 while (fread(&student, sizeof(struct Student), 1, fp)!=0) { 268 if (strcmp(id,student.id)==0) { 269 printf("ID:%s 姓名:%s 分数:%d ",student.id,student.name,student.score); 270 break; 271 } 272 } 273 274 if (strcmp(id,student.id)!=0) 275 printf("没查找到ID为 %s 的学生信息。 ",id); 276 277 printf(" 请输入需要查询的学生ID(输入n返回操作菜单):"); 278 scanf("%s",id); 279 if (strcmp(id,"n")==0||strcmp(id,"N")==0) { 280 fclose(fp); 281 selectServe(); 282 } 283 fclose(fp); 284 } 285 } 286 287 void addAchievement() 288 { 289 FILE *fp; 290 struct Student student[100]; 291 int i=0; 292 int count=0; 293 char ch; 294 295 if((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt", "r"))==NULL) 296 { 297 printf("打开文件错误!"); 298 selectServe(); 299 } 300 301 for (i=0;fread(&student[i], sizeof(struct Student), 1, fp)!=0;i++); 302 count=i; 303 fclose(fp); 304 305 if((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt", "a+"))==NULL) 306 { 307 printf("打开文件错误!"); 308 selectServe(); 309 } 310 311 printf(" ------------------添加学生成绩------------------"); 312 while (1) 313 { 314 int flag; 315 do { 316 flag=0; 317 printf(" 请输入需要添加的学生ID:"); 318 scanf("%s",student[count].id); 319 for (int k=0; k<count; k++) { 320 if(strcmp(student[count].id, student[k].id)==0) 321 { 322 printf("ID号在数据库中已存在,请重新输入。 "); 323 flag=1; 324 break; 325 } 326 } 327 } while (flag); 328 printf("请输入需要添加的学生姓名:"); 329 scanf("%s",student[count].name); 330 printf("请输入需要添加的学生分数:"); 331 scanf("%d",&student[count].score); 332 if (fwrite(&student[count], sizeof(struct Student), 1, fp)!=1) { 333 printf("添加失败!"); 334 } 335 printf("添加成功! "); 336 printf(" 是否继续添加学生成绩信息?输入y继续,输入其它返回操作菜单:"); 337 getchar(); 338 scanf("%c",&ch); 339 if (ch!='y'&&ch!='Y') { 340 fclose(fp); 341 selectServe(); 342 } 343 count++; 344 } 345 } 346 347 void delectAchievement() 348 { 349 char id[4]; 350 char sure; 351 FILE *infile,*outfile; 352 struct Student students[100]; 353 int i=0,flag=-1,count=0; 354 355 356 printf(" ------------------删除学生成绩------------------"); 357 358 if ((infile=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt","r"))==NULL) 359 { 360 printf("打开文件错误!"); 361 selectServe(); 362 } 363 364 while (fread(&students[i], sizeof(struct Student), 1, infile)!=0) i++; 365 count=i; 366 fclose(infile); 367 368 printf(" 请输入需要删除的学生ID:"); 369 scanf("%s",id); 370 while (1) 371 { 372 for (i=0; i<count; i++) { 373 if (strcmp(id,students[i].id)==0) { 374 flag=i; 375 break; 376 } 377 } 378 379 if (flag==-1) 380 printf("没查找到ID为 %s 的学生信息。",id); 381 else 382 { 383 printf("确认要删除ID为 %s 的学生信息吗?(y确定 n取消)",id); 384 getchar(); 385 scanf("%c",&sure); 386 if (sure=='y') 387 { 388 for (i=flag; i<count-1; i++) { 389 students[i]=students[i+1]; 390 } 391 count--; 392 393 outfile=fopen("/Users/5000/Desktop/C:OC作业/Final Project/temp.txt","w+"); 394 for (i=0; i<count; i++) { 395 if(fwrite(&students[i], sizeof(struct Student), 1, outfile)!=1) 396 { 397 printf("删除失败!"); 398 selectServe(); 399 } 400 } 401 fclose(outfile); 402 } 403 printf("删除成功! "); 404 } 405 406 printf(" 请输入需要删除的学生ID(输入n返回操作菜单):"); 407 scanf("%s",id); 408 409 if (strcmp(id,"n")==0||strcmp(id,"N")==0) { 410 /*其实用w打开原来文件就可以直接写入原来的文件,w打开会清空原来文件的内容*/ 411 unlink("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt");//#include <unistd.h> 412 rename( "/Users/5000/Desktop/C:OC作业/Final Project/temp.txt","/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt");//#include <unistd.h> 413 selectServe(); 414 } 415 } 416 } 417 418 void changeAchievement() 419 { 420 FILE *fp; 421 char id[4],ch; 422 int score=0,count=0,flag=1; 423 int i=0; 424 struct Student students[100]; 425 426 if ((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt","r"))==NULL) 427 { 428 printf("打开文件错误!"); 429 selectServe(); 430 } 431 while (fread(&students[i], sizeof(struct Student), 1, fp)!=0) i++; 432 count=i; 433 fclose(fp); 434 435 printf(" ------------------学生成绩排名------------------ "); 436 while (1) 437 { 438 printf("请输入需要修改成绩的学生ID:"); 439 scanf("%s",id); 440 441 442 for (i=0;i<count;i++) { 443 if (strcmp(id,students[i].id)==0) { 444 printf("ID为 %s 的%s同学,分数为:%d ",students[i].id,students[i].name,students[i].score); 445 printf("更改%s同学的分数值为:",students[i].name); 446 scanf("%d",&score); 447 students[i].score=score; 448 flag=0; 449 break; 450 } 451 } 452 453 if (flag) 454 printf("没查找到ID为 %s 的学生信息。 ",id); 455 456 if ((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt","w+"))==NULL) 457 { 458 printf("打开文件错误!"); 459 selectServe(); 460 } 461 for (i=0; i<count; i++) { 462 if(fwrite(&students[i], sizeof(struct Student), 1, fp)!=1) 463 { 464 printf("修改失败!"); 465 selectServe(); 466 } 467 } 468 469 printf(" 是否继续查询学生成绩信息?输入'y'或'Y'继续,输入其它返回操作菜单:"); 470 getchar(); 471 scanf("%c",&ch); 472 if (ch!='y'&&ch!='Y') { 473 fclose(fp); 474 selectServe(); 475 } 476 } 477 } 478 479 void sortAchievement() 480 { 481 char ch; 482 FILE *fp; 483 struct Student students[100],temp; 484 int i=0,j=0,count=0; 485 486 if ((fp=fopen("/Users/5000/Desktop/C:OC作业/Final Project/achievement.txt","r"))==NULL) 487 { 488 printf("打开文件错误!"); 489 selectServe(); 490 } 491 492 while (fread(&students[i], sizeof(struct Student), 1, fp)!=0) i++; 493 fclose(fp); 494 count=i; 495 496 printf(" ------------------学生成绩排名------------------ "); 497 for(i=0;i<count-1;i++) 498 for(j=0;j<count-1-i;j++) 499 { 500 if (students[j].score<students[j+1].score) { 501 temp=students[j]; 502 students[j]=students[j+1]; 503 students[j+1]=temp; 504 } 505 } 506 printf("ID Name Score "); //Id****Name******Score 507 for (i=0; i<count; i++) { 508 printf("%s",students[i].id); 509 for (j=0; j<6-strlen(students[i].id); j++) 510 printf(" "); 511 512 printf("%s",students[i].name); 513 for (j=0; j<10-strlen(students[i].name); j++) 514 printf(" "); 515 516 printf("%d ",students[i].score); 517 } 518 519 printf(" 输入任意键返回操作菜单:"); 520 getchar(); //接收选择操作4时输入的回车 521 scanf("%c",&ch); 522 selectServe(); 523 524 }