C语言刷题指南(二)

 

作者简介: 清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。

相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。

欢迎点赞 收藏 ⭐留言 如有错误还望各路大佬指正!

✨每一次努力都是一种收获,每一次坚持都是一种成长✨       

在这里插入图片描述

目录

 前言

1. 选择题

题目1:

题目2:

题目3:

题目4:

题目5:

2. 编程题

题目一:尼科彻斯定理

题目二:等差数列

总结


 

 前言

        本文为C语言刷题的第二期。在这个阶段,我们将继续挑战自己,探索更深入的C语言知识和编程技巧。这将是一个更加具有挑战性的阶段,但也将带来更多的成长和收益。


1. 选择题

题目1:

1、以下程序段的输出结果是( )
 

#include
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}

A: 12        B: 13        C: 16        D: 以上都不对
 

✨题目解析:

        这里考查转义字符,strlen统计的是\0之前的字符个数,注意:\\ 表示字符'\',\123表示字符'{',\t表示制表符,这些都是一个字符。

正确答案:A

题目2:

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

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

 A: 4            B: 8            C: 9            D: 6

✨题目解析:

这里考察的是对

        宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8


正确答案:B

题目3:

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

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

 A: 5            B: 6            C: 7            D: 8

✨题目解析:

此题注意静态局部变量的使用

        static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,依次类推

正确答案:C

题目4:

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

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

A: (2)=(3)  B: (1)=(2)  C: 都不一样  D: 都一样
 

✨题目解析:   

这里考察的是对const的使用

        const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为"左定值,右定向",(1)和(2)const都在*的左边,(3)中const在*的右边

正确答案:B

题目5:

对于下面的说法,正确的是( )

A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)

B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零

C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同

D: 以上说法都不对

✨题目解析: 

  • A选项,结构体存在内存对齐,这里没有考虑内存对齐。
  • B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。
  • C选项,a为数组首地址是常量不能改变

所以ABC都错。

正确答案:D

2. 编程题

题目一:尼科彻斯定理

题目描述:

C语言刷题指南(二)_第1张图片

 题目链接:

尼科彻斯定理icon-default.png?t=N6B9https://www.nowcoder.com/practice/dbace3a5b3c4480e86ee3277f3fe1e85?tpId=37&&tqId=21299&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

✨题目解析:

这道题目的解法有两种:

解法一:

        通过观察我们可以发现,整数m的平方就是连续奇数的中间值,它的起始值就是:m*(m-1)+1,结束值就是:m*(m+1)-1,只需将中间值两边的奇数加起来验证一下就可以了。代码如下:

#include

int main(){
    int n = 0;
    scanf("%d",&n);
    int m1 = n*(n-1);
    int m2 = n*(n+1);
    for(int i = m1+1; i < m2-1; i+=2){
        printf("%d+",i);
    }
    printf("%d",m2-1);
    return 0;
}

解法二:

        解法二的方法就较为复杂了,这个方法使用了sprintf,将起始奇数转换成字符串输出到一个数组中,然后再依次将剩余的奇数输出到数组中,转换成字符串,最后输出字符串。

#include 
int main()
{
    int m;
    while(~scanf("%d", &m)){
        int start = m * (m - 1) + 1;//找到对应m^3的起始奇数
        char buf[10240] = {0};
        //sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中
        sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中
        for (int i = 1; i < m; i++) {
            //然后将紧随随后的奇数转换为字符串,按照指定格式放入buf中
            //%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数
        sprintf(buf, "%s+%d", buf, start+=2);
        }
    printf("%s\n", buf);
    } 
return 0;
}

这种方法更考察我们所学的知识 “ 读写文件 ”那期的内容。

题目二:等差数列

题目描述:

C语言刷题指南(二)_第2张图片

C语言刷题指南(二)_第3张图片 题目链接:

等差数列icon-default.png?t=N6B9https://www.nowcoder.com/practice/f792cb014ed0474fb8f53389e7d9c07f?tpId=37&&tqId=21323&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

✨题目解析:

        这道题目只要了解等差数列求和公式即可,Sn=n*a1+(n-1)*n*d/2,或者Sn=n*(a1+an)/2,两种方法都可以解决。使用第二个时要先算出an,an=a1+(n-1)d。
 

#include 

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {   
        printf("%d\n",n*2+n*(n-1)*3/2 );
    }
    return 0;
}


总结

        刷题是一个持续的过程,需要坚持和持之以恒。无论是遇到困难还是取得突破,我们都要保持积极的态度和信心。相信自己的能力,相信团队的力量,我们一定能够克服一切困难,取得更好的成果。最后,我要衷心感谢每一位参与刷题的读者,你们的支持和参与是我们前进的动力。希望你们在C语言的学习和编程之路上继续努力,不断追求卓越。祝愿你们在未来的编程之旅中取得更大的成功和成就!

你可能感兴趣的:(C语言刷题训练营,算法,c语言)