暑假第一天之每天一些题系列

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;
}

以上是关于暑假第一天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章

暑假第十七天之每天一些题系列

暑假第六天之每天一些题系列

暑假第八天之每天一些题系列

暑假第七天之每天一些题系列

暑假第十八天之每天一些题系列

暑假第十三天之每天一些题系列