【暑期每日一练】 day2

文章提供了几个C语言相关的选择题解析,包括字符串长度计算、预处理器宏定义的展开、递归函数中静态变量的应用,以及指针和const的用法。此外,还包含两道编程题,分别是验证尼科彻斯定理和计算等差数列前n项和。
摘要由CSDN通过智能技术生成

目录

选择题

(1)

解析:

验证与拓展

思考

(2)

解析

 验证如下

(3) 

 解析

验证如下

拓展

(4)

解析

解析

编程题

题一

题目要求

 代码实现

题二

题目要求

 代码实现

总结


选择题

(1)

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

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

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

解析:

这里就涉及反斜杠的知识点。"\\"意思为对反斜杠进行转义,让它成为普通的反斜杠;\后跟数字最多跟三位,而且三个数子代表八进制,它会转义为后面三位数字所对应的ASCII表所对应字符,这里是123,对应10进制为83,ASCII表对应字符S

  

 \t转义为制表符,总该题可理解为

所以答案为12

验证与拓展

我们可以对以上代码进行一个验证和一个拓展为,我们将该字符内容打印出来看是否正确

这里我们看到如我们上面猜想一般,这一由于\t是制表符,所以不参与答应

思考

怎么才能打印出制表符 ?

(2)

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

#include <stdio.h>
#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

答案:B

解析

这道题的知识点博主在《程序环境和预处理超详细讲解》里有讲

(程序环境和预处理超详细讲解_遇事问春风乄的博客-CSDN博客https://blog.csdn.net/m0_71731682/article/details/131760722?spm=1001.2014.3001.5501 这里博主就不做过多讲解了,具体过程如下

 验证如下

(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

答案:C

 解析

这道题考察了递归与静态变量,注意:静态变量存储在静态区,static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。 静态全局变量与静态局部变量的区别仅是作用域不同。

所以此处的i会不断相加、

答案为7

验证如下

 

拓展

此时的i也没有销毁,我们来看一下

我们发现当第二次调用该函数的时候 ,变为了5,这是因为第一次调用该函数后i并没有被销毁,第一次结束时为i=4,所以1+4满足条件。跳出返回;

(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: 都一样
 答案:B

解析

const修饰变量,表示希望此变量只有可读性,防止被直接修改

(1)当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。

(2)此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。

(3)此时 *p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。

所以(1)=(2),选B

(5)

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: 以上说法都不对
答案:D

解析

 A选项对于结构体大小的讲解请看博主的《详解自定义类型:结构体,枚举,联合》

详解自定义类型:结构体,枚举,联合_遇事问春风乄的博客-CSDN博客https://blog.csdn.net/m0_71731682/article/details/131679172?spm=1001.2014.3001.5501A选项,没有考虑内存对齐。B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,选择D

编程题

题一

题目要求

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。

数据范围: 1≤m≤100 

输入描述:

输入一个int整数

输出描述:

输出分解后的string

示例 

  

 代码实现

#include <stdio.h>

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int start = n * n - n + 1;
        printf("%d", start);
        int i;
        for (i = 1; i < n; i++) {
            printf("+%d", start + 2 * i);
        }

        printf("\n");
    }

    return 0;
}

题二

题目要求

等差数列 2,5,8,11,14。。。。

(从 2 开始的 3 为公差的等差数列)

输出求等差数列前n项和

数据范围:  1≤n≤1000 

输入描述:

输入一个正整数n。

输出描述:

输出一个相加后的整数。

示例

 代码实现

#include<stdio.h>

int fun(int n)
{
    return 3*n -1;
}

int main()
{
    int n;
    
    while(EOF != scanf("%d",&n))
    {
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            sum += fun(i);
        }
        printf("%d\n",sum);
    }
    
    return 0;
}

总结

关于今日练习讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事问春风乄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值