c语言每日一练(5)

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

五道选择题:

1、下面代码的结果是:( )

#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;//1
	c = ++a;//2
	b = ++c, c++, ++a, a++;//3
	b += a++ + c;//4
	printf("a = %d b = %d c = %d\n", a, b, c);
	return 0;
}

A. a = 8 b = 23 c = 8      B. a = 9 b= 23 c = 8

C. a = 9 b = 25 c = 8      D. a = 9 b = 24 c = 8

解析:观察代码,发现目标是打印出a,b,c对应的值,我们计算出打印的时侯a,b,c的值问题就解决了,可以看出,在打印之前,使用了很多++运算符。因此关键这题的解题关键就在于你对++运算符的理解

++运算符分为两种,一种是前置++,一种是后置++,举个例子,++a就是前置++,a++就是后置++,这两种++的区别就在于,前置++是先++后使用,后置++是先使用后++。比方说

可以看出,x一开始被初始化为3,y=x++,y是先等于3,x再++。z=++x,是先令x++再让z=x

#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;//1
	c = ++a;//2
	b = ++c, c++, ++a, a++;//3
	b += a++ + c;//4
	printf("a = %d b = %d c = %d\n", a, b, c);
	return 0;
}

 我们继续做题,代码1令a=5,代码2令a先++使a=6,再让c=a,使c=6。

代码3是逗号表达式,根据之前所学我们知道,逗号表达式从左往右计算,计算结果为最后一个表达式,从左往右走,先是++c使c+1等于7,再是c++使c+1令c等于8,接着是++a,使a+1等于7,再是a++使b先等于a,a此时=7,故b=7。再令a++,使a为8。

来到代码4,代码4令b+=a++ +c,换种写法就是令b=b+a++ + c,是后置++,先不管,b=b+a+c=8+7+8=23,最后再让a加1为9,因此,a,b,c最后的值分别是,9,23,8,故选B

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

char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);

 A、'a' 'b'      B、ab\0c\0     C、ab c     D、ab

解析:这题考察的是对于字符串的理解,打印字符串,打印到'\0'就停止,没遇到'\0'就会一直打印到遇到'\0'为止    代码将a,b,'\0',c,'\0'一个一个字符放进了c这个字符数组中,并用打印字符串的形式打印,但刚打印完a,b就遇到了'\0'字符串结束标志,所以就会停止打印。故选C

3、在下面的字符数组定义中,哪一个有语法错误( )

 A、char a[20]="abcdefg"; B、char a[]="x+y=5.";

C、char a[15];                   D、char a[10]='5';

解析:A,B选项都使用了字符串初始化数组,可能你不明白为什么可以用字符串初始化数组,但做这道题的时候你就应该直接排除掉A,B。之所以可以用字符串来初始化数组,是因为,字符串的特殊性,字符串本身代表首元素的地址。而C选项它没有初始化数组,当然不能算错。但是D选项就出问题了,它这个操作无异于char a[10]=0;因为字符的存储是用ASCII码值实现的,可以将字符看作一种整型。所以D错

 4、下列程序的输出是( )

#include<stdio.h>
int main()
{
	int a[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, * p[4], i;
	for (i = 0; i < 4; i++)
		p[i] = &a[i * 3];
	printf("%d\n",p[3][2]);
	return 0;
}

A、上述程序有错误          B、6        C、8       D、12 

解析:观察代码可以看出它创建了一个整型数组a,和一个整型指针数组p,然后通过for循环将数组a首元素的地址,第4个元素的地址,第7个元素的地址,以及第10个元素的地址放了进去,最后要打印p[3][2],[3]可以找到第10个元素,那么[3][0]为第10个,[3][1]为第11个,故[3][2]为第12个,所以最后打印出12,故选D 

5、以下逗号表达式的值为( )

(x = 4 * 5, x * 5,x+5);

A、25        B、20      C、100      D、45 

 解析:易错题,逗号表达式从左往右计算,先算x=4*5,故此时x=20,又令x*5,但没有写做x=x*5,故x依然是20,最后让x+5即25,所以该逗号表达式最后的值为25,选A

 编程题1:

记负均正_牛客题霸_牛客网

思路:这题很简单,遇到负数计数器+1,遇到正数,就给你创建的统计总和的变量加上,最后打印出负数的个数,和使用保留一位小数的方式打印出正整数的平均值即可。

#include <stdio.h>
int main() {
    int n = 0;
    scanf("%d", &n);
    int i = 0; float sum = 0;//正整数总和
    int a_count = 0; int b_count = 0;
    //计数器
    for (i = 0; i < n; i++)
    {
        int a = 0;
        scanf("%d", &a);
        if (a < 0)
        {
            a_count++;
            //负数计数器
        }
        else if (a > 0)
        {
            sum += a;
            b_count++;
            //正数计数器
        }
    }
    if (b_count != 0)
        //除数不能是0
    {
        sum /= b_count;
    }
    printf("%d %.1f", a_count, sum);
}

编程题2: 

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

思路:由于数组1~n的数都有,且只有一个重复,一个缺失,那么我使用1^2^3.....^n所得到的数,对着数组的内容依次^一遍,(两个相同的数^等于0,且^满足交换律)那么最后得到的值就是重复的和缺失互相^的值,如此我们只有求出缺失的或者重复的中的一个便可以。

对qsort函数不了解的小伙伴可以看下我之前的文章

手把手教你使用qsort函数_大海里的番茄的博客-CSDN博客

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* p1, const void* p2)
{
	return(*(int*)p1 - *(int*)p2);
	//升序排序
}
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
	int i = 0; int x = 0;
	for (i = 1; i <= numsSize; i++)
	{
		x ^= i;
		//先从头^一遍,因为^满足交换律,顺序不重要
	}
	for (i = 0; i < numsSize; i++)
	{
		x ^= nums[i];
		//再和数组内的内容^一遍得到
		//丢失的数和重复的数^的结果
	}
	qsort(nums, numsSize, sizeof(int), cmp_int);
	for (i = 0; i < numsSize; i++)
	{
		if (nums[i] == nums[i + 1])
		//找到重复的数
			break;
	}
	x ^= nums[i];
	//x为被修改的数
	*nums = nums[i];
	*(nums + 1) = x;
	*returnSize = 2;
	return nums;
}

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

猜你喜欢

转载自blog.csdn.net/fq157856469/article/details/132232072