下面的语句中,( )正确定义了一个计算浮点数 x 的平方()的函数,并成功调用该函数。
A:float square(float x) { return x*x; } float area = square(2);。函数定义需有返回类型(A 写 float 正确),调用结果赋给 float 变量;B 缺返回类型、C 返回类型 void 不能 return 值、D 计算结果未返回。
下面代码的描述中,正确的是( )。
01void n_chars(char c, int n) { 02 while (n-- > 0) 03 cout << c; 04} 05 06char my_char = 'w'; 07int times = 5; 08n_chars(my_char, times);
B:n 是形参,times 是实参。函数定义中的参数是形参(n),调用时传入的具体值是实参(times=5);A 错(值传递,times 不变),C 错(颠倒),D 错(参数类型不匹配)。
给定以下代码,func(int& x) { x = x * 2; } int a = 5; func(a); 执行上述代码后,变量 a 的值为( )。
01void func(int& x) { 02 x = x * 2; 03} 04 05int a = 5; 06func(a);
B:10。func(int& x) 中 x 是 a 的引用,函数内 x=x*2 直接修改 a 的值,a 由 5 变 10。
运行下面代码,屏幕上输出是( )。
01double* p_arr = new double [3]; 02p_arr[0] = 0.2; 03p_arr[1] = 0.5; 04p_arr[2] = 0.8; 05p_arr += 1; 06cout << p_arr[0] << endl; 07p_arr -= 1; 08delete p_arr;
B:0.5。p_arr 指向 new double[3] 首地址,p_arr[0]=0.2, p_arr[1]=0.5, p_arr[2]=0.8;p_arr+=1 后 p_arr 指向 p_arr[1],cout<<p_arr[0] 即输出 p_arr[1]=0.5。
运行下面代码片段后,x 和 *p 的结果分别是( )。
01int x = 20; 02int* p = &x; 03*p = *p + 2;
D:22 22。x=20, p=&x, *p=*p+2=22 即 x=22,故 x 和 *p 都是 22。
下面的描述中,( )不能正确定义一个名为 Student 的结构体以及一个包含 个元素的结构数组。
D:Student students = new Student[20]——错误。students 是数组对象(栈上),不能用 new 返回的指针赋值;C 用 Student* 指针接收才是正确写法。
假定整型是 位,对一个 行 列的二维整数数组 array,假设数组第一个元素在内存中的地址为 0x7ffee4065820,则第 行第 个元素的地址 &array[1][1] 为( )。
01int array[2][3] = { 02 {0, 1, 2}, 03 {3, 4, 5} 04};
D:0x7ffee4065830。array[2][3] 行优先,arr[1][1] 偏移 1×3+1=4 个 int = 16 字节,0x7ffee4065820+16=0x7ffee4065830。
下面( )正确定义二维数组。
D:int a[][2] = {{1,2},{1,2},{3,4}};。二维数组有初始化时可省略第一维(编译器按初始化列表推断),列数必须指定。A/B/C 列数缺失。
下面代码采用递推算法来计算斐波那契数列 ,则横线上应填写( )。
01int fib(int n) { 02 if (n == 0 || n == 1) 03 return n; 04 05 int f1 = 0; 06 int f2 = 1; 07 int result = 0; 08 for (int i = 2; i <= n; i++) { 09 ____________ // 在此处填入代码 10 } 11 return result; 12}
A:result = f1 + f2; f1 = f2; f2 = result;。递推斐波那契:f(2)=f1+f2=0+1=1,然后 f1=f2=1, f2=result=1 准备下轮计算 f(3)。B 是 += 会累加错误。
下面关于排序算法(冒泡排序、插入排序和选择排序)的描述中,不正确的是( )。
C:冒泡排序在任何情况下的时间复杂度都为 O(n²)——错误。冒泡加标志优化后,最优情况(已有序)只一趟 O(n);只有最坏和平均才是 O(n²)。
冒泡排序的第一轮操作是从左到右遍历数组,通过两两比较相邻元素,将当前最大的元素移动到末尾。给定数组 arr[]={4, 1, 3, 1, 5, 2},执行第一轮冒泡排序后数组 arr 中的内容为( )。
B:1,3,1,4,2,5。{4,1,3,1,5,2} 第一趟从左到右相邻比较交换:4>1 换 {1,4,3,1,5,2};4>3 换 {1,3,4,1,5,2};4>1 换 {1,3,1,4,5,2};4<5 不换;5>2 换 {1,3,1,4,2,5},最大 5 沉底。
给定如下代码,其时间复杂度为( )。
01int cellRecur(int n) { 02 if (n == 1) 03 return 1; 04 return cellRecur(n - 1) + cellRecur(n - 1) + 1; 05}
B:O(2ⁿ)。cellRecur 两次递归调用自身(cellRecur(n-1) 各调一次),呈二叉树结构,叶子数 2ⁿ,时间复杂度 O(2ⁿ)。
下面代码实现了插入排序函数,则横线上应填写( )。
01void insertion_sort(vector<int> &nums) { 02 for (int i = 1; i < nums.size(); i++) { 03 ____________ { // 在此处填入代码 04 while (j >= 0 && nums[j] > base) 05 nums[j + 1] = nums[j]; 06 j--; 07 } 08 nums[j + 1] = base; 09 } 10}
A:int base = nums[i], j = i - 1;。插入排序把当前 nums[i] 作为 base 保存,j 从 i-1 向前扫描已排序部分找插入位置。
下面哪种方式不能实现将字符串 "Welcome to GESP!" 输出重定向到文件 log.txt( )。
C:用 ofstream 创建 outFile 但用 cout 输出,cout 仍输出到屏幕而不是文件,不能重定向;A 用 freopen、B 用 ofstream 直接写、D 用 rdbuf 重定向均可。
运行下面的代码,将出现什么情况?( )
01double hmean(double a, double b) { 02 if (a == -b) 03 throw runtime_error("Runtime error occurred"); 04 return 2.0*a*b/(a + b); 05} 06 07int main() { 08 double x = 10; 09 double y = -10; 10 11 try { 12 int result = hmean(x, y); 13 cout << "hmean: " << result << endl; 14 } 15 catch (const runtime_error& e) { 16 cout << "Caught: " << e.what() << endl; 17 } catch (...) { 18 cout << "Caught an unknown exception." << endl; 19 } 20 return 0; 21}
A:Caught: Runtime error occurred。hmean(10,-10) 中 a==-b 触发 throw runtime_error;main 中 catch(const runtime_error&) 匹配,输出 Caught: + e.what()。
在 C++ 中,下面代码可以正确定义指针和初始化指针。
01int* ptr; 02*ptr = 10;
错。int* ptr; 仅声明指针变量未初始化(野指针),直接 *ptr=10 是解引用未定义内存,运行时崩溃或损坏数据。
一个函数必须在调用之前既声明又定义。
错。函数可以只声明(提供原型)后调用,定义放在调用之后;但必须先有声明或定义在调用之前。
函数参数可以通过值传递、引用传递和指针传递,这样函数内对参数的修改可以直接修改传入变量的值。
错。值传递不能修改实参(拷贝副本);引用传递和指针传递可以通过别名或 *p 修改实参。题目说「三种方式都可直接修改实参」是错的。
int arr[3][] 是一个正确的二维数组的声明。
错。二维数组声明必须指定列数(第二维),int arr[3][] 缺少列数不合法;int arr[][4] 或 int arr[3][4] 才是正确的二维数组声明。
递推是一种通过已知的初始值和递推公式,逐步求解目标值的算法。
正确。递推算法基于初始值(边界条件)和递推关系式,逐步求解后续值。
某算法的递推关系式为 ( 为正整数)及 ,则该算法的时间复杂度为 。
正确。T(n)=T(n-1)+n 展开得 T(n)=1+n+(n-1)+...+1 = n(n+1)/2+1 = O(n²)。
冒泡排序的平均时间复杂度为 ,但最优情况下为 。
正确。冒泡排序平均 O(n²);若加标志优化(提前结束),最优情况(已有序)只一趟 O(n) 比较无交换。
冒泡排序和插入排序都是稳定的排序算法。
正确。冒泡和插入排序都只交换/移动相邻元素,相等元素的相对顺序不会改变,都是稳定排序。
选择排序是稳定的排序算法。
错。选择排序每趟把未排序区最小元素与首位交换,交换的元素不一定相邻,相等元素相对顺序可能改变,不稳定。
在 C++ 语言中,如果一个函数可能抛出异常,那么一定要在 try 子句里调用这个函数。
错。可能抛异常的函数不必放在 try 块内,异常可沿调用栈向上传播,由调用者的 try-catch 捕获。