c++ primer plus第八章习题答案

这章讲引用、模版和重载


第一题

/*
这道题什么意思?
第二个值为零或空,只打印一次;
第二个值非零时,调用第一次,打印一次字符串;调用第二次,打印两次字符串
以此类推
*/
#include <iostream>
using namespace std;

void Print(const char * pt, int n = 0);

int main()
{
char words[] = {"Hello World!"};

Print(words);

Print(words, 1);

Print(words, 0);

Print(words, 1);

return 0;
}

void Print(const char * pt, int n)
{
static int count_sum = 0;
static int count_time = 0;

count_sum++;

cout << "The " << count_sum << " time: " << endl;
if(n == 0)
cout << pt << endl;
else
{
count_time++;
cout << "The " << count_time << " time n != 0: " << endl;
for(int i = 0; i < count_sum; i++)
{
cout << pt << endl;
}
}
}


第二题

#include <iostream>

typedef struct
{
char* brand;
double mass;
int heat;
}CandyBar;

void Init(CandyBar & candy, char * brand = "Millennium Munch", double mass = 2.85, int heat = 350);
void Print(const CandyBar can);

int main(void)
{
CandyBar mycandy1, mycandy2;
Init(mycandy1);
Init(mycandy2, "Chocolate", 3.1415, 100);

Print(mycandy1);
Print(mycandy2);

return 0;
}

void Init(CandyBar & candy, char * brand, double mass, int heat)
{
candy.brand = brand;
candy.mass = mass;
candy.heat = heat;
}

void Print(const CandyBar can)
{
using namespace std;
cout << can.brand << ": mass = " << can.mass << ", heat = " << can.heat << endl;
}


第三题

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

//*******************************************************************//
//***********标注部分是另一种实现方式,基于字符类型******************//
/*char convert(char character)
{
if(character >= 97 && character <= 122)
return(toupper(character));
else
return(character);
}*/
//*******************************************************************//

void conversion(string & str)//网上抄的,详见http://blog.sina.com.cn/s/articlelist_1238143313_0_1.html
{
int limit = str.size();
char temp = 0;

for(int i = 0; i < limit; i++)
{
if(isalpha(str[i]))
str[i] = toupper(str[i]);
}
}

int main(void)
{

//*******************************************************************//
/*char phrase,output;

cout << "Enter a string (q to quit): ";
while(cin.get(phrase) && phrase != 'q')
{
if(phrase == 10)// ASCII码10, 换行符
cout << endl << "Next string (q to quit): ";
else
cout << convert(phrase);
}
cout << "Bye." << endl;*/
//*******************************************************************//

string words;

cout << "Enter a string (q to quit): ";
while(getline(cin, words) && words != "q")
{
conversion(words);
cout << words << endl
<< "Next string (q to quit): ";
}
cout << "Bye." << endl;

return 0;
}


第四题

#include <iostream>
using namespace std;
#include <cstring>
struct stringy {
char * str;
int ct;
};

void set(stringy & bean, char test[]);
void show(const stringy & bean, int n = 1);
void show(const char * pt, int m = 1);

// prototypes for set(), show(), and show() go here
int main()
{
stringy beany;
char testing[] = "Reality isn't what it used to be.";

set(beany, testing);
show(beany);
show(beany,2);
delete [] beany.str;

testing[0] = 'D';
testing[1] = 'u';
show(testing);
show(testing, 3);
show("Done!");
return 0;
}

void set(stringy & bean, char test[])
{
bean.str = new char [strlen(test)+1];
strcpy(bean.str, test);
}

void show(const stringy & bean, int n)
{
for(int i = 0; i < n; i++)
{
cout << bean.str << endl;
}
cout << endl;
}

void show(const char * pt, int m)
{
for(int i = 0; i < m; i++)
{
cout << pt << endl;
}
cout << endl;
}


第五题

#include <iostream>
using namespace std;

template <typename T>
T max5(const T num[]);//传递的值为地址,是指针类型,不需要引用。

int main(void)
{
int a[5] = {1,5,3,6,2};
double b[5] = {1.1,1.5,1.3,1.6,1.2};
int aMax;
double bMax;

aMax = max5(a);
bMax = max5(b);

cout << "Max num of int type is " << aMax << endl;
cout << "Max num of double type is " << bMax << endl;
}

template <typename T>
T max5(const T num[])
{
T temp = num[0];
for(int i = 0; i < 5; i++)
{
if(temp < num[i])
temp = num[i];
//num[5] = 10;
}
return temp;
}


第六题

#include <iostream>
using namespace std;

template <typename T>
T maxn(T num[], int n);

template <> char * maxn<char *>(char * num[], int n);

int main(void)
{
int aMax, a[] = {1,5,2,3,7,4};
double bMax, b[] = {1,5,2,3};
char * c[] = {
"Hello World",
"I'm glad to meet you",
"Little Apple",
"Dominate"
};
char * cAddr;

aMax = maxn(a, 6);
bMax = maxn(b, 4);
cAddr = maxn(c, 4);

cout << "aMax = " << aMax << endl;
cout << "bMax = " << bMax << endl;
cout << "cAddr = 0x" << static_cast<const void *>(cAddr) << " as \"" << cAddr << "\"" << endl;//转换成无类型指针输出字符串地址

return 0;
}

template <typename T>
T maxn(T num[], int n)
{
T temp;
temp = num[0];
for(int i = 0; i < n; i++)
{
if(temp < num[i])
temp = num[i];
}
return temp;
}

template <> char * maxn<char *>(char * num[], int n)
{
char * temp = num[0];
for(int i = 0; i < n; i++)
{
if(strlen(temp) < strlen(num[i]))
temp = num[i];
}
return temp;
}


第七题

#include <iostream>

struct debts
{
char name[50];
double amount;
};

template <typename T>
void ShowArray(T arr[], int n);

template <typename T>
void ShowArray(T * arr[], int n);

template <typename T>
T SumArray(T arr[], int n);

template <> debts SumArray<debts>(debts arr[], int n);

int main()
{
using namespace std;
int things[6] = {13, 31, 103, 301, 310, 130};
struct debts mr_E[3] =
{
{"Ima Wolfe", 2400.0},
{"Ura Foxe", 1300.0},
{"Iby Stout", 1800.0}
};
double * pd[3];

for (int i = 0; i < 3; i++)
pd[i] = &mr_E[i].amount;

cout << "Listing Mr. E's counts of things:\n";
ShowArray(things, 6);

cout << "Listing Mr. E's debts:\n";
ShowArray(pd, 3);

cout << "Listing Mr. E's things amount:\n";
cout << SumArray(things, 6) << endl;

cout << "Listing Mr. E's debts amount:\n";
cout << SumArray(mr_E, 3).amount << endl;
return 0;
}

template <typename T>
void ShowArray(T arr[], int n)
{
using namespace std;
cout << "template A\n";
for (int i = 0; i < n; i++)
cout << arr[i] << ' ';
cout << endl;
}

template <typename T>
void ShowArray(T * arr[], int n)
{
using namespace std;
cout << "template B\n";
for (int i = 0; i < n; i++)
cout << *arr[i] << ' ';
cout << endl;
}

template <typename T>
T SumArray(T arr[], int n)
{
T temp = 0;
for(int i = 0; i < n; i++)
temp = temp + arr[i];
return temp;
}

template <> debts SumArray<debts>(debts arr[], int n)
{
debts temp = {"NONE", 0};
for (int i = 0; i < n; i++)
{
temp.amount = temp.amount + arr[i].amount;
}
return temp;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值