TEST20221130第一阶段

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

选择题

1.

求输出结果:
int cnt = 0;
int fib(int n)
{
    cnt++;
    if (n == 0)
        return 1;
    else if (n == 1)
        return 2;
    else
        return fib(n - 1) + fib(n - 2);
}
void main()
{
    fib(8);
    printf("%d", cnt);
}

A.41
B.67
C.109
D.177

答案:B


2.

在上下文和头文件均正常情况下,以下程序的输出结果是(    )

int x = 1;
do {
    printf("%2d\n", x++);
} while (x--);

A.1
B.无任何输出
C.2
D.陷入死循环

答案:D

int main()
{
    int x = 1;
    do {
        printf("%2d\n", x++);
    } while (x--);
    return 0;
}


3.

下面的代码段中,执行之后i和j的值是什么(    )

int i = 1;
int j;
j = i++;

A.1,1
B.1,2
C.2,1
D.2,2

答案:C


4.

以下程序的k最终值是(    )

int i = 10;
int j = 20;
int k = 3;
k *= i + j;

A.90
B.50
C.70
D.30

答案:A


5.

以下C程序的输出结果是(    )

#include<stdio.h>
#include<stdlib.h>
int a = 1;
void test()
{
    int a = 2;
    a += 1;
}
int main()
{
    test();
    printf("%d\n", a);
    return 0;
}

A.1
B.2
C.3
D.4

答案:A


6.

以下描述中正确的是(    )

A.表示m>n为true或者m<n为true的表达式为m>n && m<n
B.switch语句结构中必须有default语句
C.如果至少有一个操作数为true,则包含“||”运算符的表达式为true
D.if语句结构中必须有else语句

答案:C


7.

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

A.必须在最开始
B.必须在系统调用的库函数的后面
C.可以任意
D.必须在最后

答案:C


8.

以下叙述不正确的是(    )

A.一个c源程序可由一个或多个函数组成
B.一个c源程序必须包含一个main函数
C.c程序的基本组成单位是函数
D.在c程序中,注释说明只能位于一条语句的后面

答案:D


9.

以下叙述正确的是(    )

A.在c程序中,main函数必须位于程序的最前面
B.c程序的每行中只能写一条语句
C.c语言本身没有输入输出语句
D.在对一个c程序进行编译的过程中,可发现注释中的拼写错误

答案:C


10.

在上下文及头文件据正常的情况下,执行如下代码,c的值是(    )

int a = 0, c = 0;
do {
    --c;
    a = a - 1;
}while(a > 0)

A.0
B.1
C.-1
D.死循环

答案:C


11.

假定x和y为double型,则执行x=2,y=x+3/2;后,y的值为(    )

A.3.500000
B.3
C.2.000000
D.3.000000

答案:D

int main()
{
    double x = 2;
    double y = x + 3 / 2;
//3/2为整数除法,等于1
    printf("%lf", y);
    return 0;
}


12.

以下for循环的执行次数是(    )

for (int x = 0, y = 0; (y = 123) && (x < 4); x++);

A.是无限循环
B.循环次数不定
C.4次
D.3次

答案:C

解析:(y = 123)——y被赋值:123,为真。

int main()
{
    int count = 0;
    for (int x = 0, y = 0; (y = 123) && (x < 4); x++)
  
 //x,y在for内进行初始化:程序先进入for内,再对y进行赋值,对x进行判断,最后进行调整
    {
        count++;
    }

    return 0;
}


13.

若有定义语句:int year=1009,*p=&year;以下不能使变量year中的值增至1010的语句是(    )

A.*p += 1;
B.(*p)++;
C.++(*p);
D.*p++;

答案:D

解析:操作符优先级的考察

A.
int main()
{
    int year = 1009;
    int* p = &year;
    *p += 1;

    printf("%d", year);
    return 0;
}

B.
int main()
{
    int year = 1009;
    int* p = &year;
    (*p)++;

    printf("%d", year);
    return 0;
}

C.
int main()
{
    int year = 1009;
    int* p = &year;
    ++(*p);

    printf("%d", year);
    return 0;
}

D.
int main()
{
    int year = 1009;
    int* p = &year;
    *p++;//加的是p

    printf("%d", year);
    return 0;
}


14.

选择表达式11|10的结果(本体数值均为十进制)(    )

A.11
B.10
C.8
D.2

答案:A

解析:

  |   按位或
运算法则:
有1则为1,全0方为0

11|10
11        00000000000000000000000000001011
10        00000000000000000000000000001010
得:     00000000000000000000000000001011        即,11


15.

char a; int b; float c; double d;
则表达式a*b+d-c值的类型为(    )

A.float
B.int
C.char
D.double

答案:D

解析:整型提升与算术转换的考察

编程题

1.求两个数的最小公倍数

正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:1≤a,b≤100000

思路:1,最大公约数相关定理:a,b为非零整数,a>b,a÷b=q……r,其中a与b的最大公约数等于b与r的最大公约数,表示为:
          (a,b)=(b,r);
        2.先找出最大公因数(Greatest Common Factor:Gcd/Highest Common Factor:Hcf),
          再找出两数分别除以最大公因数的商:quo1,quo2(Quotient 商),
          再将这三个数相乘求积,即为最小公倍数(Least Common Multiple:LCM/Lowst Common Multiple:LCM)。
          即可表示为:gcd*quo1*quo2=a*quo2=b*quo1=lcm

int main()
{
    int A = 0;
    int B = 0;
    scanf("%d %d", &A, &B);
    int a = A;
    int b = B;
    int quo = a / b;
    int rem = a % b;
    for (rem = a % b; rem != 0; rem = a % b)
    {
        quo = a / b;
        a = b;
        b = rem;
    }
    int gcd = b;

    int q = A / gcd;

    int lcm = 0;
    lcm = q * B;

    printf("%d\n", lcm);

    return 0;
}

标准答案:

(1)

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);

    //求最小公倍数
    int m = (a > b ? a : b);
    while (m % a != 0 || m % b != 0)
//m%a==0并且m%b==0,跳出循环:最小公倍数——最小的刚好能整除a和b的数。
    {
        m++;
    }
    printf("%d\n", m);

    return 0;
}

(2)

思路:
设m为a和b的最小公倍数,且m/a=i,
则必有:a * i % b == 0;

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);

    int i = 1;
    while (a * i % b != 0)
    {
        i++;
    }
    printf("%d\n", a * i);
    return 0;
}

拓展:求三个数的最小公因数

思路:


2.倒置字符串

将一句话的单词进行导致,标点不倒置,比如:I like Beijing.  倒置后为:Beijing. like 1

标准答案:

思路:
(1).逆序整个字符串;  .gnijieB ekil I
(2).逆序每个单词。    Beijing. like I

#include<string.h>
#include<assert.h>

void reverse(char* left, char* right)
{
    assert(left && right);
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[100] = { 0 };
    
//因为字符串中含空格,因此选用gets()
    gets(arr);
    int len = strlen(arr);

    //逆序字符串
    reverse(arr, arr + len - 1);
    
    
//逆序单词
    char* cur = arr;//因为从始至终都是在一个数组内进行置换,因此需保留数组名储存首元素地址。
    while(*cur)//'\0'结束
    { 
        char* start = cur;
//cur会++,存放单词首地址,与cur分别对应单词首元素地址和末元素地址,方便倒置
        while (*cur != ' ' && *cur != '\0')//打印每个单词
        {
            cur++;
//下标增加,至空格或'\0'停止。
        }
        reverse(start, cur - 1);
//以第一段为例,现在还是".gnijieB",需将其倒置为"Beijing."。
        if (*cur != '\0')//如果不对'\0'加以限制,cur++又会进入新的空间,从而造成死循环。
            cur++;//刚刚是遇到空格,cur++,跳过空格,进入下一次循环
    }
    printf("%s\n", arr);

    return 0;
}

 

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值