[C + + Primer Plus] answers to programming exercises – Chapter 12

Time:2021-10-12
1 // chapter12_1_cow.h
 2 
 3 
 4 #ifndef LEARN_CPP_CHAPTER12_1_COW_H
 5 #define LEARN_CPP_CHAPTER12_1_COW_H
 6 
 7 class Cow {
 8 private:
 9     char name_[20];
10     char * hobby_;
11     double weight_;
12 public:
13     Cow();
14     Cow(const char * name, const char * hobby, double weight);
15     Cow(const Cow & c);
16     ~Cow();
17     Cow & operator=(const Cow & c);
18     void showcow() const;
19 };
20 
21 
22 #endif //LEARN_CPP_CHAPTER12_1_COW_H
23 
24 
25 // chapter12_1_cow.cpp
26 
27 #include "chapter12_1_cow.h"
28 #include 
29 #include 
30 
31 Cow::Cow() {
32     name_[0] = '
1 // chapter12_1_cow.h
2 
3 
4 #ifndef LEARN_CPP_CHAPTER12_1_COW_H
5 #define LEARN_CPP_CHAPTER12_1_COW_H
6 
7 class Cow {
8 private:
9     char name_[20];
10     char * hobby_;
11     double weight_;
12 public:
13     Cow();
14     Cow(const char * name, const char * hobby, double weight);
15     Cow(const Cow & c);
16     ~Cow();
17     Cow & operator=(const Cow & c);
18     void showcow() const;
19 };
20 
21 
22 #endif //LEARN_CPP_CHAPTER12_1_COW_H
23 
24 
25 // chapter12_1_cow.cpp
26 
27 #include "chapter12_1_cow.h"
28 #include 
29 #include 
30 
31 Cow::Cow() {
32     name_[0] = '\0';
33     hobby_ = nullptr;
34     weight_ = 0;
35 }
36 
37 Cow::Cow(const char * name, const char * hobby, double weight) {
38     strcpy(name_, name);
39     hobby_ = new char[strlen(hobby)];
40     strcpy(hobby_, hobby);
41     weight_ = weight;
42 }
43 
44 Cow::Cow(const Cow &c) {
45     strcpy(name_, c.name_);
46     if (!hobby_) delete [] hobby_;
47     hobby_ = new char[strlen(c.hobby_)];
48     strcpy(hobby_, c.hobby_);
49     weight_ = c.weight_;
50 }
51 
52 Cow::~Cow() {
53     delete [] hobby_;
54 }
55 
56 Cow & Cow::operator=(const Cow & c) {
57     strcpy(name_, c.name_);
58     if (!hobby_) delete [] hobby_;
59     hobby_ = new char[strlen(c.hobby_)];
60     strcpy(hobby_, c.hobby_);
61     weight_ = c.weight_;
62     return *this;
63 }
64 
65 void Cow::showcow() const {
66     using namespace std;
67     cout << "name: " << name_ << endl
68         << "hobby: " << hobby_ << endl
69         << "weight: " << weight_ << endl;
70 }
71 
72 // run
73 
74 void ch12_1() {
75     Cow a("nma", "tennis", 70);
76     Cow b("nmb", "football", 65);
77     a.showcow();
78     b.showcow();
79     b = a;
80     b.showcow();
81     Cow c(a);
82     c.showcow();
83 }
'; 33 hobby_ = nullptr; 34 weight_ = 0; 35 } 36 37 Cow::Cow(const char * name, const char * hobby, double weight) { 38 strcpy(name_, name); 39 hobby_ = new char[strlen(hobby)]; 40 strcpy(hobby_, hobby); 41 weight_ = weight; 42 } 43 44 Cow::Cow(const Cow &c) { 45 strcpy(name_, c.name_); 46 if (!hobby_) delete [] hobby_; 47 hobby_ = new char[strlen(c.hobby_)]; 48 strcpy(hobby_, c.hobby_); 49 weight_ = c.weight_; 50 } 51 52 Cow::~Cow() { 53 delete [] hobby_; 54 } 55 56 Cow & Cow::operator=(const Cow & c) { 57 strcpy(name_, c.name_); 58 if (!hobby_) delete [] hobby_; 59 hobby_ = new char[strlen(c.hobby_)]; 60 strcpy(hobby_, c.hobby_); 61 weight_ = c.weight_; 62 return *this; 63 } 64 65 void Cow::showcow() const { 66 using namespace std; 67 cout << "name: " << name_ << endl 68 << "hobby: " << hobby_ << endl 69 << "weight: " << weight_ << endl; 70 } 71 72 // run 73 74 void ch12_1() { 75 Cow a("nma", "tennis", 70); 76 Cow b("nmb", "football", 65); 77 a.showcow(); 78 b.showcow(); 79 b = a; 80 b.showcow(); 81 Cow c(a); 82 c.showcow(); 83 }
// chapter12_2_string2.h


#ifndef LEARN_CPP_CHAPTER12_2_STRING2_H
#define LEARN_CPP_CHAPTER12_2_STRING2_H

#include 
using std::istream;
using std::ostream;

class string2 {
private:
    char * str;
    int len;
    static int num_strings;
    static const int CINLIM = 80;
public:
    string2();
    string2(const string2 & s);
    string2(const char * s);
    ~string2();
    int length() const {return len;}
    int charnum(char ch) const; // d
    string2 & stringlow(); // b
    string2 & stringup(); // c

    string2 & operator=(const string2 & s);
    string2 & operator=(const char * s);
    char & operator[](int i);
    const char & operator[](int i) const;

    friend bool operator(const string2 & s1, const string2 & s2);
    friend bool operator==(const string2 & s1, const string2 & s2);
    friend ostream & operator<>(istream & is, string2 & s);
    friend string2 & operator+(string2 & s1, const string2 & s2); // a

    static int howmany();
};


#endif //LEARN_CPP_CHAPTER12_2_STRING2_H


// chapter12_2_string2.cpp

#include "chapter12_2_string2.h"

#include 
#include 

int string2::num_strings = 0;

string2::string2() {
    len = 4;
    str = new char[1];
    str[0] = '
// chapter12_2_string2.h
#ifndef LEARN_CPP_CHAPTER12_2_STRING2_H
#define LEARN_CPP_CHAPTER12_2_STRING2_H
#include 
using std::istream;
using std::ostream;
class string2 {
private:
char * str;
int len;
static int num_strings;
static const int CINLIM = 80;
public:
string2();
string2(const string2 & s);
string2(const char * s);
~string2();
int length() const {return len;}
int charnum(char ch) const; // d
string2 & stringlow(); // b
string2 & stringup(); // c
string2 & operator=(const string2 & s);
string2 & operator=(const char * s);
char & operator[](int i);
const char & operator[](int i) const;
friend bool operator(const string2 & s1, const string2 & s2);
friend bool operator==(const string2 & s1, const string2 & s2);
friend ostream & operator<>(istream & is, string2 & s);
friend string2 & operator+(string2 & s1, const string2 & s2); // a
static int howmany();
};
#endif //LEARN_CPP_CHAPTER12_2_STRING2_H
// chapter12_2_string2.cpp
#include "chapter12_2_string2.h"
#include 
#include 
int string2::num_strings = 0;
string2::string2() {
len = 4;
str = new char[1];
str[0] = '\0';
++ num_strings;
}
string2::string2(const string2 &s) {
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
++ num_strings;
}
string2::string2(const char *s) {
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
++ num_strings;
}
string2::~string2() {
delete [] str;
-- num_strings;
}
string2 &string2::operator=(const string2 &s) {
if (this == &s)
return *this;
delete [] str;
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
return *this;
}
string2 &string2::operator=(const char *s) {
delete [] str;
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
return *this;
}
char &string2::operator[](int i) {
return str[i];
}
const char &string2::operator[](int i) const {
return str[i];
}
int string2::howmany() {
return num_strings;
}
bool operator(const string2 & s1, const string2 & s2) {
return s2 < s1;
}
bool operator==(const string2 & s1, const string2 & s2) {
return (std::strcmp(s1.str, s2.str) == 0);
}
ostream & operator<>(istream & is, string2 & s) {
char temp[string2::CINLIM];
is.get(temp, string2::CINLIM);
if (is)
s = temp;
while (is && is.get() != '\n')
continue;
return is;
}
int string2::charnum(char ch) const {
int i = 0, num = 0;
while (str[i] != '\0') {
if (str[i] == ch)
++ num;
++ i;
}
return num;
}
string2 &string2::stringlow() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::toupper(str[i]);
++ i;
}
return *this;
}
string2 &string2::stringup() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::tolower(str[i]);
++ i;
}
return *this;
}
string2 & operator+(string2 & s1, const string2 & s2) {
char * temp = new char[s1.len];
std::strcpy(temp, s1.str);
delete [] s1.str;
s1.str = new char[s1.len + s2.len + 1];
s1.len += s2.len;
std::strcpy(s1.str, temp);
std::strcat(s1.str, s2.str);
return s1;
}
// run
void ch12_2() {
using namespace std;
string2 s1(" and I am a C++ student.");
string2 s2 = "Please enter your name: ";
string2 s3;
cout << s2;
cin >> s3;
string2 t("My name is ");
s2 = t + s3;
cout << s2 << ".\n";
s2 = s2 + s1;
s2.stringup();
cout << "The string\n" << s2 << "\ncontains " << s2.charnum('A')
<< " 'A' characters in it.\n";
s1 = "red";
string2 rgb[3] = {string2(s1), string2("green"), string2("blue")};
cout << "Enter the name of a primary color for mixing light: ";
string2 ans;
bool success = false;
while (cin >> ans) {
ans.stringlow();
for (int i = 0; i < 3; ++ i) {
if (ans == rgb[i]) {
cout << "That's right!\n";
success = true;
break;
}
}
if (success)
break;
else
cout << "Try again!\n";
}
cout << "Bye\n";
}
'; ++ num_strings; } string2::string2(const string2 &s) { len = s.length(); str = new char[len + 1]; std::strcpy(str, s.str); ++ num_strings; } string2::string2(const char *s) { len = std::strlen(s); str = new char[len + 1]; std::strcpy(str, s); ++ num_strings; } string2::~string2() { delete [] str; -- num_strings; } string2 &string2::operator=(const string2 &s) { if (this == &s) return *this; delete [] str; len = s.length(); str = new char[len + 1]; std::strcpy(str, s.str); return *this; } string2 &string2::operator=(const char *s) { delete [] str; len = std::strlen(s); str = new char[len + 1]; std::strcpy(str, s); return *this; } char &string2::operator[](int i) { return str[i]; } const char &string2::operator[](int i) const { return str[i]; } int string2::howmany() { return num_strings; } bool operator(const string2 & s1, const string2 & s2) { return s2 < s1; } bool operator==(const string2 & s1, const string2 & s2) { return (std::strcmp(s1.str, s2.str) == 0); } ostream & operator<>(istream & is, string2 & s) { char temp[string2::CINLIM]; is.get(temp, string2::CINLIM); if (is) s = temp; while (is && is.get() != '\n') continue; return is; } int string2::charnum(char ch) const { int i = 0, num = 0; while (str[i] != '
// chapter12_2_string2.h
#ifndef LEARN_CPP_CHAPTER12_2_STRING2_H
#define LEARN_CPP_CHAPTER12_2_STRING2_H
#include 
using std::istream;
using std::ostream;
class string2 {
private:
char * str;
int len;
static int num_strings;
static const int CINLIM = 80;
public:
string2();
string2(const string2 & s);
string2(const char * s);
~string2();
int length() const {return len;}
int charnum(char ch) const; // d
string2 & stringlow(); // b
string2 & stringup(); // c
string2 & operator=(const string2 & s);
string2 & operator=(const char * s);
char & operator[](int i);
const char & operator[](int i) const;
friend bool operator(const string2 & s1, const string2 & s2);
friend bool operator==(const string2 & s1, const string2 & s2);
friend ostream & operator<>(istream & is, string2 & s);
friend string2 & operator+(string2 & s1, const string2 & s2); // a
static int howmany();
};
#endif //LEARN_CPP_CHAPTER12_2_STRING2_H
// chapter12_2_string2.cpp
#include "chapter12_2_string2.h"
#include 
#include 
int string2::num_strings = 0;
string2::string2() {
len = 4;
str = new char[1];
str[0] = '\0';
++ num_strings;
}
string2::string2(const string2 &s) {
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
++ num_strings;
}
string2::string2(const char *s) {
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
++ num_strings;
}
string2::~string2() {
delete [] str;
-- num_strings;
}
string2 &string2::operator=(const string2 &s) {
if (this == &s)
return *this;
delete [] str;
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
return *this;
}
string2 &string2::operator=(const char *s) {
delete [] str;
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
return *this;
}
char &string2::operator[](int i) {
return str[i];
}
const char &string2::operator[](int i) const {
return str[i];
}
int string2::howmany() {
return num_strings;
}
bool operator(const string2 & s1, const string2 & s2) {
return s2 < s1;
}
bool operator==(const string2 & s1, const string2 & s2) {
return (std::strcmp(s1.str, s2.str) == 0);
}
ostream & operator<>(istream & is, string2 & s) {
char temp[string2::CINLIM];
is.get(temp, string2::CINLIM);
if (is)
s = temp;
while (is && is.get() != '\n')
continue;
return is;
}
int string2::charnum(char ch) const {
int i = 0, num = 0;
while (str[i] != '\0') {
if (str[i] == ch)
++ num;
++ i;
}
return num;
}
string2 &string2::stringlow() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::toupper(str[i]);
++ i;
}
return *this;
}
string2 &string2::stringup() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::tolower(str[i]);
++ i;
}
return *this;
}
string2 & operator+(string2 & s1, const string2 & s2) {
char * temp = new char[s1.len];
std::strcpy(temp, s1.str);
delete [] s1.str;
s1.str = new char[s1.len + s2.len + 1];
s1.len += s2.len;
std::strcpy(s1.str, temp);
std::strcat(s1.str, s2.str);
return s1;
}
// run
void ch12_2() {
using namespace std;
string2 s1(" and I am a C++ student.");
string2 s2 = "Please enter your name: ";
string2 s3;
cout << s2;
cin >> s3;
string2 t("My name is ");
s2 = t + s3;
cout << s2 << ".\n";
s2 = s2 + s1;
s2.stringup();
cout << "The string\n" << s2 << "\ncontains " << s2.charnum('A')
<< " 'A' characters in it.\n";
s1 = "red";
string2 rgb[3] = {string2(s1), string2("green"), string2("blue")};
cout << "Enter the name of a primary color for mixing light: ";
string2 ans;
bool success = false;
while (cin >> ans) {
ans.stringlow();
for (int i = 0; i < 3; ++ i) {
if (ans == rgb[i]) {
cout << "That's right!\n";
success = true;
break;
}
}
if (success)
break;
else
cout << "Try again!\n";
}
cout << "Bye\n";
}
') { if (str[i] == ch) ++ num; ++ i; } return num; } string2 &string2::stringlow() { int i = 0; while (str[i] != '
// chapter12_2_string2.h
#ifndef LEARN_CPP_CHAPTER12_2_STRING2_H
#define LEARN_CPP_CHAPTER12_2_STRING2_H
#include 
using std::istream;
using std::ostream;
class string2 {
private:
char * str;
int len;
static int num_strings;
static const int CINLIM = 80;
public:
string2();
string2(const string2 & s);
string2(const char * s);
~string2();
int length() const {return len;}
int charnum(char ch) const; // d
string2 & stringlow(); // b
string2 & stringup(); // c
string2 & operator=(const string2 & s);
string2 & operator=(const char * s);
char & operator[](int i);
const char & operator[](int i) const;
friend bool operator(const string2 & s1, const string2 & s2);
friend bool operator==(const string2 & s1, const string2 & s2);
friend ostream & operator<>(istream & is, string2 & s);
friend string2 & operator+(string2 & s1, const string2 & s2); // a
static int howmany();
};
#endif //LEARN_CPP_CHAPTER12_2_STRING2_H
// chapter12_2_string2.cpp
#include "chapter12_2_string2.h"
#include 
#include 
int string2::num_strings = 0;
string2::string2() {
len = 4;
str = new char[1];
str[0] = '\0';
++ num_strings;
}
string2::string2(const string2 &s) {
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
++ num_strings;
}
string2::string2(const char *s) {
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
++ num_strings;
}
string2::~string2() {
delete [] str;
-- num_strings;
}
string2 &string2::operator=(const string2 &s) {
if (this == &s)
return *this;
delete [] str;
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
return *this;
}
string2 &string2::operator=(const char *s) {
delete [] str;
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
return *this;
}
char &string2::operator[](int i) {
return str[i];
}
const char &string2::operator[](int i) const {
return str[i];
}
int string2::howmany() {
return num_strings;
}
bool operator(const string2 & s1, const string2 & s2) {
return s2 < s1;
}
bool operator==(const string2 & s1, const string2 & s2) {
return (std::strcmp(s1.str, s2.str) == 0);
}
ostream & operator<>(istream & is, string2 & s) {
char temp[string2::CINLIM];
is.get(temp, string2::CINLIM);
if (is)
s = temp;
while (is && is.get() != '\n')
continue;
return is;
}
int string2::charnum(char ch) const {
int i = 0, num = 0;
while (str[i] != '\0') {
if (str[i] == ch)
++ num;
++ i;
}
return num;
}
string2 &string2::stringlow() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::toupper(str[i]);
++ i;
}
return *this;
}
string2 &string2::stringup() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::tolower(str[i]);
++ i;
}
return *this;
}
string2 & operator+(string2 & s1, const string2 & s2) {
char * temp = new char[s1.len];
std::strcpy(temp, s1.str);
delete [] s1.str;
s1.str = new char[s1.len + s2.len + 1];
s1.len += s2.len;
std::strcpy(s1.str, temp);
std::strcat(s1.str, s2.str);
return s1;
}
// run
void ch12_2() {
using namespace std;
string2 s1(" and I am a C++ student.");
string2 s2 = "Please enter your name: ";
string2 s3;
cout << s2;
cin >> s3;
string2 t("My name is ");
s2 = t + s3;
cout << s2 << ".\n";
s2 = s2 + s1;
s2.stringup();
cout << "The string\n" << s2 << "\ncontains " << s2.charnum('A')
<< " 'A' characters in it.\n";
s1 = "red";
string2 rgb[3] = {string2(s1), string2("green"), string2("blue")};
cout << "Enter the name of a primary color for mixing light: ";
string2 ans;
bool success = false;
while (cin >> ans) {
ans.stringlow();
for (int i = 0; i < 3; ++ i) {
if (ans == rgb[i]) {
cout << "That's right!\n";
success = true;
break;
}
}
if (success)
break;
else
cout << "Try again!\n";
}
cout << "Bye\n";
}
') { if (std::isalpha(str[i])) str[i] = std::toupper(str[i]); ++ i; } return *this; } string2 &string2::stringup() { int i = 0; while (str[i] != '
// chapter12_2_string2.h
#ifndef LEARN_CPP_CHAPTER12_2_STRING2_H
#define LEARN_CPP_CHAPTER12_2_STRING2_H
#include 
using std::istream;
using std::ostream;
class string2 {
private:
char * str;
int len;
static int num_strings;
static const int CINLIM = 80;
public:
string2();
string2(const string2 & s);
string2(const char * s);
~string2();
int length() const {return len;}
int charnum(char ch) const; // d
string2 & stringlow(); // b
string2 & stringup(); // c
string2 & operator=(const string2 & s);
string2 & operator=(const char * s);
char & operator[](int i);
const char & operator[](int i) const;
friend bool operator(const string2 & s1, const string2 & s2);
friend bool operator==(const string2 & s1, const string2 & s2);
friend ostream & operator<>(istream & is, string2 & s);
friend string2 & operator+(string2 & s1, const string2 & s2); // a
static int howmany();
};
#endif //LEARN_CPP_CHAPTER12_2_STRING2_H
// chapter12_2_string2.cpp
#include "chapter12_2_string2.h"
#include 
#include 
int string2::num_strings = 0;
string2::string2() {
len = 4;
str = new char[1];
str[0] = '\0';
++ num_strings;
}
string2::string2(const string2 &s) {
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
++ num_strings;
}
string2::string2(const char *s) {
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
++ num_strings;
}
string2::~string2() {
delete [] str;
-- num_strings;
}
string2 &string2::operator=(const string2 &s) {
if (this == &s)
return *this;
delete [] str;
len = s.length();
str = new char[len + 1];
std::strcpy(str, s.str);
return *this;
}
string2 &string2::operator=(const char *s) {
delete [] str;
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
return *this;
}
char &string2::operator[](int i) {
return str[i];
}
const char &string2::operator[](int i) const {
return str[i];
}
int string2::howmany() {
return num_strings;
}
bool operator(const string2 & s1, const string2 & s2) {
return s2 < s1;
}
bool operator==(const string2 & s1, const string2 & s2) {
return (std::strcmp(s1.str, s2.str) == 0);
}
ostream & operator<>(istream & is, string2 & s) {
char temp[string2::CINLIM];
is.get(temp, string2::CINLIM);
if (is)
s = temp;
while (is && is.get() != '\n')
continue;
return is;
}
int string2::charnum(char ch) const {
int i = 0, num = 0;
while (str[i] != '\0') {
if (str[i] == ch)
++ num;
++ i;
}
return num;
}
string2 &string2::stringlow() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::toupper(str[i]);
++ i;
}
return *this;
}
string2 &string2::stringup() {
int i = 0;
while (str[i] != '\0') {
if (std::isalpha(str[i]))
str[i] = std::tolower(str[i]);
++ i;
}
return *this;
}
string2 & operator+(string2 & s1, const string2 & s2) {
char * temp = new char[s1.len];
std::strcpy(temp, s1.str);
delete [] s1.str;
s1.str = new char[s1.len + s2.len + 1];
s1.len += s2.len;
std::strcpy(s1.str, temp);
std::strcat(s1.str, s2.str);
return s1;
}
// run
void ch12_2() {
using namespace std;
string2 s1(" and I am a C++ student.");
string2 s2 = "Please enter your name: ";
string2 s3;
cout << s2;
cin >> s3;
string2 t("My name is ");
s2 = t + s3;
cout << s2 << ".\n";
s2 = s2 + s1;
s2.stringup();
cout << "The string\n" << s2 << "\ncontains " << s2.charnum('A')
<< " 'A' characters in it.\n";
s1 = "red";
string2 rgb[3] = {string2(s1), string2("green"), string2("blue")};
cout << "Enter the name of a primary color for mixing light: ";
string2 ans;
bool success = false;
while (cin >> ans) {
ans.stringlow();
for (int i = 0; i < 3; ++ i) {
if (ans == rgb[i]) {
cout << "That's right!\n";
success = true;
break;
}
}
if (success)
break;
else
cout << "Try again!\n";
}
cout << "Bye\n";
}
') { if (std::isalpha(str[i])) str[i] = std::tolower(str[i]); ++ i; } return *this; } string2 & operator+(string2 & s1, const string2 & s2) { char * temp = new char[s1.len]; std::strcpy(temp, s1.str); delete [] s1.str; s1.str = new char[s1.len + s2.len + 1]; s1.len += s2.len; std::strcpy(s1.str, temp); std::strcat(s1.str, s2.str); return s1; } // run void ch12_2() { using namespace std; string2 s1(" and I am a C++ student."); string2 s2 = "Please enter your name: "; string2 s3; cout << s2; cin >> s3; string2 t("My name is "); s2 = t + s3; cout << s2 << ".\n"; s2 = s2 + s1; s2.stringup(); cout << "The string\n" << s2 << "\ncontains " << s2.charnum('A') << " 'A' characters in it.\n"; s1 = "red"; string2 rgb[3] = {string2(s1), string2("green"), string2("blue")}; cout << "Enter the name of a primary color for mixing light: "; string2 ans; bool success = false; while (cin >> ans) { ans.stringlow(); for (int i = 0; i < 3; ++ i) { if (ans == rgb[i]) { cout << "That's right!\n"; success = true; break; } } if (success) break; else cout << "Try again!\n"; } cout << "Bye\n"; }
1 // chapter12_3_stock.h
  2 
  3 
  4 void ch12_2() {
  5     using namespace std;
  6     string2 s1(" and I am a C++ student.");
  7     string2 s2 = "Please enter your name: ";
  8     string2 s3;
  9     cout << s2;
 10     cin >> s3;
 11     string2 t("My name is ");
 12     s2 = t + s3;
 13     cout << s2 << ".\n";
 14     s2 = s2 + s1;
 15     s2.stringup();
 16     cout << "The string\n" << s2 << "\ncontains " << s2.charnum('A')
 17         << " 'A' characters in it.\n";
 18     s1 = "red";
 19     string2 rgb[3] = {string2(s1), string2("green"), string2("blue")};
 20     cout << "Enter the name of a primary color for mixing light: ";
 21     string2 ans;
 22     bool success = false;
 23     while (cin >> ans) {
 24         ans.stringlow();
 25         for (int i = 0; i < 3; ++ i) {
 26             if (ans == rgb[i]) {
 27                 cout << "That's right!\n";
 28                 success = true;
 29                 break;
 30             }
 31         }
 32         if (success)
 33             break;
 34         else
 35             cout << "Try again!\n";
 36     }
 37     cout << "Bye\n";
 38 }
 39 
 40 
 41 // chapter12_3_stock.cpp
 42 
 43 #include "chapter12_3_stock.h"
 44 
 45 #include 
 46 #include 
 47 
 48 stock::stock() {
 49     company = new char[8];
 50     len = 7;
 51     strcpy(company, "no name");
 52     shares = 0;
 53     share_val = 0.0;
 54     total_val = 0.0;
 55 }
 56 
 57 stock::stock(const char * co, long n, double pr) {
 58     len = strlen(co);
 59     company = new char[len + 1];
 60     strcpy(company, co);
 61     if (n < 0) {
 62         std::cout << "Number of shares can't be negative; "
 63             << company << " shares set to 0.\n";
 64         shares = 0;
 65     }
 66     else
 67         shares = n;
 68     share_val = pr;
 69     set_tot();
 70 }
 71 
 72 stock::~stock() {
 73     delete [] company;
 74 }
 75 
 76 void stock::buy(long num, double price) {
 77     if (num < 0) {
 78         std::cout << "Number of shares purchased can't be nagetive. "
 79             << "Transaction is aborted.\n";
 80     }
 81     else {
 82         shares += num;
 83         share_val = price;
 84         set_tot();
 85     }
 86 }
 87 
 88 void stock::sell(long num, double price) {
 89     using std::cout;
 90     if (num < 0) {
 91         cout << "Number of shares sold can't be negative. "
 92             << "Transaction is aborted.\n";
 93     }
 94     else {
 95         shares -= num;
 96         share_val = price;
 97         set_tot();
 98     }
 99 }
100 
101 void stock::update(double price) {
102     share_val = price;
103     set_tot();
104 }
105 
106 void stock::show() const {
107     using std::cout;
108     using std::ios_base;
109     ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
110     std::streamsize  prec = cout.precision(3);
111     cout << "Company: " << company
112         << "  Shares: " << shares << '\n';
113     cout << "Shares Prices: $" << share_val << '\n';
114     cout.precision(2);
115     cout << "Total Worth: $" << total_val << '\n';
116     cout.setf(orig, ios_base::floatfield);
117     cout.precision(prec);
118 }
119 
120 const stock &stock::topval(const stock &s) const {
121     if (s.total_val > total_val)
122         return s;
123     return *this;
124 }
125 
126 std::ostream &operator< topval(ss[st]);
155     cout << "\nMost valuable holding:\n";
156     cout << *top;
157 }
1 // chapter12_4_stack.h
  2 
  3 
  4 #ifndef LEARN_CPP_CHAPTER12_4_STACK_H
  5 #define LEARN_CPP_CHAPTER12_4_STACK_H
  6 
  7 typedef unsigned long Item;
  8 
  9 class Stack {
 10 private:
 11     enum {MAX = 10};
 12     Item * pitems;
 13     int size;
 14     int top;
 15 public:
 16     Stack(int n = MAX);
 17     Stack(const Stack & st);
 18     ~Stack();
 19     bool isempty() const;
 20     bool isfull() const;
 21     bool push(const Item & item);
 22     bool pop(Item & item);
 23     void show() const;
 24     Stack & operator=(const Stack & st);
 25 };
 26 
 27 
 28 
 29 
 30 #endif //LEARN_CPP_CHAPTER12_4_STACK_H
 31 
 32 // chapter12_4_stack.cpp
 33 
 34 #include "chapter12_4_stack.h"
 35 #include 
 36 
 37 Stack::Stack(int n) {
 38     pitems = new Item[n];
 39     size = n;
 40     top = 0;
 41 }
 42 
 43 Stack::Stack(const Stack &st) {
 44     pitems = new Item[st.size];
 45     size = st.size;
 46     top = st.top;
 47     for (int i = 0; i < st.top; ++ i)
 48         pitems[i] = st.pitems[i];
 49 }
 50 
 51 Stack::~Stack() {
 52     delete [] pitems;
 53 }
 54 
 55 bool Stack::isempty() const {
 56     if (top == 0)
 57         return true;
 58     return false;
 59 }
 60 
 61 bool Stack::isfull() const {
 62     if (top == size)
 63         return true;
 64     return false;
 65 }
 66 
 67 bool Stack::push(const Item &item) {
 68     if (isfull())
 69         return false;
 70     pitems[top ++] = item;
 71     return true;
 72 }
 73 
 74 bool Stack::pop(Item &item) {
 75     if (isempty())
 76         return false;
 77     item = pitems[-- top];
 78     return true;
 79 }
 80 
 81 Stack &Stack::operator=(const Stack &st) {
 82     if (this == &st)
 83         return *this;
 84     if (pitems)
 85         delete [] pitems;
 86     pitems = new Item[st.size];
 87     size = st.size;
 88     top = st.top;
 89     for (int i = 0; i < st.top; ++ i)
 90         pitems[i] = st.pitems[i];
 91     return *this;
 92 }
 93 
 94 void Stack::show() const {
 95     using namespace std;
 96     cout << "Stack: ";
 97     for (int i = 0; i < top; ++ i)
 98         cout << pitems[i] << " ";
 99     cout << endl;
100 }
101 
102 // run
103 
104 void ch12_4() {
105     Stack s1(15);
106     s1.show();
107     s1.push(1234);s1.push(123);s1.push(12);
108     s1.show();
109     Item t = 0;
110     s1.pop(t);
111     s1.show();
112 
113     Stack s2(s1);
114     s2.show();
115     s2.push(12345);
116     s2.show();
117 
118     Stack s3 = s1;
119     s3.show();
120     s3.pop(t);
121     s3.show();
122 }
// ch12_5&6

//To be updated

Welcome to communicate with us.

Digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital Digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital digital Word digit digit digit digit digit digit digit number