C++程序设计原理与实践 第九章部分答案

  1 #include "../../st.h"                                       
  2 class Name_pairs{                                           
  3 public:                                                     
  4     void read_names();                                        
  5     void read_age();                                          
  6     //void print();                                             
  7     void sort1();                                             
  8     vector<string> return_name() const;                       //习题3
  9     vector<double> return_age() const;                            //习题3 
 10 private:                                                    
 11     vector<string>name;                                       
 12     vector<double>age;                                        
 13 };                                                          
 14                                                             
 15                                                             
 16 vector<string> Name_pairs::return_name() const              
 17 {                                                           
 18     return name;                                              
 19 }                                                           
 20                                                             
 21 vector<double> Name_pairs::return_age() const               
 22 {                                                           
 23     return age;                                               
 24 }                                                           
 25                                                             
 26 void Name_pairs::read_names()                               
 27 {                                                           
 28     string s;                                                 
 29     while(1)                                                  
 30     {                                                         
 31         cin>>s;                                                 
 32         if(s=="over")                                           
 33             break;                                                
 34         name.push_back(s);                                      
 35                                                             
 36     }                                                         
 37 }                                                           
 38                                                             
 39 void Name_pairs::read_age()                                 
 40 {                                                           
 41     double d;                                                 
 42     for(int i=0;i<name.size();i++)                            
 43     {                                                         
 44         cout<<"input "<<name[i]<<"'s age:";                     
 45         cin>>d;                                                 
 46         age.push_back(d);                                       
 47     }                                                         
 48 }                                                           
 49                                                             
 50 /*void Name_pairs::print()                                  
 51 {                                                           
 52     for(int i=0;i<name.size();i++)                            
 53         cout<<name[i]<<"   "<<age[i]<<endl;                     
 54 }*/                                                         
 55                                                             
 56 void Name_pairs::sort1()                                    
 57 {                                                           
 58     vector<string>name1;                                      
 59     vector<double>age1;                                       
 60     name1=name;                                               
 61     age1=age;                                                 
 62     sort(name.begin(),name.end());                            
 63     for(int j=0;j<name.size();j++)                            
 64     {                                                         
 65         for(int k=0;k<name.size();k++)                          
 66         {                                                       
 67             if(name[j]==name1[k])                                 
 68                 age1[j]=age[k];                                     
 69         }                                                       
 70     }                                                         
 71     age=age1;                                                 
 72                                                             
 73                                                             
 74 }                                                           
 75                                                             
 76 ostream& operator<<(ostream& os,const Name_pairs& np)       //习题3 
 77 {                                                           
 78     for(int i=0;i<np.return_name().size();i++)                
 79         os<<np.return_name()[i]<<"  "<<np.return_age()[i]<<endl;
 80     return os;                                                
 81 }                                                           
 82                                                             
 83 bool operator==(const Name_pairs&a,const Name_pairs&b)      //习题3 
 84 {                                                           
 85     return a.return_name()==b.return_name()                   
 86         &&a.return_age()==b.return_age();                       
 87 }                                                           
 88                                                             
 89 bool operator!=(const Name_pairs&a,const Name_pairs&b)      //习题3 
 90 {                                                           
 91     return !(a==b);                                           
 92 }                                                           
 93                                                             
 94 int main()                                                  
 95 {                                                           
 96     Name_pairs np;                                            
 97     np.read_names();                                          
 98     np.read_age();                                            
 99     np.sort1();                                               
100     cout<<np;                                                 
101     Name_pairs np1;                                           
102     np1=np;                                                   
103     if(np1==np)                                               
104         cout<<"yes"<<endl;                                      
105     keep_window_open();                                       
106 }     
习题2 3
  1 #include "../../st.h"      
  2 struct ISBN
  3 {
  4     int n1,n2,n3;
  5     char c;
  6     
  7 };
  8 
  9 istream& operator>>(istream& is,struct ISBN&i)
 10 {
 11     char c1,c2,c3;
 12     is>>i.n1>>c1>>i.n2>>c2>>i.n3>>c3>>i.c;
 13     if(!is)
 14         return is;
 15     if(c1!='-'||c2!='-'||c3!='-')
 16     {
 17         is.clear(ios_base::failbit);
 18         return is;
 19     }
 20     return is;
 21 }
 22 
 23 bool operator==(const struct ISBN&a,const struct ISBN&b)
 24 {
 25     return a.n1==b.n1&&a.n2==b.n2&&a.n3==b.n3&&a.c==b.c;
 26 }
 27 
 28 ostream& operator<<(ostream& os,struct ISBN&i)
 29 {
 30     return os<<i.n1<<"-"<<i.n2<<"-"<<i.n3<<"-"<<i.c;
 31 }
 32 
 33 struct DATA
 34 {
 35     int year;
 36     int month;
 37 };
 38 
 39 istream& operator>>(istream& is,struct DATA& dd)
 40 {
 41     char ch;
 42     is>>dd.year>>ch>>dd.month;
 43     if(!is)
 44         return is;
 45     
 46     while(ch!='-')
 47     {
 48         //is.clear(ios_base::failbit);
 49         cout<<"输入日期错误,重新输入(格式year_month):";
 50         is>>dd.year>>ch>>dd.month;
 51         if(!is)
 52             return is;
 53     }
 54     while(dd.month<1||dd.month>12)
 55     {
 56         cout<<"输入月份错误,重新输入:";
 57         is>>dd.month;
 58         if(!is)
 59             return is;
 60     }
 61     return is;
 62 }
 63 
 64 class BOOK{
 65 public:
 66     enum Genre
 67     {
 68         ficton=1,nonfiction,periodical,biography,children
 69     };
 70     BOOK();
 71     struct ISBN re_isbn() {return isbn;};
 72     string re_name(){return name;};
 73     string re_author(){return author;};
 74     struct DATA re_data(){return data;};
 75     char re_is_borrow(){return is_borrow;};
 76     void change_borrow();
 77     void read_book_one();
 78     Genre re_genre(){return genre;};
 79 private:
 80     struct ISBN isbn;
 81     string name;
 82     string author;
 83     struct DATA data;
 84     char is_borrow;
 85     Genre genre;
 86 };
 87 
 88 BOOK::BOOK()
 89 {
 90     isbn.n1=isbn.n2=isbn.n3=0;
 91     isbn.c=0;
 92     name="";
 93     author="";
 94     data.year=2001;
 95     data.month=1;
 96     is_borrow='f';
 97     genre=Genre(1);
 98 }
 99 
100 void BOOK::change_borrow()
101 {
102     if(is_borrow=='t')
103         is_borrow='n';
104     else
105         is_borrow='t';
106 }
107 
108 void BOOK::read_book_one()
109 {
110     int i;
111     cout<<"录入书名:";
112     cin>>name;
113     cout<<"录入作者:";
114     cin>>author;
115     cout<<"录入出版日期(year-month):";
116     cin>>data;
117     cout<<"录入ISBN号(x-x-x-x):";
118     cin>>isbn;
119     cout<<"录入书籍类型(ficton=1,nonfiction=2,periodical=3,biography=4,children=5):";
120     cin>>i;
121     genre=Genre(i);
122     cout<<"是否已出借(t/f):";
123     cin>>is_borrow;
124 }
125 
126 
127 void read_book(vector<BOOK>&book)
128 {
129     char ch;
130     cout<<"是否开始录入书本(y/n):";
131     cin>>ch;
132     if(ch=='n')
133         return;
134     BOOK b;
135     int ii=1;
136     while(1)
137     {
138         cout<<"录入书本"<<ii++<<""<<endl;
139         b.read_book_one();
140         book.push_back(b);
141         cout<<endl;
142         cout<<"是否继续录入书本(y/n):";
143         cin>>ch;
144         if(ch=='n')
145             break;
146         cout<<endl;
147     }
148 
149 }
150 
151 void borrow(string s,vector<BOOK>&book)
152 {
153     int i;
154     for(i=0;i<book.size();i++)
155     {
156         if(s==book[i].re_name())
157         {
158             if(book[i].re_is_borrow()=='t')
159                 cout<<"sorry,the book is borrowed."<<endl;
160             else
161             {
162                 cout<<"here is the book."<<endl;
163                 book[i].change_borrow();
164             }
165             break;
166         }
167     }
168     if(i==book.size())
169         cout<<"sorry,no you want book"<<endl;
170 
171 }
172 
173 void return_book(string s,vector<BOOK>&book)
174 {
175     int i;
176     for(i=0;i<book.size();i++)
177     {
178         if(s==book[i].re_name()){
179             cout<<"thank your cooperation."<<endl;
180             book[i].change_borrow();
181             break;
182         }
183     }
184     if(i==book.size())
185         cout<<"sorry,the book not belong to us"<<endl;
186 }
187 
188 bool operator==(BOOK&a,BOOK&b)
189 {
190     return a.re_isbn()==b.re_isbn();
191 }
192 
193 bool operator!=(BOOK&a,BOOK&b)
194 {
195     return !(a==b);
196 }
197 
198 ostream& operator<<(ostream& os,BOOK&b)
199 {
200     os<<endl<<""<<b.re_name()<<""<<endl<<"anthor: "<<b.re_author()<<endl<<"ISBN号: "<<b.re_isbn()<<endl<<"书籍类型: ";
201     switch(b.re_genre()){
202     case 1:
203         os<<"fiction"<<endl;
204         break;
205     case 2:
206         os<<"nonfiction"<<endl;
207         break;
208     case 3:
209         os<<"periodical"<<endl;
210         break;
211     case 4:    
212         os<<"biography"<<endl;
213         break;
214     case 5:
215         os<<"children"<<endl;
216         break;
217     }
218     return os;
219 }
220 
221 int main()
222 {
223     vector<BOOK>book;
224     read_book(book);
225     /*if(book.size()!=0){
226         string ss;
227         cout<<"borrow book:";
228         cin>>ss;
229         borrow(ss,book);
230         cout<<"return book:";
231         cin>>ss;
232         return_book(ss,book);
233     }*/
234     for(int i=0;i<book.size();i++)
235         cout<<book[i]<<endl;
236     keep_window_open();
237 
238 
239 
240 }
习题5 6 7
  1 ////
  2 //book.h
  3 
  4 #include "../../st.h"      
  5 struct ISBN
  6 {
  7     int n1,n2,n3;
  8     char c;
  9     
 10 };
 11 
 12 istream& operator>>(istream& is,struct ISBN&i)
 13 {
 14     char c1,c2,c3;
 15     //is.clear();
 16 //    is.sync();
 17     is>>i.n1>>c1>>i.n2>>c2>>i.n3>>c3>>i.c;
 18     if(!is)
 19         return is;
 20     if(c1!='-'||c2!='-'||c3!='-')
 21     {
 22         is.clear(ios_base::failbit);
 23         return is;
 24     }
 25     return is;
 26 }
 27 
 28 bool operator==(const struct ISBN&a,const struct ISBN&b)
 29 {
 30     return a.n1==b.n1&&a.n2==b.n2&&a.n3==b.n3&&a.c==b.c;
 31 }
 32 
 33 ostream& operator<<(ostream& os,struct ISBN&i)
 34 {
 35     return os<<i.n1<<"-"<<i.n2<<"-"<<i.n3<<"-"<<i.c;
 36 }
 37 
 38 struct DATE
 39 {
 40     int year;
 41     int month;
 42 };
 43 
 44 istream& operator>>(istream& is,struct DATE& dd)
 45 {
 46     char ch;
 47     //is.clear();
 48     //is.sync();
 49     is>>dd.year>>ch>>dd.month;
 50     if(!is)
 51         return is;
 52     
 53     while(ch!='-')
 54     {
 55         //is.clear(ios_base::failbit);
 56         cout<<"输入日期错误,重新输入(格式year_month):";
 57         is>>dd.year>>ch>>dd.month;
 58         if(!is)
 59             return is;
 60     }
 61     while(dd.month<1||dd.month>12)
 62     {
 63         cout<<"输入月份错误,重新输入:";
 64         is>>dd.month;
 65         if(!is)
 66             return is;
 67     }
 68     return is;
 69 }
 70 
 71 
 72 
 73 class BOOK{
 74 public:
 75     enum Genre
 76     {
 77         ficton=1,nonfiction,periodical,biography,children
 78     };
 79     BOOK();
 80     BOOK(struct ISBN);
 81     struct ISBN re_isbn() {return isbn;};
 82     string re_name(){return name;};
 83     string re_author(){return author;};
 84     struct DATE re_date(){return date;};
 85     char re_is_borrow(){return is_borrow;};
 86     void change_borrow();
 87     void read_book_one();
 88     Genre re_genre(){return genre;};
 89 
 90 private:
 91     struct ISBN isbn;
 92     string name;
 93     string author;
 94     struct DATE date;
 95     char is_borrow;
 96     Genre genre;
 97 };
 98 
 99 BOOK::BOOK()
100 {
101     isbn.n1=isbn.n2=isbn.n3=0;
102     isbn.c=0;
103     name="";
104     author="";
105     date.year=2001;
106     date.month=1;
107     is_borrow='f';
108     genre=Genre(1);
109 }
110 
111 BOOK::BOOK(struct ISBN is)
112 {
113     isbn.n1=is.n1;
114     isbn.n2=is.n2;
115     isbn.n3=is.n3;
116     isbn.c=is.c;
117     name="";
118     author="";
119     date.year=2001;
120     date.month=1;
121     is_borrow='f';
122     genre=Genre(1);
123 }
124 
125 void BOOK::change_borrow()
126 {
127     if(is_borrow=='t')
128         is_borrow='n';
129     else
130         is_borrow='t';
131 }
132 
133 void BOOK::read_book_one()
134 {
135     int i;
136     cout<<"录入书名:";
137     cin.clear();
138     cin.sync();
139     cin>>name;
140     cout<<"录入作者:";
141     cin.clear();
142     cin.sync();
143     cin>>author;
144     cout<<"录入出版日期(year-month):";
145     cin.clear();
146     cin.sync();
147     cin>>date;
148     cout<<"录入ISBN号(x-x-x-x):";
149     cin.clear();
150     cin.sync();
151     cin>>isbn;
152     cout<<"录入书籍类型(ficton=1,nonfiction=2,periodical=3,biography=4,children=5):";
153     cin.clear();
154     cin.sync();
155     cin>>i;
156     genre=Genre(i);
157     cout<<"是否已出借(t/f):";
158     cin.clear();
159     cin.sync();
160     cin>>is_borrow;
161 }
162 
163 
164 void read_book(vector<BOOK>&book)
165 {
166     char ch;
167     cout<<"是否开始录入书本(y/n):";
168     cin>>ch;
169     if(ch=='n')
170         return;
171     BOOK b;
172     int ii=1;
173     while(1)
174     {
175         cout<<"录入书本"<<ii++<<""<<endl;
176         b.read_book_one();
177         book.push_back(b);
178         cout<<endl;
179         cout<<"是否继续录入书本(y/n):";
180         cin>>ch;
181         if(ch=='n')
182             break;
183         cout<<endl;
184     }
185 
186 }
187 
188 void borrow(string s,vector<BOOK>&book)
189 {
190     int i;
191     for(i=0;i<book.size();i++)
192     {
193         if(s==book[i].re_name())
194         {
195             if(book[i].re_is_borrow()=='t')
196                 cout<<"sorry,the book is borrowed."<<endl;
197             else
198             {
199                 cout<<"here is the book."<<endl;
200                 book[i].change_borrow();
201             }
202             break;
203         }
204     }
205     if(i==book.size())
206         cout<<"sorry,no you want book"<<endl;
207 
208 }
209 
210 void return_book(string s,vector<BOOK>&book)
211 {
212     int i;
213     for(i=0;i<book.size();i++)
214     {
215         if(s==book[i].re_name()){
216             cout<<"thank your cooperation."<<endl;
217             book[i].change_borrow();
218             break;
219         }
220     }
221     if(i==book.size())
222         cout<<"sorry,the book not belong to us"<<endl;
223 }
224 
225 bool operator==(BOOK&a,BOOK&b)
226 {
227     return a.re_isbn()==b.re_isbn();
228 }
229 
230 bool operator!=(BOOK&a,BOOK&b)
231 {
232     return !(a==b);
233 }
234 
235 ostream& operator<<(ostream& os,BOOK&b)
236 {
237     os<<endl<<""<<b.re_name()<<""<<endl<<"anthor: "<<b.re_author()<<endl<<"ISBN号: "<<b.re_isbn()<<endl<<"书籍类型: ";
238     switch(b.re_genre()){
239     case 1:
240         os<<"fiction"<<endl;
241         break;
242     case 2:
243         os<<"nonfiction"<<endl;
244         break;
245     case 3:
246         os<<"periodical"<<endl;
247         break;
248     case 4:    
249         os<<"biography"<<endl;
250         break;
251     case 5:
252         os<<"children"<<endl;
253         break;
254     }
255     return os;
256 }
257 
258 
259 
260 //data.h
261 
262 #include "../../st.h"
263 
264 class Date{
265 public:
266     enum Month{
267         Jan=1,Feb,Mar,Apr,May,Jun,Aug,Sep,Oct,Nov,Dec
268     };
269     class Invalid{};
270 
271     Date(int y,Month m,int d);
272     Date();
273     Date(int y,int m,int d);
274 
275     int day() {return d;};
276     Month month() {return m;};
277     int year() {return y;};
278 
279     //void add_day(int n);
280     //void add_month(int n);
281     //void add_year(int n);
282 private:
283     int y;
284     Month m;
285     int d;
286 };
287 
288 
289 
290 
291 
292 
293 Date& default_date()
294 {
295     static Date dd(2001,Date::Jan,1);    
296     return dd;
297 }
298 
299 Date::Date()
300     :y(default_date().year()),m(default_date().month()),d(default_date().day())
301 {}
302 bool leapyear(int y)
303 {
304     if((y%4==0&&y%100!=0)||y%400==0)               //习题10
305         return true;
306     else
307         return false;
308 }
309 bool is_date(int y,Date::Month m,int d)
310 {
311     if(d<=0)
312         return false;
313     int days_in_month=31;
314     switch(m)
315     {
316     case Date::Feb:
317         days_in_month=(leapyear(y))?29:28;
318         break;
319     case Date::Apr: case Date::Jun:case Date::Sep:case Date::Nov:
320         days_in_month=30;
321         break;
322     }
323     if(days_in_month<d)
324         return false;
325     return true;
326 }
327 
328 
329 
330 ostream& operator<<(ostream& os,Date&d)
331 {
332     return os<<'('<<d.year()<<','<<d.month()<<','<<d.day()<<')';
333 }
334 
335 istream& operator>>(istream& is,Date& dd)
336 {
337     int y,m,d;
338     //char ch1,ch2,ch3,ch4;
339     is>>y>>m>>d;
340     if(!is)
341         return is;
342     /*if(ch1!='('||ch2!=','||ch3!=','||ch4!=')')
343     {
344         is.clear(ios_base::failbit);
345         return is;
346     }*/
347     return is;
348 }
349 
350 
351 Date::Date(int yy,Month mm,int dd)
352     :y(yy),m(mm),d(dd)
353 {
354     if(!is_date(yy,mm,dd))
355         throw Invalid();
356 }
357 
358 Date::Date(int yy,int mm,int dd)
359     :y(yy),m((Month)mm),d(dd)
360 {
361     if(!is_date(yy,(Month)mm,dd))
362         throw Invalid();
363 }
364 
365 ///
366 
367 //patron.h
368 
369 #include "../../st.h"      
370 class Patron{
371 public:
372     string re_name(){return name;}
373     string re_number(){return number;}
374     double re_expense(){return expense;}
375     void set_expense(double d);
376     void read_patron_one();
377     Patron(string);
378     Patron();
379 private:
380     string name;
381     string number;
382     double expense;
383 };
384 
385 Patron::Patron()
386 {
387     name="";
388     number="";
389     expense=0;
390 }
391 
392 Patron::Patron(string s)
393 {
394     name="";
395     number=s;
396     expense=0;
397 }
398 
399 void Patron::set_expense(double d)
400 {
401     expense=d;
402 }
403 
404 void Patron::read_patron_one()
405 {
406     cout<<"录入读者姓名:";
407     cin>>name;
408     cout<<"录入读者图书证号:";
409     cin>>number;
410     cout<<"录入读者借阅费:";
411     cin>>expense;
412     while(expense<0)
413     {
414         cout<<"录入借阅费错误,应>=0,重新录入:";
415         cin>>expense;
416     }
417 }
418 
419 bool judge_expense(Patron& p)
420 {
421     if(p.re_expense()>0)
422         return false;
423     if(p.re_expense()==0)
424         return true;
425 }
426 
427 void read_patron(vector<Patron>&patron)
428 {
429     char ch;
430     cout<<"是否开始录入读者数据(y/n):";
431     cin>>ch;
432     if(ch=='n')
433         return;
434     Patron p;
435     int ii=1;
436     while(1)
437     {
438         cout<<"录入读者"<<ii++<<""<<endl;
439         p.read_patron_one();
440         patron.push_back(p);
441         cout<<endl;
442         cout<<"是否继续录入读者数据(y/n):";
443         cin>>ch;
444         if(ch=='n')
445             break;
446         cout<<endl;
447     }
448 
449 }
450 
451 bool operator==(Patron&a,Patron&b)
452 {
453     return a.re_number()==b.re_number();
454 }
455 
456 bool operator!=(Patron&a,Patron&b)
457 {
458     return !(a==b);
459 }
460 
461 ostream& operator<<(ostream& os,Patron&p)
462 {
463     os<<p.re_name()<<"    图书证号:"<<p.re_number()<<endl;
464     if(judge_expense(p))
465         os<<"借阅费:"<<p.re_expense()<<endl;
466     return os;
467 }
468 
469 
470 
471 //transaction.h
472 
473 #include "book.h"
474 #include "patron.h"
475 #include "data.h"
476 
477 struct Transaction{
478     BOOK book;
479     Patron patron;
480     Date date;
481 };
482 
483 ostream& operator<<(ostream& os,struct Transaction&ts)
484 {
485     os<<ts.book<<ts.patron<<ts.date<<endl;
486     return os;
487 }
488 
489 ////
490 
491 //library.h
492 
493 #include "transaction.h"
494 
495 class Library{
496 public:
497     vector<BOOK> re_book(){return book;};
498     vector<Patron> re_patron(){return patron;};
499     vector<struct Transaction> re_transaction(){return transaction;};
500     vector<struct Transaction> re_transaction_pf(){return transaction_pf;};
501 
502     void borrow_book_people(Patron&p,BOOK&b);
503     void print_qf();
504     void _read_book();
505     void _read_patron();
506 private:
507     vector<BOOK> book;
508     vector<Patron> patron;
509     vector<struct Transaction> transaction;
510     vector<struct Transaction> transaction_pf;
511 };
512 
513 void Library::borrow_book_people(Patron&p,BOOK&b)
514 {
515     int i;
516 
517     for(i=0;i<book.size();i++)
518     {
519         if(b==book[i])
520         {
521             if(b.re_is_borrow()==true)
522                 cout<<"sorry,the book is already borrowed"<<endl;
523             else
524                 b=book[i];
525             break;
526         }
527     }
528     if(i==book.size())
529     {
530         cout<<"没有这本书籍"<<endl;
531         return;
532     }
533 
534     for(i=0;i<patron.size();i++)
535         if(p==patron[i])
536         {
537             p=patron[i];
538             break;
539         }
540     if(i==patron.size())
541     {
542         cout<<"没有这个读者"<<endl;
543         return;
544     }
545 
546 
547     
548     int a1,b1,c1;
549     struct Transaction ts;
550     ts.book=b;
551     ts.patron=p;
552     cout<<"输入今天日期(y m d):"; //若想直接cin>>data,应该需要用友元函数
553     cin.clear();
554     cin.sync();
555     cin>>a1>>b1>>c1;
556     ts.date=Date(a1,b1,c1);
557 
558     if(!judge_expense(p))
559     {
560         cout<<"该读者已欠费"<<endl;
561         transaction_pf.push_back(ts);
562     }
563     else
564     {
565         transaction.push_back(ts);
566     }
567 }
568 
569 void Library::print_qf()
570 {
571     for(int i=0;i<transaction_pf.size();i++)
572         cout<<transaction_pf[i]<<endl;
573 }
574 
575 void Library::_read_book()
576 {
577     char ch;
578     cout<<"是否开始录入书本(y/n):";
579     cin>>ch;
580     if(ch=='n')
581         return;
582     BOOK b;
583     int ii=1;
584     while(1)
585     {
586         cin.clear();
587         cin.sync();
588         cout<<"录入书本"<<ii++<<""<<endl;
589         b.read_book_one();
590         book.push_back(b);
591         cout<<endl;
592         cin.clear();
593         cin.sync();
594         cout<<"是否继续录入书本(y/n):";
595         cin>>ch;
596         if(ch=='n')
597             break;
598         cout<<endl;
599     }
600 }
601 
602 void Library::_read_patron()
603 {
604     char ch;
605     cout<<"是否开始录入读者数据(y/n):";
606     cin>>ch;
607     cin.clear();
608     cin.sync();
609     if(ch=='n')
610         return;
611     Patron p;
612     int ii=1;
613     while(1)
614     {
615         cout<<"录入读者"<<ii++<<""<<endl;
616         p.read_patron_one();
617         patron.push_back(p);
618         cout<<endl;
619         cin.clear();
620         cin.sync();
621         cout<<"是否继续录入读者数据(y/n):";
622         cin>>ch;
623         if(ch=='n')
624             break;
625         cout<<endl;
626     }
627 }
628 
629 /
630 
631 //main.cpp
632 
633 #include "library.h"
634 #include "../../st.h"
635 
636 int main()
637 {
638     Library l;
639     static string s;
640     static struct ISBN ib;
641     l._read_book();
642     l._read_patron();
643     char ch;
644     cout<<"是否进行借书程序(y/n):";
645     cin>>ch;
646 
647     while(ch!='n')
648     {
649         cout<<"输入书籍信息:"<<endl;
650         cin>>ib;
651         static BOOK b(ib);
652         cout<<"输入借书人信息:"<<endl;
653         cin>>s;
654         static Patron p(s);
655 
656         l.borrow_book_people(p,b);
657 
658         cout<<"是否继续借书程序(y/n):";
659         cin>>ch;
660     }
661 
662     l.print_qf();
663     keep_window_open();
664 }
习题9 10
 1 #include "../../st.h"      
 2 class Patron{
 3 public:
 4     string re_name(){return name;}
 5     string re_number(){return number;}
 6     double re_expense(){return expense;}
 7     void set_expense(double d);
 8 
 9 private:
10     string name;
11     string number;
12     double expense;
13 };
14 
15 void Patron::set_expense(double d)
16 {
17     expense=d;
18 }
19 
20 bool judge_expense(Patron p)
21 {
22     if(p.re_expense()>0)
23         return false;
24     if(p.re_expense()==0)
25         return true;
26 }
习题8
  1 #include "../../st.h"
  2 enum Week{
  3         mon=1,tues,wed,thu,fri,sat,sun
  4     };
  5 enum Month{
  6         Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
  7     };
  8     
  9 class Date{
 10 public:
 11     
 12 
 13     class Invalid{};
 14 
 15     Date(int y,Month m,int d);
 16     Date();
 17     Date(int y,int m,int d);
 18 
 19     int day() {return d;}
 20     Month month() {return m;}
 21     int year() {return y;}
 22     Week week() {return w;}
 23     Week get_week();
 24     long sun_day(){return l;}
 25     friend istream& operator>>(istream& is,Date& dd);
 26     void add_day(int n);
 27     void add_month(int n);
 28     void add_year(int n);
 29     void get_date();
 30     long get_sum_day();
 31     int day_sum();
 32 private:
 33     int y;
 34     Month m;
 35     int d;
 36     Week w;
 37     long l;
 38 };
 39 
 40 Date& default_date()
 41 {
 42     static Date dd(1970,Jan,1);    
 43     return dd;
 44 }
 45 
 46 Date::Date()
 47     :y(default_date().year()),m(default_date().month()),d(default_date().day())
 48 {
 49     
 50 }
 51 
 52 bool leapyear(int y)           //习题10
 53 {
 54     if((y%4==0&&y%100!=0)||y%400==0)
 55         return true;
 56     else
 57         return false;
 58 }
 59 
 60 bool is_date(int y,Month m,int d)
 61 {
 62     if(d<=0)
 63         return false;
 64     int days_in_month=31;
 65     switch(m)
 66     {
 67     case Feb:
 68         days_in_month=(leapyear(y))?29:28;
 69         break;
 70     case Apr: case Jun:case Sep:case Nov:
 71         days_in_month=30;
 72         break;
 73     }
 74     if(days_in_month<d)
 75         return false;
 76     return true;
 77 }
 78 
 79 void Date::add_year(int n)
 80 {
 81     y+=n;
 82 }
 83 
 84 void Date::add_month(int n)
 85 {
 86     int i=m;
 87     i+=n;
 88     while(i>12)
 89     {
 90         i-=12;
 91         add_year(1);
 92     }
 93     m=(Month)i;
 94 }
 95 
 96 void Date::add_day(int n)
 97 {
 98     int days_in_month;
 99     d+=n;
100     while(1)
101     {
102         switch(m)
103         {
104         case Feb:
105             days_in_month=(leapyear(y))?29:28;
106             break;
107         case Apr: case Jun:case Sep:case Nov:
108             days_in_month=30;
109             break;
110         }
111     
112         if(d>days_in_month)
113         {
114             d=d-days_in_month;
115             add_month(1);
116         }
117         else{
118             w=get_week();
119             l+=n;
120             break;
121         }
122     }
123 
124 }
125 
126 ostream& operator<<(ostream& os,Date&d)
127 {
128     return os<<'('<<d.year()<<','<<d.month()<<','<<d.day()<<')'<<"--"<<d.sun_day()<<endl;
129 }
130 
131 Week Date::get_week()
132 {
133     int y1,m1,c1,d1;
134     if(m==1||m==2)
135     {
136         m1=12+m;
137         y1=(y-1)%100;
138         c1=(y-1)/100;
139         d1=d;
140     }
141     else
142     {
143         m1=m;
144         y1=y%100;
145         c1=y/100;
146         d1=d;
147     }
148     int x=y1+y1/4+c1/4-2*c1+(26*(m1+1)/10)+d1-1;
149     x%=7;
150     return (Week)x;
151 }
152 
153 void Date::get_date()
154 {
155     int y1,m1,d1;
156     cin>>y1>>m1>>d1;
157     while(y1<1970||m1<1||m1>12||d1<1||d1>31)
158     {
159         if(y1<1970)
160             cout<<"输入年份错误,重新输入:";
161         if(m1<1||m1>12)
162             cout<<"输入月份错误,重新输入:";
163         if(d1<1||d1>31)
164             cout<<"输入号数错误,重新输入:";
165         cin>>y1>>m1>>d1;
166     }
167     
168     //可加上清除输入流的函数
169     
170     y=y1;
171     m=Month(m1);
172     d=d1;
173     w=get_week();
174     l=get_sum_day();
175 }
176 
177 long Date::get_sum_day()
178 {
179     long l1=0;;
180     int i;
181     for(i=1970;i<y;i++)
182     {
183         static Date d1(i,(Month)12,31);
184         l1+=d1.day_sum();
185     }
186     l1+=day_sum();
187     l=l1;
188     return l1-1;
189 }
190 
191 istream& operator>>(istream& is,Month&m)
192 {
193     is>>m;
194     return is;
195 }
196 
197 istream& operator>>(istream& is,Date& dd)
198 {
199     int y,m,d;
200     //char ch1,ch2,ch3,ch4;
201     is>>y>>m>>d;
202     if(!is)
203         return is;
204     /*if(ch1!='('||ch2!=','||ch3!=','||ch4!=')')
205     {
206         is.clear(ios_base::failbit);
207         return is;
208     }*/
209     return is;
210 }
211 
212 
213 Date::Date(int yy,Month mm,int dd)
214     :y(yy),m(mm),d(dd)
215 {
216     w=get_week();
217     l=get_sum_day();
218     if(!is_date(yy,mm,dd))
219         throw Invalid();
220 }
221 
222 Date::Date(int yy,int mm,int dd)
223     :y(yy),m((Month)mm),d(dd)
224 {
225     w=get_week();
226     l=get_sum_day();
227     if(!is_date(yy,(Month)mm,dd))
228         throw Invalid();
229 }
230 
231 Date next_weekday(Date&d)
232 {
233     Date d1=d;
234     if(d1.week()==sun||d1.week()==mon||d1.week()==tues||d1.week()==wed||d1.week()==thu)
235         d1.add_day(1);
236     else if(d1.week()==fri)
237         d1.add_day(3);
238     else
239         d1.add_day(2);
240     return d1;
241         
242 }
243 
244 int Date::day_sum()
245 {
246     int i=0;
247     switch(m)
248     {
249     case Dec:
250         i+=30;
251     case Nov:
252         i+=31;
253     case Oct:
254         i+=30;
255     case Sep:
256         i+=31;
257     case Aug:
258         i+=31;
259     case Jul:
260         i+=30;
261     case Jun:
262         i+=31;
263     case May:
264         i+=30;
265     case Apr:
266         i+=31;
267     case Mar:
268         i+=28;
269     case Feb:
270         i+=31;
271     }
272     if(leapyear(y)&&m>2)
273         i++;
274     i+=d;
275     return i;
276 }
277 
278 int week_of_year(Date&d)
279 {
280     int i=1;
281     int j=0;
282     Date d1(d.year(),1,1);
283     if(d1.week()==sun)
284         j+=7;
285     else
286         j+=7-d1.week();
287     while(j<d.day_sum())
288     {
289         j+=7;
290         i++;
291     }
292     return i;
293 }
294 
295 int main()
296 {
297     Date d;
298     d.get_date();
299     cout<<d<<endl;
300     keep_window_open();
301 }
习题11 12
  1 #include "../../st.h"
  2 
  3 class Rational{
  4 public:
  5     int re_fenzi()const{return fenzi;}
  6     int re_fenmu()const{return fenmu;}
  7     Rational():fenzi(0),fenmu(1){}
  8     Rational(int i):fenzi(i),fenmu(1){}
  9     Rational(int i1,int i2):fenzi(i1),fenmu(i2){}
 10     void to_easy();
 11     void operator=(Rational&a);
 12     friend istream& operator>>(istream&is,Rational&rt);
 13 private:
 14     int fenzi;
 15     int fenmu;
 16 };
 17 
 18 
 19 void Rational::to_easy()
 20 {
 21     int i=(fenzi>fenmu)?fenmu:fenzi;
 22     while(i>0)
 23     {
 24         if(fenzi%i==0&&fenmu%i==0)
 25         {
 26             fenzi/=i;
 27             fenmu/=i;
 28         }
 29         i--;
 30     }
 31 }
 32 
 33 Rational operator+(const Rational&a,const Rational&b)
 34 {
 35     int i=a.re_fenzi()*b.re_fenmu()+a.re_fenmu()*b.re_fenzi();
 36     int j=a.re_fenmu()*b.re_fenmu();
 37     Rational rt(i,j);
 38     rt.to_easy();
 39     return rt;
 40 }
 41 
 42 Rational operator-(const Rational&a,const Rational&b)
 43 {
 44     int i=a.re_fenzi()*b.re_fenmu()-a.re_fenmu()*b.re_fenzi();
 45     int j=a.re_fenmu()*b.re_fenmu();
 46     Rational rt(i,j);
 47     rt.to_easy();
 48     return rt;
 49 }
 50 
 51 Rational operator*(const Rational&a,const Rational&b)
 52 {
 53     int i=a.re_fenzi()*b.re_fenzi();
 54     int j=a.re_fenmu()*b.re_fenmu();
 55     Rational rt(i,j);
 56     rt.to_easy();
 57     return rt;
 58 }
 59 
 60 Rational operator/(const Rational&a,const Rational&b)
 61 {
 62     int i=a.re_fenzi()*b.re_fenmu();
 63     int j=a.re_fenmu()*b.re_fenzi();
 64     Rational rt(i,j);
 65     rt.to_easy();
 66     return rt;
 67 }
 68 
 69 void Rational::operator=(Rational&b)
 70 {
 71     b.to_easy();
 72     fenzi=b.fenzi;
 73     fenmu=b.fenmu;
 74 }
 75 
 76 bool operator==(Rational a,Rational b)
 77 {
 78     a.to_easy();
 79     b.to_easy();
 80     return a.re_fenmu()==b.re_fenmu()&&a.re_fenzi()==b.re_fenzi();
 81 }
 82 
 83 bool operator!=(Rational a,Rational b)
 84 {
 85     return !(a==b);
 86 }
 87 
 88 ostream& operator<<(ostream&os,Rational&rt)
 89 {
 90     return os<<rt.re_fenzi()<<"/"<<rt.re_fenmu();
 91 }
 92 
 93 istream& operator>>(istream&is,Rational&rt)
 94 {
 95     char ch;
 96     is>>rt.fenzi>>ch>>rt.fenmu;
 97     return is;
 98 }
 99 
100 double rational_to_double(Rational&rt)
101 {
102     double d;
103     if(rt.re_fenmu()!=0)
104         d=(double)rt.re_fenzi()/(double)rt.re_fenmu();
105     else
106         error("分母为0");
107     return d;
108 }
109 
110 int main()
111     try{
112         Rational r1,r2;
113         cin>>r1>>r2;
114         cout<<r1<<endl<<r2<<endl;
115         Rational r3=r1+r2;
116         cout<<r3<<endl;
117         cout<<r1-r2<<endl;
118         cout<<r1*r2<<endl;
119         cout<<r1/r2<<endl;
120         r2=r1;
121         cout<<r1<<endl<<r2<<endl;
122         if(r1==r2)
123             cout<<"yes"<<endl;
124         if(r1!=r2)
125             cout<<"no"<<endl;
126         cout<<rational_to_double(r1)<<endl;
127         keep_window_open();
128     }
129 catch(exception&e)
130 {
131     cerr<<e.what()<<endl;
132     keep_window_open("~~");
133     return 1;
134 }       
习题13
  1 #include "../../st.h"
  2 
  3 class Money{
  4 public:
  5     Money():yuan(0),fen(0),s("USD"){sum=0;}
  6     Money(int i):yuan(i),fen(0),s("USD"){sum=i*100;d=(double)sum/100;}
  7     Money(int i1,int i2):yuan(i1),fen(i2),s("USD"){to_real();sum=yuan*100+fen;d=(double)sum/100;}
  8     Money(string ss,double dd):s(ss),d(dd){yuan=int(d);fen=int(d*100)%100;}
  9     int re_yuan(){return yuan;}
 10     int re_fen(){return fen;}
 11     double re_double(){return d;}
 12     string re_str(){return s;}
 13     void to_real();
 14     void to_double();
 15     friend istream& operator>>(istream& is,Money&m);
 16 private:
 17     int yuan;
 18     int fen;
 19     long sum;
 20     double d;
 21     string s;
 22 
 23 };
 24 
 25 
 26 
 27 
 28 void Money::to_real()                    //假设输入美分都是三位数
 29 {
 30     int i;
 31     
 32     if(fen/100!=0)
 33     {
 34         if((fen%10)>=5)
 35         {
 36             fen/=10;
 37             fen++;
 38         }
 39         else
 40             fen/=10;
 41     }
 42     sum=yuan*100+fen;
 43 }
 44 
 45 istream& operator>>(istream& is,Money&m)
 46 {
 47     //char c;
 48     //is>>c>>m.yuan>>c>>m.fen;
 49     is>>m.s>>m.d;
 50     m.yuan=int(m.d);
 51     m.fen=int(m.d*100)%100;
 52     return is;
 53 }
 54 
 55 void Money::to_double()   
 56 {
 57     d=double(sum)/100;
 58 }
 59 
 60 
 61 
 62 ostream& operator<<(ostream& os,Money&m)
 63 {
 64     m.to_real();
 65     m.to_double();
 66     return os<<m.re_str()<<" "<<m.re_double();;
 67 }
 68 
 69 vector<string>name;
 70 vector<double>rate;
 71 
 72 void fn()      //录入各国家与美元的汇率
 73 {
 74     string s="USD";
 75     double r=1;
 76     name.push_back(s);
 77     rate.push_back(r);
 78     cout<<"输入美国与其他国家的汇率:"<<endl<<"输入国家:";
 79     while(s!="over")
 80     {
 81         cin>>s;
 82         name.push_back(s);
 83         cout<<"输入汇率:";
 84         cin>>r;
 85         rate.push_back(r);
 86         cout<<"继续输入国家:";
 87         cin>>s;
 88     }
 89 }
 90 
 91 Money operator+(Money&a,Money&b)
 92 {
 93     int i,j;
 94     for(i=0;i<name.size();i++)
 95         if(a.re_str()==name[i])
 96             break;
 97     for(j=0;j<name.size();j++)
 98         if(b.re_str()==name[j])
 99             break;
100     if(i==name.size()||j==name.size())
101         error("没有这个汇率登记记录");
102     Money mm("USD",a.re_double()*rate[i]+b.re_double()*rate[j]);
103     return mm;
104 }
105 
106 int main()
107 try{
108     vector<string>name;
109     vector<double>rate;
110     Money m1,m2;
111     cin>>m1>>m2;
112     cout<<m1<<endl<<m2<<endl;
113     fn();
114     cout<<m1+m2<<endl;
115     keep_window_open();
116 }
117 catch(exception&e)
118 {
119     cerr<<e.what()<<endl;
120     keep_window_open("~~");
121     return 1;
122 }        
习题14 15

 

转载于:https://www.cnblogs.com/yueba/p/4088404.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值