C++ Primer Plus章节编程练习第九章
1
题目
下面是一个头文件:
#ifndef GOLF_H_ #define GOLF_H_ const int Len=40; struct golf{ char fullname[Len]; int handicap; }; //设置golf的值 void setgolf(golf &g,const char* name, int hc); //提示用户输入并设置golf的值 int setgolf(golf &g); //重置handicap的值 void handicap(golf &g,int hc); void showgolf(const golf &g); #endif
注意到setgolf()被重载,可以这样使用其中的第一个版本:
golf ann; setgolf(ann,"Ann Birdfree",24);
上述函数调用提供了存储再ann结构中的信息。可以这样使用其第二个版本:
golf andy; setgolf(andy);
上述函数将提示用户输入姓名和等级,并将他们存储在andy结构中。这个函数可以(但是不一定必须)再内部使用第一个版本。
根据这个头文件,创建一个多文件程序。其中的二个文件名为golf.cpp,它提供了与头文件中的原型匹配的函数定义;另一个文件应包含main(),并演示原型化函数的所有特性。例如,包含一个让用户输入的循环,并使用输入的数据来填充一个由golf结构组成的数组,数组被填满或用户将高尔夫选手的姓名设置为空字符串时,循环将结束。main()函数只使用头文件中原型化的函数来访问golf结构。
题解
源文件golf.cpp:
#include<iostream> #include<cstring> #include"golf.h" void setgolf(golf &g,const char* name, int hc){ std::strcpy(g.fullname,name); g.handicap=hc; } //提示用户输入并设置golf的值,如果读入名字,返回1;如果读入空行,返回0; int setgolf(golf &g){ std::cout<<"Enter the name: "; std::cin.getline(g.fullname,Len); if(g.fullname[0]=='\0') return 0; //如果读入空行,则返回0 std::cout<<"Enter the handicap: "; std::cin>>g.handicap; return 1; } //重置handicap的值 void handicap(golf &g,int hc){ g.handicap=hc; } void showgolf(const golf &g){ using std::cout; using std::endl; cout<<"Name: "<<g.fullname<<endl; cout<<"Handicap: "<<g.handicap<<endl; }
源文件1.cpp:
//与golf.cpp一同编译 #include<iostream> #include"golf.h" int main(){ using namespace std; golf first,second; setgolf(first,"First one",1); if(setgolf(second)){ cout<<"Set second successfully!"<<endl; showgolf(second); } else cout<<"Set second unsuccessfully!"<<endl; handicap(first,3); showgolf(first); return 0; }
2
题目
修改程序清单9.9:用string对象代替字符数组。这样,该程序将不再需要检查输入的字符串是否过长,同时可以将输入字符串同字符串“进行比较,以判断是否为空行。
题解
#include<iostream> #include<string> void strcount(std::string str); int main(){ using namespace std; string input; cout<<"Enter a line:\n"; getline(cin,input); while(input!=""){ strcount(input); cout<<"Enter next line(empty line to quit):\n"; getline(cin,input); } cout<<"Bye\n"; return 0; } void strcount(std::string str){ using namespace std; static int total=0; int count=0; cout<<"\""<<str<<"\" contains "; count=str.size(); total+=count; cout<<count<<" characters\n"; cout<<total<<" characters total\n"; }
3
题目
下面是一个结构声明:
struct chaff{ char dross[20]; int slag; };
编写一个程序,使用定位new运算符将一个包含两个这种结构的数组放在一个缓冲区中。然后,给结构的成员赋值(对于char数组,使用函数strcpy()),并使用一个循环来显示内容。一种方法是像程序清单9.10那样将一个静态数组用作缓冲区;另一种方法是使用常规new运算符来分配缓冲区。
题解
#include<iostream> #include<cstring> #include<new> using namespace std; const int BUF=200; char buffer[BUF]; struct chaff{ char dross[20]; int slag; }; int main(){ const char* drosses[2]={"chaff one","chaff two"}; chaff* pheap=new chaff[2]; chaff* pbuff=new (buffer) chaff[2]; cout<<"The address of pheap: "<<pheap<<endl; cout<<"The address of pbuff: "<<(void*)pbuff<<endl; cout<<endl; for(int i=0;i<2;i++){ strcpy(pheap[i].dross,drosses[i]); pheap[i].slag=i; strcpy(pbuff[i].dross,drosses[i]); pbuff[i].slag=i; } for(int i=0;i<2;i++){ cout<<"The address of pheap["<<i<<"] : "<<&pheap[i]<<endl; cout<<"The contains:"<<endl; cout<<"Dross: "<<pheap[i].dross<<endl; cout<<"Slag: "<<pheap[i].slag<<endl; cout<<"The address of pbuff["<<i<<"] : "<<&pbuff[i]<<endl; cout<<"The contains:"<<endl; cout<<"Dross: "<<pbuff[i].dross<<endl; cout<<"Slag: "<<pbuff[i].slag<<endl; } delete [] pheap; return 0; }
4
题目
请基于下面这个名称空间编写一个由3个文件组成的程序:
#ifndef SALES_H_ #define SALES_H_ namespace SALES{ const int QUARTERS=4; struct Sales{ double sales[QUARTERS]; double average; double max; double min; }; //从ar中复制最多4个或者n个到s的sales成员中,计算平均值和最大最小值并存到对应的成员变量中 void setSales(Sales& s,const double ar[],int n); //提示并读入四个数字,计算并存入对应的成员变量中 void setSales(Sales& s); //显示结构体 void showSales(const Sales &s); } #endif
第一个文件是一个头文件,其中包含名称空间;第二个文件是一个源代码文件,它对这个名称空间进行扩展,以提供这三个函数的定义:第三个文件声明两个Sales对象,并使用setSales()的交互式版本为一个结构提供值,然后使用setSales()的非交互式版本为另一个结构提供值。另外它还使用showSales()来显示这两个结构的内容。
题解
源代码文件sales.cpp:
//sales.cpp #include<iostream> #include"sales.h" namespace SALES{ //从ar中复制最多4个或者n个到s的sales成员中,计算平均值和最大最小值并存到对应的成员变量中 void setSales(Sales& s,const double ar[],int n){ if(n<=0) return; n=n<QUARTERS?n:QUARTERS; double sum=0.0; s.max=s.min=ar[0]; int i; for(i=0;i<n;i++){ sum+=ar[i]; s.sales[i]=ar[i]; if(ar[i]>s.max) s.max=ar[i]; if(ar[i]<s.min) s.min=ar[i]; } //如果小于4个则,将其他置零 if(i<QUARTERS) for(;i<QUARTERS;i++) s.sales[i]=0.0; s.average=sum/QUARTERS; } //提示并读入四个数字,计算并存入对应的成员变量中 void setSales(Sales& s){ using std::cout; using std::cin; cout<<"Enter 4 numbers as the seales:"<<std::endl; double sum=0.0; for(int i=0;i<QUARTERS;i++){ cin>>s.sales[i]; sum+=s.sales[i]; if(i==0) s.max=s.min=s.sales[i]; else{ if(s.sales[i]>s.max) s.max=s.sales[i]; if(s.sales[i]<s.min) s.min=s.sales[i]; } } s.average=sum/QUARTERS; } //显示结构体 void showSales(const Sales &s){ using std::cout; using std::endl; cout<<"Sales for 4 quarters as following:\n"; for(int i=0;i<QUARTERS;i++){ if(i) putchar(' '); cout<<s.sales[i]; } cout<<endl; cout<<"The average of all sales: "<<s.average<<endl; cout<<"The max sale: "<<s.max<<endl; cout<<"The min sale: "<<s.min<<endl; } }
源代码文件4.cpp:
//与sales.cpp一起编译 #include<iostream> #include"sales.h" int main(){ SALES::Sales one,two; double mysales[]={100.2, 200.3, 300.4, 400.5}; SALES::setSales(one,mysales,3); SALES::setSales(two); SALES::showSales(one); SALES::showSales(two); return 0; }
Comments | NOTHING