写作能力有限,请多多包含( $ _ $ )
如有错误理解,请指出文中有误的地方。(可以私信)
一、选择题
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);
分析:fun 的原型是int fun(char b[10], int &a),有两个参数。
第一个参数是一维数组,其中 char c[10] ,c 是个数组,数组名 c 就是个地址,因此直接传入 c。
第二个参数整形指针参数,而 d 是 整型,要使用取址符 & 得到 d 的地址后再传入,因此传给 fun 函数的实参是 &d。最终,fun 函数调用的形式是 f(c,&d)
答案:A
2、请问下列表达式哪些会被编译器禁止【多选】( )
A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f
int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;
如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量;*c和*d不能变。
如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量;e和f不能变。
答案:ABCD
3、以下程序的输出结果为( )
A: *** B: *** *** *** *** C: *** *** D: * * *
#include <stdio.h>
int i;
void prt()
{
for (i = 5; i < 8; i++)
printf("%c", '*');
printf("\t"); //两个*号间有一个Tab键的间隔
}
int main()
{
for (i = 5; i <= 8; i++)
prt();
return 0
因为i是全局变量在函数,void prt()中执行完调用的函数后i变为8,所以main函数中的for语句
for(i=5;i<=8;i++) prt();实际只执行了一次
答案:A
4、下面代码段的输出是( )
A: -6 B: 12 C: 0 D: -12
int main()
{
int a=3;
printf("%d\n",(a+=a-=a*a));
return 0;
}
①先算 a-=a*a 等价于 a=a-a*a =3-3*3 =-6,此时a的值为-6
②再算 a+=-6 等价于 a=a+(-6) =(-6)+(-6) =-12
答案:D
5、下列不能实现死循环的是( )
A: while(1){} B: for(;1;){} C: do{}while(1); D: for(;0;){}
①循环语句中:只有条件判断为真时才进行循环,ABC中1为真,D中0为假
②for(表达式1;表达式2;表达式3)
表达式1:初始化语句。用于初始化循环变量;
表达式2:条件判断语句,用于判断循环终止条件;表达式2值为真,循环,为假,不循环;
表达式3:调整部分,用于循环条件的调整。
答案:D
二、编程题
1、记负均正_牛客题霸_牛客网 (nowcoder.com)
#include<stdio.h>
int main() {
int n = 0;
while ((scanf("%d", &n) == 1))
{
int count1 = 0;
int count2 = 0;
int tmp = 0;
float sum = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &tmp);
if (tmp < 0) {
count1++;//统计负数的个数
}
else if (tmp > 0) {
sum += tmp;//正数求和
count2++;//统计正数的个数
}
}
printf("%d %.1f\n", count1, sum / count2);
}
return 0;
}
2 、旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com)
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen )
{
int i=0;
for(i=1;i<rotateArrayLen;i++)
{
if(rotateArray[i-1]>rotateArray[i])//有序数组
return rotateArray[i];
}
return rotateArray[0];
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param numsLen int nums数组长度
* @return int整型
*/
//将旋转数组分成两部分,将前部分放到后一部分的后面
//那么最小值就是新数组后部分的第一个值
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
int left = 0, right = rotateArrayLen - 1;
while (left < right) {
int mid = (left + right) / 2; //取中间值
if (rotateArray[mid] > rotateArray[right])
left = mid +1; //中间值大于最后一个值说明中间值不属于后部分,
//而属于前部分,那么最小值就在后部分,搜索中间值的右边
else if (rotateArray[mid] < rotateArray[right])
right = mid;//中间值小于最后一个值说明中间值属于后部分,
//那么最小值就在中间值及其前面的数中找
else //如果中间值等于最后一个值,那么不知道它是属于前部分还是后部分
right --; //缩短数组
}
return rotateArray[left];
}