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、以下程序的输出结果是()
#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、以下程序的执行结果是________.
#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、阅读下面程序,程序执行后的输出结果为_____.
#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.以下程序的执行结果是_____.
#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、以下程序的输出结果是_____
#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 | 6 | 7 | 15 |
3 | 5 | 8 | 14 | 16 |
4 | 9 | 13 | 17 | 22 |
10 | 12 | 18 | 21 | 23 |
11 | 19 | 20 | 24 | 25 |
按顺序增加
输入:
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
参考代码:
#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) 参考代码:
#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) 参考代码:
#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}
输出:(无特定输出)
参考代码:
#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
参考代码:
#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
参考代码:
#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;//程序结束
}