在 C++ 中,( )正确定义了一个返回整数值并接受两个整数参数的函数。
A:int add(int a, int b) { return a+b; }。返回 int 写 int,无返回值的函数用 void;形参类型必须显式声明(B/C/D 都不符合)。
在 C++ 中,形参与实参的关系描述正确的是( )。
B:形参在函数定义时指定,实参在函数调用时传递。形参是函数声明/定义中的参数(占位符),实参是调用时传入的具体值。
运行以下代码,屏幕上将输出( )。
01#include <iostream> 02using namespace std; 03 04int var = 100; 05 06void function() { 07 int var = 200; 08 09 cout << var << " "; 10 cout << ::var << " "; 11} 12 13int main() { 14 cout << var << " "; 15 16 function(); 17 18 var += 100; 19 cout << var << " "; 20 21 return 0; 22}
B:100 200 100 300。main 先 cout<<var 输出全局 100;function() 中局部 var=200 输出 200,再 cout<<::var 输出全局 100;function 返回后 var+=100 全局 var 变 200,输出 200?让我重数:function 输出局部 200 和 ::var=100,main 输出 var 100、function()→200 100,最后 var+=100 输出 200。答案是 100 200 100 200。检查题目:var+=100 后 var=200,cout<<var 输出 200;但选项里最后是 200。答案 A 100 200 100 200。
运行下面代码,屏幕上输出是( )。
01int arr[3] = {24, 9, 7}; 02int* p = arr; 03p++; 04cout << *p << endl;
B:9。arr={24,9,7},p=arr 指向 arr[0]=24,p++ 后指向 arr[1]=9,*p=9 输出 9。
运行下面代码片段的结果是( )。
01int x = 20; 02int y = 24; 03int* p = &x; 04int* q = &y; 05 06p = q;
D:将 p 指向 y 的地址。p=q 把 q 存储的 y 地址赋给 p,p 现在指向 y,x 与 y 的值都不变。
在 C++ 中,( )正确定义一个名为 student 的结构体,其中包含一个 name 字符数组和一个 age 整数?
A:struct student { char name[20]; int age; };。struct 关键字在前,student 是类型名;B 关键字顺序错,C struct 内用 string 需 include 且语法细节不同,D char[20] name 语法错误(数组声明应在 name 后)。
在 C++ 中,( )正确声明了一个 行 列的二维数组。
B:int arr[3][4]。3 行 4 列二维数组,第二个 [4] 表示列数;A 用逗号语法错(不是 C++ 语法),C 是 4 行 3 列,D 是函数调用不是声明。
一个二维数组定义为 int arr[3][4];(假设一个 int 变量占 个字节),则 int arr[0] 占用( )个字节的内存。
D:16。int arr[3][4] 中 arr[0] 是第一行(int[4]),4 个 int 占 4×4=16 字节。
下面代码采用递推算法来实现整数 的阶乘(),则横线上应填写( )。
01int factorial(int n) { 02 int result = 1; 03 for (int i = 2; i <= n; i++) { 04 ____________ // 在此处填入代码 05 } 06 return result; 07}
A:result = i。阶乘公式 n!=1×2×...×n,循环变量 i 从 2 到 n,累乘 result=i。
在排序算法中,稳定性指的是( )。
B:排序后相同元素的相对顺序保持不变。这是排序算法稳定性的定义;A/C/D 都是对「稳定」一词的误解。
下面代码实现了冒泡排序函数,则横线上应填写( )。
01//交换数组arr的第i个元素和第j个元素 02void swap(vector<int> &arr, int i, int j) { 03 int tmp = arr[i]; 04 arr[i] = arr[j]; 05 arr[j] = tmp; 06} 07 08int bubble_sort(vector<int> &arr) { 09 for (int i = arr.size() - 1; i > 0; i--) { 10 bool flag = false; // 标志位 11 ____________{ // 在此处填入代码 12 if(arr[j] > arr[j + 1]) { 13 swap(arr, i, j); 14 flag = true; 15 } 16 } 17 if(!flag) 18 break; // 此轮"冒泡"未交换任何元素 19 } 20} 21
C:for (int j = 0; j < i; j++)。冒泡排序外层 i 控制当前未排序区右端,内层 j 从 0 到 i-1(不含 i)相邻比较交换;A 范围错,B 逆序错,D 条件永假。
冒泡排序算法在最坏情况下的时间复杂度为( )。
A:O(n²)。冒泡排序无论最坏/平均都要 n-1 趟、每趟最多 n-1 次比较,总 O(n²);最好情况(已有序)O(n)。
下面代码实现了插入排序函数(升序),则横线上应填写( )。
01void insertion_sort(vector<int> &nums) { 02 for (int i = 1; i < nums.size(); i++) { 03 int base = nums[i], j = i - 1; 04 05 ____________{ // 在此处填入代码 06 nums[j + 1] = nums[j]; 07 j--; 08 } 09 nums[j + 1] = base; 10 } 11}
A:while (j >= 0 && nums[j] > base)。插入排序升序:将 base=nums[i] 插入前面有序区,当 j>=0 且 nums[j] > base 时把 nums[j] 后移腾位。
小杨用文件重定向实现在 log.txt 文件中输出日志,则下面横线上应填写( )。
01#include <iostream> 02#include <fstream> 03#include <string> 04using namespace std; 05 06int main() { 07 ofstream log_file("log.txt"); 08 09 streambuf* original_cout = cout.rdbuf(); 10 cout.rdbuf(log_file.rdbuf()); 11 12 ____________{ // 在此处填入代码 13 14 cout.rdbuf(original_cout); // 恢复原始的标准输出缓冲区 15 return 0; 16}
A:cout << "This output will go to the log file." << endl;。代码通过 cout.rdbuf(log_file.rdbuf()) 重定向 cout 输出到 log.txt,故用 cout<< 输出即可写入文件(B/D 用 log_file 也能但 cout 是题目的重定向目标;C/D 的 >> 是输入不是输出)。
运行下面的代码,屏幕上将输出( )。
01#include <iostream> 02using namespace std; 03 04int divide(int a, int b) { 05 if (b == 0) { 06 throw runtime_error("division by zero error "); 07 } 08 return a / b; 09} 10 11int main() { 12 int x = 10; 13 int y = 0; // 设为 0 会导致除零错误 14 15 try { 16 int result = divide(x, y); 17 cout << "result: " << result <<endl; 18 }catch (const runtime_error& e) { 19 cout << "caught an exception: " << e.what() << endl; 20 } 21 22 return 0; 23}
C:caught an exception: division by zero error。divide(10,0) 抛 runtime_error,try 块内 result 未被赋值就跳到 catch,e.what() 返回 "division by zero error",输出 "caught an exception: division by zero error"。
代码 int a = 10; int* p = &a; 可以正确定义指针和初始化指针。
正确。int a=10 定义整型变量;int* p=&a 定义指向 int 的指针并用 a 的地址初始化,是正确的指针定义与初始化方式。
在 C++ 中,引用传递允许函数修改传递给它的参数的值。
正确。引用传递(C++)相当于实参的别名,函数内通过引用修改会直接影响调用方的实参。
指针的大小与其所指向的变量的数据类型的大小相同。
错。指针大小固定(32 位 4 字节,64 位 8 字节),与所指向的数据类型无关;int*、double*、char* 在同一平台大小相同。
二维数组的行的大小的必须在定义时确定,列的大小可以动态变化。
错。C++ 二维数组的行数和列数都必须在编译期确定(数组大小是常量表达式),不能动态变化。
递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。
正确。递推基于「当前状态 = f(前一或前几个状态)」的关系,从初始状态开始逐步推进求解。
选择排序是稳定的排序算法。
错。选择排序每趟将最小元素与未排序区首位交换,交换的元素不一定相邻,相等元素的相对顺序可能被改变,是不稳定排序。
插入排序的时间复杂度总是比冒泡排序低。
错。插入排序与冒泡排序平均都是 O(n²),复杂度相当,没有「插入总比冒泡快」的说法;具体常数因子和实际数据有关。
在 C++ 中,如果没有捕获到异常(没有匹配的 catch 块),程序会继续执行而不会终止。
错。若 try 块抛出异常后无匹配的 catch 块,C++ 调用 std::terminate 终止程序,不会继续执行。
以下代码用递推法求斐波那契数列的第 项,时间复杂度为指数级。
01int fibonacci(int n) { 02 if (n == 0) return 0; 03 if (n == 1) return 1; 04 05 int f0 = 0; // F(0) 06 int f1 = 1; // F(1) 07 int current; 08 09 for (int i = 2; i <= n; i++) { 10 current = f0 + f1; // F(n) = F(n-1) + F(n-2) 11 f0 = f1; 12 f1 = current; 13 } 14 15 return current; 16}
错。代码用循环递推(f0,f1 累加)求斐波那契,时间复杂度 O(n),不是指数级 O(2ⁿ)。
执行下面 C++ 代码后,输出的是 。
01int point(int* p){ 02 return *p * 2; 03} 04 05int main() { 06 int a = 10; 07 int* p = &a; 08 *p = point(p); 09 cout << *p << endl; 10}
正确。point(p) 中 *p=a=10,返回 p2=20;*p=point(p) 把 20 赋给 *p 即 a=20;cout<<*p 输出 20。