• #006 C语言大作业学生管理系统第三天


    还差最后两部分

    读取文件

    恢复删除的学生信息

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

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

    第二周尽量自己能完成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)*********************
    ");    
     48         scanf("%d",&chose); 
     49         
     50     switch(chose) 
     51     {
     52         case 1:
     53             printf("*****************1.增加学生信息***************************
    ");
     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("*******************增加信息成功***************************
    ");
     66             
     67             break;
     68         case 11:
     69             printf("*****************11.增加学生信息(头添加)******************
    ");
     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("*******************增加信息成功***************************
    ");
     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("*******************信息插入成功***************************
    ");
    105             }
    106             break;
    107             }
    108         case 2:
    109             printf("*****************2.查找指定的学生信息*********************
    ");
    110             printf("输入学生学号:");
    111             scanf("%s",iStuId); 
    112             FindStudata(iStuId);
    113             printf("*******************信息显示成功***************************
    ");
    114             break; 
    115         case 3:
    116             printf("*****************3.修改指定的学生信息*********************
    ");    
    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
    ");
    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
    ");
    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
    ");
    145                 scanf("%c",&c);
    146                 //修改分数 
    147                 if('Y'==c){
    148                 printf("修改分数:"); 
    149                 scanf("%d",&iscore); 
    150                 pTemp->score=iscore;
    151                 }
    152             
    153              } 
    154             printf("*******************信息修改成功***************************
    ");        
    155             break; 
    156         case 4:
    157             printf("*****************4.保存业主的信息到文件中*****************
    ");
    158             //保存函数
    159             SaveStuToFile();
    160              
    161             printf("*******************信息成功保存***************************
    ");
    162             break;
    163         case 6:
    164             printf("*****************6.删除指定的学生的信息*******************
    ");
    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.显示所有的学生的信息*******************
    ");
    181             showStu_data();
    182             printf("*******************信息显示成功***************************
    ");
    183             break;
    184         case 0:
    185             printf("*****************0.退出系统*******************************
    ");
    186             run=0;
    187             break; 
    188         case 10:
    189             show_main();//调用     
    190             break; 
    191         default:
    192             printf("*****************!.输入错误*******************************
    ");
    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("*******************学生管理系统***************************
    ");
    208     printf("*******************系统功能如下***************************
    ");
    209     printf("*****************1.增加学生信息(尾添加)*******************
    ");
    210     printf("*****************11.增加学生信息(头添加)******************
    ");    
    211     printf("*****************111.增加学生信息(指定位置添加)***********
    ");
    212     printf("*****************2.查找指定的学生信息*********************
    ");
    213     printf("*****************3.修改指定的学生信息*********************
    ");
    214     printf("*****************4.保存业主的信息到文件中*****************
    ");
    215     printf("*****************5.读取文件中的业主的信息*****************
    ");
    216     printf("*****************6.删除指定的学生的信息*******************
    ");
    217     printf("*****************7.恢复删除的学生的信息*******************
    ");
    218     printf("*****************9.显示所有的学生的信息*******************
    ");
    219     printf("*****************10.查看面板******************************
    ");
    220     printf("*****************0.退出系统*******************************
    ");
    221     printf("**********************************************************
    ");
    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
    ",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("查无此节点
    ");
    326     printf("*******************信息显示失败***************************
    ");
    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("是尾戒点
    ");
    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
    ",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("没有学生
    ");
    452         return ;
    453     }
    454     //打开文件
    455     pFile = fopen("dat.dat","wb+");
    456     if (NULL == pFile)
    457     {
    458         printf("打开文件失败
    ");
    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("
    ",1,strlen("
    "),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] !='
    ';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  
  • 相关阅读:
    OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
    Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
    PDF.NET 开发框架之 SOD框架 Ver 5.2 正式版开源源码发布
    变态的儿童国学教育与孔子真正的教育之道
    .net字符串数组查找方式效率比较
    Oracle根据字段值找到表名和列名
    Oracle卸载后手工删除内容
    Oracle服务启动顺序导致ORA-12514
    mysql由于权限问题看不到用户数据库
    MySql无法远程登录以及IP被锁解决办法
  • 原文地址:https://www.cnblogs.com/hx97/p/10536453.html
Copyright © 2020-2023  润新知