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

Time:2021-10-25
1 void ch8_1_print(const std::string & str, int n = 0 ) {
  2     using namespace std;
  3     static int flag = 0;
  4     ++ flag;
  5     if (!n)
  6         cout << str << endl;
  7     else {
  8         for (int i = flag; i; -- i)
  9             cout << str << endl;
 10     }
 11 }
 12 void ch8_1() {
 13     using namespace std;
 14     string str{"ch8_1"};
 15     ch8_1_print(str);
 16     ch8_1_print(str, 100);
 17 }
 18 
 19 void ch8_2_setvalue(CandyBar & bar, const char * bd = "Millennium Munch", double w = 2.85, unsigned long k = 350) {
 20     strcpy(bar.brand, bd);
 21     bar.weight = w;
 22     bar.kll = k;
 23 }
 24 
 25 void ch8_2_show(const CandyBar & bar) {
 26     using namespace std;
 27     cout << "brand: " << bar.brand << endl;
 28     cout << "weight: " << bar.weight << endl;
 29     cout << "energy: " << bar.kll << endl;
 30 }
 31 
 32 void ch8_2() {
 33     using namespace std;
 34     CandyBar bar;
 35     cout << "default value: " << endl;
 36     ch8_2_setvalue(bar);
 37     ch8_2_show(bar);
 38     char s[] = "nnn";
 39     double w = 100.123;
 40     unsigned long k = 1234;
 41     cout << "reset value: " << endl;
 42     ch8_2_setvalue(bar,s,w,k);
 43     ch8_2_show(bar);
 44 }
 45 void ch8_3_str2upper(std::string & str) {
 46     for (int i = 0; i < str.size(); ++ i)
 47         str[i] = toupper(str[i]);
 48 }
 49 void ch8_3() {
 50     using namespace std;
 51     string s;
 52     while (true) {
 53         cout << "enter string(q to quit): ";
 54         getline(cin, s);
 55         if (s == "q")
 56             break;
 57         ch8_3_str2upper(s);
 58         cout << "upper: " << s << endl;
 59     }
 60 }
 61 
 62 void ch8_4_set(stringy & sy, const char * str) {
 63     sy.str = new char[strlen(str)];
 64     strcpy(sy.str, str);
 65     sy.ct = strlen(str);
 66 }
 67 
 68 void ch8_4_show(const stringy & sy, int n = 0) {
 69     using namespace std;
 70     if (!n)
 71         cout << sy.str << endl;
 72     else {
 73         for (int i = 0; i < n; ++ i)
 74             cout << sy.str[i];
 75         cout << endl;
 76     }
 77 }
 78 
 79 void ch8_4_show(const char * str, int n = 0) {
 80     using namespace std;
 81     if (!n)
 82         cout << str << endl;
 83     else {
 84         for (int i = 0; i < n; ++ i)
 85             cout << str[i];
 86         cout << endl;
 87     }
 88 }
 89 
 90 void ch8_4() {
 91     using namespace std;
 92     stringy beany;
 93     char testing[] = "Reality isn't what it used to be.";
 94     ch8_4_set(beany, testing);
 95     ch8_4_show(beany);
 96     ch8_4_show(beany, 2);
 97     testing[0] = 'D';
 98     testing[1] = 'u';
 99     ch8_4_show(testing);
100     ch8_4_show(testing, 3);
101     ch8_4_show("Done!");
102 }
103 
104 template 
105 unsigned int ch8_5_max(const T * arr) {
106     unsigned int max_index = 0;
107     for (int i = 1; i < 5; ++ i)
108         if (arr[i] > arr[max_index])
109             max_index = i;
110     return max_index;
111 }
112 
113 void ch8_5() {
114     using namespace std;
115     int arr_int[5]{1,3,5,2,4};
116     double arr_dou[5]{3.14,2.14,5.12,8.12,10.30};
117     cout << "max int: " << arr_int[ch8_5_max(arr_int)] << endl;
118     cout << "max dou: " << arr_dou[ch8_5_max(arr_dou)] << endl;
119 }
120 
121 template 
122 T ch8_6_maxn(T * arr, unsigned int n) {
123     int max_index = 0;
124     for (int i = 1; i < n; ++ i)
125         if (arr[i] > arr[max_index])
126             max_index = i;
127     return arr[max_index];
128 }
129 
130 template <> char * ch8_6_maxn(char * arr[], unsigned int n) {
131     int max_index = 0;
132     for (int i = 1; i < n; ++ i)
133         if (strlen(arr[i]) - strlen(arr[max_index]) > 0)
134             max_index = i;
135         return arr[max_index];
136 }
137 
138 void ch8_6() {
139     using namespace std;
140     int arr_int[6]{1,2,3,4,5,6};
141     double arr_dou[4]{1.1,2.2,3.3,4.4};
142     char * arr_str[5]{
143         "h", "he", "hel", "hell", "hello"
144     };
145     cout << "max double: " << ch8_6_maxn(arr_int, 6) << endl;
146     cout << "max int   : " << ch8_6_maxn(arr_dou, 4) << endl;
147     cout << "max str   : " << ch8_6_maxn(arr_str, 5) << endl;
148 }
149 
150 template 
151 T ch8_7_sumarray(T * arr, int n) {
152     T sum{0};
153     for (int i = 0; i < n; ++ i)
154         sum += arr[i];
155     return sum;
156 }
157 
158 template 
159 T ch8_7_sumarray(T * arr[], int n) {
160     T sum{0};
161     for (int i = 0; i < n; ++ i)
162         sum += * arr[i];
163     return sum;
164 }
165 
166 void ch8_7() {
167     using namespace std;
168     int things[6]{13,31,103,301,310,130};
169     debts mr_E[3]{
170         {"Ima Wolfe", 2400.0},
171         {"Ura Foxe", 1300.0},
172         {"Iby Stout", 1800.0}
173     };
174     double * pd[3];
175     for (int i = 0; i < 3; ++ i)
176         pd[i] = &mr_E[i].amount;
177     cout << "sum of things: " << ch8_7_sumarray(things, 6) << endl;
178     cout << "sum of debts: " << ch8_7_sumarray(pd, 3) << endl;
179 }