拒绝摆烂!C语言练习打卡第七天

简介: 拒绝摆烂!C语言练习打卡第七天



🗒️前言:

在前面我们学习完C语言的所以知识,当然练习巩固也不能落下。俗话说:“无财之谓贫,学而不能行之谓病。”可见实践对我们学习的重要。接下来就让小王带着大家进行练习,巩固我们C语言的学习。

一、选择题

📝1.第一题

若有以下程序,则运行后的输出结果是( )

#include<stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
    printf("%d\n", NUM);
    return 0;
}

💡解题思路:

本题考查的是宏定义,我们只要在进行操作之前将对应的代码换成对应的宏。我们要打印NUM,只需要将NUM换成(M + 1) * M / 2,M也有宏定义,继续转换,转换成(N+1+1)*N+1/2,最后将表达式中的N也进行替换,就可以计算出结果,(2+1+1)*2+1/2的结果为8.5,但我们打印的是整型数据,所以结果是8。我们在替换时一步一步去换,不要急于求成想一步到位,最重要的是在替换过程中我们不要加任何符号,不要根据自己的主观臆断添加括号。

📝2.第二题

下面3段程序代码的效果一样吗( )

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

💡解题思路:

本题就是考察我们对 const 修饰指针变量的理解,const 在不同的位置,表达的意思就不相同。

  • const放在*的左边,const 修饰的是a指针解引用之后的结果,表示a指向的内容不能修改。
  • const放在*的右边,const 修饰的是指针变量a本身,表示a的指向不能修改。

(1)和(2)的const都在*的左边,所以它们效果一样。

📝3.第三题

如下函数的 f(1) 的值为( )

int f(int n)
{
    static int i = 1;
    if(n >= 5)
        return n;
    n = n + i;
    i++;
    return f(n);
}

💡解题思路:

本题主要考察的就是 static 修饰的静态变量,静态变量的特点:

  • 静态变量不是存放在栈区,而是存放在静态区,所以它的生命周期会延长,是整个程序运行期间。
  • 静态变量只初始化一次,第二次在遇到该变量时,就不会重新定义。

进入函数 n=1,首先把静态变量 i 初始化为1,n<5,条件不成立,不执行 if 语句,n=n+i,则n=2,i++,则i=2,返回f(2)继续执行,结果为n=4,i=3,再次执行结果为n=7,i=4,此时7>5,返回n,结果为7。

📝4.第四题

如下函数是求两个int数字最大公约数的,指出其中存在的问题()

int gcd(char x,char y)
{
    int min = x < y ? x : y;
    for (min = 0; min > 0; min--)
    {
         if (x % min = 0 && y % min = 0)
         {
            return min;
         }
    }
}

💡解题思路:

问题一:形参的类型不对,我们要求的是 int 型的最大公约数,而形参是用 char 类型接收的,这样数据会截断,会使程序出现问题。

问题二:min 的初始化不正确,当 min 初始化为0,min>0为假,循环一次也不会执行。正确的值应该是上面条件操作符计算得到的结果。

问题三:对赋值和等于的混淆,= 在数学中表达的意思是等于,而在我们编程学习中 = 是赋值,而== 才是等于的意思。当我们记不清时,将数字写在左边,表达式写在右边,例如:0==x % min,这样在写错时编译器会报错。

二、编程题

📝1.第一题

💡解题思路:

我们先通过一次遍历,找到数组中最大的数,并且记录下最大数的下标;然后再进行一次循环,通过 max<nums[i]*2  判断,如果数组中其他数的二倍大于最大的数,就返回-1;如果最大数都大于其他数的二倍,就返回最大数的下标,这里要注意不能与自身比较,所以要用 i!=index 去掉最大数。

int dominantIndex(int* nums, int numsSize)
{
    int max=0;
    int index=0;
    for(int i=0;i<numsSize;i++)
    {
        if(nums[i]>max)
        {
           max=nums[i];
           index=i;
        }
    }
    for(int i=0;i<numsSize;i++)
    {
        if(max<nums[i]*2&&i!=index)
        {
            return -1;
        }
    }
    return index;
}

📝2.第二题

💡解题思路:

这道题考察我们对异或操作符的理解,异或:对应的二进制位相同为0, 不同则为1。

  • 两个相同的数异或,得到的结果为0。
  • 0与一个数异或,结果仍为这个数。

基于这两个特点,这道题对数组中的所有数据进行逐一异或就可以解决得到奇数次的数字,因为偶数次的数字都被异或成为0了,最后单独保留了奇数次的数字。

#include <stdio.h>
int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        int num = 0, tmp = 0;
        for (int i = 0; i < n; i++) 
        {
            scanf("%d", &tmp);
            num ^= tmp;
        }
        printf("%d\n", num);
    } 
    return 0;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

相关文章
|
6月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
47 0
|
6月前
|
C语言
C语言指针——练习
C语言指针——练习
|
5月前
|
C语言
C语言练习代码第一篇
C语言练习代码第一篇
|
6月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
54 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
6月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
21 0
|
5月前
|
C语言
|
5月前
|
编译器 C语言
|
5月前
|
C语言
|
6月前
|
存储 C语言
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(中)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
38 0
|
6月前
|
C语言
C语言递归练习
C语言递归练习
29 0