C ++ Primer(第五版)第一章练习答案

1.1 节练习

练习 1.1

查阅你使用的编译器的文档,确定它所使用的文件命名约定,编译并运行main程序。

int main()
{
    return 0;
}

练习 1.2

改写程序,让它返回-1,返回-1通常被当作程序错误的标识。重新编译运行你的程序,观察你的系统如何处理main返回的错误标识。

返回-1和返回0,在单个函数中没看出有什么区别,系统也不会做什么处理。

1.2 节练习

练习 1.3

编写程序,在标准输出上打印Hello,World。

#include <iostream>

int main()
{
    std::cout << "Hello,World" << std::endl;
    return 0;
}

练习 1.4

我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。

#include<iostream>

int main()
{
    std::cout << "输入两个数字:" << std::endl;
    int a = 0, b = 0;
    std::cin >> a >> b;
    std::cout << a
              << " * "
              << b
              << " = " << a * b << std::endl;
    return 0;
}

练习 1.5

我们将所有输出语句放放在一条很长的语句中。重写程序,将每个运算的打印操作放在一条独立的语句中。

原语句

std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;

修改语句

	std::cout << "The sum of ";
    std::cout << v1;
    std::cout << " and ";
    std::cout << v2;
    std::cout << " is ";
    std::cout << v1 + v2;
    std::cout<< std::endl;

练习 1.6

解释下面程序片段是否合法:

std::cout << "The sum of " << v1;
			<< " and " << v2;
			<< " is " << v1 + v2 << std::endl;

不合法, ; 表示语句结束。第一行语句以 ; 结束,说明打印输出 std::cout 结束,则2,3行必须重新编写打印输出 std::cout 。修改为练习 1.5。

练习 1.7

编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。

int main()
{
    /*
    /*
    */
    */
    return 0;
}

练习 1.8

指出下列输出语句那些是合法的(如果有的话)

std::cout<<"/*";
std::cout<<"*/";
std::cout<</*"*/"*/;
std::cout<</*"*"/*"*/"*/;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将一条语句作为其主体)改正每个编译错误。

第一二个能正确编译并运行输出结果。
第三四个不能通过编译,可以改正为如下

std::cout<<"/*""*/""*/";
std::cout<<"/*""*""/*""*/""*/";

1.4.1 节练习

练习 1.9

编写程序,使用while循环将50到100的整数相加。

#include<iostream>

int main()
{
    int i = 50, sum = 0;
    while (i >= 50 && i <= 100)
    {
        sum += i; //sum = sum + i;
        i++;
    }
    std::cout << sum << std::endl;
    return 0;
}

练习 1.10

除了++运算符将运算对象的值增加1之外,还有一个递减运算符(–)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。

#include<iostream>
int main()
{
    int v1 = 0, v2 = 10;
  
    int i = v1;
    while (i>=v1&&i<v2)
    {
        ++i;
        if (i!=v2)
        {
             std::cout << i << std::endl;
        }
    }
      
    return 0;
}

练习 1.11

编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。

#include<iostream>
int main()
{
    int v1 = 0, v2 = 0;
    
    std::cout << "输入两个整数:" << std::endl;
    std::cin >> v1 >> v2;
    if (v1<=v2)
    {
        int i = v1;
        while (i>=v1&&i<v2)
        {
            ++i;
            if (i!=v2)
            {
                std::cout << i << std::endl;
            }
        }
        
    }
    if (v1>=v2)
    {
        int i = v2;
        while (i>=v2&&i<v1)
        {
            ++i;
            if (i!=v1)
            {
                std::cout << i << std::endl;
            }
        }
        
    }
    return 0;
}

也解决了练习1.19

1.4.2 节练习

练习 1.12

下面for循环完成了什么功能?sum的终值是多少?

int sum= 0for(int i=-100;i<=100;i++)
    sum + =i;

for循环完成了从-100到100的数相加,sum的终值为0

练习 1.13

这使用for循环重做1.4.1节的所有练习。

练习 1.9 改写

#include<iostream>

int main()
{
    /* int i = 50, sum = 0;
    while (i >= 50 && i <= 100)
    {
        sum += i; //sum = sum + i;
        i++;
    } */
    int sum = 0;
    
    for (int i = 50; i >= 50 && i <= 100; i++)
    {
        sum += i; //sum = sum + i;
    }

    std::cout << sum << std::endl;
    return 0;
}

练习 1.10 改写

#include<iostream>
int main()
{
    /* int v1 = 0, v2 = 10;
  
    int i = v1;
    while (i>=v1&&i<v2)
    {
        ++i;
        if (i!=v2)
        {
             std::cout << i << std::endl;
        }
    } */
    
    for (int i = 1; i>=0&&i<10; i++)
    {
        std::cout << i << std::endl;
    }
    
    return 0;
}

练习 1.11 改写

#include<iostream>
int main()
{
    int v1 = 0, v2 = 0;
    std::cout << "Enter two numbers:" << std::endl;
    std::cin >> v1 >> v2;
    if (v1<=v2)
    {
        /* int i = v1;
        while (i>=v1&&i<v2)
        {
            ++i;
            if (i!=v2)
            {
                std::cout << i << std::endl;
            }
        } */
        for (int i = v1 + 1; i >= v1 && i < v2; i++)
        {
            std::cout << i << std::endl;
        }
    }
    if (v1>=v2)
    {
        /* int i = v2;
        while (i>=v2&&i<v1)
        {
            ++i;
            if (i!=v1)
            {
                std::cout << i << std::endl;
            }
        } */
        for (int i = v2 + 1; i >= v2 && i < v1; i++)
        {
            std::cout << i << std::endl;
        }
    }
    return 0;
}

练习 1.14

对比for循环和while循环,两种形式的优缺点各是什么?

for循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况;while循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)

练习 1.15

编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器错误信息。

练习 1.16

编写程序,从 cin 读取一组数,输出其和

#include<iostream>

int main()
{
    int value = 0, sum = 0;
    for (; std::cin >> value;)
    {
        sum += value;
    }
    std::cout << "Sum is " << sum << std::endl;
    return 0;
}

键入Ctrl+Z结束输入

练习 1.17

如果输入的所有值都是相等的,本节程序输出什么,如果没有重复值,输出又会是怎样的?

如果输入的所有值都相等,则输出元素的个数;如果没有重复值,则输出每个元素的个数为1

练习 1.18

编译并运行本节程序,给他输入全部相等的值,再次运行程序,输入没有重复的值。

练习 1.19

修改你为1.4.1节练习1.10所编写的程序,打印一个范围内的数,使其能处理用户输入的第一个数比第二个数小的情况。

同练习1.11

练习 1.20

在网站http://www.informit.com/title/0321714113上,第一章的代码目录中包含了头文件Sales_item.h,将他拷贝到你自己的工作目录中,用它编写一个程序,读取一组书籍记录,将每条记录打印在标准输出上。

#include<iostream>
#include"Sales_item.h"

int main()
{
    Sales_item item;
    std::cin >> item;
    std::cout << item << std::endl;
    return 0;
}

练习 1.21

编写程序,读取两个ISBN相同的sales_item对象,输出他们的和

#include<iostream>
#include"Sales_item.h"

int main()
{
    Sales_item item1, item2;
    std::cin >> item1 >> item2;
    std::cout << item1 + item2 << std::endl;
    return 0;
}

练习 1.22

编写程序,读取具有多个相同ISBN的销售记录,输出所有记录之和

#include<iostream>
#include"Sales_item.h"

int main()
{
    Sales_item itemSum;
    std::cin >> itemSum;//先保存第一条输入,否则只会将个数与价钱做和,不会保留ISBN在itemSum里
    Sales_item item;
    while (std::cin >> item)
    {
        itemSum += item;
    }
    std::cout << itemSum << std::endl;
    return 0;
}

1.5.2 节练习

练习 1.23

编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。

#include<iostream>
#include"Sales_item.h"

int main()
{
    Sales_item item1, item2;
    if (std::cin >> item1)
    {
        int num = 1;
        while (std::cin>>item2)
        {
            if (item2.isbn() == item1.isbn())
            {
                num++;
            }
            else
            {
                std::cout << item1.isbn() << " 的销售记录为 " << num << " 条 " << std::endl;
                item1 = item2;
                num = 1;
            }
        }
        std::cout << item1.isbn() << " 的销售记录为 " << num << " 条 " << std::endl;
    }
    
    return 0;
}

练习 1.24

输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。

测试结果

0-201-78345-x 3 20.00
0-201-78345-x 3 20.00
0-201-78345-x 3 20.00
0-201-78345-x 3 20.00
0-201-78345-x 3 20.00
0-201-78345-x 3 20.00
0-201-78145-x 3 20.00
0-201-78345-x 的销售记录为 60-201-78145-x 3 20.00
^Z
0-201-78145-x 的销售记录为 2

1.6 节练习

练习 1.24

借助网站上的 Sales_item.h 头文件,编译并运行本节给出的书店程序。

#include <iostream>
#include "Sales_item.h"

int main() 
{
    Sales_item total; // 保存下一条交易记录的变量
    // 读入第一条交易记录,并确保有数据可以处理
    if (std::cin >> total) {
		Sales_item trans; // 保存和的变量
        // 读入并处理剩余交易记录
        while (std::cin >> trans) {
			// 如果我们仍在处理相同的书
            if (total.isbn() == trans.isbn()) 
                total += trans; // 更新总销售额 
            else {              
		        // 打印前一本书的结果 
                std::cout << total << std::endl;  
                total = trans;  // total 现在表示下一本书的销售额
            }
		}
        std::cout << total << std::endl; // 打印最后一本书的结果
    } else {
        // 没有输入! 警告读者
        std::cerr << "No data?!" << std::endl;
        return -1;  // 表示失败
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值