Chapter Review
1
Both version give the same answers, but the if else
version is more efficient. Consider what happens, for example, when ch
is a space. Version 1, after incrementing spaces, tests whether the character is a newline. This wastes time because the program has already established that ch
is a space and hence could not be a newline. Version 2, in the same situation, skips the newline test.
2
Both ++ch
and ch + 1
have the same numerical value. But ++ch
is type char
and prints as a character, while ch + 1
, because it adds a char
to an int
, is type int
and prints as a number.
注:另外,++ch
导致ch
增1,而ch + 1
并没有改变ch
。
3
#include <iostream>
using namespace std;
int main()
{
char ch;
int ct1, ct2;
ct1 = ct2 = 0;
while ((ch = cin.get()) != '$')
{
cout << ch;
ct1++;
if (ch = '$')
ct2++;
cout << ch;
}
cout << "ct1 = " << ct1 << ", ct2 = " << ct2 << "\n";
return 0;
}
控制台效果截图(细体表示输入,粗体表示输出):
Because the program uses ch = '$'
instead of ch == '$'
, the combined input and output looks like above. Each character is converted to the $
character before being printed the second time. Also the value of the expression ch = $
is the code for the $
character, hence nonzero, hence true; so ct2
is incremented each time.
注:cin.get()
依次从输入流中读入字符H
i
!
\n
S
e
n
d
` `
4
a. weight >= 115 && weight < 125
b. ch == 'q' || ch == 'Q'
c. x % 2 == 0 && x != 26
d. x % 2 == 0 && x % 26 == 0
e. donation >= 1000 && donation <= 2000 || guest == 1
f. (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
5
Not necessarily. For example, if x is 10, then !x is 0 and ! ! x is 1. However, if x is a bool variable, then ! ! x is x.
6
(x < 0)? -x : x;
or (x >= 0) x : -x;
7
switch (ch)
{
case 'A': a_grade++;
break;
case 'B': b_grade++;
break;
case 'C': c_grade++;
break;
case 'D': d_grade++;
break;
default: f_grade++;
break;
}
8
If you use integer labels and the user types a noninteger such as q, the program hangs because integer input can't process a character. But if you use character labels and the user types an integer such as 5, character input will process 5 as a character. Then the default part of the switch can suggest entering another character.
9
Here is one version:
int line = 0;
char ch;
while (cin.get(ch) && ch != 'Q')
{
if (ch == '\n') /* 不等于时 continue 跳出本次循环,相当于等于时,继续执行下面的语句 */
line++;
}
Programming Exercises
1
#include <iostream>
#include <cctype>
int main()
{
using namespace std;
cout << "Enter words: ";
char ch;
ch = cin.get();
while (ch != '@')
{
if (!isdigit(ch))
{
if (isupper(ch))
ch = tolower(ch);
else if (islower(ch))
ch = toupper(ch);
cout << ch;
}
cin.get(ch);
}
return 0;
}
2
#include <iostream>
const int ArSize = 10;
int main()
{
using namespace std;
double arr[ArSize];
double sum = 0.0;
double aver = 0.0;
int count = 0;
cout << "Enter 10 donotion values: ";
for (int i = 0; i < ArSize; ++i)
{
cin >> arr[i];
sum += arr[i];
}
aver = sum / ArSize;
cout << "Average: " << aver << endl;
for (int i = 0; i < ArSize; ++i)
{
if (arr[i] > aver)
++count;
}
cout << count << " numbers in the array are larger than the average.\n";
return 0;
}
3
#include <iostream>
int main()
{
using namespace std;
char ch;
cout << "Please enter one of the following choices:\n"
<< "c) carnivore p) pianis\n"
<< "t) tree g) game\n"
<< "f\n";
cin >> ch; /* cin.get(ch)只会读输入流的第一个字符,其它字符还在输入流待下次读取 */
while (ch != 'c' && ch != 'p' && ch != 't' && ch != 'g')
{
cout << "Please enter a c, p, t, or g: ";
cin >> ch;
}
switch (ch)
{
case 'c':
cout << "A tiger is a carnivore.\n";
break;
case 'p':
cout << "Beethoven is a pianist.\n";
break;
case 't':
cout << "A maple is a tree.\n";
break;
case 'g':
cout << "LOL is a game.\n";
break;
}
return 0;
}
4
#include <iostream>
const int STRSIZE = 20;
const int MEMBERS = 5;
enum {FULLNAME, TITLE, BOPNAME};
struct bop {
char fullname[STRSIZE]; // real name
char title[STRSIZE]; // job title
char bopname[STRSIZE]; // secret BOP name
int preference; // 0 = fullname, 1 = title, 2 = bopname
};
int main()
{
using namespace std;
bop members[MEMBERS] = {
{"Wimp Macho", "Game Designer", "WIMPY", FULLNAME},
{"Raki Rhodes", "Junior Programmer", "RAR", TITLE},
{"Celia Laiter", "Operation Engineer", "MIPS", BOPNAME},
{"Hoppy Hipman", "Analyst Trainee", "HAHA", TITLE},
{"Pat Hand", "Code Analyst", "LOOPY", BOPNAME}
};
cout << "Benevolent Order of Programmers Report\n"
<< "a. display by name b. display by title\n"
<< "c. display by bopname d. display by preference\n"
<< "q. quit\n"
<< "Enter your choice: ";
char choice;
int i;
cin >> choice;
while (choice != 'q')
{
switch (choice)
{
case 'a':
for (i = 0; i < MEMBERS; ++i)
cout << members[i].fullname << endl;
break;
case 'b':
for (i = 0; i < MEMBERS; ++i)
cout << members[i].title << endl;
break;
case 'c':
for (i = 0; i < MEMBERS; ++i)
cout << members[i].bopname << endl;
break;
case 'd':
for (i = 0; i < MEMBERS; ++i)
switch (members[i].preference)
{
case FULLNAME:
cout << members[i].fullname << endl;
break;
case TITLE:
cout << members[i].title << endl;
break;
case BOPNAME:
cout << members[i].bopname << endl;
break;
}
break;
}
cout << "Next choice: ";
cin >> choice;
}
cout << "Bye!\n";
return 0;
}
5
#include <iostream>
#include <cctype>
int main()
{
using namespace std;
double income;
double tax;
cout << "Enter your income (enter a negative number or non-numeric will quit): ";
cin >> income;
while (income >= 0.0 && !isascii(income))
{
tax = 0.0;
/* 低于5000不收税;5001~15000收10%税;15000~35000收15%税;大于35000部分收20%税,所以分界点为35000、15000和5000 */
if (income > 35000.0)
tax += (income - 35000.0) * 0.2 + 20000.0 * 0.15 + 10000.0 * 0.1;
else if (income > 15000.0)
tax += (income - 15000.0) * 0.15 + 10000 * 0.1;
else if (income > 5000.0)
tax += (income - 5000.0) * 0.1;
cout << "Tax = " << tax << endl;
cout << "Enter your income (enter a negative number or non-numeric will quit): ";
cin >> income;
}
cout << "Bye!\n";
return 0;
}
double min(double a, double b)
{
return a < b ? a : b;
}
6
#include <iostream>
#include <string>
struct Patron
{
std::string name;
double donation;
};
int main()
{
using namespace std;
int n;
cout << "Enter the number of patrons: ";
cin >> n;
Patron * patrons = new Patron[n];
int i;
int grand_patrons = 0;
for (i = 0; i < n; ++i)
{
cout << "Enter the name of patron " << i + 1 << ": ";
cin >> patrons[i].name; // 此处读入的名字不包含任何空字符(空格、tab)
cout << "Enter the donation of patron " << i + 1 << ": ";
cin >> patrons[i].donation;
if (patrons[i].donation > 10000.0)
grand_patrons++;
}
cout << "Grand Patrons:\n";
if (grand_patrons == 0)
cout << "none\n";
else
for (i = 0; i < n; ++i)
if (patrons[i].donation > 10000.0)
cout << "Name: " << patrons[i].name
<< ", Donation: " << patrons[i].donation << endl;
cout << "Patrons:\n";
if (grand_patrons == n || n == 0)
cout << "none\n";
else
for (i = 0; i < n; ++i)
if (patrons[i].donation <= 10000.0)
cout << "Name: " << patrons[i].name
<< ", Donation: " << patrons[i].donation << endl;
delete [] patrons;
return 0;
}
7
#include <iostream>
#include <cctype>
#include <string>
int main()
{
using namespace std;
string words;
int vowels = 0;
int consonants = 0;
int others = 0;
cout << "Enter words (q to quit):\n";
while (cin >> words)
{
if (words[0] == 'q' || words[0] == 'Q')
break;
else if (isalpha(words[0]))
switch (words[0])
{
case 'a':
case 'A':
case 'o':
case 'O':
case 'e':
case 'E':
case 'i':
case 'I':
case 'u':
case 'U':
vowels++;
break;
default:
consonants++;
break;
}
else
others++;
}
cout << vowels << " words beginning with vowels\n"
<< consonants << " words beginning with consonants\n"
<< others << " others\n";
return 0;
}
8
#include <iostream>
#include <fstream> // for file I/O
int main()
{
using namespace std;
ifstream inFile;
inFile.open("/Users/gemingdai/Desktop/DS/test"); // “test :I love Apple!” 算上空格正好13个字符
int count = 0;
if (!inFile.is_open())
{
cout << "Can't open file\n";
exit(EXIT_FAILURE); // same as return 1
}
inFile.get();
while (!inFile.eof())
{
inFile.get();
++count;
}
cout << "The file cotains " << count << " characters.\n";
inFile.close();
return 0;
}
9
#include <iostream>
#include <fstream> // for file I/O
#include <cstdlib>
struct Patron
{
char name[20];
double donation;
};
int main()
{
using namespace std;
int num;
ifstream inFile;
inFile.open("/Users/gemingdai/Desktop/DS/test");
if (!inFile.is_open())
{
cout << "Can't open file\n";
exit(EXIT_FAILURE); // same as return 1
}
inFile >> num;
inFile.get();
Patron * pd = new Patron[num];
for(int i = 0; i < num; ++i)
{
inFile.getline(pd[i].name, 20);
inFile >> pd[i].donation;
cout << "Name: " << pd[i].name << ", Donation: " << pd[i].donation << endl;
inFile.get();
}
inFile.close();
return 0;
}