暑假第一天之每天一些题系列
Posted 小赵小赵福星高照~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第一天之每天一些题系列相关的知识,希望对你有一定的参考价值。
暑假第一天之每天一些题系列
一、选择题
- 若有定义: int a[] = {2,4,6,8,10,12,14,16,18,20,22,24},*q[4],k;
for(k=0; k<4; k++)
{
q[k] = &a[k*3];
}
printf("%d\\n",q[3][1]);
则上面的程序段输出的结果是:
A. 18 B. 22 C. 20 D. 输出项不合法,结果不正确
答案解析:
首先我们看需要打印的是何方神圣,q[3][1]?q[3][1]等价于什么呢?它等价于*(q[3]+1),再看前面的for循环,当k=0时,将&a[0]赋给q[0],q[0]等价于什么呢?它等价于*(q,+0),也就是*q,直到k=3时,将&a[9]赋给q[3],也就是将a数组中20的地址赋给了q[3],q[3]+1则是22的地址,*(q[3]+1)则是拿到了22,即最后输出的结果为22。
- 下面程序的运行结果是
int main()
{
int i,j,a = 0;
for(i=0; i<2; i++)
{
for(j=0; j<4; j++)
{
if(j%2)
break;
a++;
}
a++;
}
printf("%d\\n",a);
}
A. 4 B. 5 C. 6 D. 7
答案解析
当i=0,j=0时,j%2=0,故执行里面的a++,a变为1,j=1时,执行break,跳出里面的这个循环,执行外面的a++,a变为2,因为i等于2时,循环就要结束,所有i只有0和1的取值,当i=1时,继续执行内部的for循环,和第一次进去的情况一样,最后a变为了4
- 宏定义的宏展开是在什么阶段完成的
A. 预处理 B. 编译 C. 预处理前 D. 运行
答案解析:
在预处理阶段,完成了#define定义的符号和宏的替换
想要深入了解,请前往博主的另一篇文章:程序由创建到得到运行结果的过程你知道吗?
- 若有以下定义: char a; int b;float c; double d; 则表达式a * b + d - c值的类型为
A. float B. int C. char D. double
答案解析:
这个题的考点为算术转换,比如一个int和一个long进行运算,那么这个int转换为long进行运算,小的转换成大的进行运算,有符号的要转换为无符号的进行运算;就这道题而言,a和b运算,a要转换为int,最后的结果为int,然后和d进行运算,前面的结果要转换为float,然后再和c运算,需要转换成double,故最后的类型为double
关于C语言中的小细节还有很多,比如隐式类型转换,想要了解更多,请前往:操作符中表达式求值(隐式类型转换详解)以及操作符属性
- 能正确表示逻辑关系:“a ≥= 10或a ≤ 0”的 C 语言表达式是
A. a>=10 or a<=0
B. a>=10 | a<=10
C. a>=10 && a<=0
D. a>=10 || a<=0
答案解析:
考的是C语言基础语法,或是||
二、填空题
- test.c 文件中包括如下语句,文件中定义的四个变量,哪个变量不是指针类型?
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a,b;
int_ptr c,d;
答案解析:
这里需要注意的是,#define只是在预处理阶段将INT_PTR替换为了int*,第三行代码相当于是int* a,b; 这里的*是给a用了,而b没有*,故这里只有a是指针类型,而b不是,typedef是类型重定义,int_ptr相当于就是int*类型,故c,d都是int*类型,所以只有b不是指针类型
- 变量分为全局和局部两种,什么变量没有赋初值时,将由系统自动置为 0
答案解析:
全局变量没有赋初值时,将由系统自动置为 0,局部变量没有赋初值时,系统会置为随机值
- 数组定义为 int a[4][5],则 a[1]+3 表示数组a中哪个元素的地址
答案解析:
数组名是首元素的地址(有例外),a[1]相当于是二维数组第二行的数组名,故a[1]是二维数组第二行首元素的地址,a[1]+3就是元素a[1][3]的地址。
三、算法题
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。时间复杂度 O(row+col)
解题思路:
我们从右上角开始查找,右上角数字有左边数字和下边数字,左边数字小于它,下边数字大于它,当查找值小于当前值时,我们列减减,到达它左边的数字,当查找值大于当前值时,我们行减减,到达它下边的数字。
代码如下:
#define ROW 3
#define COL 3
int FindValue(int arr[][3], int i, int j, int* x, int* y, int value)
{
//右上角元素的下标
int row = 0;
int col = j - 1;
while (row < j && col >= 0)
{
if (arr[row][col] > value)
{
col--;
}
else if (arr[row][col] < value)
{
row++;
}
else//找到了
{
*x = row;
*y = col;
return 1;
}
}
return 0;
}
int main()
{
int arr[][3] = { {1,3,5},{2,4,6},{7,8,9} };
int x = 0;
int y = 0;
if (FindValue(arr, ROW, COL, &x, &y, 6))
{
printf("找到了,下标为:%d %d\\n", x, y);
}
else
{
printf("没找到\\n");
}
return 0;
}
以上是关于暑假第一天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章