第二章 C语言之牛客网刷题
:fire:全网最火特辑:fire: 第二章 C语言之牛客网刷题:book:笔记 【:dizzy:点进来保证让知识充实你一整天】
前言
同学们,新的学期早已开始啦:kissing_closed_eyes:~相信大家都想在这学期偷偷地卷”死“同学吧:innocent:大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!:fist:
星光不负赶路人,时光不有心人 只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
以下内容干货满满,跟上步伐吧~
一、选择题【全面深度剖析】
Ⅰ. 考点:转义字符的理解和应用
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: 以上都不对
:see_no_evil:大家觉得答案是什么呢
:hear_no_evil:答案是 A 啦~
:speak_no_evil: 如果有疑惑,且听我细细分析呀
本题的主要考点:“转义字符和strlen函数的应用
通俗易懂来说:转义字符
就是<mark>C语言中表示字符的一种特殊形式。</mark>转义字符以<mark>反斜' \ '开头</mark>,后面跟<mark>一个字符</mark>或<mark>一个八进制</mark>或<mark>十六进制数</mark>表示。转义字符具有特定的含义,不同于字符原有的意义.
即
转义字符
既可以将原本无意义的字符【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; }
A: 4
B: 8
C: 9
D: 6
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“
#define
宏定义的理解和应用”
在解题前,让我们先了解了解什么是 宏定义
C语言中,可以用
#define
定义一个标识符来表示一个常量
【那在内存中就储存在静态区
】
该命令允许把<mark>一个名称指定成任何所需的文本</mark>,例如<mark>一个常量值或者一条语句</mark>。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。【惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量】
即通俗来说,就是将在程序中出现的 宏名 直接替换 成 指定的文本
经过以上了解后,我们再看回题目
我们就可以将
#define
定义的内容在程序中直接取代、替换成<mark>我们所定义的“内容”</mark>
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
所以,这类题型一定要全部替换后【不急着算答案】,要看清楚最后正真的计算式后,才能知道这条式子最终的模样!
以免范上面的错误,误选错误答案哦~
!!!所以为了避免错误,建议全部替换后,再带值进行计算!!!
这类题型是不是很可爱呢:kissing_closed_eyes:~
Ⅲ.考点: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
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 C 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“
satitic
静态局部变量的理解和应用”
我们先来简单了解什么是static
简易来说:static
在修饰函数的局部变量的时候,会改变变量的属性
即它会使变量具有常属性
,称为:常变量
【但本质还是变量
,只不过具有常量的属性
】
【<mark>改变了变量在内存中的储存空间</mark>(临时变量一般在栈区
中开辟内存,现在将static
所修饰的变量在静态区
开辟了空间)】
这也是为什么会具有
“常属性”
这也就说明:被
static
修饰的变量改变了自己的作用生命周期
【作用域不变】
经过短暂的认识后,再看回题目:
static改变了i的生命周期
【即i
的值不会被重新创建和销毁,值不随函数退出而消失,而要保留到下一次被访问】
第一次调用函数:i
初值是1
递归第二次调用函数时,i
还是第一次那个变量,值已经变成了2
再一次调用函数时:i
就是3
...<mark>依次类推</mark>
这样可知:
<mark>答案便是: n = 7
啦~~</mark>
Ⅳ.考点: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: 都一样
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 B 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“
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:以上说法都不对
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“综合考点【且听我分析喔~】”
A. 结构体 在内存中的存储 需要进行
内存对齐
==所以不能直接简单地将成员变量的类型大小相加就认为是结构体的总内存大小==
B. 考察
double类型的比较
,由于浮点数存在误差,==不能直接判断两个数是否相等==,通常采
用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等
C.
a
为数组首地址是常量不能改变 ==【常量是永远不能变的】==
D. √
二、编程题【全面深度解析】
Ⅰ.【牛客网题号: HJ76
尼科彻斯定理】【难度:简单
】
1、验证尼科彻斯定理,即:任何一个整数m
的立方都可以写成m
个连续奇数之和。例如:
- 输入一个正整数 m(m≤100) ,将
m
的立方写成m
个连续奇数之和的形式输出 - 将
m
的立方写成m
个连续奇数之和的形式输出
:mag:题目传送门:OJ链接
示例: 输入:6 输出:31+33+35+37+39+41
注意:
本题含有多组输入数据
!!!解题关键:等差数列的和!!!
这道题的关键在于知道规律后,运用高中学过的知识:求等差数列的和
的公式
来计算即可
实现:
#include <stdio.h> 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
。 - 输出描述:输出一个相加后的整数。
:mag:题目传送门: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 <stdio.h> 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; }
🌐 如何高效学习数据结构与算法?
<kbd>数据结构与算法</kbd>的学习还是得基础知识
➕自己动手
同步进行
如果是初学者,需要找一个可以在线练习得网站,我建议你去牛客网多练习呀(快点击跳转学起来吧!)
就如上述讲解的面试OJ题,牛客网内还有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,看看别人的思路,别人的代码,也许就能豁然开朗~
总结
综上,特辑的第二章呐:lollipop:~
让我们大家一同在平凡的生活中奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
:dizzy:如果有错误❌,欢迎指正呀:dizzy:
:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles: