《C++ Primer Plus(第六版)》(8)(第六章 分支语句和逻辑运算符 笔记和答案)...

=============笔记=============

1.字符函数库头文件<cctype>

    isalnum()    字母或数字

    isalpha()    字母

    iscntr()     控制字符

    isdigit()    数字(0-9

    isgraph()    空格之外的打印字符

    islower()    小写字母

    isprint()    打印字符,包括空格

    ispunct()    标点符号

    isspace()    标准空白字符,如空格、进纸、回车、水平制表符、垂直制表符

    isupper()    大写字母

    isxdigit()   十六进制字符

    tolower()    如果是大写,转小写

    toupper()    如果是小写,转大写


2.如果既可以使用if else if 又可以使用switch,当选项超过3个的时候,应该使用switch,效率会更高。


3.文件输出。如果不填绝对路径,生成的文件是在程序的目录下的。因为现在在用MacBook,找了半天才找到。真是日了狗了了。

    char automobile[50];
    int year;
    double a_price;
    double d_price;
    
    ofstream of;//声明一个输出的对象
    of.open("/Users/feiyin001/Documents/myTest.txt");//打开文件
    cout << "Enter the make and model of automobile: ";
    cin.getline(automobile, 50);
    cout << "Enter the model year: ";
    cin >> year;
    cout << "Enter the original asking price: ";
    cin >> a_price;
    d_price = 0.913 * a_price;
    
    //控制台输出
    cout << fixed;
    cout.precision(2);
    cout.setf(ios_base::showpoint);
    cout << "Make and model: " << automobile <<endl;
    cout << "Year: " << year <<endl;
    cout << "Was asking $ " << a_price << endl;
    cout << "Now asking $ " << d_price << endl;
    
    //文件输出
    of << fixed;
    of.precision(2);
    of.setf(ios_base::showpoint);
    of << "Make and model: " << automobile <<endl;
    of << "Year: " << year <<endl;
    of << "Was asking $ " << a_price << endl;
    of << "Now asking $ " << d_price << endl;

    of.close();
    
结果:

myTest.txt

Make and model: fdsa
Year: 0
Was asking $ 0.00
Now asking $ 0.00


4.读取文件。基本没怎么做过读写文本的事情。还是得亲自打一下代码。

myTest.txt

12331 3123
2312
3 123   12
321
3
123
3123

    ifstream ifile;
    string filename = "/Users/feiyin001/Documents/myTest2.txt";
    ifile.open(filename);
    if(!ifile.is_open())
    {
        cout << "Could not open the file " << filename << endl;
        cout << "Program terminating." <<endl;
        exit(EXIT_FAILURE);
    }
    double value = 0;
    double sum = 0;
    int count = 0;
    ifile >> value;
    while (ifile.good()) {
        ++count;
        sum += value;
        ifile >> value;
    }
    //读取停止,检测一下原因
    if (ifile.eof())
        cout << "End of file reached.\n";
    else if (ifile.fail())
        cout << "Input terminated by data mismatch.\n";
    else
        cout << "Input terminated for unknown reason.\n";
    if (count == 0)
    {
        cout << "No data processed.\n";
    }
    else
    {
        cout << "Item read: " << count << endl;
        cout << "Sum: " << sum << endl;
        cout << "Average: " << sum / count << endl;
    }
    ifile.close();
    
结果:

控制台

End of file reached.

Item read: 9

Sum: 18351

Average: 2039


============答案================

6.10 复习题


1.第二个判断少一点,如果第一个if成立,esle后面的if就不用判断了。


2.
6.2代码
char ch;
std::cout<< "type, and I shall repeat. \n";
cin.get(ch);
while (ch != '.') {
    if (ch == '\n') {
        cout << ch;
    }
    else
    {
        cout <<++ch;
    }
    std::cin.get(ch);
}
cout<< "\nPlease excuse the slight confusion.\n";
结果:
type, and I shall repeat. 
welcome to fable game.
xfmdpnf!up!gbcmf!hbnf
Please excuse the slight confusion.
++ch对每个输入的字符都+了1,变成下一个字符。
如果改成ch + 1,因为要类型转换,就变成整形了,输出的是数字。
修改:
char ch;
std::cout<< "type, and I shall repeat. \n";
cin.get(ch);
while (ch != '.') {
    if (ch == '\n') {
        cout << ch;
    }
    else
    {
        cout <<ch + 1;
    }
    std::cin.get(ch);
}
cout<< "\nPlease excuse the slight confusion.\n";
结果:
type, and I shall repeat. 
welcom to fable game。
120102109100112110331171123310398991091023310498110102
Please excuse the slight confusion.


3.

char ch;
int ct1 = 0, ct2 = 0;
while ((ch = cin.get()) != '$') {
    cout << ch;
    ct1++;
    if (ch = '$') {
        ct2++;
    }
    cout << ch;
}
cout << "ct1 = " << ct1 << " , ct2 = " << ct2 << "\n";
结果:没看清是=号,猜错答案了。。。不过输入之后,编译器会提示的。

Hi!

H$i$!$

$Send $10 or $20 now!

S$e$n$d$ $ct1 = 9 , ct2 = 9


4.

a. weight >= 115 && weight < 125
b. 'q' == ch || 'Q' == ch
c. x % 2 == 0 && x != 26
d. x % 2 == 0 && x % 26 != 0
e. (donation >= 1000 && donation <= 2000) || 1 == guest
f. (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')


5.!!x,最后x会变成true或者false,不管x是什么类型。如果x本来就是bool,就一样了。


6. 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.如果使用int,输入的是字符,则会cin出错,如果使用char,可以接受任何输入。


9.

int line = 0;
char ch;
while ( cin.get() && ch != 'Q') {
    if (ch == '\n') {
        line++;
    }
}

6.11 编程练习

1.用惯了stl,不用vector真不知道怎么回文显示。

char ch;
vector<char> cs;
while (cin.get(ch) && ch != '@') {
    if (isdigit(ch)) {
        continue;
    }
    if (isupper(ch))
    {
        cs.push_back(tolower(ch));
    }
    else if (islower(ch))
    {
        cs.push_back(toupper(ch));
    }
    else
    {
        cs.push_back(ch);
    }
}
for (int i = (int)cs.size() - 1; i >= 0; i--) {
    cout<< cs[i];
}
cout<<endl;
结果:

Welcom to Fable Game!

@


!EMAg ELBAf OT MOCLEw



2.
double ch;
vector<double> cs;
cin>>ch;
double total;
while (cin.good())
{
    cs.push_back(ch);
    total += ch;
    cin >> ch;
}
if (cs.empty()) {
    cout << "no data";
    return;
}
double average = total / cs.size();
int count = 0;
for (int i = 0; i < (int)cs.size(); ++i) {
    if (cs[i] > average) {
        ++count;
    }
}
cout<< "average: "<< average << " larger count: "<< count << endl;

3.
 cout<< "Please enter one of the following choices:" <<endl;
 cout<< "c) carnivore           p) pianist"<<endl;
 cout<< "t) tree                g) game"<<endl;
 char ch;
 cin>>ch;
 char cs[20];
 bool flag = true;
 while (flag) {
     switch (ch) {
         case 'c':
             strcpy(cs , "carnivore");
             flag = false;
             break;
         case 'p':
             strcpy(cs , "pianist");
             flag = false;
             break;
         case 't':
             strcpy(cs , "tree");
             flag = false;
             break;
         case 'g':
             strcpy(cs , "game");
             flag = false;
             break;
         default:
             flag = true;
             cout<<"Please enter a c, p, t, or g: ";
             cin >> ch;
             break;
     }
 }
 cout<< "A maple is a "<< cs << endl;

4.老是用char和[]真是不习惯。。。

const int strsize = 50;
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
};

void init(bop bops[], int num)
{
    char buffer[strsize];
    for (int i = 0; i < num; ++i) {
        sprintf(buffer,"fullname%d",i);
        strcpy(bops[i].fullname, buffer);
        sprintf(buffer,"title%d",i);
        strcpy(bops[i].title, buffer);
        sprintf(buffer,"bopname%d",i);
        strcpy(bops[i].bopname, buffer);
        bops[i].preference = i%3;
    }
}

void printInfo(bop bops[], int num, char ch)
{
   
    for (int i = 0; i < num; ++i) {
        switch (ch) {
            case 'a':
                cout<< bops[i].fullname<<endl;
                break;
            case 'b':
                cout << bops[i].title <<endl;
                break;
            case 'c':
                cout << bops[i].bopname <<endl;
                break;
            case 'd':
                if ( bops[i].preference == 0)
                {
                    cout<< bops[i].fullname<<endl;
                }
                else if (bops[i].preference == 1)
                {
                    cout << bops[i].title <<endl;
                }
                else if (bops[i].preference == 2)
                {
                    cout << bops[i].bopname <<endl;
                }
                break;
        }
    }
}

void CTestManager::testCpp()
{
    bop bops[5];
    init(bops, 5);
    cout << "Benevolent Order of Programmers Report"<< endl;
    cout << "a. display by name     b. display by title"<<endl;
    cout << "c. display by bopname  d. display by preference"<<endl;
    cout << "q. quit"<<endl;
    cout << "Enter your choice: ";
    char ch;
    bool flag = true;
    cin >> ch;
    while (flag) {
        switch (ch) {
            case 'a':
            case 'b':
            case 'c':
            case 'd':
                printInfo(bops, 5, ch);
                cout << "Next choice: ";
                cin >> ch;
                break;
            case 'q':
                cout << "Bye!" << endl;
                flag = false;
                break;
            default:
                cout << "Enter your choice: a, b, c, d, or q:";
                cin >> ch;
                break;
        }
        
    }
}

5.

int money = 0;
cout << "Please enter tvarps: ";
cin >> money;
while (cin.good() && money > 0) {
    int tax = 0;
    if (money > 35000) {
        tax += (money - 35000) * 0.2;
        money = 35000;
    }
    if (money > 15000) {
        tax += (money - 15000) * 0.15
        money = 15000;
    }
    if (money > 5000) {
        tax += (money - 5000) * 0.1;
        money = 5000;
    }
    if (money <= 5000) {
        tax += money * 0.0;
        money = 0;
    }
    cout << "tax: "<< tax <<endl;
    cout << "Please enter tvarps: ";
    cin >> money;
}

6.
struct SPlayer
{
    string name;
    double money;
};
int num = 0;
cout << "Please enter player num:";
cin >> num;
SPlayer* players = new SPlayer[num];
int grandCount = 0;
for (int i = 0; i < num; ++i) {
    cout << "name: ";
    cin>> players[i].name;
    cout << "money: ";
    cin >>players[i].money;
    if (players[i].money >= 10000) {
        ++grandCount;
    }
}
cout<<"====Grand Patrons===="<<endl;
if (grandCount > 0) {
    for (int i = 0; i < num; ++i) {
        if (players[i].money >= 10000) {
            cout << players[i].name<<endl;
        }
    }
}
else{
    cout<<"none"<<endl;
}
cout<<"====Patrons===="<<endl;
if (num - grandCount > 0) {
    for (int i = 0; i < num; ++i) {
        if (players[i].money < 10000) {
            cout << players[i].name<<endl;
        }
    }
}
else{
    cout<<"none"<<endl;
}
delete[] players;

结果:

Please enter player num:5

name: 01

money: 1231

name: 2

money: 234

name: 3

money: 233333

name: 4

money: 3333

name: 5

money: 99999

====Grand Patrons====

3

5

====Patrons====

01

2

4


7.
char ch[50];
int otherCount = 0;
int vowel = 0;
int consonant = 0;
cout <<"Enter words (q to quit):"<<endl;
cin >> ch;
while (strcmp(ch, "q") != 0) {
    if (isalpha( ch[0])) {
        if (ch[0] == 'a' || ch[0] == 'A' ||
            ch[0] == 'e' || ch[0] == 'E' ||
            ch[0] == 'i' || ch[0] == 'I' ||
            ch[0] == 'o' || ch[0] == 'O' ||
            ch[0] == 'u' || ch[0] == 'U'
            )
        {
            ++vowel;
        }
        else
        {
            ++consonant;
        }
    }
    else{
        ++otherCount;
    }
    cin >> ch;
}
cout << vowel << " words beginning with vowels\n";
cout << consonant << " words beginning with consonants\n";
cout << otherCount << " others\n";

结果:

Enter words (q to quit):

The 12 awesome oxen ambled

quietly across 15 meters of lawn. q

5 words beginning with vowels

4 words beginning with consonants

2 others


8.

ifstream ifile;
string filename = "/Users/FableGame/Documents/myTest2.txt";
ifile.open(filename);
if(!ifile.is_open())
{
    cout << "Could not open the file " << filename << endl;
    cout << "Program terminating." <<endl;
    exit(EXIT_FAILURE);
}
char ch = 0;
int count = 0;
ifile >> ch;
while (ifile.good()) {
    ++count;
    ifile >> ch;
}
//读取停止,检测一下原因
if (ifile.eof())
    cout << "End of file reached.\n";
else if (ifile.fail())
    cout << "Input terminated by data mismatch.\n";
else
    cout << "Input terminated for unknown reason.\n";
if (count == 0)
{
    cout << "No data processed.\n";
}
else
{
    cout << "Char read: " << count << endl;
}
ifile.close();

9.其实读文件和cin是一样的,忘记字符串和数字交替会有问题,调了一会儿。

struct SPlayer
{
    char name[50];
    double money;
};
int num = 0;
ifstream ifile;
string filename = "/Users/feiyin001/Documents/myTest2.txt";
ifile.open(filename);
if(!ifile.is_open())
{
    cout << "Could not open the file " << filename << endl;
    cout << "Program terminating." <<endl;
    exit(EXIT_FAILURE);
}
ifile >> num;
ifile.get();
SPlayer* players = new SPlayer[num];
int grandCount = 0;
for (int i = 0; i < num; ++i) {
    ifile.getline(players[i].name, 50,'\n');
    cout << "name: " << players[i].name << endl;
    ifile >>players[i].money;
    ifile.get();
    cout << "money: " << players[i].money<< endl;
    if (players[i].money >= 10000) {
        ++grandCount;
    }
}
ifile.close();
cout<<"====Grand Patrons===="<<endl;
if (grandCount > 0) {
    for (int i = 0; i < num; ++i) {
        if (players[i].money >= 10000) {
            cout << players[i].name<<endl;
        }
    }
}
else{
    cout<<"none"<<endl;
}
cout<<"====Patrons===="<<endl;
if (num - grandCount > 0) {
    for (int i = 0; i < num; ++i) {
        if (players[i].money < 10000) {
            cout << players[i].name<<endl;
        }
    }
}
else{
    cout<<"none"<<endl;
}
delete[] players;

结果:

name: Sam Stone

money: 2000

name: Freida Flass

money: 100500

name: Tammy Tubbs

money: 5000

name: Rich Raptor

money: 55000

====Grand Patrons====

Freida Flass

Rich Raptor

====Patrons====

Sam Stone

Tammy Tubbs




转载于:https://www.cnblogs.com/fablegame/p/6119707.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值