C++Primer第五版——习题答案+详解

 非标准答案,都是个人理解

第三章

3.4

#include
#include

using std::cout;
using std::endl;
using std::cin;
using std::string;

int main()
{ 
  string str1,str2;
  getline(cin,str1);
  getline(cin,str2);
  if(str1==str2)
  {
    cout<<"equal"<=str2)
  {
    cout<

3.5

#include 
#include
using std::cout;
using std::cin;
using std::string;

int main()
{
    string sumS1, s;
    while (getline(cin, s))
    {
        sumS1 += s;
        cout << sumS1;
    }
    
}

字符串确实能直接用加号连接,但是这种方式程序死循环很不爽。。。

3.6

#include
#include

using std::cout;
using std::endl;
using std::cin;
using std::string;

int main()
{
  string s("some string");
  for(auto &c:s)
  {
    c='x';
  }
  cout <

这个就简单了,循环s又是地址传递,直接赋值,只是这里一定注意单个字母的时候是单引号!

3.8

int i=0;
  string s("some string");
  while (i

又学了一个函数s.size是字符串长度的长度,小于字符串长度内都给他覆盖掉就可以了。

3.9

合法,s默认初始化为空字符串,打印第一个字符,也就是打印空格,我在机器上运行了确实合法

3.10

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    string s="hello,world,i an iron man.";
    string c="";
    for(auto i:s)    //这里传进来是H所以auto声明i是char的形式。
    {
        if(!ispunct(i))
        {
            c+=i;    //让它走向下一个,要不然循环完c里面就是n这个字母
        }
        
    }
  
    
   cout<

3.10 第二种解法

#include
#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    
    
 string s = "hello,world,i an iron man.";
 string tmp(s);            //拷贝s,把值赋给tmp
 std::for_each(tmp.begin(), tmp.end(), [](char& c) { (ispunct(c) ? c = 0x0 : c = c); }); 
 cout << tmp << endl;
    

}

//for_each也是循环遍历,c就是每一个tem遍历的单个元素,和上面的解法i一样,又是引用的形式可以直接修改。三目运算符,对tmp进行修改。结果一样。

这里还要说一下就是尽量不要直接修改s,包括写项目的时候,不能直接修改传入的数据,新建一个临时的修改就好了。

3.11

合法,c的类型是const char

3.12

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{

    std::vector> ivec;
    


}



正确,第一个vector名字叫ivec里面每一个元素都是vector类型的。

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{

    std::vector svec=ivec;

}




错误:ivec 是个什么东西,你没有定义啊

(c)这个没毛病,容器里边是string类型,里面放了10个null;

3.13

(a)这玩意就是个空对象

(b)这玩意里面包含十个元素,全都是零

(C)这玩意里面包含十个元素,全都是42

(d)放了一个元素10

(e)放了两个元素,一个10,一个42

(f)string类型,里面放了十个空格

(g)string 类型,里面放了是个”hi"

3.14

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    std::vector v1;
    int a;
    while(cin>>a)
    {
    v1.push_back(a);
    break;
    }
    for(auto b:v1)
    {
        cout<

3.15

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    std::vector v1;
    string  a;
    while(cin>>a)
    {
    v1.push_back(a);
    break;
    }
    for(auto b:v1)
    {
        cout<

用书里的发现一直在循环里面,不断的往v1输入,加了break,就好了,就读入一组数据挺好。

3.16

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    std::vectorv1;
    cout<

3.17

#include
#include
#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{	
	std::vector v1;
	string s;
	while (cin >> s)
	{
		v1.push_back(s);
        
	}
	for(auto &a:v1)
    {
        for(auto &b:a)
        {
            b=toupper(b);
        }
    }
	for (auto i:v1)
	{
		cout<

要知道里面是两个形式,第一是vector里面的每一个string,第二是string里面的每一个字母。

3.18

不合法,会报段错误


	std::vector i{42};
    

	



3.19

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{	
	//std::vector i{42,42,42,42,42,42,42,42,42,42};
    //std::vectori(10,42);
    std::vectori{10,"42"};
    for(auto a:i)
    {
        cout<

很明显是第二种赋值,尤其是对整数赋值,更加清晰明了。

3.20


#include 
#include
using std::cout;
using std::cin;
using std::endl;
int main()
{
    
    std::vector i_v = { 1,2,3,4,5,6 };
    std::vector sum_v1;
    for (decltype(i_v.size()) index = 0; index < i_v.size()-1; index++)
    {
        sum_v1.push_back(i_v[index] + i_v[index + 1]);
    }
    for (auto c : sum_v1)
    {
        cout << c<<" ";
    }
    cout << "\n";
       
}
#include 
#include
using std::cout;
using std::cin;
using std::endl;
int main()
{
    
    std::vector i_v = { 1,2,3,4,5,6 };
    std::vector sum_v1;
    for (decltype(i_v.size()) index = 0; index < i_v.size()-1; index++)
    {
        sum_v1.push_back(i_v[index] + i_v[i_v.size()-index -1]);
    }
    for (auto c : sum_v1)
    {
        cout << c<<" ";
    }
    cout << "\n";
       
}

3.21

#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    std::vectorv1(10,1);
    cout << v1.size() << '\n';
    auto a = v1.begin();
    auto b = v1.end();
    for (; a != b;)
    {
        cout << *a << endl;
        ++a;
    }

3.22

#include
#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    std::vector s{"hello,world"};
    
    
    
    for (auto a = s.begin(); a != s.end() && !a->empty(); ++a)
    {
        for (auto& c : *a)
        {
            c=toupper(c);

        }
        
        
    }
    for (auto c : s)
    {
        cout << c << " ";
    }
    cout << endl;

}

3.23

#include
#include
#include
using std::endl;
using std::cout;
using std::cin;
using std::string;
int main()
{
    std::vector i(10,1);
    
    
    
    for (auto a = i.begin(); a != i.end(); ++a)
    {
        *a = *a * 2;
        
        
    }
    for (auto c : i)
    {
        cout << c << " ";
    }
    cout << endl;

}

3.24

#include 
#include
using std::cout;
using std::cin;
using std::endl;
int main()
{

    std::vector i = { 1,2,3,4,5,6 };
    std::vector sum;
    
    for (auto it = i.begin(); it != i.end()-1 ; ++it)
    {
        sum.push_back(*it + *(it + 1));
    }
    for (auto c : sum)
    {
        cout << c << " ";
    }
    cout << "\n";

}
#include 
#include
using std::cout;
using std::cin;
using std::endl;
int main()
{
    
    std::vector i = { 1,2,3,4,5,6 };
    std::vector sum;
	auto b=i.begin();
	auto e=i.end()-1;
    for (int n=0; b!=e-1; ++b)
    {
        sum.push_back(*b + *(e-n));
		n++;
    }
    for (auto c : sum)
    {
        cout << c<<" ";
    }
    cout << "\n";
       
}

这里又引用了一个n为了是能够从end往前移动,一开始也想过直接减b但是老是报错,还是这样吧,这样能跑动。

3.25

3.26

因为end指向的是最后一个元素的最后一个位置,相加总位置就多了

3.27

数组里面[这里边可以是常量表达式]

a:不合法,Constexpr unsigned buf_size =1024;才行

c:返回值得也是Constexpr

d:范围小了,忘了\0了吧。

3.28

int 声明在全局,自动赋值0,声明在函数内部自动赋值随机

string应该是都赋值了空格。

3.29

对象固定实现,能够随机访问读取速度更快,申请空间固定更加贴近底层。

3.30

数组索引应当从0开始

3.31

#include
#include
#include
using std::cout;
using std::cin;

using std::endl;
int main()
{
    int a[9];
    for (size_t ix = 0; ix <= 10; ++ix)
    {
        a[ix] = ix;
    }
    for(auto c:a)
    {
        cout << c << " ";
    }
    return 0;
}

3.34

p1 往后移动 p2-p1个距离

当p2-p1的距离已经大于数组的总数,超出了范围就会出错。

3.35

#include
int main()
{
    int a[]={1 ,2,3,4,5,67};
    int *beg=std::begin(a);
    int *last=std::end(a);
    for(;beg!=last;++beg)
    {
        *beg=0;
    }
    for(auto c:a)
    {
        std::cout<

3.36

#include
int main()
{
    int a1[]={1,2,3,4,5,67};
    int b1[]={1,2,3,4,5,67};
    int *beg1=std::begin(a1);
    int *last1=std::end(a1);
    int *beg2=std::begin(b1);
    int *last2=std::end(b1);
    while((beg1*beg2)
        {
            std::cout<<"a1>b1";
            break;
        }
        else if(*beg1<*beg2)
        {
            std::cout<<"a1

3.37

遍历输出ca[],输出结果会出现乱码

3.38

存储地址,里面存放的数据是XXX ,变量名是XX,

指针的存储地址里存放的是指向XX的存储地址

根据变量名可以拿到里面存放的数据,也可以根据指针里面存放的存储地址去拿数据,但是你单单的存储地址相加,地址就改变了,可能指向了一个奇怪的地方。也可能是危险的,因为如果你权限很大的话,很有可能通过取地址把不应该修改的东西修改。

#include
#include
using std::cin;
using std::cout;
using std::endl;

int main()
{
   std::string a="hello,world";
   std::string b="hello,china";
   if(a>b)
   {
       cout<<"a>b";
   }
}

3.40

#include
#include
#include
using std::cin;
using std::cout;
using std::endl;

int main()
{
    char a[]="hello,world";
    char b[]="hello,china";
    char  c[50]="";
    strcpy(c,a);
    strcat(c," ");
    strcat(c,b);
    cout<

3.41

#include

using std::cout;
using std::endl;
using int_arry=int[4];
typedef int int_array[4];

int main()
{
    int ia[3][4] = {
         {1,2,3,4}
        ,{5,6,7,8}
        ,{9,10,11,12}};
    for(auto &P: ia)
    {
        for(auto q:P)
        {
            cout<
#include

using std::cout;
using std::endl;
using int_arry=int[4];
typedef int int_array[4];

int main()
{
    int ia[3][4] = {
         {1,2,3,4}
        ,{5,6,7,8}
        ,{9,10,11,12}};
    for (int_arry *p=ia;p!=std::end(ia);++p)
    {
        for(int *q=*p;q!=std::end(*p);++q)
        {
            cout<<*q<

4.11

#include

using std::cin;
using std::cout;

int main()
{
    int a=3,b=2,c=1,d=0;
    if(a>b && b>c && c>d)
        cout<<"right";
}

4.21

#include
#include

using std::cin;
using std::cout;

int main()
{
    std::vector vi={1,2,3,4,56,6,7,8,9};
    for(auto &c:vi)
    {
        c=(c%2==0) ? c : c*2 ; 

    }
    for(auto c:vi)
    {
        cout<

你可能感兴趣的:(C++Primer习题,c++)