• C语言:选择+编程(每日一练Day15)


    目录

    选择题:

    题一:

    题二:

    题三:

    题四:

    题五:

    编程题:

    题一:寻找奇数

    思路一:

    题二:寻找峰值

    思路一:

    本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

    感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!


    选择题:

    题一:

    1、有如下代码,则 *(p[0]+1) 所代表的数组元素是()
    int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];
    p[0] = a[1];

    A: a[0][1]    B: a[1][0]    C: a[1][1]    D: a[1][2]

    答案解析:

            p是一个指针数组,p[0] = a[1];此处a[1]是二维数组的第二行的数组名,数组名表示首元素的地址,a[1]是a[1][0]的地址,所以p[0]中存储的是第2行第1个元素的地址,p[0]+1就是第二行第2个元素的地址,*(p[0]+1)就是第二行第二个元素了。所以C正确。

    题二:

    2、关于指针下列说法正确的是【多选】( )

    A: 任何指针都可以转化为void *      B: void *可以转化为任何指针
    C: 指针的大小为8个字节                 D: 指针虽然高效、灵活但可能不安全

    答案解析:

            C选项,指针占几个字节要看平台,64位环境下8个字节,32位环境下4个字节。

    题三:

    3、以下 scanf 函数调用选项中, 错误的是( )
    struct T
    {

            char name[20];
            int age;
            int sex;
    } a[5], *pa=a;

    A: scanf("%s",a[0].name);         B: scanf("%d", &pa[0].age);
    C: scanf("%d",&(pa->age));       
    D: scanf("%d", pa->age);

    答案解析:

            该题考察的是通过scanf函数的调用对结构体数据类型进行初始化。scanf("输入控制符", 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。scanf输入时要通过地址找空间,B、C用了&是正确的。name属于字符数组的数组名,相当于数组的首地址,A正确。单独的pa->age可用于输出语句获取
    值的形式,用在scanf中的时候需要&操作符,D错误。

    题四:

    4、如下函数 fun 计算 prod=1*2*3*…*n ,并返回计算结果值。但当 n>12 时,返回值不正确。要找出该程序的错误,正确的调试方法是( )

    int fun(int n)
    {
            int prod = 1 , i = 0;
            for(i = 1;i <= n;i++)
            {
                    prod *= i;
            }

            return prod;
    }

    A: 监视变量prod的值,在prod *= i;行处设置断点,然后单步运行,直到发现错误原因
    B: 监视变量prod的值,在return prod;行处设置断点,程序中断后,即可发现错误原因
    C: 在prod=1;处设置断点,然后在函数调用堆栈中即可发现错误原因
    D: 监视变量i的值,在for (i=1; i<=n; i++)行处设置断点,然后单步运行,直到发现错误原因

    答案解析:

            依题目已知情况,当n<=12时结果是正确的,说明是随着参数的变大计算过程中哪里出了问题,故而要在prod *= i;处设断点,查看原因。错误原因是数据过大时整型溢出。

    题五:

    5、下列给定程序中,函数 fun 的功能是:把形参a所指数组中的奇数按原顺序依次存放到 a[0]、a[1]、a[2]… 中,把偶数从数组中删除,奇数个数通过函数值返回。 例如,若a所指数组中的数据最初排列为: 9,1,4,2,3,6,5,8,7 ,删除偶数后,a所指数组中的数据为: 9,1,3,5,7 ,返回值为5。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果( )
    int fun(int a[], int n)
    {
            int i, j;
            j=0;
            for (i=0; i                 if (a[i]%2== _________ )
                    {
                            a[j]=a[i];
                            _________;
                    }

            return _________;
    }

    A: 0 j++ j    B: 1 j++ j+1    C: 0 j++ j+1    D: 1 j++ j

    答案解析:

            代码实现的思路应该是arr[i]是奇数的时候要存储起来,所以第一个空是1,最开始j是0,每次找到一个奇数就存储到arr[j]的位置,那接下里j需要+1,所以得第二个空是j++,当循环停止的时候,j其实就是奇数的个数。所以最后返回j,第三个空是j。所以选D。

    编程题

    题一:寻找奇数

    寻找奇数_牛客题霸_牛客网 (nowcoder.com)

    示例1

            输入:

            5
            2 1 2 3 1

            输出:

            3

    思路一:

    必懂知识:按位异或(“ ^ ”):二进制位相同为“0”,不同为“1”。

            第一步:定义记录元素值的result,以及元素个数n;

            第二步:遍历题目所给数组,并输入各个下标对应的元素给result,按位异或,最终将相同的数抵消为“0”;

            第三步:最后得到的就是数组中奇数个元素,打印。

    1. #include
    2. #include
    3. int main()
    4. {
    5. int n = 0;
    6. int result = 0;
    7. scanf("%d", &n);
    8. int num = 0;
    9. //遍历题目数组
    10. for (int i = 0; i < n; i++)
    11. {
    12. //输入各个下标对应的元素
    13. scanf("%d", &result);
    14. //按位异或,最终将相同的数抵消为“0”
    15. num ^= result;
    16. }
    17. //最后得到的就是数组中奇数个元素
    18. printf("%d\n", num);
    19. return 0;
    20. }

    题二:寻找峰值

    寻找峰值_牛客题霸_牛客网 (nowcoder.com)

    示例1

            输入:

            [2,4,1,2,7,8,4]

          返回值:

            1
    

           说明:

            4和8都是峰值元素,返回4的索引1或者8的索引5都可以     

    思路一:

    二分查找:

            第一步:首先排除边界情况,再定义首元素下标left,尾元素下标right;

            第二步:二分查找:nums[mid] < nums[mid+1]时,说明峰在右边,即需要left = mid + 1;

                                            nums[mid] >= nums[mid+1]时,说明峰在左边,即需要 right = mid;

            第三步:最后二分查找使下标left就是最大值,返回left。

    1. int findPeakElement(int* nums, int numsLen )
    2. {
    3. //排除边界情况
    4. if(numsLen == 1 || nums[0] > nums[1])
    5. return 0;
    6. if(nums[numsLen-1] > nums[numsLen-2])
    7. return numsLen-1;
    8. int left = 0;
    9. int right = numsLen-1;
    10. //二分查找使下标left就是最大值
    11. while(left < right)
    12. {
    13. int mid = (left + right) / 2;
    14. if(nums[mid] < nums[mid+1])
    15. {
    16. left = mid + 1;
    17. }
    18. else
    19. {
    20. right = mid;
    21. }
    22. }
    23. return left;
    24. }

    本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

    感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                                  

  • 相关阅读:
    C 回调函数,接口 函数指针作为函数的参数 函数指针作为结构体成员
    HDFS存储目录分析
    网络工程师回顾学习(第二部分)
    什么是 JVM ?
    Springboot整合ElasticSearch(1)- 环境搭建 -非自动注入的方式
    Google Cloud Natural Language情感分析教程
    大学生《Web课程谁》期末网页制作 HTML+CSS+JavaScript 网页设计实例 瑜伽网站企业网站制作
    (附源码)springboot《升学日》日本大学信息及院校推荐网站 毕业设计 251949
    CocosCreator 面试题(五)TS有什么优缺点?为什么要用TS?
    微服务容错 Resilience4j 接口服务-容错原理
  • 原文地址:https://blog.csdn.net/weixin_71964780/article/details/132678914