Bootstrap

青少年编程能力等级测评CPA C++(三级)-试卷2

青少年编程能力等级测评CPA C++(三级)-试卷2

一、单项选择题(共15题,每题3分,共45分)

CP3_2_1.在宽度为500米的河道上,修建一个拦河大坝。施工队每天筑坝50米,由于当时条件所限,晚上又被河流冲毁15米,求施工队需要几天完成500米的筑坝任务。下列代码实现该功能,则/**(1)**/处需要填写的语句是(  )。

#include <iostream>

using namespace std ;

int main(void) {

    int amount = 0;

    int days = 0;

    while (true) {  

        amount += 50;

        days++;

        if (amount >= 500)

            break;  

        /**(1)**/

    }

    cout << days << endl;  

    return 0;

}

A.amount += 15;

B.amount += 50;

C.amount -= 15;

D.amount -= 50;

CP3_2_2.下列有关穷举算法的叙述中,不正确的是(  )。

A.使用穷举法,必须满足的条件是解的个数有限且可以列举

B.使用穷举法,需确定答案要满足的条件

C.穷举法得到的结果一定是正确的

D.穷举法适用于任何问题

CP3_2_3.有数列1,1/1!,1/2!,1/3!,1/4!,1/5!...(其中n!表示n的阶乘),下列代码计算数列第10项的值,则迭代关系语句是(  )。

#include <iostream>

using namespace std;

int main(){

    int i=1;

    double num=1.0;

    while(i <10){

        num *= 1.0 / i;

        i++;

    }

    cout<<num<<endl;

    return 0;

}

A.double num=1.0;;

B.int i=1;

C.整个while()循环语句

D.num *= 1.0 / i;

CP3_2_4.运行下列代码,输出结果是(  )。

#include <iostream>

using namespace std;

int main( ){

    int a[ ] = {1,2,3,4,5},b[5];

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

        b[i]=a[i]+a[4-i];

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

        cout<<b[i]<< '\t';

    return 0;

}

A.3 3 3 3 3

B.6 6 6 6 6

C.3 5 7 9 6

D.2 4 6 8 10

CP3_2_5.使用选择排序算法(每趟最多交换一次)对一组数“19,28,12,7,66,31,24”进行升序排序,则第三趟结束后,这组数的顺序是(  )。

A.19,28,12,7,66,31,24

B.7,19,12,28,66,31,24

C.7,12,19,24,66,31,28

D.7,12,19,28,66,31,24

CP3_2_6.用直接插入排序算法对一组数“100,80,12,66,31,19,28”进行升序排序,则第四趟结束后,这组数的顺序是(  )。

A.80,100,12,66,31,19,281

B.12,80,100,66,31,19,282

C.12,31,66,80,100,19,284

D.12,66,80,100,31,19,283

CP3_2_7.用冒泡排序算法对一组数“48,98,23,45,62,51”进行升序排序,下列叙述正确的是(  )。

A.对于这组数排好序需要1趟

B.对于这组数排好序需要2趟

C.对于这组数排好序需要3趟

D.对于这组数排好序需要4趟

CP3_2_8.下列有关排序算法稳定性的叙述中,正确的是(  )。

A.如待排序的一组数有相同的数值,排序后这些数的相对次序一定保持不变,则排序算法是稳定的

B.同一组数的初始顺序不同,排序总的比较次数相同,则排序算法是稳定的

C.同一组数的初始顺序不同,排序总的交换次数相同,则排序算法是稳定的

D.同一组数的初始顺序不同,排序总的比较次数和总的交换次数都相同,则排序算法是稳定的

CP3_2_9.已经按升序排列好的一组数“20,40,47,58,62,82,94”,使用二分查找算法在这组数中查找200,判断出200不在这组数中,需要比较的次数是(  )。

A.3次

B.4次

C.1次

D.2次

CP3_2_10.一个装有16枚硬币的袋子,其中有一个硬币是伪造的,并且伪造的硬币比真的硬币要轻(真币重量10,假币重量9)。现有一台可用来比较两组硬币重量的仪器(下面程序中的sum函数模拟对一组硬币称重),下列程序使用分治法找出那枚伪造的硬币(输出伪币的下标)。在/**(1)**/处应填写的表达式为(  )。

#include <iostream>

using namespace std;

int sum(int a[], int m, int n)    //求重量和 (a[m]+a[m+1]+…+a[n])

{

    int sum = 0;     

    for (int i = m; i <= n; i++)     

    {         

        sum += a[i];

    }

    return sum;

}

int find(int a[], int left, int right) {

    if (right - left == 1)  //只剩2个硬币

        return a[right] > a[left] ? left : right;

    int mid = (right + left) / 2;

    if ((right - left) % 2 == 0)//硬币数量为奇数

    {

        if(a[mid]<10)   //mid 就是伪币,返回下标mid 

            return mid;    

        int sumLeft = sum(a, left, mid - 1);   //前面一组硬币重量之和

        int sumRight = sum(a, mid + 1, right); //后面一组硬币重量之和

        if(sumLeft > sumRight)    //假币在后面一组

            return find(a, mid + 1, right);

        else      //假币在前面一组

            return find(a, left, mid - 1);

    }

    else //硬币数量为偶数

    {         

        int sumLeft = /**(1)**/ ;

        int sumRight = sum(a, mid + 1, right);

        if(sumLeft > sumRight)  

            return find(a, mid + 1, right);

        else

            return find(a, left, mid - 1);  

    }

 }

int main()

{

    int a[16]= {10,10,10,10,10,10,9,10,10,10,10,10,10,10,10,10};

    int index = find(a,0,15);

    cout << index << endl;

    return 0;

}

A.sum(a, left, mid - 1)

B.sum(a, mid , right)

C.sum(a, left, mid)

D.sum(a, mid, right)

CP3_2_11.使用贪心法求解0-1背包问题。已知一背包能装入25kg的物品,现有重量、价值各不相同的8件物品,如何选择装入背包的物品,使装入物品的总价值最大。贪心策略是优先将性价比高的物品装入背包。下列代码实现该功能,则/**(1)**/处需要填写的语句是(  )。

说明:程序中定义了cmp()函数,是为了使用sort(items,items+n,cmp) 对items按性价比降序排序。

#include<iostream>

#include<algorithm>

using namespace std;

struct item{  //物品

    float weight;  //重量

    float value;   //价值

    float ratio;   //性价比(单位重量的价值)

};

bool cmp(struct item a, struct item b) //排序用的函数,考生不必研究 

{

    return a.ratio > b.ratio;

}

int main()

{

    int n=8;

    float c = 25;  //背包剩余的容量(还可以装入物品的重量)

struct item items[] = { {5,10},{8,11},{6,9},{2,8},

                             {7,19},{8,15},{1,1},{2,1} };

    for(int i=0; i<n; i++)  //计算性价比

       items[i].ratio = items[i].value/items[i].weight;

    sort(items,items+n,cmp);   //对items按性价比降序排序究 

    float sum= 0;    //已装入物品的总价值

    for (int i = 0; i < n; i++)

    {

        if ( items[i].weight <= c)  //将物品i装入背包

        {

            sum += items[i].value;

            /**(1)**/

        }

     }

     cout << "装入的总价值:" << sum << endl;

}

A.c -= items[i].weight;

B.c += items[i].weight;

C.c -= items[i].value;

D.c += items[i].value;

CP3_2_12.执行下列程序,输出结果是(  )。

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

    char a[10] = "Program";

    char b[10] = "Programer";

    char c[10] = "Problem";

    int i,j,k;

    i = strcmp(a,b);

    j = strcmp(a,c);

    k = strcmp(a,"Program");

    cout << i <<"  " << j << "  " << k <<  endl;

    return 0;

}

A.1  -1  0

B.-1  1  0

C.-1  0  1

D.1  0  -1

CP3_2_13.执行下列程序,输出结果是(  )。

#include <iostream>

#include <string>

using namespace std;

int main()

{

    string s1= "Program";

    string s2;

    s2.assign(s1,2,4);

    cout << s2 <<  endl;

    return 0;

}

A.Program

B.ogram

C.ogra

D.ra

CP3_2_14.若对如图所示的有向图进行遍历,则属于深度优先遍历序列的是(  )。

A.A→B→E→C→D→F→G

B.A→B→C→E→D→F→G

C.A→B→F→G→E→C→D

D.A→B→C→E→F→G→D

CP3_2_15.下列有关面向对象程序设计的叙述中,错误的是(  )。

A.在面向对象程序设计中,程序的模块是由类构成的

B.在面向对象程序设计中,将数据与操作数据的函数封装在一起构成类

C.在面向对象程序设计中,继承可以减少程序中的重复代码

D.在面向对象程序设计中,多态是指一个类中不同的函数完成不同的功能

二、多项选择题(共5题,每题3分,共15分)

CP3_2_16.下列有关排序算法的叙述中,正确的有(  )。

A.选择排序,总的比较次数和数据的初始顺序无关

B.插入排序,所需时间与数据的初始顺序有关

C.冒泡排序是不稳定的排序

D.插入排序,第k次外层循环后,前k个元素已经是排好序的

CP3_2_17.下列有关局部最优解和全局最优解的叙述中,不正确的有(  )。

A.若一项决策和解决该问题的所有决策相比较是最优的,被称为全局最优解

B.若一项决策和解决该问题的部分决策相比较是最优的,被称为局部最优解

C.全局最优解不一定是局部最优解

D.任何问题都可以使用贪心算法得到全局最优解

CP3_2_18.若对如图所示的无向图进行遍历,则属于广度优先遍历序列的有(  )。

A.A→B→C→D→E→F→G→H

B.A→B→D→C→F→E→G→H

C.A→C→B→F→E→D→G→H

D.A→C→F→E→G→H→B→D

CP3_2_19.下列关于面向对象程序设计的叙述中,正确的有(  )。

A.在面向对象的程序设计中,类的数据成员称为属性

B.在面向对象的程序设计中,类的函数成员称为方法

C.类的方法只能在类的内部定义

D.类的方法可以在类的内部定义,也可以在类的外部定义

CP3_2_20. 有如下Test类的定义,则下列有关该类对象定义的语句,不正确的有(  )。

class Test

{

public:

    Test (int i){}

    Test (int i, int j, int k){}

};

A.Test a;

B.Test a1(1);

C.Test a2(1,2);

D.Test a3(1,2,3);

三、编程题(共2题,每题20分,总分40分)

CP3_2_21.

一渔夫打鱼三天,然后晒网两天,一直这样循环作业,打鱼一天可以赚300元,晒网一天需要花费30元,编写程序,输入一个正整数代表渔夫需要赚的钱数,输出渔夫为赚够这些钱需要作业的天数。

样例1

输入:1000

输出:6

样例2

输入:6000

输出:36

CP3_2_22.

小明学习二分查找算法后,想编写一个C++关键字查询程序。首先将学过的15个C++的关键字按升序的顺序存放到二维字符数组中,然后输入要查找的关键字,如果查到则输出该关键字的位置索引;若没有查到则输出-1。

注意

编程过程中对于程序给定的部分不允许修改,考生仅允许在/****code****/提示行区间内作答。

#include <iostream>

#include <cstring>

using namespace std;

int search(char words[][30], int length, char *key);

int main()

{

    char words[15][30]={"bool","break","case","char","continue",

                           "do", "double", "else", "float", "for","if",

                           "int","long","switch","while"};  

    char key[30];  //要查找的关键字

    cin >> key;    

    int index = search(words, 15, key);//返回待查找关键字的索引,找不到返回-1

    cout << index << endl;

}

int search(char words[][30], int length, char *key)

{

    /************code**********/

     

     

    /************code**********/

}

样例1

输入:float

输出:8

样例2

输入:floor

输出:-1

;