作者介绍:
作者:热爱编程不起眼的小人物
作者的Gitee:代码仓库
系列文章推荐:实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化、优化、再优化~
我和大家一样都是初次踏入这个美妙的“元”宇宙 希望在输出知识的同时,也能与大家共同进步、无限进步
文章目录:fire:全网寒假最火特辑:fire: 第一章 C语言之牛客网刷题:book:笔记 【:dizzy:点进来保证让知识充实你一整个寒假】前言一、选择题【全面深度剖析】
Ⅰ. 考点:“全局变量”与“局部变量”的打印顺序Ⅱ.考点:转义字符的应用Ⅱ.考点:宏定义和typedef的理解和应用Ⅳ.考点:三目 *** 作符的理解Ⅴ.考点:scanf的理解和应用 二、编程题【全面深度解析】
Ⅰ.【牛客网题号: `JZ17` 打印从1到最大的n位数】【难度:`入门`】Ⅱ.【牛客网题号: `HJ73` 计算日期到天数转换】【难度:`简单`】 总结
前言
同学们,寒假早已开始啦~相信大家都想在寒假偷偷地卷”死“同学吧寒假里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊
星光不负赶路人,时光不有心人 只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
以下内容干货满满,跟上步伐吧~
一、选择题【全面深度剖析】
Ⅰ. 考点:“全局变量”与“局部变量”的打印顺序
int x = 5, y = 7; void swap() { int z; z = x; x = y; y = z; } int main() { int x = 3, y = 8; swap(); printf("%d,%dn", x , y); return 0; }
A:5,7 B:7,5 C:3,8 D:8,3
同学们觉得答案是什么呢
答案是 C 啦~
如果同学们有疑惑,且听我细细分析呀
本题的主要考点:“全局变量”与“局部变量”的打印顺序
相当于在局部变量的变量名和全局变量名相同的情况下,在主函数内部的变量值 是全部指向局部变量
即当在同时拥有 局部变量 和 全局变量 且 变量的名字相同 的情况下,当在主函数中要打印 这个变量名的内容 的时候,程序会偏向于打印 “距离打印位置近的”变量参数【即在同名的情况 打印的是 局部变量的内容 而 非全局变量】
!!!切记 !!! 虽然在相同变量名的情况,打印的是 局部变量,但 两个同名的变量实质:是两个单独存在的变量。
【因为 全局变量 和 局部变量 在内存中存储的位置是不同的;全局变量储存在 “静态区”,而 局部变量存储在 “栈区”】
“在内存中的存储方式” 这方面的内容在这里就不多论述啦~
如果有兴趣可以持续关注哦~
我会尽快出这方面的相关内容~
所以 即使是变量名字相同的情况下,它们的同时存在也不会相互影响,相互顶替,它们是相互独立的存在
实例:
所以 不建议 将 全局变量的变量名 与 局部变量的变量名 设置成相同的名字 ,不然会让程序员搞混,从而造成不必要的麻烦哦~
Ⅱ.考点:转义字符的应用
以下不正确的定义语句是( )
A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[ ] = {’x10’, ‘xa’, ‘8’};
C: char c1[ ] = {‘1’,‘2’,‘3’,‘4’,‘5’};
D: int y[5+3] = {0, 1, 3, 5, 7, 9};
同学们觉得答案是什么呢
以下不正确的定义语句是( )
A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[ ] = {'x10', 'xa', '8'};
C: char c1[ ] = {‘1’,‘2’,‘3’,‘4’,‘5’};
D: int y[5+3] = {0, 1, 3, 5, 7, 9};
答案是 B 啦~
如果同学们有疑惑,且听我细细分析呀
本题主要考点:“对于转义字符的理解和应用”
通俗易懂来说:转义字符就是C语言中表示字符的一种特殊形式。转义字符以反斜’ '开头,后面跟一个字符或一个八进制或十六进制数表示。转义字符具有特定的含义,不同于字符原有的意义.
有了以上了解后,我们再看回原题就可以理解B为什么是不正确的了
x10 、xa 属于十六进制转义字符
【十六进制转义字符是由反斜杠’ ’ 和字母x(或X) 及随后的1~2个十六进制数字构成的字符序列。】
【可以通过ASCII码表中对应的十六进制值找到转换后的字符】所以这个写法是正确的 ********************************************************************************8 看上去属于八进制转义字符
【八进制转义字符它是由反斜杠’ ’ 和随后的 1~3个八进制数字构成的字符序列】
【可以通过ASCII码表中对应的八进制值找到转换后的字符】
但 八进制数字 并不包括数字8所以这个写法是错误的
虽然字符集中的所有字符都可以用 八进制转义字符 或 十六进制转义字符 来表示。
但因为在不同的计算机系统上采用的字符集可能不同,因此,为了能使所编写的程序可以方便地移植到其他的计算机系统上运行,程序中应少用这种形式的转义字符。
Ⅱ.考点:宏定义和typedef的理解和应用
test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )
#define INT_PTR int* typedef int* int_ptr; INT_PTR a, b; int_ptr c, d;
A: a B: b C: c D: d
同学们觉得答案是什么呢
答案是 ACD 啦~
如果同学们有疑惑,且听我细细分析呀
本题主要考点:“宏定义和typedef的理解和应用”
我们先来简单了解什么是宏定义和typedef关键字
宏:在 C 语言中,可以采用命令 #define
来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。【惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量】
即通俗来说,就是将在程序中出现的 宏名 直接替换 成 指定的文本
typedef关键字:C语言允许用户使用 typedef
关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等
即通俗来说, 就是将类型的名字进行重命名从而方便用户自己使用
经过以上了解后,我们再看回题目
#define INT_PTR int* //此为 “宏” typedef int* int_ptr;// 相当于 “重命名” //INT_PTR a, b; //直接替换就好 int* a, b; //int_ptr c, d; //这里也直接替换 int* c, d;
这样看来转换过后,四个都是指针,但这样真的正确吗?
其实,两种“替换”的意思并不一样
在预处理阶段,define只会替换,不会做任何的算计逻辑等处理。所以替换过后“ * ”会先与距离近的变量结合在一起组成一个指针变量,所以 a为整型指针,但 b仅仅是一个被创建的整型变量【如果b想为指针的话,得将“b”该改成“ *b ”】
而对于 typedef int* int_ptr ;
【typedef】不是一种简单的宏替换,它可以用作同时声明指针的多个对象【即 相当于在声明多个对象的类型的时候,给多个对象加上了一个“()”括号,这样就可以一次性声明多个对象的类型了】【Eg:int*(c,d)】
这也是为什么int_ptr c, d 中,c, d都是int*类型了
Ⅳ.考点:三目 *** 作符的理解
若给定条件表达式 (M)?(a++):(a--) ,则其中表达式 M ( )
A: 和(M== 0)等价
B: 和(M== 1)等价
C: 和(M != 0)等价
D: 和(M != 1)等价
同学们觉得答案是什么呢
答案是 C 啦~
如果同学们有疑惑,且听我细细分析呀
本题主要考点:“三目 *** 作符的理解”
题目的意思是想让我们选出下列哪一个表达式可以等价于 表达式M
首先让我们先简单了解三目 *** 作符的应用
简单来说:三目 *** 作符【a?b:c】先判断表达式a,如果表达式a为真,输出表达式b作为三目 *** 作符的结果;如果a为假,则输出表达式c作为三目 *** 作符的结果
这样一来便知道
如果 M 与 (M != 0)等价
表示:(M != 0) ? (a++) : (a- -)
相当于M如果为 0,即表达式M为 假,即 M != 0为 假,则结果为(a- -);
表达式M如果为 真,即 M != 0为 真,则结果为(a++);
所以最终结果: 表达式M 是与 表达式(M != 0)是等价的
Ⅴ.考点:scanf的理解和应用
有如下定义语句,则正确的输入语句是【多选】( )
int b; char c[10];
A: scanf("%d%s",&b,&c); B: scanf("%d%s",&b,c);
C: scanf("%d%s",b,c); D: scanf("%d%s",b,&c);
同学们觉得答案是什么呢
答案是 B 啦~
如果同学们有疑惑,且听我细细分析呀
本题主要考点:“scanf的理解和应用”
scanf的意思就是:将输入的内容通过后面给出的地址找到对应的地址并将内容放到这个地址上,从而实现“赋值”
因为 &b 是取 b 的地址;
而 c[10] 中的 c 就代表字符组的首个地址,不需再取地址了
所以答案就是:B
二、编程题【全面深度解析】
Ⅰ.【牛客网题号: JZ17 打印从1到最大的n位数】【难度:入门】
输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3 ,则打印出 1、2、3 一直到最大的 3 位数 999 。
用返回一个整数列表来代替打印n 为正整数
题目传送门:OJ链接
示例: 输入:1 返回值:[1,2,3,4,5,6,7,8,9]
注意:
1: 这里returnSize是需要打印个数的变量的指针
2: 需要返回一个数组首元素的地址
特别注意:定义新的数组不能在函数内部定义!!!
因为在函数内部开辟的是临时变量,作用域和生命周期仅仅在函数内部,一旦出函数,这些临时变量就会消失,所以返回数组首元素再打印就相当于非法访问内存,就会报错~
实现:
static int a[100000]; //加上 static 是防止重复定义 int* printNumbers(int n, int* returnSize ) { int k=1; for(int i=0;i
Ⅱ.【牛客网题号: HJ73 计算日期到天数转换】【难度:简单】根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。
输入描述:输入一行,每行空格分割,分别是年,月,日。输出描述:输出是这一年的第几天
题目传送门:OJ链接
示例: 输入:2012 12 31 输入:1982 3 4 输出:366 输出:63注意:
1.判断是否为闰年【闰年:366天;平年:365天】
2.天数只需要加到月份-1的天数【eg :2月12日,只需要加(2-1)月对应的天数+“12”天】实现:
#includeint main() { int year = 0; int month = 0; int day = 0; scanf("%d %d %d",&year,&month,&day); int m[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //故意预留一个位置,有利于后续代码 “一月”对应下标“1”…… int i = 0; //判断是否为闰年 if((year%4==0&&year%100!=0 ) || (year%400==0)) { for(i=0;i<=month-1;i++) { day = day + m[i]; } if(month > 2) { printf("%dn",day+1); } else { printf("%dn",day); } } else { for(i=0;i<=month-1;i++) { day = day + m[i]; } printf("%dn",day); } return 0; }
总结综上,特辑的第一章呐甜头~
让我们大家一同在寒假奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”如果有错误❌,欢迎指正呀
✨如果觉得收获满满,可以点点赞支持一下哟~✨
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)