c语言每日一练(11)

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

五道选择题:

1.执行完下面一段程序后输出的值是()

#include<stdio.h>
int main()
{
int a = 1,b = 3,c = 5,d = 4;
int x = 0;
if (a < b)//1
if (c < d) x = 1;//2
else//3
if (a < c)//4
if (b < d) x = 2;//5
else x = 3;//6
else x = 6;//7
else x = 7;//8
printf("%d", x);
}

A、1     B、2     C、3      D、6

解析:易错题, 观察代码发现在代码1之前所做的操作只是简单地对变量初始化,到了代码1之后则是一大堆的if,else,这个地方其实考察的便是if,else的匹配问题,if,else的匹配在没有外界因素的影响之下秉承着就近原则,也就是if和else的相对距离小的会互相匹配上,根据这个我们可以得出,2和3匹配,5和6匹配,4和7匹配,1和8匹配

明白了匹配关系之后我们顺着代码走就行了,首先a<b成立,走到2,c<d不成立,走到3再走到4,a<c成立,走到5,b<d成立,令x=2,剩下的else就不用走了,因为之前已经匹配过了。故最后打印出来的是2,选B

拓展:当a=4,b=3,c=5,d=4时会打印出来什么(其他不变),                                           

拓展解析:根据if,else的匹配问题,在a<b不成立时,就已经走到了代码8,令x=7,故最后会打印出7

2、以下程序的运行结果是()

#include<stdio.h>
int main()
{
	int m = 6;
	if (m++ > 6)
	printf("%dn", m);
	else 
	printf("%dn", --m);
}

A、4       B、5      C、 7     D、 6

解析:前面有好好做题的小伙伴看到这道题估计是直呼简单。首先定义并初始化m=6,接着走if,后置++,先使用后++,因此6>6不成立,走到else,此时m=7,最后前置--,先--后使用,所以m-1=6,并打印,故最后输出6,选D

3、以下程序运行的结果是()

#include<stdio.h>
int main()
{
	int k;
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	for (k = 0; k < 3; k++) 
	printf("%d ", a[2 - k][k]);
}

A、3 6 9      B、7 5 3     C、9 6 3     D、3 5 7

解析:观察代码发现,主要部分就是一个循环打印。首先定义了一个二维数组,并在里面存放1,2,3,4,5,6,7,8,9接着在循环中打印二维数组中的对应内容。

循环次数少,不需要找规律直接代入,当k=0时,打印a[2][0],当k=1时,打印a[1][1],当k=2时,打印a[0][2]。a[2][0]根据数组的下标就是打印出第三行第一个元素,也就是7,a[1][1]打印出第二行第二个元素,5,a[0][2]打印出第一行第三个元素,3。综上所述,选B

4、有两个字符数组a和b,则以下正确的语句是_________()【多选】
A、printf("%s %s",a,b);      B、scanf(“%s %s”,a,b);

C、scanf("%s %s",&a+1,&b+1);D、printf("%s %s",&a,&b);

解析:易错题,考察的是你对于指针,scanf和printf的综合理解。首先我们要明白的一点就是,数组的名字往往代表着它们的首地址,本题没有特殊情况,下一题我给大家讲一种特殊情况。

选项A,以字符串的形式打印a和b,没取地址,但数组名本身此时是地址,故可以,A正确。选项B,使用scanf对a,b字符串修改,此时数组名依然是地址,没毛病,B正确。

选项C,首先对数组名取地址得到的地址确实就是数组的首地址,但是,它的权重是整个数组,什么意思,就是a+1是跳过一个元素,&a+1则是跳过整个数组,C越界,故错误。选项D,对数组名取地址,得到数组首地址并进行打印,没问题,D正确

 5、在32位平台下程序运行的结果是()

#include<stdio.h>
int main()
{
	int a = 0;
	char b[9] = "abc";
	int arr[3] = { 0 };
	printf("%d ", sizeof(&a));//1
	printf("%d ", sizeof(a));//2
	printf("%d ", sizeof(&b));//3
	printf("%d ", sizeof(b));//4
	printf("%d ", sizeof(&arr));//5
	printf("%d ", sizeof(arr));//6
}

A、4 4 4 4 4 4 B、4 4 4 9 4 3   C、4 4 4 9 4 12   D、4 4 4 9 4 4

解析:在32位平台下地址的字节数为4,因此一遇到地址就直接判定为4。代码1,地址,打印4。代码2,整型变量的字节大小为4,打印4。代码3,地址,打印4。代码4,数组名,地址,打印4,代码5,地址,打印4,代码6,地址,打印4,所以答案为4 4 4 4 4 4,选A,好像很合理,实则大错特错。在使用sizeof的时候数组名所代表的并不是数组首元素的地址而是整个数组   也就是说,sizeof(数组)计算的是整个数组所占的字节数,所以代码4和代码6应该打印出9和12,故答案为,4,4,4,9,4,12选C 

 编程题1:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

int diagonalSum(int** mat, int matSize, int* matColSize){
int sum=0;
int i=0;
for(i=0;i<matSize;i++)
{
   sum+=mat[i][matSize-i-1]+mat[i][i];
   //将对角线上的加起来
}
if(matSize%2!=0)
//为奇数有重复,要减去
{
  i=matSize/2;
  sum-=mat[i][i];
}
return sum;
}

编程题2:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

提示:注意细节,避免越界,避免忽略特殊情况,其次还需要注意的一点则是已经有花的地方不能再种了

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
    int i = 0;
    int count = 0;
    if (n == 0)
        //特殊情况单独处理
        return true;
    if (flowerbedSize == 1)
        //特殊情况单独处理
    {
        if (flowerbed[0] == 0)
            return true;
        else
            return false;
    }

    for (i = 0; i < flowerbedSize; i++)
    {
        if (flowerbed[i] == 1)
            //有花了就直接跳过
        {
            continue;
        }
        if (i == 0)
            //第一个元素和最后一个元素正常处理会越界,单独考虑
        {
            if (flowerbed[1] == 0)
            {
                flowerbed[0] = 1;
                count++;
                //种上了计数器+1并修改对应位置的值
                continue;
                //种上了就直接返回
            }
            else
                continue;
            //没种上意味着不能种也返回
        }

        if (i == flowerbedSize - 1)
        {
            if (flowerbed[flowerbedSize - 2] == 0)
            {
                flowerbed[flowerbedSize - 1] = 1;
                count++;
                //种上了计数器+1并修改对应位置的值
                continue;
                //种上了就直接返回
            }
            else
                continue;
            //没种上意味着不能种也返回
        }
        if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0)
            //通常情况分析
        {
            flowerbed[i] = 1;
            count++;
            //种上了计数器+1并修改对应位置的值
            continue;
        }
    }
    if (n <= count)
    {
        return true;
    }
    else
        return false;
}

好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O