C++基础知识——练习一(含答案解析)

该博客围绕C++展开,包含选择题、程序填空题和阅读程序写结果三部分。选择题考查字符串长度、main函数位置等基础知识点;程序填空题涉及选择排序、递归转换整数为字符串等;阅读程序写结果则给出不同程序示例并分析输出结果,帮助巩固C++知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、选择题

1、求“abc\ \12\n”字符串的长度( C )

(A) 5          (B) 6          (C) 7          (D) 8

 知识点分析:

        转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符。

注意事项:转义字符中只能使用小写字母,每个转义字符只能看作一个字符。

所以,“abc\ \12\n”字符串的长度是7。

拓展练习1:字符串常量 ”\tMyNane\103” 的长度是:( B )

(A) 6          (B) 8          (C) 12          (D) 14

拓展练习2:字符串常量 "\t\"\062\xff\n" 的长度是___5___。

知识点分析:   '\103'是一个转义字符,表示八进制数103所对应的ASCII码值所对应的字符。
由于八进制103等于67,而ASCII值为67的字符为 'C' ,所以'\103'代表字符'C'。

转义字符要注意八进制和十六进制:

分析:\t ,\" ,\062 ,\xff ,\n 。一共是5个转义字符,在C中,转义字符的长度都是1,字符串结束符'\0'不计长度。

'\063'表示的是字符'3',因为'3'的ASCII码是30(十六进制)48(十进制)63(八进制)。

'\x41'表示的是字符'A',因为'A'的ASCII码是41(十六进制)65(十进制)101(八进制)。

2、C++语言规定:在一个源程序中,main函数的位置( C )。

A.必须在最开始           B.必须在系统调用的库函数的后面

C.可以任意                  D.必须在最后

 知识点分析: 

在C++中,main函数的位置可以任意,但是程序执行的时候,总是从main函数开始。

3、在每个C++程序中都必须包含有这样一个函数,该函数的函数名为( A )。

A.main          B.MAIN         C.name          D.function

 知识点分析: 

 C++主函数main,C++函数名和变量名严格区分大小写,A和a是两个不同的变量名称。

4、当需要对标准输入/输出设备进行输入/输出操作时,应在文件开始使用#include预处理命令,使之包含( A )头文件。

A.iostream.h         B.stdlib.h         C.fstream.h          D.strstream.h

 知识点分析: 

 iostream.h是input output stream的简写,意思为标准的输入输出流头文件

5、若a=-14,b=3,则条件表达式a<b?a:b+1的值为( A )。

A.-14 B.-13 C.3 D.4

知识点分析: 

a<b?a:b+1是三元表达式,a<b成立返回a,不成立返回b+1的值。

三元表达式格式:条件表达式?表达式1:表达式2; 

其中,条件表达式的值会被判断,如果为真,则整个表达式的值为表达式1的值;如果为假,则整个表达式的值为表达式2的值。

6、设x=7,执行语句y=++x,则y等于( D )

(A) 6          (B) 7           (C)9         (D) 8

知识点分析:  

考察对自增运算符的掌握,i++和++i,在赋值表达式中是不一样的。有先后顺序区别

y=x++;表示y=x;x=x+1;

y=++x;表示x=x+1;y=x;

x++;   ++x;    单独作为表示式时,两者相同。

7、下列字符列中,合法的长整型常量是:(C、D)

(A) 4.18e3          (B) 0.46793          (C)4L          (D) 956738

知识点分析:  

整型变量用于存储整数值。整型变量有以下几个子类型:

short:短整型,通常占2个字节,取值范围为-32,768到32,767。2^15=32,768
int:整型,通常占4个字节,取值范围为-2,147,483,648到2,147,483,647。2^31
long长整型,通常占4或8个字节,取值范围为-2,147,483,648到2,147,483,647(32位系统)或-9,223,372,036,854,775,808到9,223,372,036,854,775,807(64位系统)。
long long:超长整型,通常占8个字节,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。2^63

A选项4.18e3,e=2.718281828459,是科学计数法,只能用于实型,因为可能有小数;

B选项0.46793,所以B值是小数,不属于整型;

C D选项用编辑器测试,都正确

后缀:l或L表示将long常量,u或U表示unsigned int常量。U、L可以任意组合。

默认为double常量。后缀:l或L表示long double常量,f或F表示float常量。

8、在C++中,char类型数据在内存的存储形式是:( D )

(A) 原码          (B) 反码           (C)补码         (D) ASCII码

知识点分析:

在C++中:int型数据(正数和负数)都是以补码形式存放的,字符型数据是以ASC码形式存放的。

9、若a是int类型变量,则表达式a=25/3%3的值是:( B )。

A) 3          B) 2          C) 1          D) 0

知识点分析: 

在C++中,/表示整除,%表示取余数,也就是模预算,a=25/3%3,a=(25/3)等于8,8在对3取余数,等于2

10、设有变量定义 int i, j; 与表达式 i==0 && j==0 等价的表达式是:( B )

(A) i||j         (B) !i&&!j          (C) !i==!j         (D) i==j

知识点分析: 

原表达式中 i==0 和 j==0 都必须为真才成立。!是C++的逻辑运算符,意思是“非”B中 !i 和 !j 都必须为真,而 i==0 在i为零时为真,!i也是i为零是为真。这就是许多人喜欢把if( a == 0 )写成if( !a )的原因。a == 0 和 !a 是等价的。

11、设变量int a = 5; 下列哪个表达式计算后,使得变量b的值等于2 ?( A )

(A) b=a/2         (B) b=6-(a--)          (C) b=a%2         D) b=a>3?3:2

知识点分析: 

A.b=5/2=2;        B.b= 6-5=1;        C.b=a%2=1(模运算);         D.b=3(三元表达式)

12、if…else中为避免嵌套出现二义性,C++规定else子句总与( B )

(A)其之前最近的if语句

(B)其之前最近且尚未配对的if语句

(C)缩排位置相同的if语句

(D)其之后最近的if语句

知识点分析:注意if与else的配对关系。原则是if总是与它上面最近的、未配对的else配对

13、逻辑运算符两侧运算对象的数据( D )

(A)只能是逻辑型数据                    (B)只能是整型数据

(C)只能是整型或字符型数据         (D)可以是任何类型的数据

 知识点分析:

逻辑运算符两侧运算对象的数据类型:可以是任何合法的类型数据;因为逻辑运算符两边的运算对象,最终都被转换成bool值(逻辑值)操作。0、null转换为false,而所有非零、非false、非null值转换为true;然后进行运算。

14、设变量x,y,a,b,c,d的值为1,计算表达式(x=a!=b)&&(y=c!=d)后,变量x,y的值分别是:( B )

(A) 0,0         (B) 0,1          (C) 1,0         (D) 1,1

 知识点分析:

 !=的优先级比赋值“=”的优先级大,所以上边表达式可以写成这样:
(x=(a!=b))&&(y=(c!=d))

同时&&、||逻辑运算有个特点:

&&当左边为假时,就不会运算右边的表达式

||当左边为真时,就不运行右边的表达式了

所以,表示式(x=(a!=b))&&(y=(c!=d))只执行左边运算,x=0,y值不变,y=1

15、若a是int类型变量,则计算表达式a=1000%999的值是( B )。

A) 0         B) 1          C) 2          D) 3

 知识点分析:

%模运算,取余数操作,1000%999=1

16、已知 int x=1, y=0; 执行下面程序段后,y的值为( C )。

if(x) { if (x>0) y=1; } else y = -1 ;

(A)-1         (B)0          (C) 1          (D)不确定

知识点分析:

这段代码的意思是:当x!=0时,如果x>0,y=1;否则y=-1

已知x=1,y=0,执行代码后,y=1;

17、 已知 int x=1, y=0, w ; 执行下面程序段后,w的值为( A )。

if(x) if(y) w=x&&y; else w=y;

(A)0          (B)-1          (C) 1          (D)不确定

知识点分析:

这段代码的意思是:当x!=0时,如果y!=0,w=x&&y(与运算),否则w=y

已知x=1,y=0,执行代码后,w=0

18、语句while(w) … 中的表达式w的等价表示是:( C )

(A) w==0          (B) w==1           (C) w!=0          (D) w!=1

 知识点分析:

while(x),就是当x有值,也就是x!=0,和if(x)用法类似

19、语句while(a>b) a--; 等价于( D )。

(A)if(a>b)a--;             (B)do{a--}while(a>b);

(C) for(a>b)a--;         (D) for(;a>b; a--);

 知识点分析:

while(a>b),循环语句,当a>b成立情况下,重复执行a--命令;

A.if语句条件判断,只执行一次;B.do……while语句循环,至少执行一次命令,a>b不成立时,和while语句结果不同;C.for循环格式错误;D.for循环语句使用正确,结果和while相同

20、已知int i=0,x=0; 下面while语句执行时循环次数为( D )。

while( x || i ) { x ++ ; i ++ ; }

(A) 3          (B) 2          (C)1          (D) 0

 知识点分析:

||条件或,i=0,x=0,x||i=0,while判断条件不成立,执行次数为0

21、执行语句 x=1; while(++x<7)cout<<’*’; 后输出结果是:( A )

(A) *****          (B) ******          (C) *******          (D) ********

 知识点分析:

while(++x<7),每次对x加1后在进行条件判断,判断是否小于7,小于则打印*,循环次数5次

22、C++中循环语句while和do …while的主要区别是( A )

(A)do…while的循环体至少无条件执行一次

(B)while的循环控制条件和do…while的循环控制条件的控制条件的控制方式是相反的

(C)do …while允许从外部转到循环体内,while不允许

(D)while的循环体不能复合语句

知识点分析: 

while(执行条件①){
循环体②
}

while语句的执行顺序是,先判断①是否为true,如果为true则执行②,执行完后回到①,若为true则重复执行②,直到有一次判断①为false,或者循环用break;中断时结束。


do
{
    循环体②
}while(循环条件①)

do...while循环是,首先不管青红皂白,先执行循环体②,执行完后判断循环条件①,如果为true则跳回到循环体②重复执行,然后再判断①,直到①为false.

23、若有以下程序段:

for(m=1;m<=100;m++)

{

cin>>y;

if(y<0)

continue;

cout<<m;

}

则下面正确的说法是( D )

(A)当y<0时整个循环结束           (B)当y>=0时什么也不输出

(C)cout语句永远也不执行          (D)最多输出100个非负整数

 知识点分析: 

C++ 的循环结构有三种,分别是 while、do while 和 for 循环。执行循环结构的时候,一旦遇到 continue 语句,则直接跳过循环中continue 后续的所有代码,开始下一次循环。

continue 语句只能用在循环结构中,它的功能是终止本次循环,立即开始下一次循环。
在嵌套的循环结构中,continue 语句仅影响包裹它的最内层循环。

顺便复习一下break,

break;是一种控制流语句,用于终止包含它的最内层的循环(例如 for、while、do-while 循环)或 switch 语句。当程序执行到 break; 时,它会立即跳出当前循环或 switch 语句,继续执行紧接着循环或 switch 后面的代码。(也就是终止该循环)

24、假定a为一个字符型(char)数组,则元素a[8]的地址比该数组的首地址大( B ) 个字节。

A.4          B.8          C.16          D.32

 知识点分析: 在C++中,一个char类型占据1个字节,所以元素a[8]的地址比数组首地址大8个字节。 

25、语句“while(!x)…”等价于( A )

(A)while(x==0)…          (B) while(x!=1)…          (C) while(x!=0)…         (D) while(x==1)…

 知识点分析: a == 0 和 !a 是等价的。

26、一维数组a正确定义是( D )。

(A)char a(10)                   (B) int a[]

  (C) int k=5,a[k]                   (D)char a[]={‘a’,’b’,’c’}

 知识点分析:

数组的大小是固定的,一旦定义后无法改变。另外,数组的索引从 0 开始,最大索引为数组大小减 1。

选项C,目前在大部分编译器中支持这种写法,但是在最早的C语言中,是不支持以变量来定义数组的,所以考试中还是不支持这种写法。

27、char x[5]={‘a’,’b’,’\0’,’c’,’\0’} ; cout<<x;输出的结果是( B )

(A)’a’’b’          (B)ab          (C) ab c         (D)abc

 知识点分析:‘\0’是 C++ 中的空字符结尾,表示字符串的结束空字符是一个特殊字符,其 ASCII 码值为 0,当 C++ 编译器遇到 '\0' 时,它知道字符串已经结束并停止读取字符。因为是以字符串方式输出,遇到'\0'停止。 

28、在"int a[ ][3]={{1},{3,2},{4,5,6},{0}};"中,a[2][2]的值是( C)。

A.1          B.0          C.6         D.2

知识点分析:

 这个赋值语句,二维数组a:

1 0 0

3 2 0

4 5 6

0 0 0

a[2][2]=6,要注意数组下标是从0开始的

29、设有下面和程序段

char a[3],b[]=“China”

a=b;

cout<<a;

则( A )

(A)编译出错                  (B)运行后将输出Ch  

  (C) 运行后将输出Chi         (D)运行后将输出Chian

 知识点分析:

数组之间拷贝不能直接使用a=b,而是可以使用字符串拷贝函数strcpy。而且数组a的长度只有3,而数组b有5个字符,还不包括结尾字符。

字符串拷贝函数strcpy格式:strcpy (字符数组名1,字符数组名2) 的功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“”也一同拷贝。字符数组名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串

30、判断字符串s1是否大于字符s2的是( A )

(A)if(strcmp(s1,s2)>0)          (B)if(strcmp(s1,s2))

(C)if(strcmp(s2,s1)>0)          (D)if(s1>s2)

知识点分析:

strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。


知识加油站——字符串函数:
  • 应用于查找的find()函数   

cout<<"ab在str中的位置:"<<str.find("ab")

  • 字串(substr()函数)

cout<<"返回str[3]以后的子串:"<<str.substr(3)

  • 替换 

cout<<"返回把 [2]到[2+(4-1)] 的内容替换为'lk'后的新字符串:"<<str.replace(2,4,"lk")

  • 插入:insert()函数 

cout<<"从 [2] 位置开始添加字符串'kjh'并返回形成的新字符串:"<<str.insert(2,"kjh")

  • 追加字符:pushback()函数和append()函数 

cout<<"在输入字符串的尾部添加字符串avs:"<<str.append("avs")

  • 交换字符:swap()函数 

str1.swap(str2);

  • 字符串大小 size()函数和length()函数  

cout<<"size()函数获取大小:"<<str.size()

cout<<"length()函数获取大小:"<<str.length();

  • 字符串比较函数:compare() 

cout<<"字符串比较结果:"<<str1.compare(str2)

  • 另外基本的操作函数

strcpy(s1,s2) :复制字符串s2到s1

strcat(s1,s2) :连接s2到s1的末尾

strlen(s1) :返回字符串s1的长度

strcmp(s1,s2) :若s1和s2是相同的,则返回0,s1< s2,返回值小于0,若s1>s2,返回值大于0


二、程序填空题

 1、以下程序的功能是:用选择法对5个实数排序(按从小到大顺序)。请填空

#include <iostream>

using namespace std;

void main( )

{ double x[5], t; int i,j,k;

for(i=0; i<5; i++) cin>>x[i];for(i=0; i<4; i++)

{ k=i ;

for(【1】; j<5; j++)

if(x[j]<x[k]) k=j;

【2】//将选择好的下标元素和下标为i 的元素交换

【1】j=i+1;

【2】t=x[i];x[i]=x[k] ;x[k]=t ;

知识点分析:选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

本题目中,是用选择排序算法从小到大排序,第一轮找到最小的排在第一位,第二轮,从数组第二个开始往后比较找第二小的数……【1】处每一轮比较的数组下标和i变量有关系,j=i+1;【2】处,如果每次比较靠后的数据x[j]小于前面的x[i],那么交换两者数据,利用临时变量t,t=x[i];x[i]=x[k] ;x[k]=t ;交换数据。

[2、以下函数的功能是:用递归法将一个整数m 转换成字符串。例如:输入整数1472,应输出字符串 "1472”。m的位数不确定,可以是任意位数的整数。请填空

void print( int m )

{ if(m<10) 【3】//递归出口

else

{

【4】//递归体

putchar(m%10+48);

【3】putchar(m+48);

【4】print(m/10);

知识点分析:

分析:应该将输入的数中的每个数进行剥离,然后从头到尾将每个数字转化为对应的字符。递归函数print需要完成的工作是,当n不是个位数(putchar(m+48)!=0)的时候,将n/10作为参数进行递归调用函数print,然后将数字n的最后一位数字转化为字符串。因为每次的递归调用print函数,是发生在将n的最后一个数字转化为字符串的操作之前的,所以会依次将数字n的每个数字转化为字符。

在C/C++语言中我们都知道整数转换为字符串是不能直接转换的。一位整数转换为字符也只能将其转换为整数的ASCII码。

我们知道 0-9的数字的ASCII码对应于48~57。因此一位整数转换为字符串直接将整数+48后就可以强制转换。

所以大致思路就是,将整数n 进行模10 ,即n%10得到n的个位,然后将其转换为字符加到字符串中,再将n/10进行迭代。

putchar是c语言函数之一,作用是向终端输出一个字符。其格式为putchar(c),其中c可以是被单引号(英文状态下)引起来的一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127),也可以是事先用char定义好的一个字符型变量。

3、下面是显示如下图案的程序。

1111111111

2222222

33333

444

5

#include<iostream.h>

void main(

{ int i, j, k ;

for( i= 1; i<= 5; i++)

 for( k = 1;_(5)_; k++)

cout<<ends ;

for(j-1 ;___(6)_; j++)

cout <<_(7)_;

cout<<endl;

}

}

k<-i-1

( 2*(5-i)+1)

i

三、阅读程序写结果

1.//循环

#include<iostsam h>

void main()

{ int i=0,s=0:

while (i++<=10)

{ if(i%2) continue;

s=s+i;

cout<<s<<’\t’;

}

}

输出:

2 6 12 20 30

2.//数组,指针

#include<iostream. h>

void main()

{ int num[5];

int *p=num,i :

for(i=1;i<=5;i++) num[i-1]=i;

for(i=0; i<5;i++)

cout<<num[i]+(*p++)<<'\t';

cout<<endl:

}

输出:

2 4 6 8 10

3.//递归

#include<iostream.h>

void print(char ch)

{int i=0;

if(ch==’D')

return;

else

{print(ch+1);

while(i++<=ch-'A')

cout<<ch;

cout<<endl;

}

}

void main{

print(‘A’);

}

输出:

CCC

BB

A

### ROC 曲线概述 ROC曲线(受试者工作特征曲线)是种广泛应用于二值分类器性能评估的图形化表示方法[^1]。该曲线通过描绘真阳性率(True Positive Rate, TPR),也称为敏感度或召回率,与假阳性率(False Positive Rate, FPR)之间的关系来展示不同阈值下的模型表现。 #### 真阳性和假阳性率计算方式 对于给定的个概率预测模型,在不同的决策边界下可以得到系列混淆矩阵。基于此,TPR 和 FPR 的定义如下: - **真阳性率 (TPR)** 或 召回率 = TP / (TP + FN),其中 TP 表示真正例数,FN 是指假反例数。 - **假阳性率 (FPR)** = FP / (FP + TN),这里 FP 指的是假正例数量,TN 则代表真实负例的数量。 ```python from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt def plot_roc(y_true, y_scores): fpr, tpr, _ = roc_curve(y_true, y_scores) roc_auc = auc(fpr, tpr) plt.figure() lw = 2 plt.plot(fpr, tpr, color='darkorange', lw=lw, label=f'ROC curve (area = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic Curve') plt.legend(loc="lower right") plt.show() # 假设我们有个真实的标签列表和对应的分数/概率估计 plot_roc([0, 1, 1, 0, 1], [0.1, 0.4, 0.35, 0.8, 0.7]) ``` #### AUC 度量标准 AUC即曲线下面积(Area Under the Curve), 它衡量了整个二维空间内的积分区域大小。理想情况下,当分类器完美区分两类数据时,其AUC等于1;而随机猜测的结果对应于条斜率为1的直线,此时AUC=0.5。因此,较高的AUC意味着更好的分类能力[^2]。 #### 使用场景考量 尽管ROC曲线提供了全面的理解视角,但在某些特定条件下可能不如其他类型的图表实用。例如,在处理高度不平衡的数据集时,精确率-召回率(Precision-Recall)图可能会提供更直观的信息[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值