一、选择题
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
【解析】
函数的原型是: int fun(char b[10], int&a);
变量c,d的定义是: char c[1];int d;
D函数第一个形参 char b[10],需要传入的是数组的首地址。数组char c[10] 的数组名 c 是数组的首元素地址,可以传入 C。
@函数第二个形参int &a为引用类型作为形参,d 是 整型变量,可以直接传入,因此传给 fun 函数的实参是 d。最终,fun 函数调用的形式是 f(c,d)。因此选A。
补充:
如果函数原型为int fun(char b[10],int*a
即此时第二个形参为指针类型,则需传入变量d的地址,此处就应该选B
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掌握的是否清楚
1.const如果在指针变量的“ * ”的左边(即 const int * a 和 int const * a的意义是相同的,作用是等价的)
表达的意思是:对指针变量a 解引用的值是保持不变的
只有a里面存放的地址改变了,解引用出来的值才会变化
2. const如果在指针变量的“ * ”的右边【即 int * const a】 表达的意思是: a里面存放的地址是保持不变
只有主动对 *a 赋值才能改变这个值,但a里面的地址是一直保持不
对于A和B:const在“ * ”的左面,则 const 就是用来修饰指针所指向的变量,即指针指向为常量,则此时的*c和*d不变
对于C和D:如果 const 位于“ * ”的右侧,则 const 就是修饰指针本身,即指针本身是常量
则e和f的地址不能被改变
3、以下程序的输出结果为( )
#include <stdio.h> 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
【解析】
注意:这里出现转义字符 \t ,而 \t 代表为水平制表符,简单来说就是在键盘上按了TAB的效果,也可以理解为缩进符
全局变量创建在静态区中,作用域为整个程序且生命周期与主函数相同,只有程序结束,它才会销毁
全局变量 i ,在 main() 中修改为 5 ,第一次在 prt() 中执行循环输出三次 '*' , i 被修改为 8 ,回到 main() 中第二次调用 prt() 时,i<8 为假,循环结束没输出,执行一次 print("\t") ,再次回到主函数后 i++ 变为 9 , i<=8 为假,循环结束 ;
4、下面代码段的输出是( )
int main() { int a=3; printf("%d\n",(a+=a-=a*a)); return 0; }
A: -6 B:12 C:0 D:-12
【答案】D
【解析】
本题可以写成:表达式a+a-=a*a中*的优先级最高,其次是-=,+的优先级最低,因此先求a*a,所以原表达式可写成a+a-=9,再算a-=9,原表达式可写为a=a-9=-6,最后算a+a,因为此时a=-6,所以a+a=-6+(-6)=-12,故选择D选项。
拓展:操作符优先级图表
5.下列不能实现死循环的是( )
A.while(1){} B.for(;1;){} C.do{}while(1); D.for(;0;){}
【答案】D
【解析】
只有条件为真时才进行循环, ABC 中 1 为真, D 中 0 为假,故选D。
二、编程题
1.OJ链接 【牛客网题号: HJ97 记负均正】【难度:简单】
首先输入要输入的整数个数 n ,然后输入 n 个整数。输出为 n 个整数中负数的个数,和所有正整数的平均值,
结果保留一位小数。
注意: 0 即不是正整数,也不是负数,不计入计算; 本题有多组输入用例。
输入描述:首先输入一个正整数 n ,然后输入 n 个整数。
输出描述:输出负数的个数,和所有正整数的平均值。
#include<stdio.h> int main() { int n = 0; while (~scanf("%d ", &n)) { int arr[2001] = { 0 }; int count1 = 0; int count2 = 0; int sum = 0; float ave = 0; int i = 0; for (i = 0; i < n; i++) { scanf("%d ", &arr[i]); if (arr[i] < 0) { count1++; } else if (arr[i] > 0) { count2++; sum += arr[i]; } } printf("%d ", count1); if (count2) { ave = sum / count2; printf("%.1lf\n", ave); } else { printf("0.0\n"); } } return 0; }
2.OJ链接 【牛客网题号:JZ11 旋转数组的最小数字】【难度:简单】
有一个长度为 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
int minNumberInRotateArray(int* nums, int numsLen) { int left = 0; int right = numsLen - 1; while (left < right) { int mid = (left + right) / 2; if (nums[mid] < nums[right]) right = mid; else if (nums[mid] > nums[right]) left = mid + 1; else right--; } return nums[right]; }
好了,今天的每日一刷就到这里结束了,感谢大家的观看!