c++-pimer-plus-6th-chapter06

  • Post author:
  • Post category:其他


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;
}

控制台效果截图(细体表示输入,粗体表示输出):

605033-20181217092911487-686046035.png

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;
}

转载于:https://www.cnblogs.com/houhaibushihai/p/9664705.html