#C1101. 府学集训试题1
府学集训试题1
本卷共 50 题:单项选择题 30 题(每题 2 分)、多项选择题 10 题(每题 3 分)、判断题 10 题(每题 1 分),满分 100 分。
一、单项选择题(每题 2 分)
- 小李编写数据交换工具,结合指针与引用实现交换逻辑,运行代码输出结果是?
void swapNum(int *m, int &n) {
int tmp = *m;
*m = n;
n = tmp;
}
int main() {
int a = 350, b = 120;
swapNum(&a, b);
cout << a << " " << b;
return 0;
}
{{ select(1) }}
- 350 120
- 120 350
- 350 350
- 编译报错
- 自定义函数计算四门学科总分,横线处正确调用语句是?
int getTotal(int x, int y, int z, int k) {
return x + y + z + k;
}
int main() {
int phy = 82, chem = 91, bio = 78, geo = 86;
int sum = __________;
cout << sum;
return 0;
}
{{ select(2) }}
- getTotal
- getTotal(phy, chem, bio, geo)
- getTotal(int phy, chem, bio, geo)
- getTotal(x,y,z,k)
- 运行下方代码,控制台打印输出数值为?
int addTwo(int num) {
return num + 2;
}
int main() {
int b = 8;
cout << addTwo(b) + addTwo(4);
return 0;
}
{{ select(3) }}
- 12
- 14
- 16
- 18
- 针对下列代码描述正确的是?
void drawLine() {
int lineCnt = 18;
}
int main() {
cout << lineCnt;
return 0;
}
{{ select(4) }}
- 程序输出18
- 编译正常,输出随机垃圾值
- 编译失败,lineCnt仅在drawLine函数内有效
- 编译失败,cout不能输出整型变量
- 角色升级程序,执行代码后 *ptr 最终数值是?
int currLv = 8, nextLv = 11;
int *ptr = &currLv;
*ptr = *ptr + 3;
ptr = &nextLv;
{{ select(5) }}
- 8
- 11
- currLv的内存地址
- nextLv的内存地址
- 沙盘地图二维数组
int grid[5][4];,单个 int 占 4 字节,grid 首地址 0x2000,&grid + 1地址为?
{{ select(6) }}
- 0x204c
- 0x205c
- 0x2050
- 0x2058
- 执行代码后变量 res 的值为?
int arr[] = {14, 22, 38, 46, 52};
int *p = arr + 2;
int res = *(p - 1) + *(p + 1);
{{ select(7) }}
- 68
- 72
- 60
- 84
- 4 组学员、每组 5 人成绩存入二维数组 grade,
grade[2][1]数值是?
int grade[4][5] = {
{62,64,66,68,70},
{71,73,75,77,79},
{80,83,86,89,92},
{91,93,95,97,99}
};
{{ select(8) }}
- 73
- 83
- 80
- 93
- 结构体 Weapon 存储武器信息,哪种写法编译报错?
struct Weapon {
string name;
int atk;
};
{{ select(9) }}
Weapon w = {"Bow", 160};Weapon w; w.name = "Bow"; w.atk = 160;Weapon w = new Weapon{"Bow", 160};Weapon *p = new Weapon{"Bow", 160};
- 运行代码,控制台输出内容是?
struct Magazine {
string name;
int page;
};
int main() {
Magazine mag[2] = {{"Game", 96}, {"Life", 132}};
cout << mag[1].name;
return 0;
}
{{ select(10) }}
- Game
- Life
- 96
- 132
- 商品热度排序,热度相同需保留原始先后顺序,下列说法错误的是?
{{ select(11) }}
- 冒泡排序稳定,仅左大于右时交换元素
- 插入排序稳定,相等元素不向前交换
- 选择排序稳定,每次提取最小值放到数组前端
- 排序稳定指等值元素排序后相对顺序不变
- 爬楼梯递推规则:g(n)=g(n-1)+g(n-2),g(1)=2,g(2)=3,调用 step(5) 结果为?
int step(int n) {
if(n <= 2) return n == 1 ? 2 : 3;
int a=2,b=3,tmp;
for(int i=3;i<=n;i++){
tmp = a + b;
a = b;
b = tmp;
}
return b;
}
{{ select(12) }}
- 10
- 13
- 8
- 21
- 除法异常容错程序,运行后输出内容为?
try {
int m = 40, k = 0;
if(k == 0) throw "Divide Fault";
cout << m / k;
} catch(int err) {
cout << "Num Err:" << err;
} catch(const char* msg) {
cout << "Catch:" << msg;
}
{{ select(13) }}
- 0
- Num Err:0
- Catch:Divide Fault
- 程序直接崩溃
- 下方代码实现升序排序,该排序算法是?
void sortArr(float arr[], int len) {
for(int i=0; i<len-1; i++){
int minIdx = i;
for(int j=i+1; j<len; j++){
if(arr[j] < arr[minIdx]) minIdx = j;
}
float t = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = t;
}
}
{{ select(14) }}
- 冒泡排序
- 插入排序
- 选择排序
- 归并排序
- 读取文件 info.txt,文件内容
Class 16,执行代码输出结果?
ifstream fin("info.txt");
string s; int num;
fin >> s >> num;
cout << s.size() * num;
{{ select(15) }}
- 64
- 80
- 16
- 72
- 已知定义
int arr[5][4];,若数组首地址为 0x1000,int 占 4 字节,则表达式arr + 1对应的内存地址是?
{{ select(16) }}
- 0x1004
- 0x1010
- 0x1014
- 0x1080
- 关于 C++ 值传递、指针传递、引用传递,下列说法正确的是
{{ select(17) }}
- 值传递时,函数形参是实参的独立副本,修改形参不会影响实参
- 指针传递时,函数内无法通过指针修改外部变量的值
- 引用传递时,引用变量在定义之后可以重新绑定到另一个变量
- 值传递与引用传递的运行效率完全相同,没有任何区别
- 下列关于冒泡、选择、插入排序稳定性描述,正确的是?
{{ select(18) }}
- 选择排序是稳定排序
- 冒泡排序相邻元素相等时不交换,则可以保证稳定
- 插入排序一定不稳定
- 稳定排序执行速度一定快于不稳定排序
- 有递推公式 f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2),采用普通递归实现该函数,其时间复杂度接近?
{{ select(19) }}
- O(n)
- O(n^2)
- O(2^n)
- O(log n)
- C++ 结构体定义,以下代码能够正常编译运行的是?
struct Student {
int id;
string name;
};
{{ select(20) }}
Student s = {"1001"};Student s; s.name = "Tom";Student s(); s.id = 1;Student s = {name:"Lily"}
- 执行双层循环代码:
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cout << "*";
该程序时间复杂度为?
{{ select(21) }}
- O(n)
- O(n^2)
- O(2^n)
- O(log n)
- 关于 C++ 文件流,若想要读取磁盘上已有文件的数据,应当使用?
{{ select(22) }}
- ofstream
- ifstream
- ostream
- cerr
- C++ 异常处理 try-catch,下面说法错误的是?
{{ select(23) }}
- try块中出现异常,会立刻跳出try,匹配对应catch
- catch可以捕获指定类型的异常数据
- 如果异常没有被捕获,程序不会终止
- 一个try可以搭配多个不同类型的catch
- 对比 Python 与 C++ 参数传递,下面描述准确的是?
{{ select(24) }}
- Python存在纯粹的值传递
- C++引用传递在Python中有完全等同语法
- Python传递可变对象(列表)时,函数内修改元素会影响外部
- Python传递整数变量,函数内部修改一定会改变外部变量
- 选择排序核心思想是不断在未排序区间寻找最小值交换至前端,它不稳定的根本原因是?
{{ select(25) }}
- 循环次数过多
- 远距离交换操作容易打乱等值元素相对顺序
- 只能从小到大排序
- 无法处理重复数字
- 下面关于局部变量作用域说法正确的是?
{{ select(26) }}
- 在函数内部定义的变量,可以直接在函数外部访问
- 代码块{}内部定义变量,出块之后仍然有效
- 不同作用域内可以定义同名变量,优先使用当前局部变量
- 局部变量默认自动初始化为0
- 设有
int a=10, *p=&a;,执行int b=20; p=&b;,下列结果正确的是?
{{ select(27) }}
- a的值变为20
- p存储的地址修改为变量b的地址
- *p的值依旧是10
- &a的值发生改变
- 下列哪一段算法属于递推思想而非递归?
{{ select(28) }}
- 函数不断调用自身直到基线条件
- 从第1项开始,循环依次算出第2、3……第n项斐波那契数
- 使用分治法快速排序
- 递归遍历树形结构
- 二维数组
int mat[4][3]; int *q = mat[0];,q+2 指向的是?
{{ select(29) }}
- mat第2行首元素
- mat[0][2]
- mat[2][0]
- 整个数组向后偏移2行
- 下列代码执行后输出结果是?
void func(int &x){x *= 2;}
int main(){
int m = 6;
func(m);
cout << m;
return 0;
}
{{ select(30) }}
- 6
- 12
- 0
- 编译报错
二、多项选择题(每题 3 分)
- 下列关于 C++ 函数三种传参方式描述正确的是
{{ multiselect(31) }}
- 值传递拷贝独立副本,函数内修改不影响外部原始变量
- 指针传递直接操作原变量内存,可修改实参真实数据
- 引用是原变量别名,无需拷贝副本,能直接修改外部值
- 结构体变量无法作为函数形参传入
- 关于二维数组定义与初始化合法规则,说法正确的有
{{ multiselect(32) }}
- 全局/局部二维数组初始化时允许省略第一维行数
- 定义二维数组时第二维列数绝对不能省略
double data[][4]={1.1,2.2,3.3};语法合法可编译float arr[3][]={1,2,3};属于标准合法写法
- 下面哪些特征属于函数内部局部变量
{{ multiselect(33) }}
- 仅在当前{}代码块内可访问,出作用域失效
- 定义后未手动赋值,存储随机垃圾数值
- 函数执行完毕自动释放栈内存,销毁变量
- 整个程序所有函数都能直接读取使用
- 针对冒泡、插入、选择三种基础排序,表述无误的是
{{ multiselect(34) }}
- 冒泡、插入排序均为稳定排序,等值元素顺序不变
- 基础选择排序属于不稳定排序,会打乱等值相对位置
- 稳定排序会交换相等元素,改变原有前后次序
- 有序数组使用flag优化冒泡,一轮遍历即可结束,复杂度O(n)
- 结构体变量与指针的合法访问写法包含
{{ multiselect(35) }}
- 普通结构体变量:变量名.成员名
- 结构体指针:指针变量->成员名
- (*结构体指针).成员名 等价于 -> 访问方式
- 结构体内部不允许定义string、数组类型成员
- 下列属于指针安全、合规操作的是
{{ multiselect(36) }}
- 直接给指针字面数字(如0x1234)作为地址赋值
- 使用*解引用,读取指针指向内存存储的数据
- 两个同类型指针变量,可使用> < ==比较地址大小
- 使用&取普通变量地址,赋值给同类型指针
- 文件流相关函数与使用场景正确的有
{{ multiselect(37) }}
- open()函数用于打开指定路径的磁盘文件
- eof()用于判断文件读取是否到达末尾
- rdbuf()可替换标准输出缓冲区,实现输出重定向到文件
- ifstream类专门用于文件写入操作
- 对比指针与引用,下列正确描述是
{{ multiselect(38) }}
- 引用定义时必须绑定已有变量,不能无主引用
- 指针变量可多次修改指向,切换指向不同变量
- 引用一旦绑定变量,无法重新绑定其他变量
- 指针和引用都不能修改外部原始变量的值
- 下面对代码时间复杂度判断错误的选项是
{{ multiselect(39) }}
- 单层for循环
for(int i=1;i<=n;i++)复杂度O(n) - 内层j<=i的双层嵌套循环,复杂度为O(2^n)
- 三层完全独立嵌套循环,时间复杂度O(n^3)
- 循环迭代版斐波那契数列,复杂度为O(2^n)
- 以下代码书写会直接触发编译报错的有
{{ multiselect(40) }}
int num[6]; num++;- 函数内部定义局部变量,在main函数直接访问
int &ref;仅声明引用,未绑定任何变量- void无返回函数内单独写
return;
三、判断题(每题 1 分)
- 运行下列代码,变量 x 最终的值会变为 28。
void addVal(int *p) {
*p = *p + 18;
}
int main() {
int x = 10;
addVal(&x);
return 0;
}
{{ select(41) }}
- 正确
- 错误
- C++ 引用一旦绑定变量,后续可以通过赋值操作将其重新指向另一个变量。
{{ select(42) }}
- 正确
- 错误
- 下面代码能够正常编译并正确输出 4 名学生的平均分数。
struct Student {
int id;
int score;
};
int main() {
Student st[4] = {{1, 76}, {2, 88}, {3, 91}, {4, 85}};
int sum = 0;
for (int i = 0; i < 4; i++) sum += st[i].score;
double avg = sum / 4.0;
cout << avg;
return 0;
}
{{ select(43) }}
- 正确
- 错误
- 选择排序是一种稳定的排序算法。
{{ select(44) }}
- 正确
- 错误
- 带有优化标记 flag 的冒泡排序,若数组初始完全有序,仅需一轮遍历即可结束,时间复杂度为 O(n)。
{{ select(45) }}
- 正确
- 错误
- C++ 二维数组初始化时可省略第一维长度,不能省略第二维;
int arr[][3]={{1,5},{2,6}}合法,int arr[][]={1,2,3}无法编译。
{{ select(46) }}
- 正确
- 错误
- 下方双层循环代码的时间复杂度是 O(2^n)。
int num = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
num++;
}
}
{{ select(47) }}
- 正确
- 错误
- 若在 C++ 中,ofstream 以默认方式打开文件时,若文件不存在则新建文件;若文件已存在,会清空文件原有内容。
{{ select(48) }}
- 正确
- 错误
- 运行饭卡充值程序,控制台最终输出 90。
void addMoney(int money) {
money += 40;
}
int main() {
int card = 50;
addMoney(card);
cout << card;
return 0;
}
{{ select(49) }}
- 正确
- 错误
- 以下两行代码能够正常编译运行。
int arr[6];
arr++;
{{ select(50) }}
- 正确
- 错误