🔥全网寒假最火特辑🔥 第一章 C语言之牛客网刷题📖笔记 【💫点进来保证让知识充实你一整个寒假】
前言
以下内容干货满满,跟上步伐吧~
一、选择题【全面深度剖析】
Ⅰ. 考点:“全局变量”与“局部变量”的打印顺序
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,%d\n", x , y);
return 0;
}
A:5,7 B:7,5 C:3,8 D:8,3
🙊 如果同学们有疑惑,且听我细细分析呀
相当于在局部变量的变量名和全局变量名相同的情况下,在主函数内部的变量值 是全部指向局部变量
即当在同时拥有 局部变量 和 全局变量 且 变量的名字相同 的情况下,当在主函数中要打印 这个变量名的内容 的时候,程序会偏向于打印 “距离打印位置近的”变量参数【即在同名的情况 打印的是 局部变量的内容 而 非全局变量】
!!!切记 !!! 虽然在相同变量名的情况,打印的是 局部变量,但 两个同名的变量实质:是两个单独存在的变量。
【因为 全局变量 和 局部变量 在内存中存储的位置是不同的;全局变量储存在 “静态区”,而 局部变量存储在 “栈区”】
“在内存中的存储方式” 这方面的内容在这里就不多论述啦~
如果有兴趣可以持续关注哦~
我会尽快出这方面的相关内容~
所以 即使是变量名字相同的情况下,它们的同时存在也不会相互影响,相互顶替,它们是相互独立的存在
Ⅱ.考点:转义字符的应用
🙊 如果同学们有疑惑,且听我细细分析呀
通俗易懂来说:转义字符
就是C语言中表示字符的一种特殊形式。转义字符以反斜’ \ '开头,后面跟一个字符或一个八进制或十六进制数表示。转义字符具有特定的含义,不同于字符原有的意义.
有了以上了解后,我们再看回原题就可以理解B为什么是不正确的了
Ⅱ.考点:宏定义和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
🙊 如果同学们有疑惑,且听我细细分析呀
我们先来简单了解什么是宏定义
和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?b:c】先判断表达式a,如果表达式a为真
,输出表达式b
作为三目操作符的结果;如果a为假
,则输出表达式c
作为三目操作符的结果
这样一来便知道
Ⅴ.考点: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);
🙊 如果同学们有疑惑,且听我细细分析呀
scanf的意思就是:将输入的内容通过后面给出的地址找到对应的地址并将内容放到这个地址上,从而实现“赋值”
二、编程题【全面深度解析】
Ⅰ.【牛客网题号: JZ17
打印从1到最大的n位数】【难度:入门
】
输入数字 n
,按顺序打印出从 1
到最大的 n
位十进制数。比如输入 3
,则打印出 1、2、3
一直到最大的 3
位数 999
。
- 用返回一个整数列表来代替打印
- n 为正整数
🔍题目传送门:OJ链接
示例:
输入:1
返回值:[1,2,3,4,5,6,7,8,9]
注意:
实现:
static int a[100000]; //加上 static 是防止重复定义
int* printNumbers(int n, int* returnSize )
{
int k=1;
for(int i=0;i<n;i++)
k*=10;
int i;
for(i=1;i<k;i++)
a[i-1]=i;
*returnSize=i-1;
return a;
}
Ⅱ.【牛客网题号: HJ73
计算日期到天数转换】【难度:简单
】
根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。
- 输入描述:输入一行,每行空格分割,分别是年,月,日。
- 输出描述:输出是这一年的第几天
🔍题目传送门:OJ链接
示例:
输入:2012 12 31 输入:1982 3 4
输出:366 输出:63
注意:
实现:
#include <stdio.h>
int 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("%d\n",day+1);
}
else
{
printf("%d\n",day);
}
}
else
{
for(i=0;i<=month-1;i++)
{
day = day + m[i];
}
printf("%d\n",day);
}
return 0;
}
总结
综上,特辑的第一章呐甜头🍭~
让我们大家一同在寒假奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨