一、 选择题
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