📙作者簡介:?清水加冰,目前大二在讀,正在學習C/C++、Python、操作系統、數據庫等。
📘相關專欄:C語言初階、C語言進階、數據結構刷題訓練營、有感興趣的可以看一看。
歡迎點贊 👍 收藏 ?留言 📝 如有錯誤還望各路大佬指正!
?每一次努力都是一種收獲,每一次堅持都是一種成長?? ? ? ?
?
目錄
前言
1. 選擇題
?📖題目1:
📖題目2:
📖題目3:
?📖題目4:
📖題目5:?
2.?編程題
📖題目一:
?📖題目二:
總結
前言
????????前邊我們學習了C語言相關的知識,然而并沒有進行系統的練習,接下來我將開啟一個新的專欄,C語言刷題訓練營,以便于大家鞏固所學的知識。
1. 選擇題
?📖題目1:
1、執行下面程序,正確的輸出是( )
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
?題目解析:
這道題目考察的是函數相關的知識
- swap函數調用時用的是全局變量,主函數中定義的變量只在主函數中有效,因為主函數也是一個函數,它與其他函數是平行關系;輸出語句這里,考慮局部優先的原則
正確答案:C
📖題目2:
2、以下不正確的定義語句是( )
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選項考查轉義字符,有如下格式,
- 八進制數字是0-7,沒有8,故B選項中'\8'是錯誤的
- \ddd ddd表示1到3個八進制數 如:\130 轉義為 字符X
- \xhh hh表示1到2位十六進制數 如:\x30 轉義為 字符0
正確答案:B
📖題目3:
3、 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
?題目解析:
這道題目考察的是C語言中的類型別名和typedef關鍵字的使用。
- #define是宏定義,僅僅是直接替換,INT_PTR a, b; 進行宏替換后代碼是這樣的:int *a, b;這里的int *是a的類型,b的類型是int,故此次b只是int類型。
- typedef是把該類型定義一個別名,別名是一個獨立的類型了,使用這個類型創建的變
量都是這個類型的。因此,a,c,d才是指針類型。正確答案:ACD
?📖題目4:
?4、 若給定條件表達式 (M)?(a++):(a--) ,則其中表達式 M ( )
A: 和(M==0)等價
B: 和(M==1)等價
C: 和(M!=0)等價
D: 和(M!=1)等價
?題目解析:
?這道題目考察的是對運算符的理解
給定條件表達式(M)?(a++):(a--)。 (表達式1)? (表達式2): (表達式3)為三目運算符。
計算規則為:先判斷表達式1是否為真,若為真,則計算表達式2,并將表達式2的結果作為整個表達式最終的結果,表達式3不計算;否則,表達式3的結果為最終結果,表達式2不計算。
分析:
在此表達式中,若M=0,為假,計算a--; 若M≠0,為真,計算a++; 若要求與M等價,則要滿足M取0時為假,取非0數值時為真。 c選項中:假定M取0,則M表示假,當M是0時,表達式M!=0不成立,為假,計算a--; 當M取非0數值時,M為真,表達式M!=0成立,為真,計算a++; 符合題意
正確答案:C
📖題目5:?
5、有如下定義語句,則正確的輸入語句是【多選】( )
?
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);
?題目解析:
&c和c兩個地址值是一樣的,程序的效果相同,也沒錯,但同時也必須把變量b的地址給scanf,故CD錯誤
正確答案:AB
2.?編程題
📖題目一:
題目描述:
?題目鏈接:
打印從1到最大的n位數https://www.nowcoder.com/practice/4436c93e568c48f6b28ff436173b997f?tpId=13&tqId=2273153&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking題目接口描述:
/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param n int整型 最大位數* @return int整型一維數組* @return int* returnSize 返回數組行數*/
int* printNumbers(int n, int* returnSize ) {}
??題目解析:
????????首先這道題目它是一道接口型題目,我們要先明白它的各個參數的含義,n就是輸出的最大位數,而returnSize就是需要返回的數字個數
這里首先要清楚n位數中最大的數字,實際上就是 10^n - 1 。 比如:
- 1位數: 10的1次方- 1
- 2位數: 10的2次方- 1
- 3位數: 10的3次方- 1
????????這個規律清楚后動態申請空間,將數值填入就可以了,需要注意的是數組下標從0開始,而數值從1開始。
nt* printNumbers(int n, int* returnSize ) {*returnSize=pow(10,n)-1;int k=*returnSize+1;int* ret=(int*)malloc(sizeof(int)**returnSize);for(int i=1;i<k;i++){ret[i-1]=i;}return ret; }
?📖題目二:
題目描述:
?題目鏈接:
計算日期到天數轉換https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded?tpId=37&&tqId=21296&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking?題目解析:
?解題思路:? ? ? ?
????????這道題簡單解法其實將每個月的天數枚舉出來,然后根據當前月份向前累加滿月的天數,然后再加上當前月所在的天數。最終考慮平閏年的 2 月份區別是否增加一天。
????????其中需要注意的是平年和閏年的判斷,而且是閏年的月份大于 2 的時候,也就是 2 月走完,總天數才能加 1 (比如 2000年2月18日 ,雖然是閏年,但是 2月 都沒走完那是不能加上閏年多出的一天的)
代碼如下:
#include <stdio.h> int isleapyear(int year) {if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){return 1;} return 0; } int main() {int monthday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int year, month, day;while (~scanf("%d %d %d", &year, &month, &day)){int days = day;if (isleapyear(year) && month > 2) { days += 1;}for (int i = month - 1; i > 0; i--) {days += monthday[i];}printf("%d\n", days);} return 0; }
?
總結
? ? ? ? 好了,以上便是本期C語言刷題的全部內容,希望可以對你有所幫助。最后,感謝閱讀!