C语言小练习(三)

C语言小练习(三)_第1张图片
“也许你感觉自己与周遭格格不入,但正是那些你一人度过的时光,让你变得越来越有意思,等有天别人终于注意到你的时候,他们就会发现一个比他们想象中更酷的人。”-《生活大爆炸》

Day03

  • 一.选择题
  • 二.编程题

一.选择题

1.已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( )
A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d);

答案:A
答题思路:函数第一个形参 char b[10] ,需要传入的是数组的首地址。数组char c[10] 的数组名 c 是数组的首元素地址,可以传入 c。参数a是指针,需要接受它的地址。

2.请问下列表达式哪些会被编译器禁止【多选】( )

int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;

A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f

答案:ABCD
答题思路:const放在*的左边,表示指针指向的值不可修改,但是指针指向可以修改。const放在*的右边,表示指针指向的值可修改,但是指针指向不可以修改。那么,放在中间,指针指向以及指针指向的值都不能改。本题中,*c和*d指向的值不能变,e的指向不能变,f都不能变,因此全错。

3.以下程序的输出结果为( )

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int i;
void prt()
{
	for (i = 5; i < 8; i++)
		printf("%c", '*');
	printf("\t");
}
int main()
{
	for (i = 5; i <= 8; i++)
		prt();
	return 0;
}

A: *** B: *** *** *** *** C: *** *** D: * * *

答案:A
答题思路:本题主要需要弄清楚for循环的一个执行流程:
C语言小练习(三)_第2张图片
关于for循环的详细知识点可以见博客链接: for循环
那么,本题的解题流程如下:
C语言小练习(三)_第3张图片
C语言小练习(三)_第4张图片

4.下面代码段的输出是( )

#include 
int main()
{
	int a = 3;
	printf("%d\n", (a += a -= a * a));
	return 0;
}

A: -6 B: 12 C: 0 D: -12

答案:D
答题思路:本题考察的主要是运算符的优先级以及结合性。关于具体的操作符的知识可跳转至链接: 操作符

操作符的优先级:

操作符 描述 结合性 是否控制求值顺序
() 聚组 /
() 函数调用 左结合性
[ ] 下标引用 左结合性
. 访问结构成员 左结合性
-> 访问结构指针成员 左结合性
++ 后缀自增 左结合性
- - 后缀自减 左结合性
! 逻辑反 右结合性
~ 按位取反 右结合性
+ 单目,表示正值 左结合性
- 单目,表示负值 右结合性
++ 前缀自增 右结合性
- - 前缀自减 右结合性
* 间接访问 右结合性
& 取地址 右结合性
sizeof 取其长度,以字节表示 右结合性
(类型) 类型转换 右结合性
* 乘法 左结合性
/ 除法 左结合性
% 整数取模 左结合性
+ 加法 左结合性
- 减法 左结合性
<< 左移位 左结合性
>> 右移位 左结合性
> 大于 左结合性
>= 大于等于 左结合性
< 小于 左结合性
<= 小于等于 左结合性
== 等于 左结合性
!= 不等于 左结合性
& 位与 左结合性
^ 位异或 左结合性
I 位或 左结合性
&& 逻辑与 左结合性
II 逻辑或 左结合性
?: 条件操作符 右结合性
= 赋值 左结合性
+= 以…加 右结合性
-= 以…减 右结合性
*= 以…乘 右结合性
/= 以…除 右结合性
%= 以…取模 右结合性
<<= 以…左移 右结合性
>>= 以…右移 右结合性
&= 以…与 右结合性
^= 以…异或 右结合性
I= 以…或 右结合性
, 逗号 左结合性

我们可以发现在该表达式中a += a -= a * a*的优先级大于-=+=*是左结合,和+=-=是右结合。
本题的解题流程如下:
C语言小练习(三)_第5张图片
运行结果如下:
C语言小练习(三)_第6张图片

5.下列不能实现死循环的是( )
A: while(1){} B: for(;1;){} C: do{}while(1); D: for(;0;){}

答案:D
答题思路:只有想循环条件为真时,循环才会继续。在C语言中,0表示假,1为真,因此选D

二.编程题

1.首先输入要输入的整数个数 n ,然后输入 n 个整数。输出为 n 个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
注意: 0 即不是正整数,也不是负数,不计入计算; 本题有多组输入用例。
输入描述:首先输入一个正整数 n ,然后输入 n 个整数。
输出描述:输出负数的个数,和所有正整数的平均值。
数据范围: 1≤n ≤2000 ,输入的整数都满足 ∣val∣≤1000
OJ链接【牛客网题号: HJ97 记负均正】【难度:简单】

答题思路:从题目中的输入n个整数,我们会想到要利用数组来储存数据。然后利用for循环来找出数组中负数的个数(count)和正数的个数(count2),并且把所有正整数加起来,然后算出平均值。

#define _CRT_SECURE_NO_WARNINGS 1
#include 
int main()
{
	int arr[1000];
	int n = 0;
	while (scanf("%d", &n) != EOF)
	{
		int count = 0;//记录负数的个数
		int count2 = 0;//记录正数的个数
		float sum = 0;
		int i = 0;
		for (i = 0; i < n; i++)
		{
			scanf("%d", &arr[i]);
			if (arr[i] < 0)
			{
				count++;
			}
			if (arr[i] > 0)
			{
				count2++;
				sum += arr[i];
			}
		}
		printf("%d ", count);
		if (count2)
			printf("%.1f", sum / count2);
		else
			printf("0.0");
	}
	return 0;
}

样例输出:
C语言小练习(三)_第7张图片
2.有一个长度为 n 的非降序数组,比如 [1,2,3,4,5] ,将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了 [3,4,5,1,2] ,或者 [4,5,1,2,3] 这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围: 1≤n≤10000 ,数组中任意元素的值: 0≤val≤10000
示例:
输入:[3,4,5,1,2]
返回值:1
OJ链接【牛客网题号: JZ11 旋转数组的最小数字】【难度:简单】

答题思路:本题我采用的是遍历的方法,把每个数都比较一遍。但是这种方法只限于数据少的情况,数据大的话就会算很久,效率低。

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    int min = *rotateArray;//初始存放第一个数
    for (int i = 1; i < rotateArrayLen; ++i)
    {
        if(*(rotateArray+i) < min)
        {
            min = *(rotateArray+i);
        }
    }
    return min;
}

好啦,第三天的练习到这里就结束啦!后期会继续更新C语言的小练笔,欢迎大家持续关注、点赞和评论!❤️❤️❤️

你可能感兴趣的:(c语言,开发语言)