C++ primer第五版 练习 第二章

2.1 类型 int、long、long long 和 short 的区别是什么?无符号类型和带符号类型的区别是什么?float 和 double的区别是什么?

int 最小是16位, long 是32位,long long是64位。
无符号只能表示大于等于0的值,有符号类型可以表示正数、负数、0
float表示单精度浮点数,double为双精度浮点数。float和double分别有7和16位有效位。

2.2 计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。

选用double类型,理由emm常识么??

2.3 读程序写结果

unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;

32
4294967264
32
-32
0
0

2.4 编写程序检查你的估计是否正确,如果不正确,请仔细研读本节直到弄明白问题所在。

#include <iostream>

int main(){
    
    unsigned u = 10, u2 = 42;
    std::cout << u2 - u << std::endl;
    std::cout << u - u2 << std::endl;
    
    int i = 10, i2 = 42;
    std::cout << i2 - i << std::endl;
    std::cout << i - i2 << std::endl;
    std::cout << i - u << std::endl;
    std::cout << u - i << std::endl;
    return 0;
}

结果:在这里插入图片描述

2.5 指出下述字面值的数据类型并说明每一组内几种字面值的区别:

  • (a) ‘a’, L’a’, “a”, L"a"
  • (b) 10, 10u, 10L, 10uL, 012, 0xC
  • © 3.14, 3.14f, 3.14L
  • (d) 10, 10u, 10., 10e-2

(a) 字符型字面值、宽字符型字面值、字符串型字面值、宽字符串型字面值。
(b) 十进制整型字面值、十进制无符号整型字面值、十进制长整型字面值、无符号长整型字面值、八进制整型字符值、十六进制整型字符值
© double字面值、float字面值、long double字面值
(d) 十进制整型字面值、无符号整型字面值、double字面值、double字面值

2.6 下面两组定义是否有区别,如果有,请叙述之:

int month = 9, day = 7;
int month = 09, day = 07;

第一行为十进制整型,第二行为八进制整型。
因为八进制没有9所以第二行的month这个变量错了。

2.7 下述字面值表示何种含义?它们各自的数据类型是什么?

  • (a) “Who goes with F\145rgus?\012”
  • (b) 3.14e1L
  • © 1024f
  • (d) 3.14L
    (a)“Who goes with Fergus?(换行)” 字符串字面值
    (b)long double 3.14
    (c)不合法,f表示float
    (d)long double

2.8 请利用转义序列编写一段程序,要求先输出 2M,然后转到新一行。修改程序使其先输出 2,然后输出制表符,再输出 M,最后转到新一行。

#include <iostream>

int main(){
    std::cout << "2\115" << '\n';
    std::cout << '2' << '\t' << '\115' << '\n';
}

2.9 解释下列定义的含义,对于非法的定义,请说明错在何处并将其改正。

  • (a) std::cin >> int input_value;
  • (b) int i = { 3.14 };
  • © double salary = wage = 9999.99;
  • (d) int i = 3.14;
    (a) 没有定义,一个没有初始化的内置类型就是没有定义
int input_value = 0;
std::cin >> input_value;

(b) i是整型数据,用列表初始化内置类型的变量时,如果存在数值丢失的可能,会报错
double i = {3.14};
© wage变量未定义就使用。

double wage;
double salary = wage = 9999.99

(d) 将一个double类型字面值赋给一个整型变量。i会直接赋值为3.

double i = 3.14;

2.10 下列变量的初值分别是什么?

std::string global_str;//空字符串
int global_int;//0
int main()
{
    int local_int;//未定义
    std::string local_str;//空字符串
}

2.11 指出下面的语句是声明还是定义:

  • (a) extern int ix = 1024; //定义
  • (b) int iy; //定义
  • © extern int iz; //声明

2.12 请指出下面的名字中哪些是非法的?

  • (a) int double = 3.14;// 和关键字重复不行
  • (b) int _;
  • © int catch-22;//非法字符
  • int 1_or_2 = 1;//有关键字
  • double Double = 3.14;

2.13 下面程序中 j 的值是多少?

int i = 42;
int main()
{
    int i = 100;
    int j = i;
}

100

2.14 下面的程序合法吗?如果合法,它将输出什么?

    int i = 100, sum = 0;
    for (int i = 0; i != 10; ++i)
        sum += i;
    std::cout << i << " " << sum << std::endl;

100 输出0-9的和:45

2.15 下面的哪个定义是不合法的?为什么?

  • (a) int ival = 1.01;
  • (b) int &rval1 = 1.01;
  • © int &rval2 = ival;
  • (d) int &rval3;
    (b)(d)不合法
    (b)引用必须要绑定在对象
    (d)引用必须初始化

2.16 考察下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了哪些操作?

int i = 0, &r1 = i; double d = 0, &r2 = d;

扫描二维码关注公众号,回复: 11118891 查看本文章
  • (a) r2 = 3.14159;
  • (b) r2 = r1;
  • © i = r2;
  • (d) r1 = d;
    (a) 合法:d的值被赋为3.14159
    (b)合法:d做类型转换
    ©合法:小数被截断
    (d)合法:小数被截断

2.17 执行下面的代码段将输出什么结果?

int i, &ri = i;
i = 5; ri = 10;
std::cout << i << " " << ri << std::endl;

输出:10, 10

2.18 编写代码分别改变指针的值以及指针所指对象的值。

#include <iostream>

int main(){
    int i = 10, j = 20;
    int * p = &i;
    //改变指针指向对象的值
    *p = 30;
    std::cout << "i= " << i << std::endl;
    //改变指针的值
    p = &j;
    std::cout << "*p= " << *p << std::endl;
    
}

在这里插入图片描述

2.19 说明指针和引用的主要区别

引用 指针
不是对象,只是别名 是对象
创建的时候必须初始化 创建的时候不用初始化
一旦初始化之后就不能绑定给其他对象 可以重新指向其他对象

2.20 请叙述下面这段代码的作用。

int i = 42;//定义一个整型变量并初始化为42
int *p1 = &i; //创建一个指针变量p1指向i对象
*p1 = *p1 * *p1;//将i的值改为42*42

2.21 请解释下述定义。在这些定义中有非法的吗?如果有,为什么?

int i = 0;
(a) double* dp = &i;//非法,一个指向double类型的指针不能指向整型变量i
(b) int *ip = i;//非法,指针存储的值应该是对象的地址
(c) int *p = &i;//合法

2.22 假设 p 是一个 int 型指针,请说明下述代码的含义。

if (p) // 判断指针p是不是空指针
if (*p) // 判断指针p指向的对象的值是不是0

2.23 给定指针 p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。

不能,因为首先要确定这个指针是不是合法的,才能判断它所指向的对象是不是合法的。

2.24 在下面这段代码中为什么 p 合法而 lp 非法?

int i = 42;
void *p = &i;//可以指向任意对象
long *lp = &i;//指向long类型的指针不能指向int类型的变量

2.25 说明下列变量的类型和值。

(a) int* ip, i, &r = i;
(b) int i, *ip = 0;
(c) int* ip, ip2;

(a)ip是一个指向int型指针,i是int型变量,如果i是在函数体外则为0,r是i的引用
(b)i是一个int型变量,ip是一个空指针
(c)ip是一个指向int型指针,ip2是一个int型变量

2.26 下面哪些语句是合法的?如果不合法,请说明为什么?

const int buf;      // 不合法, const 对象必须初始化
int cnt = 0;        // 合法
const int sz = cnt; // 合法
++cnt; ++sz;        // 不合法, const 对象不能被改变

2.27 下面的哪些初始化是合法的?请说明原因。

int i = -1, &r = 0;         // 不合法, 引用不能直接给字面值
int *const p2 = &i2;        // 合法
const int i = -1, &r = 0;   // 合法
const int *const p3 = &i2;  // 合法
const int *p1 = &i2;        // 合法
const int &const r2;        // 不合法, 引用没有这种写法
const int i2 = i, &r = i;   // 合法

2.28 说明下面的这些定义是什么意思,挑出其中不合法的。

int i, *const cp;       // 不合法, cp必须初始化
int *p1, *const p2;     // 不合法, p2必须初始化
const int ic, &r = ic;  // 不合法, ic必须初始化
const int *const p3;    // 不合法, p3必须初始化
const int *p;           // 合法. 一个指针,指向 const int

2.29 假设已有上一个练习中定义的那些变量,则下面的哪些语句是合法的?请说明原因。

i = ic;     // 合法, 常量赋值给普通变量
p1 = p3;    // 不合法, p3为指针常量是不能赋值普通指针
p1 = &ic;   // 不合法, ic是常量只能用常量指针来指向
p3 = &ic;   // 合法, p3 是常量指针且指向常量
p2 = p1;    // 合法, 可以将普通指针赋值给常量指针
ic = *p3;   // 合法, 对 p3 取值后(int) 然后赋值给 ic

2.30 对于下面的这些语句,请说明对象被声明成了顶层const还是底层const?

const int v2 = 0;//顶层 int v1 = v2;
int *p1 = &v1, &r1 = v1;
const int *p2 = &v2, *const p3 = &i, &r2 = v2;//p2 是底层,p3 既是顶层,r2 是底层。

2.31 假设已有上一个练习中所做的那些声明,则下面的哪些语句是合法的?请说明顶层const和底层const在每个例子中有何体现。

r1 = v2; // 合法, 顶层在拷贝时不受影响
p1 = p2; // 不合法,  p1 不是底层const
p2 = p1; // 合法, int* 可以转换成const int*
p1 = p3; // 不合法, p3 是一个底层const,p1 不是
p2 = p3; // 合法, p2 和 p3 都是底层const,p3顶层不影响

2.32 下面的代码是否合法?如果非法,请设法将其修改正确。

int null = 0, *p = null;
非法
int null = 0, *p = 0;

2.40 根据自己的理解写出 Sales_data 类,最好与书中的例子有所区别。

struct Sales_Data{
    string bookNo;
    string bookName;
    unsigned units_sold = 0;//销售数量
    double revenue = 0.0;//销售收入
    double price = 0.0;//单价
};

2.41 使用你自己的Sale_data类重写1.5.1节(第20页)、1.5.2节(第21页)和1.6节(第22页)的练习。眼下先把Sales_data类的定义和main函数放在一个文件里。

1.51 读取一组书籍销售记录,将每条记录打印到标准输出上

#include <iostream>
#include <string>
struct Sale_Data
{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

int main(){
//    for(Sales_Data sd; cin >> sd; cout << sd << endl);
    Sales_Data book;
    double price;
    std::cin >> book.bookNo >> book.units_sold >> price;
    book.revenue = book.units_sold * price;
    std::cout << book.bookNo << " " << book.units_sold << " " << book.revenue << " " << price;
    
    return 0;
}
#include <iostream>
struct Sales_Data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

int main(){
    Sales_Data book, book2;
    double price;
    std::cin >> book.bookNo >> book.units_sold >> price;
    std::cin >> book2.bookNo >> book2.units_sold >> price;
    if(book.bookNo == book2.bookNo){
        std::cout << book.units_sold + book2.units_sold << std::endl;
    }else{
        std::cerr << "输入有误" << std::endl;
    }
    
    return 0;
}
#include <iostream>
struct Sales_Data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

int main(){
    Sales_Data total_book;
    double total_price;
    if(std::cin >> total_book.bookNo >> total_book.units_sold >> total_price){
//        int cnt = 1;
        total_book.revenue = total_book.units_sold * total_price;
        Sales_Data book;
        double book_price;
        while(std::cin >> book.bookNo >> book.units_sold >> book_price){
            book.revenue = book.units_sold * book_price;
            if(total_book.bookNo == book.bookNo){
                total_book.units_sold += book.units_sold;
                total_book.revenue += book.revenue;
//                ++cnt;
            }else{
                std::cout << total_book.bookNo << " " << total_book.units_sold << " " << total_book.revenue << total_price << std::endl;
//                std::cout << total_book.bookNo << "has " << cnt << "recordings!";
                total_book.bookNo = book.bookNo;
                total_price = book_price;
                total_book.units_sold = book.units_sold;
                total_book.revenue = book.revenue;
            }
            
        }
        std::cout << total_book.bookNo << " " << total_book.units_sold << " " << total_book.revenue << total_price << std::endl;
//        std::cout << total_book.bookNo << "has " << cnt << "recordings!";
    }
    else{
        std::cout << " No " << std::endl;
        return -1;
    }
    return 0;
}

1.5.2

#include <iostream>
struct Sales_Data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

int main(){
    Sales_Data total_book;
    double total_price;
    if(std::cin >> total_book.bookNo >> total_book.units_sold >> total_price){
        int cnt = 1;
        total_book.revenue = total_book.units_sold * total_price;
        Sales_Data book;
        double book_price;
        while(std::cin >> book.bookNo >> book.units_sold >> book_price){
            book.revenue = book.units_sold * book_price;
            if(total_book.bookNo == book.bookNo){
//                total_book.units_sold += book.units_sold;
//                total_book.revenue += book.revenue;
                ++cnt;
            }else{
                std::cout << total_book.bookNo << "has " << cnt << "recordings!";
                total_book.bookNo = book.bookNo;
                total_price = book_price;
                total_book.units_sold = book.units_sold;
                total_book.revenue = book.revenue;
            }
           
        }
         std::cout << total_book.bookNo << "has " << cnt << "recordings!";
    }
    return 0;
}
发布了8 篇原创文章 · 获赞 1 · 访问量 459

猜你喜欢

转载自blog.csdn.net/Echo_Hsu/article/details/105167017