题目来源
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群请扫左侧二维码,关注微信公众号请扫右侧二维码