1 条题解

  • 0
    @ 2025-6-24 21:15:51

    课堂练习

    1. 【NOIP2014】若有如下程序段,其中sabc均已定义为整型变量,且ac均已赋值,c>0c>0
    s = a;
    for (b = 1; b <= c; b++)
        s += 1;
    

    则与上述程序段功能等价的赋值语句是( )。

    A. s = a + b

    B. s = a + c

    C. s = s + c

    D. s = b + c

    【答案】B

    【分析】s初值是a,循环体执行c次,每次加1,因此s = a + c

    1. 【NOIP2014】要求按以下程序计算s = 1 + 1/2 + 1/3 + ··· + 1/10
    #include<iostream>
    using namespace std;
    int main() {
        int n;
        float s;
        s = 1.0;
        for (n = 10; n > 1; n--)
            s = s + 1 / n;
        cout << s << endl;
        return 0;
    }
    

    程序运行后输出结果错误,导致错误结果的程序行是( )。

    A. s = 1.0;

    B. for(n = 10; n > 1; n--)

    C. s = s + 1 / n;

    D. cout << s << endl;

    【答案】C

    【分析】将不同类型进行算术运算时,会进行类型转换。 - 级别从高到底:double > float > long long > int > char > bool; - 级别从高到底:无符号数 > 有符号数; 由于n是整数,因此表达式中的1/n会处理为整数除法,而这里我们需要的结果应该为实数。要使结果正确,需要使用实数除法,可以改为1.0/n1/(float)n等。

    1. 【NOIP2014】有以下程序:
    #include<iostream>
    using namespace std;
    int main() {
        int s, a, n;
        s = 0;
        a = 1;
        cin >> n;
        do {
            s += 1;
            a -= 2;
        } while (a != n);
        cout << s << endl;
        return 0;
    }
    

    若要使程序的输出值为2,则应该从键盘给n输入的值是( )。
    A. -1
    B. -3
    C. -5
    D. 0
    【答案】B
    【分析】要使得最终s = 2,需要执行两次do..while循环体,n的值应该为 -3。 4. 【NOIP2016】有以下程序:

    #include<iostream>
    using namespace std;
    int main() {
        int k = 4, n = 0;
        while (n < k) {
            n++;
            if (n % 3 != 0)
                continue;
            k--;
        }
        cout << k << "," << n << endl;
        return 0;
    }
    

    程序运行后的输出结果是( )。
    A. 2,2
    B. 2,3
    C. 3,2
    D. 3,3
    【答案】D
    【分析】continue语句的作用是跳过当前循环体未执行的语句(即本题的k--;),而继续执行下一次循环。当n < 3时,if条件始终成立,k不会发生任何变化,因此只有在n = 3时才会执行k--使得k = 3,并终止循环。 5. 【NOIP2018】为了统计一个非负整数的二进制形式中1的个数,代码如下:

    int CountBit(int x) {
        int ret = 0;
        while (x) {
            ret++;
            // 此处填空
        }
        return ret;
    }
    

    则空格内要填入的语句是( )。
    A. x >>= 1
    B. x &= x - 1
    C. x |= x >> 1
    D. x <<= 1
    【答案】B
    【分析】考察位运算知识。观察程序可知ret存的是x二进制1的个数,带入一些不同的x值到程序中,会发现x &= x - 1的作用是使x最低位的1置零,所以符合要求。 6. 【NOIP2013】下列程序中,正确计算1,2,.,100这100个自然数之和sum(初始值为0)的是( )。

    // A选项
    i = 1;
    do {
        sum += i;
        i++;
    } while (i <= 100);
    // B选项
    i = 1;
    do {
        sum += i;
        i++;
    } while (i > 100);
    // C选项
    i = 1;
    while (i < 100) {
        sum += i;
        i++;
    }
    // D选项
    i = 1;
    while (i >= 100) {
        sum += i;
        i++;
    }
    

    【答案】A
    【分析】可以正确的计算1,2,3,.,100之和,而B和D循环执行条件是i > 100,显然在i初始等于1的情况下,循环不会被执行。C只能求1至99的和。 7. 【NOIP2014】若有变量int afloat xy,且a = 7x = 2.5y = 4.7,则表达式x + a % 3 * (int)(x + y) % 2 / 4的值大约是( )。
    A. 2.500000
    B. 2.750000
    C. 3.500000
    D. 0.000000
    【答案】A
    【分析】考察运算符号的优先级和运算顺序。运算级优先级为()大于%*/大于+-,同一级别的从左往右计算,所以(int)(x + y)=7a % 3 * (int)(x + y) % 2 / 4 = 1 * 7 % 2 / 4 = 0,所以最后答案为x,即2.500000。 8. 【NOIP2014】设变量xfloat型且已赋值,则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是( )。
    A. x = (x * 100)+0.5 / 100.0;
    B. x = (x * 100 + 0.5) / 100.0;
    C. x = (int)(x * 100 + 0.5) / 100.0;
    D. x = (x / 100 + 0.5) * 100.0;
    【答案】C
    【分析】通过将float型强制转换为int型可实现截取整数的操作,而在截取之前加0.5,就实现了四舍五入的功能。本题也可以使用排除法,通过代入具体的数值进行验证。假设x = 1.116,A,B,C,D的计算结果分别为111.605,1.121,1.12,51.116。 9. 【NOIP2014】以下程序段实现了找第二小元素的算法。输入是n个不等的数构成数组S,输出S中第二小的数SecondMin。在最坏情况下,该算法需要做( )次比较。

    if (S[1] < S[2]) {
        FirstMin = S[1];
        SecondMin = S[2];
    }
    else {
        FirstMin = S[2];
        SecondMin = S[1];
    }
    for (i = 3; i <= n; i++)
        if (S[i] < SecondMin)
            if (S[i] < FirstMin) {
                SecondMin = FirstMin;
                FirstMin = S[i];
            }
            else {
                SecondMin = S[i];
            }
    

    A. 2n
    B. n - 1
    C. `2n

    不定项选择题

    1. 【NOIP2013】下列程序中,正确计算1,2,.,100这100个自然数之和sum(初始值为0) 的是( )。
    i=1;
    A. for(i=1;i<=100;i++) sum+=i; 
    i=1;
    B. while (1>100){ 
        i++; 
        sum+=i;
    }
    i=1;
    C. do{ 
        sum+=i; 
        i++;
    }while(i<=100); 
    i=1;
    D. do{
        sum+=i; 
        i++;
    }while(i>100);
    

    【答案】AC
    【分析】A和C可以正确的计算1到100的和,而B和D循环执行的条件是i > 100,显然在i初始等于1的情况下,循环不会被执行。

    • 1

    信息

    ID
    16
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    0
    上传者