2022级物联兴趣小组第二次考核答案解析

一、选择题

1、以下选项中,不能正确赋值的是: ()

A、 char s1[10];s1=”Ctest”; 

B、 char s2[]={‘C’, ‘t’, ‘e’, ‘s’, ‘t’};

C、 char s3[20]=”Ctest”; 

D、 char *s4=”Ctest\n”

答案:A

2、有定义:char*p1,*p2;则下列表达式中正确合理的是()

A、p1/=5

B、p1+=5

C、p1=p2

D、p1*=p2

答案:C

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

C
#include <stdio.h>
void sub(int *s,int *y)
{
    static int t = 3;
    *y = s[t];
    t--;
}
int main()
{
    int a[]={1,2,3,4},i,x=0;
    for(i=0;i<4;i++)
    {
        sub(a,&x);
        printf("%d ",x);
    }
}

A、4 4 4 4

B、0 0 0 0

C、1 2 3 4

D、4 3 2 1

答案:D

4、设char *s=”\ta\017bc”;则指针变量s指向的字符串所占的字节数是()

A、7

B、6

C、9

D、5

答案:B

5、以下叙述正确的是()

A、用do-while构成循环时,只有在while后的表达式为非零时结束循环。

B、do-while语句构成的循环不能用其它语句构成的循环来代替。

C、用do-while构成循环时,只有在while后的表达式为零时结束循环。

D、do-while语句构成的循环只能用break语句退出。

答案:C

6、以下程序的执行结果是________.

C
#include <stdio.h>
int main()
{ 
    int  w=1,x=2,y=3,z=4;
    w =( w < x ) ? x : w;
    w =( w < y ) ? y : w;
    w =( w < z ) ? z : w;
    printf( "%d",w);
}

A、2

B、4

C、3

D、1

答案:B

二、判断题

1、假设有 int a[10],  *p; 则p=&a[0]与p=a等价()

答案:正确

2、a=(b=4)+(c=6) 是一个合法的赋值表达式()

答案:正确

3、C程序总是从程序的第一条语句开始执行()

答案:错误

4、在程序中定义了一个结构体类型后,可以多次用它来定义具有该类型的变量()

答案:正确

5、如果想使一个数组中全部元素的值为0,可以写成 int a[10]={0*10};()

答案:错误

三、填空题

1、表达式 (int)((double)(5/2)+2.5) 的值是_____.

答案:4

2、阅读下面程序,程序执行后的输出结果为_____.

C
#include "stdio.h"
int main()
{
    char a,b;
    for(a='0',b='9';a<b;a++,b--)
        printf("%c%c",a,b);
    printf("\n");
}

答案:0918273645

3.以下程序的执行结果是_____.

C
#include "stdio.h"
int main()
{
    int a, b, *p = &a, *q = &b;
    a = 10;
    b = 20;
    *p = b;
    *q = a;
    printf("a=%d,b=%d\n", a, b);
}

答案:a=20,b=20

4、以下程序的输出结果是_____

C
#include <stdio.h>
#define PR(ar) printf("ar = %d", ar)
int main()
{   int j,a[]={1,3,5,7,9,11,13,15},*p=a+5;
    for(j=3;j;j--)
        switch(j)
        {   case 1:
            case 2:PR(*p++);break;
            case 3:PR(*(--p) );
        }
}

答案:ar = 9ar = 9ar = 11

四、编程题

1、输入数字N,输出一个N*N的蛇形矩阵(N<=100,矩阵方向如下)

方向由1->2->3->4->5->……->N*N
按顺序增加

输入:

5

输出:

1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25

参考代码:

C
#include <stdio.h>
int main()
{
    int n, i = 0, j = 0, num = 1;
    scanf("%d", &n);//读取n
    int matrix[100][100] = {0};//假设矩阵大小不超过100x100
    while(num<=n*n)//填充矩阵
    {
        matrix[i][j]=num++;//填充数字并递增num
        if((i + j) % 2 == 0)//判断移动方向
        {//偶数,向上移动
            if(j == n - 1)i++;//触及右边界,向下移动
            else if(i == 0)j++;//触及上边界,向右移动
            else{ i--; j++;}//否则,向上移动
        }else
        {//奇数,向下移动
            if(i == n - 1)j++;//触及下边界,向右移动
            else if(j == 0)i++;//触及左边界,向下移动
            else {i++;j--;}//否则,向下移动
        }
    }
    for(i = 0; i < n; i++)//打印填充后的矩阵
    {
        for(j = 0; j < n; j++)
        {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n"); // 每一行打印完毕后换行
    }
    return 0;
}

2、使用指针来完成下列编程题目

(1)使用指针比较三个数的大小(注:使用其他方法0分,且三个数不固定 )

(2)使用指针比较三个字符串的大小(长度)

(1) 参考代码:

C
#include <stdio.h>
int main()
{
    int a, b, c;
    int *max, *mid, *min;//使用三个指针来表示最大、中间和最小的数
    scanf("%d %d %d", &a, &b, &c);
    /*初始化指针*/
    max = &a;
    mid = &b;
    min = &c;
    if (*max < *mid)//找到最大的数
    {
        max = &b;
        mid = &a;
    }
    if (*max < *min)
    {
        int *temp = max;
        max = min;
        min = temp;
    }
    if (*mid < *min)// 确保mid是中间的数
    {
        int *temp = mid;
        mid = min;
        min = temp;
    }
    printf("%d > %d > %d\n", *max, *mid, *min);
    return 0;
}
展开所有

(2) 参考代码:

C
#include <stdio.h>
#include <string.h>
int main()
{
    char str1[100], str2[100], str3[100];
    char *s1 = str1;
    char *s2 = str2;
    char *s3 = str3;
    scanf("%99s %99s %99s", str1, str2, str3);//%99s避免缓冲区溢出
    /*指针指向字符串,用于比较长度*/
    char *longest = s1;
    char *second = s2;
    char *third = s3;
    /*比较长度并重新指派指针*/
    if(strlen(s2) > strlen(longest))
    {
        second = longest;
        longest = s2;
    }
    if(strlen(s3) > strlen(longest))
    {
        third = second;
        second = longest;
        longest = s3;
    }
    if(strlen(second) > strlen(third))
    {
        char *temp = second;
        second = third;
        third = temp;
    }
    printf("最长的字符串: %s\n", longest);
    printf("中间的字符串: %s\n", third);
    printf("最短的字符串: %s\n", second);
    return 0;
}
展开所有

3、rand()函数为C语言中生成随机数的函数,其头文件为“stdlib.h” ,“time.h”。
用法为:
srand((unsigned)time(NULL)); //放在初始化结束的开始
rand()%N; //生成N以内的随机数
现有一个长度为10的数组,内容为{1,5,70,11,33,44,77,99,12,82}
需要将原有数组随机打乱输出。
(注:需要保持多次的输出不一致,不满足则0分)

例:

输入:
输出:{77,5,1,11,33,44,70,99,82,12}
输出:{33,5,1,12,70,44,99,77,82,11}
输出:(无特定输出)

参考代码:

C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int array[10] = {1, 5, 70, 11, 33, 44, 77, 99, 12, 82};
    int n = 10;
    srand((unsigned)time(NULL));//初始化随机数生成器
    for (int i = n - 1; i > 0; i--)//使用Fisher-Yates洗牌算法打乱数组
    {
        int j = rand() % (i + 1);//生成一个[0, i]范围内的随机数
        /*交换array[i]和array[j]*/
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    printf("{");//打印打乱后的数组
    for (int i = 0; i < n; i++)
    {
        printf("%d", array[i]);
        if (i < n - 1)
        {
            printf(", ");
        }
    }
    printf("}\n");
    return 0;
}

4、将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如:n = 7, k = 3,下面三种分法被认为是相同的:

1 , 1 , 5 ;
1 , 5 , 1 ;
5 , 1 , 1 ;

问有多少种不同的分法。

输入格式

n,k (6<n<=200,2<=k<=6)

输出格式

一个整数,即不同的分法。

示例:输入:7,3 输出:4

参考代码:

C
#include <stdio.h>
#include <string.h>
int main()
{
    int n, k;
    scanf("%d,%d", &n, &k);//输入n和k,注意中间的逗号
    int dp[n+1][k+1];//dp[i][j]表示和为i,长度为j的不同分法的数量
    memset(dp, 0, sizeof(dp));
    dp[0][0] = 1;//初始化,长度为0且和为0的分法只有1种
    for(int x = 1; x <= 5; x++)//对于每个数字1到5,更新动态规划DP表
    {
        for(int i = x; i <= n; i++)//从数字x开始,因为至少需要和为x
        {
            for(int j = 1; j <= k; j++)
            {
                dp[i][j] += dp[i - x][j - 1];//使用不小于前一个数字的数字
            }
        }
    }
    printf("%d\n", dp[n][k]);//输出不考虑顺序的分法数量
    return 0;
}

5、给你一个非递减的有序整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数。

示例:

输入:arr = [1,2,2,6,6,6,6,7,10]

输出:6

参考代码:

C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char input[200];//假设输入的字符串长度不会超过200个字符
    int arrSize = 0;//用于计算数组中的元素个数
    printf("输入一个非递减的有序的整数数组,格式为'arr = [元素1,元素2,……,元素n]':\n");
    fgets(input, 200, stdin);//读取整行输入并解析数组元素个数
    //预先遍历一遍字符串以确定数组大小
    for(int i = 0; input[i] != '\0'; ++i)
    {
        if (input[i] == ',')
        {
            ++arrSize;
        }
    }
    ++arrSize;//数组的大小是逗号数量加1
    int *arr = (int *)malloc(arrSize * sizeof(int));//动态分配数组
    /*解析输入字符串并填充数组*/
    char *token = strtok(input, "[,] ");//使用strtok函数分割字符串
    for (int i = 0; token != NULL && i < arrSize; ++i)
    {
        arr[i] = atoi(token);//将分割出来的字符串转换为整数
        token = strtok(NULL, "[,] ");//继续分割
    }
    /*查找超过25%的元素*/
    int threshold = arrSize / 4;
    for (int i = 0; i <= arrSize - threshold; ++i)
    {
        if (arr[i] == arr[i + threshold])
        {
            printf("%d\n", arr[i]);
            free(arr);//释放内存
            return 0;//找到答案,退出程序
        }
    }
    free(arr);//释放内存
    return 0;//程序结束
}
展开所有

完结