还差最后两部分

读取文件

恢复删除的学生信息

先学会处理文件的 知识点,再继续跟着视频做这个作业。

应该明天周六能把视频里手把手教的学生管理系统敲完

第二周尽量自己能完成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