C++ Primer Plus 第九章编程题练习
第一题
题目描述
下面是一个头文件:
const int Len = 40;
struct golf
{
char fullname[Len];
int handicap;
};
int setgolf(golf &g);
void handicap(golf &g, int hc);
void showgolf(const golf &g);
函数说明
注意到setgolf( )被重载,可以这样使用其第一个版本:
golf ann;
setgolf (ann,"Ann Birdfree", 24);
上述函数调用提供了存储在ann结构中的信息。可以这样使用其第二个版本:
golf andy;
setgolf (andy);
上述函数将提示用户输入姓名和等级,并将它们存储在andy结构中。这个函数可以(但是不一定必须) 在内部使用第一个版本。
根据这个头文件,创建一个多文件程序。其中的一个文件名为golf.cpp,它提供了与头文件中的 原型匹配的函数定义;另一个文件应包含main(),并演示原型化函数的所有特性。例如,包含一个 让用户输入的循环,并使用输入的数据来填充一个由golf结构组成的数组,数组被填满或用户将高 尔夫选手的姓名设置为空字符串时,循环将结束。main( )函数只使用头文件中原型化的函数来访问 golf结构。
代码片段
//golf.h
const int Len = 40;
struct golf
{
char fullname[Len];
int handicap;
};
void setgolf(golf &g, const char *name, int hc);
int setgolf(golf &g);
void handicap(golf &g, int hc);
void showgolf(const golf &g);
//golf.cpp
#include<iostream>
#include<cstring>
#include"golf.h"
void setgolf(golf &g, const char *name, int hc)
{
strcpy(g.fullname,name);
handicap(g,hc);
return ;
}
int setgolf(golf &g)
{
using namespace std;
cin.clear();
cin.sync();
cout<<"Fullname: ";
cin.getline(g.fullname,Len);
if(!strcmp(g.fullname,""))
return 0;
else
{
cout<<"Handicap: ";(cin>>g.handicap).get();
return 1;
}
}
void handicap(golf &g, int hc)
{
g.handicap=hc;
}
void showgolf(const golf &g)
{
using std::cout;
cout<<"Fullname: "<<g.fullname<<"\nHandicap: "<<g.handicap<<'\n';
return;
}
//main.cpp
#include <iostream>
#include "golf.h"
int m = 0;
int main(void)
{
using namespace std;
cout << "Please enter how many persons will you enter? " << endl;
while (!(cin >> m))
{
cout << "Invalid input! Please enter ahain!\n";
cin.clear();
cin.sync();
}
cin.clear();
cin.sync();
golf *pr = new golf[m];
cout << "Now, you can input your data in the formal of below data: \n";
setgolf(pr[0], "fullname1", 1);
showgolf(pr[0]);
cout << "Below are your inputs: \n";
for (int i = 0; i < m&&setgolf(pr[i]); i++)
cout << "\nThe next input: \n\n";
cout << "\nThe input has finished!\nBye!\n";
cout << "Below are your input: \n";
for (int i = 0; i < m && pr[i].fullname[0] != '\0'; i++)
showgolf(pr[i]);
while (cin.get() != EOF)
;
return 0;
}
第二题
题目描述
修改程序清单9.9,用string 对象代替字符数组。这样,该程序将不再需要检查输入的字符串是否 过长,同时可以将输入字符串同字符串“” 进行比较,以判断是否为空行。
代码片段
#include <iostream>
#include<string>
#include<cstring>
using namespace std;
const int Size = 10;
void strcount(const string str)
{
static int total = 0;
int count = 0;
cout << "\"" << str << "\" contains ";
for(int i=0;str[i]!='\0';i++)
if(str[i]!=' ')
count++;
total += count;
cout << count << " characters\n";
cout << total << " characters total!\n";
}
int main()
{
string input;
cout << "Enter a line:" << endl;
while (getline(cin,input))
{
if(input=="")
break;
cin.clear();
cin.sync();
strcount(input);
cout<<"Enter next line( empty line to quit): "<<endl;
}
cout << "Bye!" << endl;
while(cin.get()!=EOF);
return 0;
}
第三题
题目描述
下面是一个结构声明
struct chaff{
char dross[20];
int slag;
}
编写一个程序,使用定位new运算符将一个包含两个这种结构的数组放在一个缓冲区中。然后,给结构的成员赋值(对于char数组,使用函数strcpy()),并使用一个循环来显示内容。一种方法是像程序清单9.10那样将一个静态数组用作缓冲区;另一种方法是使用常规new运算符来分配缓冲区。
代码片段
#include <iostream>
#include<cstring>
using namespace std;
struct chaff
{
char dross[20];
int slag;
};
char zeon[512];
int main(void)
{
chaff *pr = new (zeon) chaff[2];
chaff *ps = new chaff[2];
cout<<"Please enter your data:\n";
for(int i=0;i<2;i++)
{
cout<<"Dross: ";
char name[20];
cin.getline(name,20);
cin.clear();
cin.sync();
strcpy((pr+i)->dross,name);
strcpy((ps+i)->dross,name);
cout<<"\nSlag: ";
cin>>(pr+i)->slag;
cin.get();
(ps+i)->slag=(pr+i)->slag;
}
for(int i=0;i<2;i++)
{
cout<<"\n#"<<i<<':'<<endl;
cout<<"Dross: "<<(pr+i)->dross<<endl<<(ps+i)->dross;
cout<<"\nSlag: "<<(ps+i)->dross<<endl<<(ps+i)->slag<<endl;
}
while (cin.get() != EOF)
;
return 0;
}
第四题
题目描述
请基于下面这个名称空间编写一个由3个文件组成的程序:
namespace SALES
{
const int QUARTERS = 4;
struct Sales
{
double sales[QUARTERS];
double average;
double max;
double min;
};
void setSales(Sales &S, const double ar[], int n);
void setSales(Sales &s);
void showSales(const Sales &s);
}
第一个文件是一个头文件,其中包含名称空间;第二个文件是一个源代码文件,它对这个名称空间进行扩展,以提供这三个函数的定义;第三个文件声明两个Sales对象,并使用setSales( )的交互式版本为一个结构提供值,然后使用setSales( )的非交互式版本为另一个结构提供值。另外它还使用showSales( )来显示这两个结构的内容。
代码片段
//4.h
namespace sALEs
{
const int QUARTERs = 4;
struct sales
{
double sales[QUARTERs];
double average;
double max;
double min;
};
void setsales(sales &s, const double ar[], int n);
void setsales(sales &s);
void showsales(const sales &s);
}
//4.cpp
#include <iostream>
#include "4.h"
namespace sALEs
{
void setsales(sales &s, const double ar[], int n)
{
double sum = 0;
double min = ar[0], max = ar[0];
for (int i = 0; i < QUARTERs && i < n; i++)
{
s.sales[i] = ar[i];
sum += ar[i];
if (min > ar[i])
min = ar[i];
if (max < ar[i])
max = ar[i];
}
s.average = sum / (n > QUARTERs ? QUARTERs : n);
s.min = min;
s.max = max;
}
void setsales(sales &s)
{
using std::cout, std::cin;
cout << "Please enter the sales(lesser than 0 to quit and no more than four numbers): \n";
double min, max, sum = 0;
int i;
for (i = 0; i < 4; i++)
{
cout << "#" << i+1 << "\n";
cin >> s.sales[i];
if (s.sales[i] < 0)
break;
if (i == 0)
max = min = s.sales[0];
sum += s.sales[i];
if (min > s.sales[i])
min = s.sales[i];
if (max < s.sales[i])
max = s.sales[i];
}
cout << "Bye!\n";
s.average=sum/i; s.min = min;
s.max = max;
}
void showsales(const sales &s)
{
using namespace std;
cout<<"sales:\n";
for(int i=0;i<4;i++)
{
if(s.sales[i]>1e-6)
cout<<s.sales[i]<<' ';
else
{
cout<<endl;
break;
}
cout<<endl;
}
cout<<"\nAverage :"<<s.average<<endl<<"Max: "<<s.max<<endl<<"Min: "<<s.min<<endl;
}
}
//main.cpp
#include<iostream>
#include"4.h"
int main(void)
{
using namespace sALEs;
sales exam1,exam2;
double temp[3]={1.1,2.2,3.3};
setsales(exam1,temp,3);
showsales(exam1);
setsales(exam2);
showsales(exam2);
while(std::cin.get()!=EOF);
return 0;
}