<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      第一次作業——圖書管理系統

      軟件開發與創新作業
      第一篇博客
      對已有項目進行分析,改進做二次開發
      本次選用的是本平臺的圖書管理系統
      (1)項目來源
      原項目博客:http://www.rzrgm.cn/xinglichao/p/9064415.html
      以下是原代碼

      點擊查看代碼
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #define AVAILABLE 0
      #define UNAVAILABLE 1
      #define MAXNAME 30
      #define CLEAR "cls"
      typedef struct book{
          char *name;
          int id;
          int count;
          int status;
          struct book *next;
      }Book;
      void welcome();
      void error(char *);           // [異常提醒]
      char land();                  // [主頁面項目]
      int usrstudent();             // [學生入口]返回 0表示返回主頁 1表示繼續執行本函數
      int usrmanager();             // [管理員入口]返回 0表示返回主頁 1表示繼續執行本函數
      int viewbook();               // [查看圖書]返回打印的圖書個數     失敗返回-1
      int addbook();                // [注冊圖書]添加圖書成功 返回圖書id  失敗返回-1
      int modbook();                // [修改圖書]修改圖書信息   成功后返回id  失敗 -1
      int delbook();                // [注銷圖書]刪除成功 返回被刪除圖書的id 失敗返回-1
      void printbook(Book *);       // [打印圖書]
      Book *lookup(char *, int);    // [搜索圖書]
      int borrowbook();             // [借閱圖書]
      int returnbook();             // [歸還圖書]
      Book *head = NULL;
      int nbook = 0;
      int main(){ 
          welcome();
          return 0;
      }
      void welcome(){
          printf("*************************歡迎使用圖書管理系統*************************\n");
          while(1){
              printf("-------------------------------------\n");
              printf("請輸入項目前編號執行相關操作:\n");
              printf("\n[1] 管理員入口\n\n[2] 學生入口\n\n[0] 退出\n\n");
              switch(land()){
                  case '1':
                      while(1){
                          if(usrmanager()){
                              continue;
                          }else{
                              break;
                          }
                       }
                      break;
                  case '2':
                      while(1){
                          if(usrstudent()){
                              continue;
                          }else{
                              break;
                          }
                      }
                      break;
                  case '0':
                      exit(0);
                  default:
                      error("采集項目參數失敗");
              }
          }
      }
      char land(){
          char c, flag;
          int i;
          while(1){
              for(i = 0; (c = getchar()) != '\n'; flag = c, ++i)
                  ;
              if(i == 1){
                  if(flag == '1' || flag == '2' || flag == '0'){
                      return flag;
                  }
              }else if(i == 0){
                  continue;
              }
              error("[請輸入命令: 1 / 2 / 0 選擇項目]");
          }
          return '\0';
      }
      void error(char *s){
          fprintf(stderr, "%s\n", s);
      }
      char dostudent(){
          char c, flag;
          int i;
          while(1){
              for(i = 0; (c = getchar()) != '\n'; flag = c, ++i )
                  ;
              if(i == 1){
                  if(flag == '1' || flag == '2' || flag == '3' || flag == '0'){
                      return flag;
                  }
              }else if(i == 0){
                  continue;
              }
              error("[請輸入命令: 1 / 2 / 3/ 0 選擇項目]");
          }
      }
      int usrstudent(){
          printf("-------------------------------------\n");
          printf("請輸入項目前編號執行相關操作:\n\n");
          printf("[1] 借閱圖書\n[2] 歸還圖書\n[3] 查看館存圖書\n");
          printf("[0] 返回主頁\n");
          switch(dostudent()){
              case '1':
                  borrowbook();
                  break;
              case '2':
                  returnbook();
                  break;
              case '3':
                  viewbook();
                  break;
              case '0':
                  return 0;
              default:
                  error("采集項目參數失敗");
                  break;
          }
          return 1;
      }
      int borrowbook(){
          system(CLEAR);
          char sname[MAXNAME];
          printf("搜索圖書:\n");
              scanf("%s", sname);
              getchar();
              Book *bp;
              char *namep = NULL;
              if((bp = lookup(namep = strdup(sname), 0)) == NULL){
                  printf("圖書 %s 不存在\n", namep);
                  fflush(stdin);
                  return -1;
              }else{
                  printbook(bp);
                  if(! bp->status){
                      printf("借閱圖書: Y N\n");
                  }else{
                      printf("圖書外借中\n");
                      return 0;
                  }
                  while(1){
                      char c = '\0';
                      scanf("%c", &c);
                      getchar();
                      if(!(c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
                          fflush(stdin);
                          error("指令無效");
                          continue;
                      }
                      if(c == 'Y' || c == 'y'){
                          --bp->count > -1 ? printf("成功\n") : printf("失敗\n");
                          if(! bp->count){
                              bp->status = UNAVAILABLE;
                          }
                          return bp->id;
                      }else{
                          return 0;
                      }
                  }
              }  
          return -1;
      }
      int returnbook(){
          system(CLEAR);
          char sname[MAXNAME];
          printf("歸還圖書:\n");
          scanf("%s", sname);
          getchar();
          Book *bp;
          char *namep;
          if((bp = lookup(namep = strdup(sname), 0)) == NULL){
              fflush(stdin);
              printf("此圖書并不是館內圖書\n");
              return -1;
          }else{
              printbook(bp);
              printf("歸還圖書: Y N\n");
              while(1){
                  char c = '\0';
                  scanf("%c", &c);
                  getchar();
                  if(!(c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
                      fflush(stdin);
                      error("指令無效");
                  }else if(c == 'Y' || c == 'y'){
                      bp->count++ ? : (bp->status = AVAILABLE);
                      printf("成功\n");
                      return bp->id;
                  }else{
                      return 0;
                  }
              }
          }
          return -1;
      }
      char domanager(){
          char c, flag;
          int i;
          while(1){
              for(i = 0; (c = getchar()) != '\n'; flag = c, ++i)
                  ;
              if(i == 1){
                  if(flag == '1' || flag == '2' || flag == '3' || flag == '4' || flag == '0'){
                      return flag;
                  }
              }else if(i == 0){
                  continue;
              }
              error("[請輸入命令: 1 / 2 / 3/ 4 / 0 選擇項目]");     
          }
          return '\0';
      }
      int usrmanager(){
          printf("-------------------------------------\n");
          printf("請輸入項目前編號執行相關操作:\n\n");
          printf("[1] 查看已存圖書\n[2] 注冊新圖書\n[3] 修改已有圖書信息\n[4] 注銷現存圖書\n");
          printf("[0] 返回主頁\n");
          switch(domanager()){
              case '1':
                  viewbook();
                  break;
              case '2':
                  addbook();
                  break;
              case '3':
                  modbook();
                  break;
              case '4':
                  delbook();
                  break;
              case '0':
                  return 0;
              default:
                  error("采集項目參數失敗");
                  break;
          }
          return 1;
      
      }
      int viewbook(){
          system(CLEAR);      ///////////////////////////////////////////
          Book *bp;
          for(bp =head; bp != NULL; bp = bp->next){
              printbook(bp);
          }
          if(nbook){
              return nbook;
          }else{
              printf("圖書館還沒有圖書哦\n");
              return 0;
          }
          return -1;
      }
      void printbook(Book *bp){
          printf("圖書編號:%d\n", bp->id);
          printf("圖書名:%s\n", bp->name);
          printf("圖書存數:%d\n", bp->count);
          printf("圖書狀態:%s\n", bp->status ? "不可借" : "可借");
      }
      int addbook(){
          system(CLEAR);      ///////////////////////////////////////////
          char sname[MAXNAME];
          int id, count;
          char *namep;
          while(1){
              id = 0;
              count = 0;
              namep = NULL;
              printf("請輸入圖書名:\n");
              scanf("%s", sname);
              getchar();
              printf("請輸入小于1000的圖書編號:\n");
              scanf("%d", &id);
              getchar();
              if(!(id > 0 && id < 1000)){
                  error("輸入編號不符合要求");
                  fflush(stdin);
                  continue;
              }
              printf("請輸入小于50的圖書數量:\n");
              scanf("%d", &count);
              getchar();
              if(!(count > 0 && count < 50)){
                  error("輸入數目不符合要求");
                  fflush(stdin);
                  continue;
              }
              Book *bp;        
              if((bp = lookup(namep = strdup(sname), id)) == NULL){
                  bp = (Book *)malloc(sizeof (Book));
                  if(bp == NULL || (bp->name = namep) == NULL){
                      error("注冊圖書失敗");
                      fflush(stdin);
                      continue;
                  }
                  bp->id = id;
                  bp->count = count;
                  bp->status = AVAILABLE;
                  ++nbook;
                  bp->next = head;
                  head = bp;
                  printf("圖書 %s 注冊成功\n", sname);
                  return id;
              }else{
                  fflush(stdin);
                  error("圖書名或編號已經被占用");
              }
          }
          return -1;
      }
      Book *lookup(char *s, int id){
          Book *bp;
          for(bp = head; bp != NULL; bp = bp->next){
              if(id == bp->id || strcmp(s, bp->name) == 0){
                  return bp;
              }
          }
          return NULL;
      }
      int modbook(){  // 修改除id之外的信息  因為要修改id 直接刪掉后重新添加會更好
          system(CLEAR);      ///////////////////////////////////////////
          Book *bp = NULL;
          while(1){
              int id = 0;
              printf("請輸入要修改信息的圖書編號:\n");
              scanf("%d", &id);
              getchar();
              if(!(id > 0 && id < 1000)){
                  fflush(stdin);
                  error("圖書編號不符合要求");
                  continue;
              }
              if((bp = lookup("", id)) != NULL){
                  printf("以下為要修改的圖書的現有信息:\n");
                  printbook(bp);
                  printf("[1] 修改圖書名\n[2] 修改圖書數量\n[3] 修改圖書狀態\n[0] 放棄修改\n");
                  while(1){
                      int i;
                      scanf("%d", &i);
                      getchar();
                      if(!(i == 1 || i == 2 || i == 3 || i == 0)){
                          fflush(stdin);
                          error("輸入項目前編號選擇相關項目");
                          continue;
                      }
                      switch(i){
                          case 1:
                              while(1){
                                  char newname[MAXNAME], *namep;
                                  printf("圖書名:\n");
                                  scanf("%s", newname);
                                  getchar();
                                  if((lookup(namep = strdup(newname), 0)) != NULL){
                                      fflush(stdin);
                                      error("圖書名已存在");
                                      continue;
                                  }
                                  if((bp->name = namep) != NULL){
                                      printf("修改成功\n");
                                      return id;
                                  }
                              }
                              break;
                          case 2:
                              while(1){
                                  int bnum;
                                  printf("輸入圖書數量:\n");
                                  scanf("%d", &bnum);
                                  getchar();
                                  if(!(bnum > 0 || bnum < 1000)){
                                      fflush(stdin);
                                      error("數目不符合要求");
                                      continue;
                                  }
                                  bp->count = bnum;
                                  printf("修改成功\n");
                                  return id;
                              }
                              break;
                          case 3:
                              while(1){
                                  char c;
                                  int status;
                                  status = bp->status;
                                  status == AVAILABLE ? printf("修改狀態為[不可借]: Y N\n") : printf("修改狀態為[可借]: Y N\n");
                                  scanf("%c", &c);
                                  getchar();
                                  if(!( c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
                                      fflush(stdin);
                                      error("指令無效");
                                      continue;
                                  }
                                  if(c == 'Y' || c == 'y'){
                                       status == AVAILABLE ? bp->status = UNAVAILABLE : (bp->status = AVAILABLE);
                                       printf("修改成功\n");
                                       return id;
                                  }else{
                                      printf("放棄修改\n");
                                      return 0;
                                  }
                              }
                              break;
                          case 0:
                              return 0;
                          default:
                              error("獲取參數失敗");
                              break;   
                      }
                  }
              }else{
                  printf("沒有此圖書\n");
                  return 0;
              }
          }
          return -1;
      }
      int delbook(){
          system(CLEAR); 
          Book *bp, *fbp;
          int id = 0;
          printf("請輸入要注銷的圖書編號:\n");
          scanf("%d", &id);
          getchar();
          if(!(id > 0 && id < 1000)){
              fflush(stdin);
              error("圖書編號不符合要求");
              return -1;
          }
          for(fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next){
              if(bp->id == id){
                  printbook(bp);
                  break;
              }
          }
          if(bp != NULL){
              while(1){
                  printf("確定要注銷此圖書:Y  N\n");
                  char YN;
                  scanf("%c", &YN);
                  getchar();
                  if(!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))){
                      fflush(stdin);
                      error("指令無效\n");
                      continue;
                  }
                  if(YN == 'Y' || YN == 'y'){
                      bp == head ? head = bp->next : (fbp->next = bp->next);                
                      free(bp->name);                  //添加釋放name這塊內存//bp內存的只是指向name的指針
                      free(bp);                bp = NULL;
                      printf("圖書注銷成功\n");
                      break;
                  }else{
                      printf("放棄注銷\n");
                      return 0;
                  }
              }  
              return id;
          }else{
              printf("要注銷的圖書編號不存在\n");
              return -1;
          }
          return -1;
      }
      

      (2)運行環境和運行結果
      DevC++,Windows11

      1.主頁面


      2.管理員頁面


      2.1查看已有圖書

      2.2注冊新圖書

      2.3修改已有圖書


      2.3.1修改圖書名


      2.3.2修改圖書數量


      2.3.3修改圖書狀態


      2.4注銷現存圖書


      3.學生頁面


      3.1借閱圖書


      3.2歸還圖書


      3.3查看館存圖書


      (3)主要問題列表
      1.管理員登陸不需要特定的輸入
      2.修改圖書后沒有顯示修改后的效果,無法及時確定是否成功修改
      3.頁面過于簡略,用戶使用不便
      (4)新代碼

      點擊查看代碼
      void welcome(){
          printf("------------------------------------------------------------------------------------------------------------------------\n");
      	printf("*************************************************歡迎使用圖書管理系統**************************************************\n");
          while(1){
              printf("------------------------------------------------------------------------------------------------------------------------\n");
              printf("輸入項目前編號執行相關操作:\n");
              printf("\n				[1] 管理員入口\n\n				[2] 學生入口\n\n				[0] 退出\n\n");
              printf("請輸入:");
              switch(land()){
                  case '1':
                      while(1){
                      	int m;char n;
      					printf("請輸入管理員代號:");
      					scanf("%d",&m);
      					if(m==1)
      						printf("登錄成功\n");
      					else break;
                          if(usrmanager()){
                              continue;
                          }else{
                              break;
                          }
                       }
                      break;
                  case '2':
                      while(1){
                          if(usrstudent()){
                              continue;
                          }else{
                              break;
                          }
                      }
                      break;
                  case '0':
                      exit(0);
                  default:
                      error("采集項目參數失敗");
              }
          }
      }
      
      
      
      
      int usrstudent(){
          printf("------------------------------------------------------------------------------------------------------------------------\n");
          printf("請輸入項目前編號執行相關操作:\n\n");
          printf("				[1] 借閱圖書\n				[2] 歸還圖書\n				[3] 查看館存圖書\n");
          printf("				[0] 返回主頁\n");
          switch(dostudent()){
              case '1':
                  borrowbook();
                  break;
              case '2':
                  returnbook();
                  break;
              case '3':
                  viewbook();
                  break;
              case '0':
                  return 0;
              default:
                  error("采集項目參數失敗");
                  break;
          }
          return 1;
      }
      
      
      
      
      int usrmanager(){
      	
          printf("------------------------------------------------------------------------------------------------------------------------\n");
          printf("請輸入項目前編號執行相關操作:\n\n");
          printf("				[1] 查看已存圖書\n				[2] 注冊新圖書\n				[3] 修改已有圖書信息\n				[4] 注銷現存圖書\n");
          printf("				[0] 返回主頁\n");
          printf("請輸入編號:");
          switch(domanager()){
              case '1':
                  viewbook();
                  break;
              case '2':
                  addbook();
                  break;
              case '3':
                  modbook();
                  break;
              case '4':
                  delbook();
                  break;
              case '0':
                  return 0;
              default:
                  error("采集項目參數失敗");
                  break;
          }
          return 1;
      
      }
      
      
      
      
      
      
      
      int modbook(){  // 修改除id之外的信息  因為要修改id 直接刪掉后重新添加會更好
          system(CLEAR);      ///////////////////////////////////////////
          Book *bp = NULL;
          while(1){
              int id = 0;
              printf("請輸入要修改信息的圖書編號:\n");
              scanf("%d", &id);
              getchar();
              if(!(id > 0 && id < 1000)){
                  fflush(stdin);
                  error("圖書編號不符合要求");
                  continue;
              }
              if((bp = lookup("", id)) != NULL){
                  printf("以下為要修改的圖書的現有信息:\n");
                  printbook(bp);
                  printf("[1] 修改圖書名\n[2] 修改圖書數量\n[3] 修改圖書狀態\n[0] 放棄修改\n");
                  while(1){
                      int i;
                      scanf("%d", &i);
                      getchar();
                      if(!(i == 1 || i == 2 || i == 3 || i == 0)){
                          fflush(stdin);
                          error("輸入項目前編號選擇相關項目");
                          continue;
                      }
                      switch(i){
                          case 1:
                              while(1){
                                  char newname[MAXNAME], *namep;
                                  printf("圖書名:\n");
                                  scanf("%s", newname);
                                  getchar();
                                  if((lookup(namep = strdup(newname), 0)) != NULL){
                                      fflush(stdin);
                                      error("圖書名已存在");
                                      continue;
                                  }
                                  if((bp->name = namep) != NULL){
                                      printf("修改成功\n");
                                      printbook(bp);
                                      return id;
                                  }
                              }
                              break;
                          case 2:
                              while(1){
                                  int bnum;
                                  printf("輸入圖書數量:\n");
                                  scanf("%d", &bnum);
                                  getchar();
                                  if(!(bnum > 0 || bnum < 1000)){
                                      fflush(stdin);
                                      error("數目不符合要求");
                                      continue;
                                  }
                                  bp->count = bnum;
                                  printf("修改成功\n");
                                  printbook(bp);
                                  return id;
                              }
                              break;
                          case 3:
                              while(1){
                                  char c;
                                  int status;
                                  status = bp->status;
                                  status == AVAILABLE ? printf("修改狀態為[不可借]: Y N\n") : printf("修改狀態為[可借]: Y N\n");
                                  scanf("%c", &c);
                                  getchar();
                                  if(!( c == 'Y' || c == 'y' || c == 'N' || c == 'n')){
                                      fflush(stdin);
                                      error("指令無效");
                                      continue;
                                  }
                                  if(c == 'Y' || c == 'y'){
                                       status == AVAILABLE ? bp->status = UNAVAILABLE : (bp->status = AVAILABLE);
                                       printf("修改成功\n");
                                       printbook(bp);
                                       return id;
                                  }else{
                                      printf("放棄修改\n");
                                      return 0;
                                  }
                              }
                              break;
                          case 0:
                              return 0;
                          default:
                              error("獲取參數失敗");
                              break;   
                      }
                  }
              }else{
                  printf("沒有此圖書\n");
                  return 0;
              }
          }
          return -1;
      }
      
      

      (5)重構結果

      1.用戶頁面

      2.修改后顯示書籍效果

      (6)總結
      1.閱讀代碼和理解代碼有著一定的難度,每個人寫代碼的習慣有所不同,在理解的時候有著一定的差錯。
      2.對代碼進行完善優化,也是有著很大的難度,修改代碼時有可能會破壞原有的邏輯,也有可能破壞原有的結構順序,本來準備優化界面之間的層次和跳轉,但這樣會改變代碼的邏輯的結構,所需要改動的幅度過大,所以并沒有選擇優化界面的這方面問題。
      3.對于管理員登錄輸入的問題,因為本次項目本來就足夠完整,結構也是很齊整,對于用戶需求也是基本上都滿足了,插入一個管理員登錄輸入,系統便崩潰了,又摸索著簡化了原本寫入的輸入信息,然后才成功。
      4.在本次實驗中,也學習到了一些相同問題的不同的處理方式,對于一些函數的使用,文件流的讀寫,有了更多的了解。

      posted @ 2024-03-07 02:53  落深  閱讀(34)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产熟女av一区二区三区| 美女胸18下看禁止免费视频| 国产高清自产拍av在线| 国产av人人夜夜澡人人爽麻豆| 国产日韩精品欧美一区灰| 五月婷婷开心中文字幕| 国产精品中文字幕一区| 午夜福利日本一区二区无码| 国产亚洲精品超碰热| 色综合激情丁香七月色综合| 日韩一级伦理片一区二区| 精品久久精品午夜精品久久| 在线亚洲午夜理论av大片| 九九热精品免费在线视频| 欧美色欧美亚洲高清在线视频| 视频二区国产精品职场同事 | 日日爽日日操| 成 人 免费 在线电影| 国产精品一区二区三区色| 欧美日韩亚洲国产| 国产精品白丝久久AV网站| 婷婷久久综合九色综合88| 农村妇女野外一区二区视频| 日韩人妻无码一区二区三区99 | 精品人妻av区乱码| 国内偷自第一区二区三区| 麻豆国产va免费精品高清在线| 国产亚洲精品久久久网站好莱| 99久久精品国产一区色| 成人一区二区不卡国产| 亚洲国产欧美一区二区好看电影| 免费国产va在线观看| 中文字幕无码视频手机免费看| 性欧美乱熟妇xxxx白浆| 奇米777四色影视在线看| 中文字幕亚洲无线码在线| 亚洲精品日韩在线观看| 国偷自产一区二区三区在线视频| 精品久久亚洲中文无码| 国产亚洲精品在av| 欧美人与动牲交a免费|