【第一章】 C语言之牛客网刷题笔记

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

在这里插入图片描述


作者介绍:

:mortar_board:作者:热爱编程不起眼的小人物:goat:
:mag_right:作者的Gitee:代码仓库
:pushpin:系列文章推荐:实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化、优化、再优化~
:ledger:我和大家一样都是初次踏入这个美妙的“元”宇宙:earth_asia: 希望在输出知识的同时,也能与大家共同进步、无限进步:star2:

🌐为大家推荐一款刷题网站呀👉点击跳转
以下题目&算法思想,都可以从此网站中找到并参考学习哟~


@TOC


前言

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

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

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

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


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


Ⅰ. 考点:“全局变量”与“局部变量”的打印顺序

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

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 C 啦~

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

本题的主要考点:全局变量”与“局部变量”的打印顺序

相当于在局部变量的变量名全局变量名相同的情况下,在主函数内部的变量值 是<mark>全部指向局部变量</mark>

即当在同时拥有 局部变量全局变量变量的名字相同 的情况下,当在主函数中要打印 这个变量名的内容 的时候,程序会偏向于打印 <mark>“距离打印位置近的”变量参数</mark>【即在同名的情况 打印的是 局部变量的内容 而 非全局变量

!!!切记 !!! 虽然在相同变量名的情况,打印的是 局部变量,但 两个同名的变量实质:是两个单独存在的变量

【因为 全局变量局部变量内存中存储的位置是不同的;<mark>全局变量</mark>储存在 “静态区”,而 <mark>局部变量</mark>存储在 “栈区”

“在内存中的存储方式” 这方面的内容在这里就不多论述啦~
如果有兴趣可以持续关注哦~
我会尽快出这方面的相关内容~

所以 即使是变量名字相同的情况下,它们的同时存在也不会相互影响,相互顶替,它们是相互独立的存在

实例:
在这里插入图片描述

所以 不建议全局变量的变量名局部变量的变量名 设置成相同的名字 ,不然会让程序员搞混,从而造成不必要的麻烦哦~


Ⅱ.考点:转义字符的应用

以下不正确的定义语句是( )
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};

:see_no_evil:同学们觉得答案是什么呢


以下不正确的定义语句是( )
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};


:hear_no_evil:答案是 B 啦~

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

本题主要考点:“对于转义字符的理解和应用”

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

有了以上了解后,我们再看回原题就可以理解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

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 ACD 啦~

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

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

我们先来简单了解什么是宏定义typedef关键字

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

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

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)等价

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 C 啦~

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

本题主要考点:“三目操作符的理解”

==题目的意思是想让我们==选出下列哪一个表达式可以==等价于== 表达式M

首先让我们先简单了解三目操作符的应用
简单来说:三目操作符【a?b:c】先判断表达式a,如果表达式a为,输出表达式b作为三目操作符的结果;如果a为,则输出表达式c作为三目操作符的结果

这样一来便知道

如果 M 与 (M != 0)等价
表示:(M != 0) ? (a++) : (a- -)
相当于==M如果为 0,即表达式M为 假,即 M != 0为 假,则结果为(a- -);==
<mark>表达式M如果为 真,即 M != 0为 真,则结果为(a++);</mark>

所以最终结果: 表达式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);

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 B 啦~

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

本题主要考点:“scanf的理解和应用”

==scanf的意思就是:将输入的内容通过后面给出的地址找到对应的地址并将内容放到这个地址上,从而实现“赋值”==

因为 &b 是取 b 的地址;
c[10] 中的 c 就代表字符组的首个地址,不需再取地址了
所以答案就是:B


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


Ⅰ.【牛客网题号: JZ17 打印从1到最大的n位数】【难度:入门

输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3 ,则打印出 1、2、3 一直到最大的 3 位数 999

  • 用返回一个整数列表来代替打印
  • n 为正整数

:mag:题目传送门: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<n;i++)
        k*=10;

    int i;

    for(i=1;i<k;i++)
        a[i-1]=i;

    *returnSize=i-1;

    return a;
}

Ⅱ.【牛客网题号: HJ73 计算日期到天数转换】【难度:简单

根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。

  • 输入描述:输入一行,每行空格分割,分别是年,月,日。
  • 输出描述:输出是这一年的第几天

:mag:题目传送门:OJ链接

示例:
输入:2012 12 31  输入:1982 3 4
输出:366         输出:63

注意:

1.判断是否为闰年【闰年:366天;平年:365天】
2.天数只需要加到月份-1的天数【eg :2月12日,只需要加(2-1)月对应的天数+“12”天】

实现:

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

🌐 如何高效学习数据结构与算法?


<kbd>数据结构与算法</kbd>的学习还是得基础知识自己动手同步进行

如果是初学者,需要找一个可以在线练习得网站,我建议你去牛客网多练习呀(快点击跳转学起来吧!)

在这里插入图片描述

就如上述讲解的面试OJ题,牛客网内还有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,看看别人的思路,别人的代码,也许就能豁然开朗~


总结

综上,特辑的第一章呐甜头:lollipop:~
让我们大家一同在寒假奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”

:dizzy:如果有错误❌,欢迎指正呀:dizzy:
:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles:
在这里插入图片描述

全部评论
C语言在牛客刷题太爽了
点赞 回复 分享
发布于 2022-08-28 13:28 河南

相关推荐

06-20 15:23
门头沟学院 Java
难道你们背八股都不觉得累?现在每天背八股背的我想吐
想去大厂的土豆子:累不累都是对比出来的,八股可比高考、考研轻松多了
点赞 评论 收藏
分享
05-23 19:02
吉林大学 Java
点赞 评论 收藏
分享
06-20 19:40
中原工学院 Java
网络存储:十几天不会让你拉人办卡就结束了吧?
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务