手记

信奥测试题

一、 选择题

1 根据你所学过的C++内容,请选出所有正确的选项
A if用于实现循环结构,可以反复执行若干行语句
B <iostream>是C++中的头文件,引入后可以使用cin/cout等输入输出工具
C <cstdio>是C语言的头文件,不能在C++中被引入
D fopen, freopen和ifstream都可以实现文件输入
E if之后必须有一个else与之对应
F for用于实现循环结构,可以反复执行若干语句

2 根据你对C++中数组和字符串的理解,请选出所有正确的选项
A 数组的大小必须一开始指定,一旦指定后不能调整
B 可以用字符数组来表示字符串,字符串以第一个\0作为结尾
C 可以用字符数组来表示字符串,字符串长度就是字符数组的大小
D 数组的大小可以在程序的运行过程中随时调整,并且可以多次调整
E 数组中的元素必须是相同类型

3 选出下列关于C++ string字符串的正确选项
A 运行string s = “hello baby”;之后,s.substr(3, 5);的值为”lo ba”
B 运行string s = “hello baby”;之后,s.substr(3, 5);的值为”llo b”
C 使用string需要包含头文件<cstring>
D 使用string str; 定义的字符串str,可以通过str.length(); 获取字符串的长度
E 使用string需要包含头文件<string>
F 使用string str; 定义的字符串str,可以通过strlen (str); 获取字符串的长度

4 通过char str[110] = “jisuanke”; 定义了一个C风格的字符串,选出相关的正确选项
A strlen(str)的结果为8
B str.size()的结果为8
C scanf(“%s”, str); 能重新读入这个字符串
D scanf(“%s”, &str); 能重新读入这个字符串

5 选出下列关于C++结构体的正确选项
A 通过下面的方法正确的定义了一个结构体
struct Person
{
string name;
int age;
};
B C++中通过,操作能访问结构体的成员变量
C C++一个结构体中的定义的成员变量的类型必须相同
D 通过下面的方法正确的定义了一个结构体
struct Person
{
string name;
int age;
}

6 关于C++多维数组的说法,哪些是正确的
A 通过char s[3][10] = {“jisuanke1”, “jisuanke2”, “jisuanke3”}, 定义了三个C风格的字符串
B 在C++中,多维数组的不同维度的大小可以不同,例如int a[2][3];是一个合法的语句
C C++数组最多只能定义二维

7 下列关于C++中函数的使用的说法,正确的有哪些
A C++中定义的函数可以不声明返回类型
B C++中定义的函数可以没有参数
C C++中定义的函数不可以自己调用自己
D C++中定义的函数的返回值类型为void表示不返回任何值

8 关于C++动态数组的使用,下列哪些是正确的
A C++中动态数组包含在头文件<vector>中
B 动态数组通过size()方法获取当前数组长度
C 动态数组通过push()方法动态地插入一个元素
D 动态数组通过clear()方法清空动态数组

9 关于排序算法,下列哪些是正确的
A sort(a, a + n);表示把a[0], a[1], … a[n – 1]按照从小到大的顺序排列
B sort(a, a + n);表示把a[0], a[1], … a[n]按照从小到大的顺序排列
C sort可以对结构体类型进行排序

10 关于C++中的STL,下列哪些说法是正确的
A map表示映射类型(也被称为字典),我们可以用它来存储“单词->释义”这样的字典数据,并可以很方便地从中查出某个“单词”对应的“释义”
B vector, map, set等常用的结构都属于STL
C STL目前仍然无法在NOIP/NOI竞赛中使用
D STL在信息学竞赛中可以无限制地使用
E set表示集合类型,只能用于存储整数集合

二、编程题

(具体的题目内容请看顶部的链接)

1 求跑道长度

2 今天会下雨吗

3 输出乘法表

4 矩阵旋转

5 打印锯齿矩阵

答案

(一)选择题

1 BDF

2 ABE
对于答案C,可以举个例子:str = “abcd”, s[] = “abcd”
此时字符串str的长度为4,因为字符串长度指的是字符串中有效字符的个数,不包含C风格结束符\0
字符数组s[]长度为5,因为这个是算的数组的长度,也就是所占用的存储空间,当然要包含\0结束符(它也要占用存储空间)
另外,对于指定长度的字符数组c[10]=”abcd”,长度为10,因为你显示指定了字符数组的长度,所占内存当然就是10。它的存储空间是连续的,也就是说,10个字符空间中,前面五个分别是a,b,c,d和结束符\0,后面五个全部都是0(被初始化了)。
所以,C答案不对。

3 ADE
<string>是C++特化的字符容器,内含string类。
<cstring>是C++为兼容C提供的<string.h>的C++版本。
strlen是C语言中用来求字符串长度的函数。

4 AC
(1)字符数组不能使用size()函数,必须先转化成string对象,如下面的程序所示。
(2)整形、字符型、浮点型,用scanf都需要加取地址符“&”,但是字符串的名称本身就代表字符串的首地址,所以不用加取地址符。

#include <iostream>#include <cstring>using namespace std;int main(){    char str[110] = "jisuanke";    cout << strlen(str) << endl;    string s = str;    cout << s.size() << endl;    return 0;
}

运行结果:

8
8

5 AB
C++中struct与class几乎相同。用struct定义的类与用class定义的类的差别是用struct定义的类中不包含成员访问限定符public、protected和private。用struct定义的类的所有成员默认为公有的,而用class定义的类的成员则默认为是私有的。
类和结构体都必须以分号结尾,所以A对D错。
因为结构体中的成员都是public的,所以可以通过. 来访问,B对。
数组的各个元素的类型必须相同,结构体的各个成员的类型不需要相同,比如名字通常是字符串,年龄通常是整型。C错。

6 AB
a[2][3] = {{1, 2, 3}, {4, 5, 6}}这是一个二维数组,包含了a[0]和a[1]。a[0] = {1,2,3}, a[1] = {4,5,6}。或者:a[0][0] = 1, a[0][1] = 2, a[0][2] = 3,a[1][0] = 4, a[1][1] = 5, a[1][2] = 6。所以B正确
C++数组能定义成无数维的,但平时使用最好不要超过3维,否则会很复杂很难理解。C错。

7 BD
C++中的函数一定要有返回类型,如果不需要返回值就返回void。void表示空类型。A错D对。
C++的函数可以没有参数,比如

void sayHi(){    cout << “Hi” << endl;
}

多数编程语言,包括C, C++,Java,Python等,函数可以调用自身,这就是递归。

8 ABD
vector如果想在指定位置插入元素,使用insert方法,如果想在末端插入元素,使用push_back方法。vector没有push方法。

9 AC
对结构体进行排序的代码如下:

#include<iostream>#include<vector>#include<algorithm>using namespace std;struct student{
    string name;    int age;
};bool comp(const student &a,const student &b){    return a.age < b.age;
}int main(){
    student s1,s2,s3,s4;
    s1.name = "Liu Yi";
    s1.age = 20;
    s2.name = "Chen Er";
    s2.age = 10;
    s3.name = "Zhang San";
    s3.age = 40;
    s4.name = "Li Si";
    s4.age = 30;    vector<student>v;
    v.push_back(s1);
    v.push_back(s2);
    v.push_back(s3);
    v.push_back(s4);

    sort(v.begin(),v.end(),comp);    for(int i = 0; i < 4; i++)
    {        cout << v[i].name << " " << v[i].age << endl;
    }

    system("pause");    return 0;
}

运行结果:

Chen Er 10
Liu Yi 20
Li Si 30
Zhang San 40
请按任意键继续. . .

10 ABC
STL即Standard Library的缩写,C++ STL就是C++的标准库。

#include<iostream>#include<map>using namespace std;int main(){    map<int, string> m;
    m.insert(make_pair(1, "Liu Yi"));
    m.insert(make_pair(2, "Chen Er"));    cout << m[1] << endl;    cout << m[2] << endl;    return 0;
}

运行结果:

Liu Yi
Chen Er
#include<iostream>#include<set>using namespace std;int main(){    set<char> s;
    s.insert('c');
    s.insert('a');
    s.insert('b');
    s.insert('a');
    s.insert('b');    set<char>::iterator it;    for(it = s.begin(); it != s.end(); it++)
    {        cout << *it << ' ';
    }    return 0;
}

运行结果:

a b c

这里可以看出,set中不允许有重复的元素,并且元素顺序与插入顺序无关,默认会按正序(升序)排列。
另外,vector, set, map都有insert方法,但只有vector有push_back方法。

(二)编程 题

1

#include <iostream>#include <cstdio>using namespace std;int main(){    float v, a;    scanf("%f%f", &v, &a);    printf("%.3f", v * v / (2 * a));    return 0;
}

2

#include<cstdio>#include<cmath>using namespace std;int main(){    float h;    scanf("%f", &h)    if(abs(h - 55.4) <= 0.000002)
    {        printf("NO");
    }    else if(h > 55.4)
    {         printf("YES");
    }    else
    {        printf("NO");
    }    
    return 0;
}

3

#include <iostream>using namespace std;int main(){    int n;    cin >> n;    for(int r = 1; r <= n; r++)
    {        for(int c = r; c <= n; c++)
        {            cout << r << '*' << c << '=' << r * c ;            if(c != n)
            {                cout << '\t';
            }
        }        cout << endl;
    }    return 0;
}

4

#include <iostream>#include <memory.h>using namespace std;int main(){    int n, m;    cin >> n >> m;    int a[n][m];    memset(a, 0, sizeof(a));    for(int i = 0; i < n; i++)     // m行
    {        for(int j = 0; j < m; j++) // n列
        {            cin >> a[i][j];
        }
    }    int b[m][n];    memset(b, 0, sizeof(b));    for(int i = 0; i < m; i++)
    {        for(int j = 0; j < n; j++)
        {            // 以样例中的数据为例:
            // b[0][0] = a[2][0], b[0][1] = a[1][0], b[0][2] = a[0][0]
            // b[1][0] = a[2][1], b[1][1] = a[1][1], b[1][2] = a[0][1]
            // b[2][0] = a[2][2], b[2][1] = a[1][2], b[2][2] = a[0][2]
            // b[3][0] = a[2][3], b[3][1] = a[1][3], b[3][2] = a[0][3]
            // 由上面四行,得b[i][j] = a[n - 1 - j][i];
            b[i][j] = a[n - 1 - j][i];            cout << b[i][j];            if(j != n - 1)
            {                cout << ' ';    //根据题意,最右边的数的右侧不需要空格
            }
        }        cout << endl;
    }    return 0;
}

5

#include <iostream>#include <vector>using namespace std;int main(){    int n, m;    cin >> n >> m;    vector<vector<int> > v(n);    for(int i = 0; i < n; i++)
    {        vector<int> vrow;
        v.push_back(vrow);
    }    for(int i = 0; i < m; i++)
    {       int x, y;       cin >> x >> y;
       v[x - 1].push_back(y);
    }    for(int i = 0; i < n; i++)
    {        vector<int> vrow = v[i];        vector<int>::iterator it;        for(it = vrow.begin(); it != vrow.end(); it++)
        {            cout << *it;            if(it != vrow.end() - 1) //  最右的元素,右侧不需要加空格
            {                cout << ' ';
            }
        }        cout << endl;
    }    return 0;
}



作者:海天一树X
链接:https://www.jianshu.com/p/64ed20025881


0人推荐
随时随地看视频
慕课网APP