下列代码中,输出结果是( )。
01#include<iostream> 02using namespace std; 03int func(int x,int y) 04{ 05 int a=x,b=y; 06 int t; 07 t=a; 08 a=b; 09 b=t; 10 cout<<a<<" "<<b<<" "; 11} 12int main() 13{ 14 int c,d; 15 c=12; 16 d=24; 17 func(12,24); 18 cout<<c<<" "<<d<<endl; 19}
B:24 12 12 24。func(12,24) 值传递拷贝 a=12,b=24,函数内 swap 后输出 a=24 b=12,然后 main 中 cout<<c<<" "<<d 输出原值 12 24。
下面函数不能正常执行的是( )。
B:main 中 func() 调用,但 func 定义在 main 之后且没有前置声明,编译器找不到 func 标识符报错;其他 A/C/D 都是合法的(C 是正常顺序,D 是先声明后定义)。
下面程序输出的是( )。
01#include<iostream> 02using namespace std; 03int func(); 04int main() 05{ 06 int i=2; 07 cout<<i<<endl; 08 for(int x=0;x<1;x++) 09 { 10 int i=10; 11 cout<<i<<endl; 12 } 13 i=i+1; 14 cout<<i<<endl; 15 { 16 i=i*i; 17 cout<<i<<endl; 18 } 19}
B:2 10 3 9。main 输出 i=2;进入 for 循环体定义局部 i=10 并输出 10;循环结束后 i=i+1 即 main 局部 i 从 2 变 3,输出 3;进入无 for 的 { } 块 i=i*i=9,输出 9。
假设变量 a 的地址是 0x6ffe14,下面程序的输出是( )。
01#include<iostream> 02using namespace std; 03int main() 04{ 05 int *p; 06 int a=10; 07 p=&a; 08 p++; 09 cout<<p<<endl; 10}
D:0x6ffe18。p=&a 后 p 指向 0x6ffe14,p++ 自增一个 int(4 字节),故 p=0x6ffe14+4=0x6ffe18,cout<<p 输出指针值。
如果下列程序输出的地址是 0x6ffe00,则 cout<<a+1<<endl; 输出的是( )。
01#include<iostream> 02using namespace std; 03int main() 04{ 05 int a[2][3]={0}; 06 cout<<a<<endl; 07}
B:0x6ffe0C。a 是 int[2][3] 类型,a+1 跳过一行(3 个 int = 12 字节),0x6ffe00+12=0x6ffe00+0x0C=0x6ffe0C。
C++ 中,关于文件路径说法错误的是( )。
D:「GESP.txt」是绝对路径——错误。该字符串只是文件名(相对路径),不是绝对路径;绝对路径以盘符或 / 开头。
关于直接插入排序,下列说法错误的是( )。
D:空间复杂度 O(n)。插入排序是就地排序,只用常数级额外空间(当前元素、循环变量),空间复杂度 O(1) 而非 O(n)。
下列程序横线处,应该输入的是( )。
01#include<iostream> 02using namespace std; 03int n,a[10001]; 04void swap(int &a,int &b) 05{ 06 int t=a; 07 a=b; 08 b=t; 09} 10int main() 11{ 12 cin>>n; 13 for(int i=1;i<=n;i++) 14 cin>>a[i]; 15 for(int i=n;i>1;i--) 16 for(int j=1;j<i;j++) 17 if(a[j]>a[j+1]) 18 ____________; 19 for(int i=1;i<=n;i++) 20 cout<<a[i]<<" "; 21 cout<<endl; 22 return 0; 23}
A:swap(a[j],a[j+1])。swap 函数接受两个 int& 引用,调用 swap(a[j],a[j+1]) 即可交换两元素(B/D 下标错,C 跨度错)。
下面关于递推的说法不正确的是( )。
A:递推表现为自己调用自己——错误。自己调用自己是递归的特征;递推是从初始值出发用递推关系一步步求未知项。
关于几种排序算法的说法,下面说法错误的是( )。
B:冒泡排序算法不是一种稳定的排序算法——错误。冒泡排序只交换相邻元素,相等元素的相对顺序不变,是稳定排序。
数组 {45,66,23,1,10,97,52,88,5,33} 进行从小到大冒泡排序过程中,第一趟冒泡过后的序列是( )。
A:{45,23,1,10,66,52,88,5,33,97}。冒泡第一趟从前往后两两比较,遇大就交换,最大元素 97 冒泡到末尾:45<66 不换,66>23 换,66>1 换,66>10 换,66<97 不换,97>52 换,97>88 换,97>5 换,97>33 换。
下面的排序算法程序中,横线处应该填入的是( )。
01int a[8]={ 2,3, 4, 5, 6,2,3,1}; 02for (int i=1;i<8;i++) 03{ 04 int key = a[i]; 05 int j=i-1; 06 while(a[j]>key && j>=0) 07 { 08 ____________; 09 j -= 1; 10 } 11 a[j + 1]= key; 12}
D:a[j+1]=a[j]。插入排序 while 内将已比较元素向后挪一位为待插入腾位,故 a[j+1]=a[j](j+1 是后移目标位)。
下面的程序中,如果输入 10 0,会输出( )。
01#include<iostream> 02using namespace std; 03 04double Division(int a, int b) 05{ 06 if (b == 0) 07 throw "Division by zero condition!"; 08 else 09 return ((double)a / (double)b); 10} 11 12void func() 13{ 14 int len, time; 15 cin >> len >> time; 16 cout << Division(len, time) << endl; 17} 18 19int main() 20{ 21 try { 22 func(); 23 } 24 catch (const char* errmsg) 25 { 26 cout << errmsg << endl; 27 } 28 catch (const int errmsg) 29 { 30 cout << errmsg << endl; 31 } 32 return 0; 33}
A:Division by zero condition!。func 读入 len=10, time=0 调用 Division(10,0),b==0 触发 throw "Division by zero condition!";main 中 catch(const char*) 匹配并输出该字符串。
条直线,最多可以把平面分为多少个区域( )。
B:56。n 条直线最多把平面分成 n(n+1)/2+1 个区域,n=10 时 10×11/2+1=55+1=56。
下面程序中,如果语句 cout<<p<<endl; 输出的是 0x6ffe00,则 cout<<++p<<endl; 输出的是( )。
01int x[10][10][10]={{0}}; 02int *p; 03p=&x[0][0][0]; 04cout<<p<<endl; 05cout<<++p<<endl;
D:0x6ffe04。p 是 int* 指向 x[0][0][0] 即 0x6ffe00;++p 自增一个 int(4 字节),p=0x6ffe04。
int& a 和 &a 是一样的,都是取 a 的地址。
错。int& a 是声明一个 int 类型的引用变量 a(必须初始化绑定某个变量);&a 是取变量 a 的地址(单目运算符),二者含义完全不同。
以下代码不能够正确执行。
01#include<iostream> 02using namespace std; 03int main() 04{ 05 int a=20; 06 int& ra; 07 ra=&a; 08 cout<<ra<<endl; 09}
正确。int& ra; 是声明一个引用变量但未初始化绑定任何对象(引用必须初始化),语法错误或运行时未定义;且 ra=&a 是把 a 的地址赋给引用 ra,但引用绑定的是值不是地址,编译失败。
引用是一个指针常量。
正确。引用在底层实现上常被视为「指针常量」(不可重新绑定到其他对象,但语法上更安全),C++ 标准将引用视为变量的别名。
下面程序两个输出结果是一样的。
01#include<iostream> 02using namespace std; 03int main() 04{ 05 int a[2][3]={0}; 06 cout<<a<<endl; 07 cout<<&a[0][0]<<endl; 08}
正确。int a[2][3]={0} 时 a 退化为 int(*)[3],a 是首行地址即首元素 a[0][0] 地址;&a[0][0] 也是 a[0][0] 地址,二者值相等。
函数不可以调用自己。
错。函数可以递归调用自己(C++ 支持递归),如阶乘函数 factorial(n)=n*factorial(n-1)。
函数参数传递过程中,如果传常量值、常量引用和常量指针都是不能被修改的,它们可以防止函数对实参的值或地址进行修改。
正确。const 值参数、const& 引用参数、const* 指针参数都向编译器承诺不修改实参或其指向内容,能防止函数误修改数据。
下面代码输出的值等于 。
01#include<iostream> 02using namespace std; 03int main() 04{ 05 int *p=NULL; 06 cout<<p<<endl; 07}
正确。int *p=NULL(值为 0),cout<<p 输出指针值 0(即 0 或 0x0 视实现而定,通常输出 0)。
在下面这个程序里,a[i][j] 和一个普通的整型变量一样使用。
01#include<iostream> 02using namespace std; 03int main() 04{ 05 int a[10][10]={0}; 06 for(int i=0;i<10;i++) 07 { 08 for(int j=0;j<10;j++) 09 { 10 if(i==j) 11 { 12 a[i][j]=1; 13 } 14 } 15 } 16}
正确。a[i][j] 在表达式中退化为 int,可像普通 int 一样赋值、运算、传给函数(如 a[i][j]=1 是合法的赋值)。
一个一维数组,至少含有一个自然数 ,是一个合法的数列。可以在一维数组末尾加入一个自然数 , 不能超过一维数组末尾元素的一半,形成一个新的合法的一维数组,如果 ,那么可以有 个不同的合法数组。
正确。N=6 的合法数组:{6};{6,3}(3≤3);{6,3,1}(1≤1);{6,2}(2≤3);{6,2,1}(1≤1);{6,1}(1≤3)共 6 个。
插入排序算法中,平均时间复杂度是 ,最坏的情况逆序情况下,达到最大时间复杂度。
正确。插入排序平均时间复杂度 O(n²),最坏情况(逆序)达到上界,需要最多比较和移动次数。