信奥测试题

作者: 海天一树X | 来源:发表于2018-07-05 19:41 被阅读34次

    题目来源

    https://www.jisuanke.com/course/1171?from=syllabus

    一、 选择题

    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;
    }
    

    TopCoder & Codeforces & AtCoder交流QQ群:648202993
    更多内容请关注微信公众号


    wechat_public_header.jpg

    相关文章

      网友评论

        本文标题:信奥测试题

        本文链接:https://www.haomeiwen.com/subject/ywqmuftx.html