C++primer习题集(第三章)

3.1 使用恰当的using语句声明重做1.4.1节(第11页)与2.6.2节(第67面)的练习。

  这个比较麻烦,而且也比较简单,请自行解决。

 


 

3.2 编写一段程序,从标准输入中一次读取一整行,然后修改该程序使其一次读入一个词。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string line;
    cout<<"每当你输入一串字符,并enter,他会读取这一行并输出\n";
    while(getline(cin,line))
    {
        cout<<line<<endl;
    }

    return 0;
}
//修改后的代码
#include<iostream> #include<string> using namespace std; int main() { char c; cout<<"每当你输入一个/一串字符,并enter,他会输出该个/串字符\n"; while(c=getchar()) { cout<<c<<endl; } return 0; }

PS:看错了,修改后是读词(以空白为分割),而不是读字符,应该如下所示:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string line;
    while(cin>>line)
    {
        cout<<line<<endl;
    }

    return 0;
}

 


 

3.3 说明string类的输入运算符和getline函数是分别如何处理空白字符的。

  string

    string的输入运算符(>>)从输入流中读取字符串的时候,会自动忽略前面的空白符(空格,tab,换行),然后读取连续的非空白字符,并在后续遇到的第一个空白字符处终止。

    例如:cin>>line输入“    hello   world!   ”时,string读取只会读取到“hello”,而world会留到等待下次读取输入流的时候才会出现,此时保存的line为“hello”。

  getline

    getline每次读取一行字符串,并将之保存在string中,这样的获得的字符串是可以包含空格的,可以使用3.2中的程序进行验证。

    例如,getline(cin,line)输入“    hello   world!   ”的时候,保存的line是“    hello   world!   ”。

 


 

3.4 编写一段程序读入两个字符串,比较其是否相等并输出结果。如果不相等,输出比较大的那个字符串。改写上述程序,比较两个输入的字符串是否等长,如果不等长,输入长度较大的那个字符串。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str1;
    string str2;
    cout<<"请输入两个字符串(以空格或者换行结尾:\n";
    cin>>str1>>str2;
    if(str1==str2)
        cout<<"equal!"<<endl;
    else if(str1>str2)
        cout<<str1<<"\t\t这是更大的字符串"<<endl;
    else
        cout<<str2<<"\t\t这是更大的字符串"<<endl;
    return 0;
}
请输入两个字符串(以空格或者换行结尾:
1234
2234464646
2234464646              这是更大的字符串
//修改后
#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str1;
    string str2;
    cout<<"请输入两个字符串(以空格或者换行结尾:\n";
    cin>>str1>>str2;
    if(str1.size()==str2.size())
        cout<<"equal!"<<endl;
    else if(str1.size()>str2.size())
        cout<<str1<<"\t\t这是更长的字符串"<<endl;
    else
        cout<<str2<<"\t\t这是更长的字符串"<<endl;
    return 0;
}
请输入两个字符串(以空格或者换行结尾:
2345
123
2345            这是更长的字符串

  


 

3.5 编写一段程序从标准输入中读入多个字符串将他们拼接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔起来。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s;
    string sum;
    cout<<"请输入一系列字符串,用ctrl+C结束输入:"<<endl;
    while(cin>>s)
        sum=sum+s;
    cout<<sum;

    return 0;
}
#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s;
    string sum;
    cout<<"请输入一系列字符串,用ctrl+C结束输入:"<<endl;
    while(cin>>s)
    {
        sum=sum+s;
        sum=sum+" ";
    }

    cout<<sum;

    return 0;
}

 


 

3.6 编写一段程序,使用范围for语句将字符串内的所有字符用X替代。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str="hello,world!";
    for (auto &c : str) c = 'X';
    cout<<str<<endl;

    return 0;
}

 


 

3.7 就上一题完成的程序而言,如果将循环控制的变量设置为char将发生什么?先估计一下结果,然后实际编程进行验证。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str="hello,world!";
    for (char &c : str) c = 'X';
    cout<<str<<endl;

    return 0;
}

//实际上并无区别,auto自动转换为char

 


 

3.8 分别用while循环和传统for循环重写第一题的程序,你觉得哪种形式更好呢?为什么?

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str="hello,world!";
    decltype(str.size()) i = 0;

    //while
    while(i<str.size())
        str[i++]='X';
    cout<<str<<endl;
    //for
    for(i=0;i<str.size();i++)
        str[i]='Y';
    cout<<str<<endl;

    return 0;
}

//范围for比较简单,不需要得到字符串的长度

 


 

3.9 下面的程序有何作用?它合法吗?如果不合法?为什么?

string s;
cout << s[0] << endl;

//合法,string默认为'\0',是存在一个字符的,如果改为s[1]就不合法了。

 


 

3.10 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str="hello,world!";
    string str2;
    for(auto c:str)
        if(!ispunct(c))
            str2=str2+c;
    cout<<str2<<endl;

    return 0;
}

 


 

3.11 下面的范围for语句合法吗?如果合法,c的类型是什么?

const string s = "Keep out!";
for(auto &c : s){ /* ... */ }

//此处c是一个const char&,只可读变量不可赋值
//所以当不改变c的值时,是合法的,否则就是不合法的。

 


 

3.12 下列vector对象的定义有不正确的吗?如果有,请指正出来。正确的描述其结果,错误的说明其原因。

    vector<vector<int>> ivec;             // 合法,创建了一个元素为vector的vector对象,不过似乎过去要加个空格(P87
    vector<string> svec = ivec;           // 不合法,类型不一致,改为={"ivce"};
    vector<string> svec(10, "null");      // 合法, 有10个string: "null".

 


 

3.13 下列的vector对象各自包含多少元素?这些元素的值分别是什么?

    vector<int> v1;                       // 个数:0   没有值
    vector<int> v2(10);                   // 个数:10  默认初始值
    vector<int> v3(10, 42);               // 个数:10  10个42
    vector<int> v4{10};                   // 个数:1   10
    vector<int> v5{10, 42};               // 个数:2   10,42
    vector<string> v6{10};                // 个数:10  默认初始值
    vector<string> v7{10, "hi"};          // 个数:10  10个"hi"

 


 

3.14 编写一段程序,用cin读入一组整数并把他们保存在一个vector对象中。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    int x;
    vector<int> v;
    cout<<"输入一系列数字,用ctrl+C终止输入,我们会把这些数字加入到容器中并输出其size:"<<endl;
    while(cin>>x)
        v.push_back(x);
    cout<<v.size()<<endl;
    return 0;
}

 


 

3.15 改写上面的程序,不过这次是字符串。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    string s;
    vector<string> v;
    cout<<"输入一系列字符串,用ctrl+C终止输入,我会将其加入到容器中并输出其size:"<<endl;
    while(cin>>s)
        v.push_back(s);
    cout<<v.size()<<endl;
    return 0;
}

 


 

3.16 编写一段程序,把3.13中vector对象的容积和具体内容输出。检验你之前的回答是否正确,不会的话好好学。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    vector<int> v1;                       // 个数:0   没有值
    if(v1.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v1.size()<<endl;
        for(auto i:v1)
            cout<<i<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v2(10);                   // 个数:10  默认初始值
    if(v2.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v2.size()<<endl;
        for(auto i:v2)
            cout<<i<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v3(10, 42);               // 个数:10  10个42
    if(v3.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v3.size()<<endl;
        for(auto i:v3)
            cout<<i<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v4{10};                   // 个数:1   10
    if(v4.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v4.size()<<endl;
        for(auto i:v4)
            cout<<i<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v5{10, 42};               // 个数:2   10,42
    if(v5.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v5.size()<<endl;
        for(auto i:v5)
            cout<<i<<"\t";
        cout<<endl<<endl;
    }

    vector<string> v6{10};                // 个数:10  默认初始值
    if(v6.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v6.size()<<endl;
        for(auto s:v6)
            cout<<s<<"\t";
        cout<<endl<<endl;
    }

    vector<string> v7{10, "hi"};          // 个数:10  10个"hi"
    if(v7.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v7.size()<<endl;
        for(auto s:v7)
            cout<<s<<"\t";
        cout<<endl<<endl;
    }

    return 0;
}
NULL!

size:10
0       0       0       0       0       0       0       0       0       0

size:10
42      42      42      42      42      42      42      42      42      42

size:1
10

size:2
10      42

size:10


size:10
hi      hi      hi      hi      hi      hi      hi      hi      hi      hi

 


 

3.17 从cin读入一组词并把他们存入到一个vector对象,然后设法把所有的词都改成大写,输出改变后的结果,每个词一行。

#include<iostream>
#include<string>
#include <algorithm>
#include<vector>
using namespace std;

int main()
{
    vector<string> v;
    string s;
    cout<<"输入一系列字符串,用ctrl+C终止:"<<endl;
    while(cin>>s)
    {
        v.push_back(s);
    }
    for(auto &str:v)
    {
        transform(str.begin(),str.end(),str.begin(),::toupper);
        cout<<str<<endl;
    }


    return 0;
}

 


 

3.18 下面的程序合法吗?如果不合法如何修改?

    vector<int> ivec;
    ivec[0] = 42;

  不合法,vector为空,没有第一个元素,无法给它赋值。

    //直接给他初始化一个0
    vector<int> ivec={0};
    ivec[0] = 42;

 


 

3.19 如果想定义含有10个元素的vector对象,所有元素值都是42,请你列举三种不同的实现方式。哪种更好,为什么?

    vector<int> ivec1(10,42);

    vector<int> ivec2={42,42,42,42,42,42,42,42,42,42};
    
    vector<int> ivec3;
    for(int i=0;i<10;i++)
        ivec3.push_back(42);

 


 

3.20 读入一组整数,并把他们存入到一组vector对象,将每对相邻整数的和输出。然后修改程序,这次先输出第一个和最后一个的和,然后输出第二个和倒数第二个的和,以此推类。

//相邻数字相加
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    int x;
    vector<int> v;
    while(cin>>x)
        v.push_back(x);

    int num=v.size();
    if(num==0)
    {
        cout<<"no number in vector!"<<endl;
    }
    else if(num==1)
    {
        cout<<v[0];
    }
    else{
        for(decltype(v.size()) i=0;i<num-1;i++)
            cout<<v[i]+v[i+1]<<endl;
    }



    return 0;
}
//首尾数字相加
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    int x;
    vector<int> v;
    while(cin>>x)
        v.push_back(x);

    int num=v.size();
    if(num==0)
    {
        cout<<"no number in vector!"<<endl;
    }
    else if(num==1)
    {
        cout<<v[0];
    }
    else{
        for(decltype(v.size()) i=0;i<num-1;i++)
            cout<<v[i]+v[num-1-i]<<endl;
    }



    return 0;
}

 


 

3.21 请使用迭代器重做3.3.3节的第一个练习(3.16)。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    vector<int> v1;                       // 个数:0   没有值
    if(v1.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v1.size()<<endl;
        for(auto it=v1.begin();it!=v1.end();++it)
            cout<<*it<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v2(10);                   // 个数:10  默认初始值
    if(v2.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v2.size()<<endl;
        for(auto it=v2.begin();it!=v2.end();++it)
            cout<<*it<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v3(10, 42);               // 个数:10  10个42
    if(v3.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v3.size()<<endl;
        for(auto it=v3.begin();it!=v3.end();++it)
            cout<<*it<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v4{10};                   // 个数:1   10
    if(v4.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v4.size()<<endl;
        for(auto it=v4.begin();it!=v4.end();++it)
            cout<<*it<<"\t";
        cout<<endl<<endl;
    }

    vector<int> v5{10, 42};               // 个数:2   10,42
    if(v5.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v5.size()<<endl;
        for(auto it=v5.begin();it!=v5.end();++it)
            cout<<*it<<"\t";
        cout<<endl<<endl;
    }

    vector<string> v6{10};                // 个数:10  默认初始值
    if(v6.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v6.size()<<endl;
        for(auto it=v6.begin();it!=v6.end();++it)
            cout<<*it<<"\t";
        cout<<endl<<endl;
    }

    vector<string> v7{10, "hi"};          // 个数:10  10个"hi"
    if(v7.empty())
        cout<<"NULL!"<<endl<<endl;
    else{
        cout<<"size:"<<v7.size()<<endl;
        for(auto s:v7)
            cout<<s<<"\t";
        cout<<endl<<endl;
    }

    return 0;
}

 


 

3.22 修改之前那个输出text第一段的程序,首先把text的第一段全部改成大写形式,然后输出它。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    vector<string> text;
    for(string line;getline(cin,line);) text.push_back(line);
    for(auto it=text.begin();it!=text.end()&&!it->empty();it++)
    {
        for(auto &c:*it) c=toupper(c);
        for(auto c:*it)
        {
            cout<<c;
            if(c==' ')
                break;
        }
        cout<<endl;
    }

    return 0;
}

 


 

3.23 编写一段程序,创建一个含有10个整数的vector对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出vector对象的内容,检验程序是否正确。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    vector<int> text;
    for(int i=0;i<10;i++) text.push_back(i+1);
    for(auto it=text.begin();it!=text.end();it++)
    {
        *it=(*it)*2;
        cout<<*it<<endl;
    }

    return 0;
}

 


 

3.24 请使用迭代器重做3.3.3节的最后一个练习(3.20)。

//相邻数字相加
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    int x;
    vector<int> v;
    while(cin>>x)
        v.push_back(x);

    int num=v.size();
    if(num==0)
    {
        cout<<"no number in vector!"<<endl;
    }
    else if(num==1)
    {
        cout<<v[0];
    }
    else{
        for(auto it=v.begin();it!=v.end();it++)
            cout<<*it+*(it+1)<<endl;
    }

    return 0;
}
//首尾数字相加
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    int x;
    vector<int> v;
    while(cin>>x)
        v.push_back(x);

    int num=v.size();
    if(num==0)
    {
        cout<<"no number in vector!"<<endl;
    }
    else if(num==1)
    {
        cout<<v[0];
    }
    else{
        for(auto beg=v.begin(),en = v.end()-1;beg!=v.end();beg++,en--)
            cout<<*beg+*en<<endl;
    }

    return 0;
}

 


 

3.25 3.3.3节划分分数段的程序是使用下标运算符实现的,请利用迭代器改写该程序实现完全相同的功能。

//首尾数字相加
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
    vector<int> grade(10);
    int score;
    while(cin>>score)
        if(score<100) ++(*(grade.begin()+score/10));
        else if(score==100) ++(*(grade.end()-1));
    for(auto i:grade) cout<<i<<endl;
    return 0;
}

 


 

3.26 在100页的二分搜索程序中,为什么用的是 mid = beg + (end - beg) / 2, 而非 mid = (beg + end) / 2 ; ?

一种说法是两个迭代器之间只能进行相减操作,代表他们之间的距离,没有迭代器的相加操作。

另一种说法是,为了避免两个很大的数加法导致的溢出。

 


 

3.27 假设txt_size 是一个无参函数,它的返回值是int。请回答下列哪个定义是非法的,为什么?

unsigned buf_size = 1024;
 
int ia[buf_size];                  
int ia[4 * 7 - 14];                
int ia[txt_size()];                
char st[11] = "fundamental";      
#include<iostream>
#include<string>
using namespace std;
int txt_size()
{
    printf("a test\n");
    return 1;
}
int main()
{
    unsigned buf_size = 1024;

    int ia1[buf_size]={0};                   // 合法
    int ia2[4 * 7 - 14]={0};                 // 合法
    int ia3[txt_size()]={0};                 // 合法
    //char st[11] = "fundamental";           // 不合法, 这个字符串的大小是12

    cout<<ia1[0]<<"\t"<<ia2[0]<<"\t"<<ia3[0]<<endl;
    return 0;
}

 


 

3.28 下列数组中元素的值是什么?

#include<iostream>
#include<string>
using namespace std;
string sa[10];
int ia[10];
int main() {
    string sa2[10];
    int ia2[10];
    for(int i=0;i<10;i++)
        cout<<sa[i]<<"\t"<<ia[i]<<"\t"<<sa2[i]<<"\t"<<ia2[i]<<endl;
    return 0;
}

/*
结果如下:
int的全局变量会默认初始化为0,但是局部变量不会初始化,值是未知的
string的全局和局部都会默认初始化为空
        0               16777234
        0               1878278144
        0               17
        0               6422044
        0               2
        0               6422056
        0               1878143121
        0               1878278344
        0               -2
        0               12

*/

 


 

3.29 相比于vector 来说,数组有哪些缺点,请例举一些。

  1. 数组的维度必须是常量表达式,即在初始化是必须给出。整个程序的运行过程中也不会改变。
  2. 数组不允许拷贝和赋值,即不能将数组的内容拷贝到其他数组作为其初始值,但是vector可以。
  3. 数组使用的过程,容易产生数组越界,而相对于vector则可以使用较多的机制来控制,例如使用迭代器


 

3.30 指出下面代码中的索引错误。

    constexpr size_t array_size = 10;
    int ia[array_size];
    for (size_t ix = 1; ix <= array_size; ++ix)   //数组下标应该是0--(array_size-1),没有ia[10]
        ia[ix] = ix;

 


 

3.31 编写一段程序,定义一个含有10个int的数组,令每个元素的值就是其下标值。

#include<iostream>
#include<string>
using namespace std;

int main() {
    int a[10];
    for(int i=0;i<10;i++)
        a[i]=i;
        
    return 0;
}

 


 

3.32 将上一题刚刚创建的数组拷贝给另一数组。利用vector重写程序,实现类似的功能。

#include<iostream>
#include<string>
using namespace std;

int main() {
    int a[10];
    for(int i=0;i<10;i++)
        a[i]=i;
    int b[10];
    for(int i=0;i<10;i++)
        b[i]=a[i];
    return 0;
}
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    // 使用vector
    vector<int> v(10);
    for (auto it = v.begin(); it!=v.end();++it)
        *it=it-v.begin();
 
    vector<int> v2(v);


    return 0;
}

 


 

3.33 对于104页的程序来说,如果不初始化scores将会发生什么?

  如果不初始化scores,那数组里面的值都是未知的,这个程序都没意义了。

 


 

3.34 假定p1 和 p2 都指向同一个数组中的元素,则下面程序的功能是什么?什么情况下该程序是非法的?

p1+=p2-p1;

这句代码,实际上是将p2指针所指的地址给到p1,因此只要p2合法不溢出,就没问题(这里p1只要不去访问,都ok,看下面代码)

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int *p1=a+20;
    int*p2=a+3;
    p1+=p2-p1;
    cout<<*p1;

    return 0;
}

/*最后可以编译成功并输出 4 */

 


 

3.35 编写一段程序,利用指针将数组中的元素置为0。

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int *p1=begin(a);
    int*p2=end(a);
    while(p1!=p2)
    {
        *p1=0;
        p++;
    }
    for(int i=0;i<10;i++)
        cout<<a[i]<<endl;

    return 0;
}

 


 

3.36 编写一段程序,比较两个数组是否相等。再写一段程序,比较两个vector对象是否相等。

//数组比较
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int b[10]={1,2,3,4,5,6,7,8,9,100};
    int *pa1=begin(a);
    int*pa2=end(a);
    int *pb1=begin(b);
    int*pb2=end(b);
    while(pa1!=pa2)
    {
        if(*pa1!=*pb1){
            cout<<"不一致!"<<endl;
            break;
        }
        pa1++;pb1++;

    }
    if(pa1==pa2)
        cout<<"一致"<<endl;

    return 0;
}
//vector比较
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    vector<int> a={1,2,3,4,5,6,7,8,9,10};
    vector<int> b={1,2,3,4,5,6,7,8,9,10};
    if(a==b)
        cout<<"一致!"<<endl;
    else
        cout<<"不一致!"<<endl;
    return 0;
}

 


 

3.37 下面的程序是何含义,程序的输出结果是什么?

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    const char ca[]={'h','e','l','l','o'};
    const char *cp=ca;
    while(*cp){
        cout<<*cp<<endl;
        ++cp;
    }
    return 0;
}



/*
作用是打印ca里的所有字符
*/

 


 

3.38 在本节中我们提到,将两个指针相加不但是非法的,而且也没有什么意义。请问为什么两个指针相加没有意义?

  指针在进行加法操作时,实际上是对指针进行偏移。指针的值表示内存地址,而指针的加法操作会根据指针类型的大小将指针的值增加相应的偏移量。

  当两个指针进行相加时,其结果并不是它们的和,而是将第一个指针的值增加了第二个指针的值所表示的偏移量。这样的结果并没有实际意义,因为它并不能代表一个有效的内存地址或有效的数据。

   此外,两个指针相加也可能导致指针越界或访问无效的内存区域,这是非法的操作。因此,两个指针相加既没有实际意义,也是不被允许的操作。

 


 

3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {
    string s1="hello!";
    string s2="hi!";
    cout<<(s1>s2?1:0)<<endl;

    char *c1="morning";
    char *c2="night";
    auto jud=strcmp(c1,c2);
    cout<<jud<<endl;
}

 


 

3.40 编写一段程序,定义两个字符数组并用字符串字面值初始化它们;接着再定义一个字符数组存放前面两个数组连接后的结果。使用strcpy和strcat把前两个数组的内容拷贝到第三个数组当中。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {
    char *c1="morning";
    char *c2="night";

    size_t new_size = strlen(c1) + strlen(" ") + strlen(c2) + 1;
    char *c3 = new char[new_size];

    strcpy(c3,c1);  //这里不能是strcat
    strcat(c3," ");
    strcat(c3,c2);
    cout<<c3<<endl;

    return 0;
}

 


 

3.41 编写一段程序,用整型数组初始化一个vector对象。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {
    int num[]={1,2,3,4,5,6};

    vector<int> iv(begin(num),end(num));

    for(auto i:iv) cout<<i<<endl;

    return 0;
}

 


 

3.42 编写一个程序,将含有整数元素的vector对象拷贝给一个整型数组。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {


    vector<int> iv{1,2,3,4,5,6};
    int num[6];
    for(auto *i=begin(num);i!=end(num);i++)
    {
        *i=iv[i-begin(num)];
    }
    for(int i=0;i<6;i++)
        cout<<num[i]<<endl;

    return 0;
}

 


 

3.43 编写3个不同版本的程序,令其均能输出ia的元素。版本1使用范围for语句管理迭代过程;版本2和版本3都使用普通for语句,其中版本2要求使用下标运算符,版本3要求使用指针。此外,在所有3个版本的程序中都要直接写出数据类型,而不能使用类型别名、auto关键字和decltype关键字。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {
    int ia[3][4]={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };

    //范围for
    for(const int (&row)[4]:ia){
        for(int col:row){
            cout<<col<<"\t";
        }
        cout<<endl;
    }
    //for,下标
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
            cout<<ia[i][j]<<"\t";
        cout<<endl;
    }
    //for,指针
    for(int(*p)[4]=ia;p!=ia+3;p++){
        for(int *q=*p;q!=*p+4;q++)
            cout<<*q<<"\t";
        cout<<endl;
    }
    return 0;
}

 


 

3.44 改写上一个练习中的程序,使用类型别名来代替循环控制变量的类型。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {
    int ia[3][4]={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };
    using int_arr=int[4];
    
    //范围for
    for(int_arr &row:ia){
        for(int col:row){
            cout<<col<<"\t";
        }
        cout<<endl;
    }
    //for,下标
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
            cout<<ia[i][j]<<"\t";
        cout<<endl;
    }
    //for,指针
    for(int_arr *p=ia;p!=ia+3;p++){
        for(int *q=*p;q!=*p+4;q++)
            cout<<*q<<"\t";
        cout<<endl;
    }
    return 0;
}

 


 

3.45 再一次改写程序,这次使用auto关键字。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;

int main() {
    int ia[3][4]={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };
    using int_arr=int[4];

    //范围for
    for(auto &row:ia){
        for(auto col:row){
            cout<<col<<"\t";
        }
        cout<<endl;
    }
    //for,下标
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
            cout<<ia[i][j]<<"\t";
        cout<<endl;
    }
    //for,指针
    for(auto *p=ia;p!=ia+3;p++){
        for(auto *q=*p;q!=*p+4;q++)
            cout<<*q<<"\t";
        cout<<endl;
    }
    return 0;
}

 


 

完工!!!!!!撒花 !!!

posted @ 2023-08-03 14:05  para_dise  阅读(58)  评论(0)    收藏  举报