前言:
每日一练系列,每一期都包含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'字符串结束标志,所以就会停止打印。故选D
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