當前位置:網站首頁>#全網寒假最火特輯# 【第一章】 C語言之牛客網刷題筆記 【點進來保證讓知識充實你一整個寒假】

#全網寒假最火特輯# 【第一章】 C語言之牛客網刷題筆記 【點進來保證讓知識充實你一整個寒假】

2022-01-28 01:55:03 Dream_Y.Ocean

全網寒假最火特輯 第一章 C語言之牛客網刷題筆記 【點進來保證讓知識充實你一整個寒假】

在這裏插入圖片描述


作者介紹:

作者:熱愛編程不起眼的小人物
作者的Gitee:代碼倉庫
系列文章推薦:實現Strcpy函數 - 通過函數發現 “程序之美” | 不斷優化、優化、再優化~
我和大家一樣都是初次踏入這個美妙的“元”宇宙 希望在輸出知識的同時,也能與大家共同進步、無限進步



前言

同學們,寒假早已開始啦~相信大家都想在寒假偷偷地卷”死“同學吧寒假裏可以做的事情有很多哦,我們一定要好好地利用好這段時間,努力地提昇自己,大膽放手一搏吧!

星光不負趕路人,時光不有心人

只要我們以深深地謙卑去忍耐 “暗無天日” 的日子,定會迎來屬於我們豁然開朗地一刻!讓我們一起為心中所想,去奮鬥吧!!

以下內容幹貨滿滿,跟上步伐吧~


一、選擇題【全面深度剖析】


Ⅰ. 考點:“全局變量”與“局部變量”的打印順序

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

如果同學們有疑惑,且聽我細細分析呀

本題的主要考點:全局變量”與“局部變量”的打印順序

相當於在局部變量的變量名全局變量名相同的情况下,在主函數內部的變量值全部指向局部變量

即當在同時擁有 局部變量全局變量變量的名字相同 的情况下,當在主函數中要打印 這個變量名的內容 的時候,程序會偏向於打印 “距離打印比特置近的”變量參數【即在同名的情况 打印的是 局部變量的內容 而 非全局變量

!!!切記 !!! 雖然在相同變量名的情况,打印的是 局部變量,但 兩個同名的變量實質:是兩個單獨存在的變量

【因為 全局變量局部變量內存中存儲的比特置是不同的全局變量儲存在 “靜態區”,而 局部變量存儲在 “棧區”

“在內存中的存儲方式” 這方面的內容在這裏就不多論述啦~
如果有興趣可以持續關注哦~
我會盡快出這方面的相關內容~

所以 即使是變量名字相同的情况下,它們的同時存在也不會相互影響,相互頂替,它們是相互獨立的存在

實例:
在這裏插入圖片描述

所以 不建議全局變量的變量名局部變量的變量名 設置成相同的名字 ,不然會讓程序員搞混,從而造成不必要的麻煩哦~


Ⅱ.考點:轉義字符的應用

以下不正確的定義語句是( )
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<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

注意:

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

總結

綜上,特輯的第一章呐甜頭~
讓我們大家一同在寒假奔赴熱愛吧~
畢竟,
“熱愛的東西 永遠不要說放弃”

如果有錯誤,歡迎指正呀
如果覺得收獲滿滿,可以點點贊支持一下喲~
在這裏插入圖片描述

版權聲明
本文為[Dream_Y.Ocean]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280155027395.html

隨機推薦