信奥测试题

题目来源

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


加入少儿信息学奥赛学习QQ群请扫左侧二维码,关注微信公众号请扫右侧二维码


QQ群和公众号.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容