【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】

全网最火特辑 第二章 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】

在这里插入图片描述


作者介绍:

作者:热爱编程不起眼的小人物
作者的Gitee:代码仓库
系列文章推荐:实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化、优化、再优化~
【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
我和大家一样都是初次踏入这个美妙的“元”宇宙 希望在输出知识的同时,也能与大家共同进步、无限进步


文章目录

  • :fire:全网最火特辑:fire: 第二章 C语言之牛客网刷题:book:笔记 【:dizzy:点进来保证让知识充实你一整天】
  • 前言
  • 一、选择题【全面深度剖析】
    • Ⅰ. 考点:转义字符的理解和应用
    • Ⅱ.考点:`#define`宏定义的理解和应用
    • Ⅲ.考点:`satitic`静态局部变量的理解和应用
    • Ⅳ.考点:`const`对指针的理解和应用
    • Ⅴ.考点:综合考点
  • 二、编程题【全面深度解析】
    • Ⅰ.【牛客网题号: `HJ76` 尼科彻斯定理】【难度:`简单`】
    • Ⅱ.【牛客网题号: `HJ100` 等差数列】【难度:`简单`】
  • 总结


前言

同学们,新的学期早已开始啦~相信大家都想在这学期偷偷地卷”死“同学吧大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊

星光不负赶路人,时光不有心人

只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!

以下内容干货满满,跟上步伐吧~


一、选择题【全面深度剖析】


Ⅰ. 考点:转义字符的理解和应用

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

#include

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

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

大家觉得答案是什么呢


答案是 A 啦~

如果有疑惑,且听我细细分析呀

本题的主要考点:转义字符和strlen函数的应用

通俗易懂来说:转义字符就是C语言中表示字符的一种特殊形式。转义字符以反斜’ \ '开头,后面跟一个字符一个八进制十六进制数表示。转义字符具有特定的含义,不同于字符原有的意义.

转义字符既可以将原本无意义的字符【eg:\t、\n、\123…】转换为有意义的字符也可以将原来有意义的字符转换为无意义【eg:\ \ 、\ "……】(即这些被转义成“无意义的”可以正常输出了,不会被编译器认为是具有特殊意义的字符)

所以:
\\在这里当作一个字符长度【将右边那个\无意义了,所以在计算长度的时候只看作一个】
\123在这里被转义了,对照ASCII表可知,得出来的字符为{【所以也只看作一个字符】
\t合在一起表示的是制表图【数的时候只看作一个字符】

所以数下来一共三处被转义,所以字符长度为12


Ⅱ.考点:#define宏定义的理解和应用

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

同学们觉得答案是什么呢


答案是 D 啦~

如果同学们有疑惑,且听我细细分析呀

本题主要考点:#define宏定义的理解和应用”

在解题前,让我们先了解了解什么是 宏定义

C语言中,可以用 #define 定义一个标识符来表示一个常量【那在内存中就储存在静态区
该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。【惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量】

即通俗来说,就是将在程序中出现的 宏名 直接替换指定的文本

经过以上了解后,我们再看回题目

我们就可以将#define定义的内容在程序中直接取代替换成我们所定义的“内容”

include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2

int main()
{
	printf("%d\n", NUM);
	//N = 2
	//M = N + 1 
	//NUM = (M+1) * M / 2 = 【替换后】 = (N + 1 + 1) * N + 1 / 2 
	//NUM = (2 + 1 + 1) * 2 + 1 / 2 = 8.5
	
	//但是以整型打印出来的,所以打印的结果为 8 
	
	return 0;
}

特别注意#define所替换的文本是直接替换的,不会考虑什么计算顺序的数学概念

易错:所以上面如果是直接先带值计算M的值的话,那本题就极易算出易错答案B

所以,这类题型一定要全部替换不急着算答案要看清楚最后正真的计算式后,才能知道这条式子最终的模样!

以免范上面的错误,误选错误答案哦~

!!!所以为了避免错误,建议全部替换后,再带值进行计算!!!

这类题型是不是很可爱呢~


Ⅲ.考点:satitic静态局部变量的理解和应用

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 啦~

如果同学们有疑惑,且听我细细分析呀

本题主要考点:satitic静态局部变量的理解和应用”

我们先来简单了解什么是static

简易来说:static在修饰函数的局部变量的时候,会改变变量的属性
即它会使变量具有常属性,称为:常变量
【但本质还是变量,只不过具有常量的属性
改变了变量在内存中的储存空间(临时变量一般在栈区中开辟内存,现在将static所修饰的变量在静态区开辟了空间)】

这也是为什么会具有“常属性”


这也就说明static修饰的变量改变了自己的作用生命周期【作用域不变】

经过短暂的认识后,再看回题目:

static改变了i的生命周期
【即i的值不会被重新创建和销毁,值不随函数退出而消失,而要保留到下一次被访问】
第一次调用函数: i初值是1
递归第二次调用函数时i还是第一次那个变量,值已经变成了2
再一次调用函数时i就是3

依次类推

这样可知:【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】_第1张图片
答案便是: n = 7啦~~


Ⅳ.考点:const对指针的理解和应用

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对指针的理解和应用”

我们先了解const对指针的作用是怎么样的

1.const如果在指针变量的 “ * ” 的左边
【即 const int * a == int const * a】 
== 表达的意思是:对 指针变量a 解引用的值是保持不变的
【只有a里面存放的地址改变了,解引用出来的值才会变化】
2.const如果在指针变量的 “ * ” 的右边
【即 int * const a】
== 表达的意思是:a里面 存放的地址是保持不变
【只有 主动对 *a 赋值才能改变这个值,但a里面的地址是一直保持不变的】

简记为"左定值,右定向"【以*为标记】

所以 (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:以上说法都不对

同学们觉得答案是什么呢


答案是 D 啦~

如果同学们有疑惑,且听我细细分析呀

本题主要考点:“综合考点【且听我分析喔~】”

A. 结构体 在内存中的存储 需要进行内存对齐 所以不能直接简单地将成员变量的类型大小相加就认为是结构体的总内存大小

B. 考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采
比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等

C. a为数组首地址是常量不能改变 【常量是永远不能变的】

D.


二、编程题【全面深度解析】


Ⅰ.【牛客网题号: HJ76 尼科彻斯定理】【难度:简单

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

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

题目传送门:OJ链接

示例:
输入:6
输出:31+33+35+37+39+41

注意:

本题含有多组输入数据

!!!解题关键:等差数列的和!!!
这道题的关键在于知道规律后,运用高中学过的知识:求等差数列的和公式来计算即可

实现:

#include 

int main()
{
    int m = 0;
    while(scanf("%d",&m) != EOF)
    {
        int i = 0;
        int begin = m*(m-1)+1; // 
        printf("%d",begin); //先把首元素记下来
    
        for(i=0;i<m-1;i++)
        {
            begin += 2;
            printf("+%d",begin);
        }
        printf("\n");
    }
    
    return 0;
}
}


Ⅱ.【牛客网题号: HJ100 等差数列】【难度:简单

等差数列 2,5,8,11,14, ...(从 2开始的 3为公差的等差数列),求等差数列前n项和。

  • 输入描述:输入一个正整数n
  • 输出描述:输出一个相加后的整数。

题目传送门:OJ链接

示例:
输入:2       输入:275
输出:7       输出:113575
说明:2+5=7   说明:2+5+...+821+824=113575

思路:

  • 1. 这道题比上一道题目更加的明显,只需要了解了等差数列求和公式Sn=n(a1+an)/2就简单了 ,根据题目得知 a1=2,而等差数列第n项也有具体公式an=a1+(n-1)d ,而公差为3, 这时候只需要套入公式计算即可
  • 2. 或者记录下求出的每一项,并相加 就是等差数列的和

实现:

#include 

int main()
{
    int n = 0;
    
    while(scanf("%d",&n) != EOF)
    {
        int i  = 0;
        int sum =0;  
        for(i=0;i<n;i++)
        {
            sum += 2+3*i; //直接算出每一项,顺便求和 就是 等差数列的和
                          //【等差数列的和 = 每一项之和】
        }
        printf("%d\n",sum);
    }
    
    return 0;
}

总结

综上,特辑的第二章呐~

让我们大家一同在平凡的生活中奔赴热爱吧~

毕竟,

“热爱的东西 永远不要说放弃”

如果有错误❌,欢迎指正呀

✨如果觉得收获满满,可以点点赞支持一下哟~✨
在这里插入图片描述

你可能感兴趣的:(寒假刷题特辑,c语言,开发语言,c++,程序人生,职场和发展)