test

test

 

  1 /**/ /* *
  2  *    0318作業 
  3  *    學號:CAW4417 
  4  *    姓名:黃獻葦 
  5  *    
  6  *    第1本第2本不可指定加入位置,第3本後可指定加入哪本書籍編號之後 
  7  *    
  8   */

  9 #include  < iostream >
 10 #include  < string >
 11 #include  < sstream >
 12
 13 using   namespace  std;
 14
 15 struct  Book {
 16    char  m_szName[ 20 ]; // 書名 
 17    char  m_szAuthor[ 20 ]; // 作者 
 18    int   m_iISBN; // ISBN 
 19    int   m_iPrice;  // 價格
 20   Book  *  m_pNextBook;
 21 }
;
 22
 23 enum {
 24   ADD_NEW_BOOK_ACTION  =   1 ,
 25   DELETE_BOOK_ACTION  =   2 ,
 26   SEARCH_BOOK_ACTION  =   3 ,
 27   LIST_BOOK_ACTION  =   4 ,
 28   EXIT  =   5
 29 }
;
 30
 31 enum {
 32     NAME_CONDITION  =   1 ,
 33     AUTHOR_CONDITION  =   2 ,
 34     ISBN_CONDITION  =   3 ,
 35     PRICE_CONDITION  =   4
 36 }
;
 37
 38 class  LinkList {
 39      public :
 40         Book  * m_pHeader; // 記錄第一本書的位置 
 41          int  m_iAmount; // 加入此LinkList的書籍數量 
 42          void  addBook();
 43          void  deleteBook();
 44          void  searchBook();
 45          void  listAllBook();
 46          void  searchBookCondition( int  condition, string  str);
 47          void  searchBookCondition( int  condition, int  number);
 48 }
;
 49
 50 void  getUserInputInt( int   *  p); // 取得user輸入的數字選項 
 51 void  getUserInputIntBookInfo(Book  * book); // 取得user輸入的書籍資訊 
 52 void  showTitle();
 53 string  int2str( int  i);
 54
 55 /**/ /*
 56  *加入書籍
 57  *第1本第2本不可指定加入位置,第3本後可指定加入哪本書籍編號之後 
 58   */

 59 void  LinkList::addBook() {
 60     
 61      int  l_iInput  =   0 ;
 62      if ( m_iAmount  >=   2  ) { // 加入第3本書以後才問 
 63         cout  <<   " 請問要加在第幾本書後面: " ;
 64         getUserInputInt( & l_iInput);
 65     }

 66     
 67     
 68      if ( m_iAmount  <   2  ) { // 加入第1本or第2本書 
 69         Book  * l_pNewBook  =   new  Book();
 70         getUserInputIntBookInfo(l_pNewBook);
 71         
 72         l_pNewBook -> m_pNextBook  =  NULL;    
 73          if 0   ==  m_iAmount ) {
 74             m_pHeader  =  l_pNewBook;
 75         }

 76          else   if 1   ==  m_iAmount ) {
 77             m_pHeader -> m_pNextBook  =  l_pNewBook;
 78         }

 79         
 80     }

 81      else   if ( (m_iAmount  >=   2 &&  (l_iInput  <= m_iAmount ) ) { // 選擇加入在目前書籍中哪一本之後 
 82         Book  * l_pNewBook  =   new  Book();
 83         getUserInputIntBookInfo(l_pNewBook);
 84         
 85         Book  * l_pAddAfter  =  m_pHeader;
 86          int  l_i  =   0 ;
 87         l_iInput -- ;
 88          while (l_iInput  >  l_i) {
 89             l_pAddAfter  =  l_pAddAfter -> m_pNextBook;
 90             l_i ++ ;
 91         }

 92         Book  * l_pNextBook  =  l_pAddAfter -> m_pNextBook;
 93         l_pAddAfter -> m_pNextBook  =  l_pNewBook;
 94         l_pNewBook -> m_pNextBook  =  l_pNextBook;
 95
 96     }
    
 97      else   if (l_iInput  >  m_iAmount) { // 超過目前書籍量 
 98         cout  <<   " 目前只有  "   <<  m_iAmount  <<   "  本書 "   <<  endl;
 99          return ;
100     }

101     m_iAmount ++ ;
102 }

103
104 /**/ /*
105  *刪除指定編號之書籍 
106   */

107 void  LinkList::deleteBook() {
108      if 0   ==  m_iAmount ) {
109         cout  <<   " 裡面沒有書可以刪除 "   <<  endl;
110          return ;
111     }

112     
113     cout  <<   " 請輸入要刪除第幾本書 " ;
114      int  l_iInput  =   0 ;
115     getUserInputInt( & l_iInput);
116     
117      if ( l_iInput  >  m_iAmount ) {
118         cout  <<   " 錯誤!目前無此編號之書籍!! "   <<  endl;
119          return ;
120     }
    
121     l_iInput -- ;
122     
123     Book  * l_mDeleteBook  =  m_pHeader;
124     
125      if 0   ==  l_iInput ) { // 刪除第一本書 
126         m_pHeader  =  m_pHeader -> m_pNextBook;
127         delete l_mDeleteBook;
128     }

129      else {
130         Book  * l_pPreBook;
131          int  l_i  =   0 ;
132          while (l_iInput  >  l_i) {
133             l_pPreBook  =  l_mDeleteBook;
134             l_mDeleteBook  =  l_mDeleteBook -> m_pNextBook;    
135             l_i ++ ;
136         }

137         l_pPreBook -> m_pNextBook  =  l_mDeleteBook -> m_pNextBook; // 前一本書指向下一本 
138         delete l_mDeleteBook;
139     }

140     
141     m_iAmount -- ;
142 }

143
144 /**/ /*
145  *尋找指定之書籍 
146   */

147 void  LinkList::searchBook() {
148     
149      if (m_iAmount  <   1 ) {
150         cout  <<   " 裡面沒有書可以查詢!! "   <<  endl; 
151          return ;
152     }

153     
154     cout  <<   " 請輸入要查詢的條件 1-書名,2-作者,3-ISBN,4-價格 : " ;
155     
156      int  l_iSearchCondition  =   0 ;
157     getUserInputInt( & l_iSearchCondition);
158     
159     
160      switch (l_iSearchCondition) {
161          case  NAME_CONDITION:
162          case  AUTHOR_CONDITION: {
163              string  str;
164             cout  <<   " 請輸入欲查詢的條件: " ;
165             cin  >>  str;
166             searchBookCondition(l_iSearchCondition,str);
167              break ;
168         }

169          case  ISBN_CONDITION:
170          case  PRICE_CONDITION: {
171              int  l_iUserInput  =   0 ;
172             cout  <<   " 請輸入欲查詢的條件: " ;
173             getUserInputInt( & l_iUserInput);
174             searchBookCondition(l_iSearchCondition,l_iUserInput);
175              break ;
176         }

177          default :
178             cout  <<   " 請輸入正確選項 "   <<  endl;
179     }

180     
181 }

182
183
184 /**/ /*
185  *用書名或作者查 
186   */

187 void  LinkList::searchBookCondition( int  condition, string  str) {
188     cout  <<   " 用書名或作者查 "   <<  endl;
189     Book  * l_pCurrentBook  =  m_pHeader;
190      string  l_szMessage ;
191     
192      if ( condition  ==  NAME_CONDITION ) { // 查書名 
193          for ( int  i = 0  ; i < m_iAmount ; i ++ ) {
194              if ( str  ==  l_pCurrentBook -> m_szName ) {
195                  if 0   ==  l_szMessage.size() ) {
196                     l_szMessage  +=   " 搜尋結果如下:\n " ;
197                 }

198                 l_szMessage  +=   " 第  " ;
199                 l_szMessage  +=  int2str(i + 1 );
200                 l_szMessage  +=   "  本書==>書名: " ;
201                 l_szMessage  +=  l_pCurrentBook -> m_szName;
202                 l_szMessage  +=   "  作者: " ;
203                 l_szMessage  +=  l_pCurrentBook -> m_szAuthor;
204                 l_szMessage  +=   "  ISBN: " ;
205                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iISBN);
206                 l_szMessage  +=   "  價格: " ;
207                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iPrice);
208                 l_szMessage  +=   " \n " ;
209             }

210             l_pCurrentBook  =  l_pCurrentBook -> m_pNextBook;
211         }
// end of for
212     }

213      else   if ( condition  ==  AUTHOR_CONDITION ) { // 查作者 
214          for ( int  i = 0  ; i < m_iAmount ; i ++ ) {
215              if ( str  ==  l_pCurrentBook -> m_szAuthor ) {
216                  if 0   ==  l_szMessage.size() ) {
217                     l_szMessage  +=   " 搜尋結果如下:\n " ;
218                 }

219                 l_szMessage  +=   " 第  " ;
220                 l_szMessage  +=  int2str(i + 1 );
221                 l_szMessage  +=   "  本書==>書名: " ;
222                 l_szMessage  +=  l_pCurrentBook -> m_szName;
223                 l_szMessage  +=   "  作者: " ;
224                 l_szMessage  +=  l_pCurrentBook -> m_szAuthor;
225                 l_szMessage  +=   "  ISBN: " ;
226                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iISBN);
227                 l_szMessage  +=   "  價格: " ;
228                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iPrice);
229                 l_szMessage  +=   " \n " ;
230             }

231             l_pCurrentBook  =  l_pCurrentBook -> m_pNextBook;
232         }
// end of for        
233     }

234     
235      if 0   ==  l_szMessage.size() ) {
236         l_szMessage  +=   " 你的搜尋無結果!!!!! " ;    
237     }

238     cout  <<  l_szMessage  <<  endl;
239 }

240
241 /**/ /*
242  *用ISBN或價格查 
243   */

244 void  LinkList::searchBookCondition( int  condition, int  number) {
245     Book  * l_pCurrentBook  =  m_pHeader;
246      string  l_szMessage ;
247     
248      if ( condition  ==  ISBN_CONDITION ) { // 查ISBN
249          for ( int  i = 0  ; i < m_iAmount ; i ++ ) {
250              if ( number  ==  l_pCurrentBook -> m_iISBN ) {
251                  if 0   ==  l_szMessage.size() ) {
252                     l_szMessage  +=   " 搜尋結果如下:\n " ;
253                 }

254                 l_szMessage  +=   " 第  " ;
255                 l_szMessage  +=  int2str(i + 1 );
256                 l_szMessage  +=   "  本書==>書名: " ;
257                 l_szMessage  +=  l_pCurrentBook -> m_szName;
258                 l_szMessage  +=   "  作者: " ;
259                 l_szMessage  +=  l_pCurrentBook -> m_szAuthor;
260                 l_szMessage  +=   "  ISBN: " ;
261                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iISBN);
262                 l_szMessage  +=   "  價格: " ;
263                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iPrice);
264                 l_szMessage  +=   " \n " ;
265             }

266             l_pCurrentBook  =  l_pCurrentBook -> m_pNextBook;
267         }
// end of for
268     }

269      else   if ( condition  ==  PRICE_CONDITION ) { // 查售價 
270          for ( int  i = 0  ; i < m_iAmount ; i ++ ) {
271              if ( number  ==  l_pCurrentBook -> m_iPrice ) {
272                  if 0   ==  l_szMessage.size() ) {
273                     l_szMessage  +=   " 搜尋結果如下:\n " ;
274                 }

275                 l_szMessage  +=   " 第  " ;
276                 l_szMessage  +=  int2str(i + 1 );
277                 l_szMessage  +=   "  本書==>書名: " ;
278                 l_szMessage  +=  l_pCurrentBook -> m_szName;
279                 l_szMessage  +=   "  作者: " ;
280                 l_szMessage  +=  l_pCurrentBook -> m_szAuthor;
281                 l_szMessage  +=   "  ISBN: " ;
282                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iISBN);
283                 l_szMessage  +=   "  價格: " ;
284                 l_szMessage  +=  int2str(l_pCurrentBook -> m_iPrice);
285                 l_szMessage  +=   " \n " ;
286             }

287             l_pCurrentBook  =  l_pCurrentBook -> m_pNextBook;
288         }
// end of for        
289     }

290     
291      if 0   ==  l_szMessage.size() ) {
292         l_szMessage  +=   " 你的搜尋無結果!!!!! " ;    
293     }

294     cout  <<  l_szMessage  <<  endl;    
295     
296 }

297
298
299
300 /**/ /*
301  *列出所有書籍 
302   */

303 void  LinkList::listAllBook() {
304      if ( NULL  ==  m_pHeader ) {
305         cout  <<   " 沒有書!! "   <<  endl;    
306          return ;
307     }

308     
309     cout  <<   " 目前共有: "   <<  m_iAmount  <<   " 本書,所有書籍清單如下: "   <<  endl;
310     Book  * l_pTempBook  =  m_pHeader;
311      while ( NULL  !=  l_pTempBook ) {
312         cout  <<   "  書名: "   <<  l_pTempBook -> m_szName;
313         cout  <<   "  作者: "   <<  l_pTempBook -> m_szAuthor;
314         cout  <<   "  ISBN: "   <<  l_pTempBook -> m_iISBN;
315         cout  <<   "  價格: "   <<  l_pTempBook -> m_iPrice  <<  endl;
316         cout  <<   " ******************************* "   <<  endl;        
317         l_pTempBook  =  l_pTempBook -> m_pNextBook;
318     }

319     
320 }

321
322 /**/ /*
323  *取得user輸入 
324   */

325 bool  getUserInputInt( int   *  p) {
326   cin  >>   * p;
327    if ! cin  ) {
328         cerr  <<   " 錯誤!! "   <<  endl;    
329          return   false ;
330     }

331 }

332
333
334 /**/ /*
335  *取得user輸入的書籍資訊 
336   */

337 void  getUserInputIntBookInfo(Book  * book) {
338     cout  <<   " 請輸入書名: " ;
339     cin  >>  book -> m_szName;
340     cout  <<   " 請輸入作者: " ;
341     cin  >>  book -> m_szAuthor;
342     cout  <<   " 請輸入ISBN: " ;
343     cin  >>  book -> m_iISBN;
344     cout  <<   " 請輸入價格: " ;
345     cin  >>  book -> m_iPrice;    
346 }

347
348
349 /**/ /*
350  *show出工作項目 
351   */

352 void  showTitle() {
353     cout  <<   " ################## "   <<  endl;
354   cout  <<   " 1)add a new book # "   <<  endl;
355   cout  <<   " 2)delete a book  # "   <<  endl;
356   cout  <<   " 3)search a book  # "   <<  endl;
357   cout  <<   " 4)list all book  # "   <<  endl;
358   cout  <<   " 5)exit           # "   <<  endl;  
359   cout  <<   " ################## "   <<  endl;
360   cout  <<   " 請輸入: " ;  
361 }

362
363 /**/ /*
364  *轉換數字為字串 
365   */

366 string  int2str( int  i) {
367      string  s;
368     stringstream ss(s);
369     ss  <<  i;
370      return  ss.str();    
371 }
    
372
373 int  main() {
374     
375     LinkList  * l_firstLinkList  =   new  LinkList();
376     
377      while ( true ) {
378     showTitle();
379      int  input  =   0 ; // user input 
380     getUserInputInt(  & input );
381      
382          /**/ /*     
383     if( ADD_NEW_BOOK_ACTION != input &&
384                 DELETE_BOOK_ACTION  != input &&
385                 SEARCH_BOOK_ACTION  != input &&
386                 LIST_BOOK_ACTION    != input  ){
387       break; 
388     }
389      */

390     
391      if ( EXIT  ==  input ) {
392              break ;    
393         }

394         
395      switch (input) {
396              case  ADD_NEW_BOOK_ACTION: {
397                 l_firstLinkList -> addBook();
398          break ;
399       }

400        case  DELETE_BOOK_ACTION: {
401         l_firstLinkList -> deleteBook();
402          break ;
403       }

404        case  SEARCH_BOOK_ACTION: {
405         l_firstLinkList -> searchBook();
406          break ;
407       }

408        case  LIST_BOOK_ACTION: {
409         l_firstLinkList -> listAllBook();
410          break ;
411       }

412              default :
413                 cout  <<   " 請輸入正確選項!! "   <<  endl;
414     }
// end switch      
415     
416     
417     
418   }
// end while    
419
420     system( " pause " );
421      return   0 ;
422 }

423

你可能感兴趣的:(test)