C++Primer第五版 4.7节练习

练习4.21:编写一段程序,使用条件运算符从vector 中找到哪些元素的值是奇数,然后将这些奇数值翻倍。

练习4.22:本节的示例程序将成绩划分成high pass,pass 和fail三种,扩展改程序使其进一步将60分到75分之间的成绩设定为low pass。要求程序包含两个版本:一个版本只使用条件运算符;另外一个版本使用1个或多个if语句。哪个版本的程序更容易理解呢?为什么

练习4.23: 因为运算符的优先级问题,下面这条表达式无法通过编译。根据4.12节中的表(第147页)指出它的问题在哪里?应该如何修改?
string s = “word”;
string p1 = s + s[s.size()-1] == ‘s’ ? “”:”s”;

练习4.24:本节示例程序将成绩划分成high pass,pass 和fail三种,它的依据是条件运算符满足右结合率。假如条件运算符满足的是左结合律,求值过程将是怎样的?

答 练习4.21程序见云盘
练习4.22程序见云盘,if语句的版本更好理解,分支清晰,可读性更强。

练习4.3 + 高于 == 高于 ?:高于 =
因此程序相当于 p1 = [(s + s[s.size()-1]==’s’)] ?”” : “s”
改正:p1 = s +[(s.[s.size()-1]==’s’ )? “ ”:”s”]

练习 4.24
答:网络参考答案:题目没看懂(grade<60)?”fail”:(grade>90)?”high pass”:”pass”;
2015/5/29 备注:上面是网上参考答案
string finalgrade = (grade > 90) ? ”high pass” : (grade > 60) ? “pass” : “fail”
条件运算符满足右结合律,因此加括号后等价于
string finalgrade = (grade > 90) ? “high pass” : ((grade)>60 ? “pass” : “fail”)

以整体的观念去看条件运算符 ,假如条件运算符满足左结合律
加括号后 相当于 string finalgrade = ((grade > 90) ? “high pass”: (grade >60) ) ? “pass” : “fail”
网上的参考答案直接篡改了表达式的位置,肯定是错的,满足左还是右结合律,去加括号,但条件运算符本身的定义是不变的。个人见解,不排除也许是我的观点是错的。

练习4.21

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int val;
    vector<int> ivec;
    while (cin >> val)
    ivec.push_back(val);

    for (auto it = ivec.begin(); it != ivec.end(); ++it)
        {
            cout << ((*it % 2) !=0 ? 2*(*it) : *it ) << " "; 
            //编译了很久 
        } 
        cout << endl;
    return 0;
} 

练习4.22-1

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int grade;
    while (cin >> grade)
    {
        string finalgrade = (grade > 90) ? "high pass" : (( grade >= 75 )? "pass" : ((grade >= 60) ? "low pass" : "fail") );//版本1 
        cout << finalgrade << endl;
    }
    return 0;
} 

练习4.22-2

#include <iostream>

using namespace std;

int main()
{
    int grade;
    while (cin >> grade)
    {
        if (grade > 90)
            cout << "high pass" << endl;
        else if (grade > 75) 
            cout << "pass" << endl;
            else if (grade >= 60 )
                cout << "low pass" << endl;
                else cout << "fail" << endl;  
    } 
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值