还差最后两部分
读取文件
恢复删除的学生信息
先学会处理文件的 知识点,再继续跟着视频做这个作业。
应该明天周六能把视频里手把手教的学生管理系统敲完
第二周尽量自己能完成C语言课本最后面那道学生管理系统的大作业
目前代码进度
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define StuIdlen 12//学生学号长度 6 #define StuNamelen 12//学生姓名长度 7 typedef struct Stu 8 { 9 char StuName[StuNamelen]; 10 char StuId[StuIdlen]; 11 int score; 12 struct Stu* pNext;//下一个指针 13 }Stu_data; //学生数据类型 14 //声明链表的头和尾 15 Stu_data* g_pHead =NULL; 16 Stu_data* g_pEnd =NULL; //初始化0 17 void show_main();//展示功能面板 声明 18 void AddStu( char *iStuName,char *iStuId,int iscore);//添加学生信息 19 //清空列表 20 void FreeLinkData(); 21 //打印数据 22 void showStu_data(); 23 //链表头添加一个节点 24 void HeadAddStu( char *iStuName,char *iStuId,int iscore);//添加学生信息 25 //查找指定学生 26 Stu_data* FindStu(char* iStuId); 27 //指定位置插入节点 28 void InsertNode(Stu_data* pTemp,char *iStuName,char *iStuId,int iscore); 29 //查找指定的学生信息 30 void FindStudata(char* iStuId); 31 //删除指定的学生信息 32 void DeleteStuNode(Stu_data* pNode); 33 //保存信息进文件 34 void SaveStuToFile(); 35 //读取文件中学生的信息 36 void ReadStuFormFile(); 37 int main() 38 { 39 40 41 42 int chose; 43 int run =1;//永真run 44 show_main();//调用 45 while(run)//永真执行操作 46 { 47 printf("*****************请输入指令(帮助10)*********************\n"); 48 scanf("%d",&chose); 49 50 switch(chose) 51 { 52 case 1: 53 printf("*****************1.增加学生信息***************************\n"); 54 char iStuName[StuNamelen]; 55 char iStuId[StuIdlen]; 56 int iscore; 57 printf("输入学生姓名:"); 58 scanf("%s",iStuName); 59 getchar(); 60 printf("输入学生学号:"); 61 scanf("%s",iStuId); 62 printf("输入学生成绩:"); 63 scanf("%d",&iscore); 64 AddStu(iStuName,iStuId,iscore); 65 printf("*******************增加信息成功***************************\n"); 66 67 break; 68 case 11: 69 printf("*****************11.增加学生信息(头添加)******************\n"); 70 /*char iStuName[StuNamelen]; 71 char iStuId[StuIdlen]; 72 int iscore; 73 */ 74 printf("输入学生姓名:"); 75 scanf("%s",iStuName); 76 getchar(); 77 printf("输入学生学号:"); 78 scanf("%s",iStuId); 79 printf("输入学生成绩:"); 80 scanf("%d",&iscore); 81 HeadAddStu(iStuName,iStuId,iscore); 82 printf("*******************增加信息成功***************************\n"); 83 //头添加 84 break; 85 case 111: 86 { 87 88 Stu_data* pTemp =NULL; 89 printf("输入指定学号"); 90 scanf("%s",iStuId); 91 pTemp=FindStu(iStuId); 92 if(NULL!=pTemp) 93 { 94 95 scanf("%s",iStuId); 96 printf("输入学生姓名:"); 97 scanf("%s",iStuName); 98 getchar(); 99 printf("输入学生学号:"); 100 scanf("%s",iStuId); 101 printf("输入学生成绩:"); 102 scanf("%d",&iscore); 103 InsertNode(pTemp,iStuName,iStuId,iscore); 104 printf("*******************信息插入成功***************************\n"); 105 } 106 break; 107 } 108 case 2: 109 printf("*****************2.查找指定的学生信息*********************\n"); 110 printf("输入学生学号:"); 111 scanf("%s",iStuId); 112 FindStudata(iStuId); 113 printf("*******************信息显示成功***************************\n"); 114 break; 115 case 3: 116 printf("*****************3.修改指定的学生信息*********************\n"); 117 printf("输入学生学号:"); 118 scanf("%s",iStuId); 119 //查找 120 Stu_data* pTemp = FindStu(iStuId) ; 121 //打印 122 char c; 123 if(NULL != pTemp) 124 { 125 getchar(); 126 printf("是否修改学号?Y/N\n"); 127 scanf("%c",&c); 128 //修改学号 129 if('Y'==c){ 130 printf("修改学号:") ; 131 scanf("%s",iStuId); 132 strcpy(pTemp->StuId,iStuId); 133 } 134 getchar(); 135 printf("是否修改名字?Y/N\n"); 136 scanf("%c",&c); 137 //修改名字 138 if('Y'==c){ 139 printf("修改名字:") ; 140 scanf("%s",iStuName); 141 strcpy(pTemp->StuName,iStuName); 142 } 143 getchar(); 144 printf("是否修改分数?Y/N\n"); 145 scanf("%c",&c); 146 //修改分数 147 if('Y'==c){ 148 printf("修改分数:"); 149 scanf("%d",&iscore); 150 pTemp->score=iscore; 151 } 152 153 } 154 printf("*******************信息修改成功***************************\n"); 155 break; 156 case 4: 157 printf("*****************4.保存业主的信息到文件中*****************\n"); 158 //保存函数 159 SaveStuToFile(); 160 161 printf("*******************信息成功保存***************************\n"); 162 break; 163 case 6: 164 printf("*****************6.删除指定的学生的信息*******************\n"); 165 printf("输入学生学号:"); 166 scanf("%s",iStuId); 167 //查找 168 pTemp = FindStu(iStuId); 169 170 //删除这个节点 171 if(NULL !=pTemp) 172 { 173 //调用学生删除函数 174 175 DeleteStuNode(pTemp); 176 177 } 178 break; 179 case 9: 180 printf("*****************9.显示所有的学生的信息*******************\n"); 181 showStu_data(); 182 printf("*******************信息显示成功***************************\n"); 183 break; 184 case 0: 185 printf("*****************0.退出系统*******************************\n"); 186 run=0; 187 break; 188 case 10: 189 show_main();//调用 190 break; 191 default: 192 printf("*****************!.输入错误*******************************\n"); 193 break; 194 } 195 196 197 } 198 FreeLinkData(); 199 system("PAUSE"); 200 return 0; 201 } 202 203 204 205 void show_main()//展示功能面板 定义 206 { 207 printf("*******************学生管理系统***************************\n"); 208 printf("*******************系统功能如下***************************\n"); 209 printf("*****************1.增加学生信息(尾添加)*******************\n"); 210 printf("*****************11.增加学生信息(头添加)******************\n"); 211 printf("*****************111.增加学生信息(指定位置添加)***********\n"); 212 printf("*****************2.查找指定的学生信息*********************\n"); 213 printf("*****************3.修改指定的学生信息*********************\n"); 214 printf("*****************4.保存业主的信息到文件中*****************\n"); 215 printf("*****************5.读取文件中的业主的信息*****************\n"); 216 printf("*****************6.删除指定的学生的信息*******************\n"); 217 printf("*****************7.恢复删除的学生的信息*******************\n"); 218 printf("*****************9.显示所有的学生的信息*******************\n"); 219 printf("*****************10.查看面板******************************\n"); 220 printf("*****************0.退出系统*******************************\n"); 221 printf("**********************************************************\n"); 222 223 } 224 void AddStu(char *iStuName,char *iStuId,int iscore) 225 { 226 227 //检验合法性质 228 if(NULL == iStuName||NULL == iStuId||iscore<0) 229 { 230 printf("输入学生信息错误"); 231 return ; 232 } 233 //逻辑判断- 234 //创建一个节点 235 236 Stu_data* pTemp=malloc(sizeof(Stu_data)); 237 //节点成员附初始值 238 strcpy(pTemp->StuName,iStuName); 239 strcpy(pTemp->StuId,iStuId); 240 241 242 pTemp->score=iscore; 243 pTemp->pNext=NULL; 244 // 接在链表上 245 if(g_pHead==NULL||g_pEnd==NULL) 246 { 247 g_pHead =pTemp;//link 248 g_pEnd =pTemp;//向后移动 249 } 250 else 251 { 252 g_pEnd->pNext = pTemp; 253 g_pEnd=pTemp; 254 } 255 256 } 257 void FreeLinkData() //清空列表 258 { 259 Stu_data* pTemp = g_pHead;//记录节点 260 while(g_pHead !=NULL) 261 { 262 g_pHead=g_pHead->pNext;//向后移动了一个 263 264 free(pTemp);//删除节点 265 266 } 267 } 268 void showStu_data()//展示链表 showStu_data(); 269 { 270 Stu_data* pTemp = g_pHead; 271 while(pTemp != NULL) 272 { 273 printf("学号:%s,姓名:%s,分数:%d\n",pTemp->StuId,pTemp->StuName,pTemp->score); 274 pTemp=pTemp->pNext;//向后移动了一个 275 } 276 } 277 //链表头添加一个节点 278 void HeadAddStu( char *iStuName,char *iStuId,int iscore)//添加学生信息 279 { 280 //检测合法性 281 if(NULL == iStuName||NULL == iStuId||iscore < 0) 282 { 283 printf("学生信息输入错误"); 284 return ; 285 } 286 //创建一个节点 287 Stu_data* pTemp = malloc(sizeof(Stu_data)); 288 //成员赋值 289 strcpy(pTemp->StuName,iStuName); 290 strcpy(pTemp->StuId,iStuId); 291 pTemp->score = iscore; 292 pTemp->pNext = NULL; 293 if(NULL == g_pHead||NULL == g_pEnd) 294 {//链表为空 295 g_pHead = pTemp; 296 g_pEnd =pTemp; 297 298 } 299 else 300 { 301 //新节点的下一个指向头先连后断 302 pTemp->pNext = g_pHead; 303 g_pHead=pTemp; 304 } 305 } 306 //查找指定学生 307 Stu_data* FindStu(char* iStuId)//201801013 12356 308 { 309 //检测参数合法性 310 if(NULL == iStuId) 311 { 312 printf("学号输入错误"); 313 return NULL; 314 } 315 //遍历链表 316 Stu_data* pTemp=g_pHead; 317 while(pTemp) 318 { 319 if(0 == strcmp(pTemp->StuId,iStuId)) 320 { 321 return pTemp; 322 } 323 pTemp=pTemp->pNext; 324 } 325 printf("查无此节点\n"); 326 printf("*******************信息显示失败***************************\n"); 327 return NULL; 328 } 329 330 //指定位置插入节点 331 void InsertNode(Stu_data* pTemp,char *iStuName,char *iStuId,int iscore) 332 { 333 //创建一个节点 334 Stu_data* pnewTemp = malloc(sizeof(Stu_data)); 335 //成员赋值 336 //成员赋值 337 strcpy(pnewTemp->StuName,iStuName); 338 strcpy(pnewTemp->StuId,iStuId); 339 pnewTemp->score = iscore; 340 pnewTemp->pNext = NULL; 341 if(pTemp==g_pEnd)//是尾节点 342 { 343 printf("是尾戒点\n"); 344 g_pEnd->pNext=pnewTemp; 345 g_pEnd=pnewTemp; 346 347 } 348 else 349 { 350 //先连后断 351 pnewTemp->pNext=pTemp->pNext; 352 pTemp->pNext=pnewTemp; 353 354 } 355 } 356 //查找指定的学生信息 357 void FindStudata(char* iStuId) 358 { 359 Stu_data* pTemp=FindStu(iStuId); 360 if(pTemp ==NULL) 361 { 362 return ; 363 } 364 printf("学号:%s,姓名:%s,分数:%d\n",pTemp->StuName,pTemp->StuId,pTemp->score); 365 } 366 //删除指定的学生信息 367 void DeleteStuNode(Stu_data* pNode) 368 { 369 370 //只有一个节点 371 if(g_pHead == g_pEnd) 372 { 373 free(g_pHead); 374 g_pHead = NULL; 375 g_pEnd = NULL; 376 } 377 //只有两个节点 378 else if(g_pHead->pNext==g_pEnd) 379 { 380 if(g_pHead==pNode) 381 { 382 383 free(g_pHead); 384 g_pHead=g_pEnd; 385 386 } 387 else 388 { 389 free(g_pEnd); 390 g_pEnd=g_pHead; 391 g_pHead->pNext=NULL; 392 393 } 394 } 395 //常规情况 396 else 397 { 398 Stu_data* pTemp=g_pHead; 399 if(g_pHead == pNode)//删除 特殊在头部 400 { 401 //记住头 402 pTemp=g_pHead; 403 g_pHead = g_pHead->pNext; 404 free(pTemp); 405 pTemp = NULL; 406 return; 407 } 408 //判断头 409 while(pTemp) 410 { 411 if(pTemp->pNext == pNode) 412 { 413 //删除 特殊在尾巴 414 if(pNode == g_pEnd) 415 { 416 free(pNode); 417 pNode == NULL; 418 g_pEnd = pTemp; 419 g_pEnd->pNext = NULL; 420 return ; 421 } 422 //删除 423 else 424 { 425 //记住删除的节点 426 Stu_data* p =pTemp->pNext; 427 pTemp->pNext = pNode->pNext; 428 //释放节点 429 free(p); 430 p = NULL; 431 return ; 432 433 } 434 435 436 } 437 pTemp=pTemp->pNext; 438 } 439 } 440 } 441 //保存信息进文件 442 void SaveStuToFile() 443 { 444 //判断链表是否为NULL 445 FILE* pFile = NULL; 446 Stu_data* pTemp = g_pHead; 447 char strBuf[30] = {0}; 448 char strScore[10] = {0}; 449 if(NULL == g_pHead) 450 { 451 printf("没有学生\n"); 452 return ; 453 } 454 //打开文件 455 pFile = fopen("dat.dat","wb+"); 456 if (NULL == pFile) 457 { 458 printf("打开文件失败\n"); 459 return; 460 } 461 //操作文件指针 462 while(pTemp) 463 { 464 //学号赋值进去 465 strcpy(strBuf,pTemp->StuId); 466 strcat(strBuf,"."); 467 //姓名赋值进去 468 strcat(strBuf,pTemp->StuName); 469 strcat(strBuf,"."); 470 //分数赋值进去 471 itoa(pTemp->score,strScore,10); 472 strcat(strBuf,strScore); 473 474 475 fwrite(strBuf,1,strlen(strBuf),pFile); 476 fwrite("\r\n",1,strlen("\r\n"),pFile); 477 pTemp = pTemp->pNext; 478 } 479 //关闭文件 480 fclose(pFile); 481 482 } 483 484 void ReadStuFormFile() 485 { 486 FILE* pFile = fopen("dat.dat","rb+"); 487 if(NULL == pFile) 488 { 489 printf("文件打开失败"); 490 return; 491 492 } 493 char strBuf[30]={0}; 494 //操作指针,读取函数 495 char strName[StuNamelen] = {0}; 496 char strId[StuIdlen] = {0}; 497 char strScore[10] = {0}; 498 int nCount =0; 499 while(EOF != fgets(strBuf, 30, pFile)) 500 { 501 int i = 0; 502 503 for(i = 0;strBuf[i] !='\r';i++) 504 { 505 if(0 == nCount)//到点 506 { 507 strId[i] = strBuf[i]; 508 if('.'== strBuf[i]) 509 { 510 nCount++; 511 } 512 } 513 else if (1 == nCount)//第一个点 514 { 515 int j=0; 516 strName[j] = strBuf[i]; 517 if('.'== strBuf[i]) 518 { 519 nCount++; 520 } 521 j++; 522 } 523 else //第二个点 (2 == nCount) 524 { 525 int j=0; 526 strScore[j] = strBuf[i]; 527 j++; 528 } 529 } 530 } 531 //关闭 532 fclose(pFile); 533 } 534 535 536 537 538 539 540