“也许你感觉自己与周遭格格不入,但正是那些你一人度过的时光,让你变得越来越有意思,等有天别人终于注意到你的时候,他们就会发现一个比他们想象中更酷的人。”-《生活大爆炸》
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循环的一个执行流程:
关于for循环
的详细知识点可以见博客链接: for循环
那么,本题的解题流程如下:
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
,*
的优先级大于-=
和+=
,*
是左结合,和+=
和-=
是右结合。
本题的解题流程如下:
运行结果如下:
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;
}
样例输出:
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语言的小练笔,欢迎大家持续关注、点赞和评论!❤️❤️❤️