- ??博客主頁(yè):江池俊的博客
- ?收錄專欄:C語(yǔ)言刷題專欄
- ??專欄推薦:?C語(yǔ)言初階之路 ?C語(yǔ)言進(jìn)階之路
- ??代碼倉(cāng)庫(kù):江池俊的代碼倉(cāng)庫(kù)
- ??歡迎大家點(diǎn)贊??評(píng)論??收藏?
- ??表情分享:??????????????????????????????????
??前言:
- 本專欄每篇練習(xí)將包括
5個(gè)選擇題 + 2個(gè)編程題
,將涵蓋C語(yǔ)言的不同方面,包括基礎(chǔ)語(yǔ)法、數(shù)據(jù)類型、控制結(jié)構(gòu)、數(shù)組、指針和函數(shù)等。通過(guò)練習(xí),你將逐步掌握C語(yǔ)言的基礎(chǔ)知識(shí)和常見(jiàn)問(wèn)題,提高你的編程技巧和解決問(wèn)題的能力。- 我希望這個(gè)博客能夠?yàn)槟闾峁┯袃r(jià)值的練習(xí)資源,讓你在實(shí)踐中不斷進(jìn)步。同時(shí),我們也鼓勵(lì)你在練習(xí)過(guò)程中進(jìn)行思考和創(chuàng)新,嘗試使用不同的編程方法和技巧。
- 讓我們一起挑戰(zhàn)C語(yǔ)言練習(xí)題,攻克每一個(gè)難點(diǎn),不斷提升自己的編程技能!
在評(píng)論區(qū)分享你的練習(xí)心得和問(wèn)題,與我們一起交流和成長(zhǎng)。
??選擇題
- 執(zhí)行下面程序,
正確
的輸出是( )
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
【解析】:swap
函數(shù)調(diào)用時(shí)用的是全局變量
,主函數(shù)中定義的變量只在主函數(shù)中有效,因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),它與其他函數(shù)是平行關(guān)系;輸出語(yǔ)句這里,考慮局部?jī)?yōu)先的原則,故打印的x
值為3
,y
的值為8
。
- 以下
不正確
的定義語(yǔ)句是( )
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
【解析】:
本題B選項(xiàng)考查轉(zhuǎn)義字符,有如下格式,但八進(jìn)制數(shù)字是0-7,沒(méi)有8,故B選項(xiàng)中’\8’是錯(cuò)誤的\ddd ddd表示1到3個(gè)八進(jìn)制數(shù) 如:\130 轉(zhuǎn)義為 字符X
\xhh hh表示1到2位十六進(jìn)制數(shù) 如:\x30 轉(zhuǎn)義為 字符0
- test.c 文件中包括如下語(yǔ)句,文件中定義的四個(gè)變量中,是指針類型的變量為【多選】( )
#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
【解析】:易錯(cuò)題
因?yàn)?define是宏定義,僅僅是直接替換;INT_PTR a, b
, 進(jìn)行宏替換后代碼是這樣的:int *a, b
;這里的int *
是a
的類型,b
的類型是int
,故此次b
只是int
類型。而typedef
是把該類型定義一個(gè)別名,別名是一個(gè)獨(dú)立的類型了,使用這個(gè)類型創(chuàng)建的變量都是這個(gè)類型的。所以a,c,d
才是指針類型。
- 若給定條件表達(dá)式
(M)?(a++):(a--)
,則其中表達(dá)式M
( )
A: 和 (M ==0) 等價(jià) ? B: 和 (M ==1) 等價(jià) ? C: 和(M !=0 )等價(jià) ? D: 和(M != 1)等價(jià)
??正確答案:
C
【解析】:易錯(cuò)題
給定條件表達(dá)式(M)?(a++):(a--)
。 (表達(dá)式1)? (表達(dá)式2): (表達(dá)式3)為三目運(yùn)算符
。
- 三目運(yùn)算符計(jì)算規(guī)則為:先判斷
表達(dá)式1
是否為真,若為真,則計(jì)算表達(dá)式2
,并將表達(dá)式2
的結(jié)果作為整個(gè)表達(dá)式最終的結(jié)果,表達(dá)式3
不計(jì)算;否則,表達(dá)式3
的結(jié)果為最終結(jié)果,表達(dá)式2
不計(jì)算。- 在此表達(dá)式中,若
M=0
,為假,計(jì)算a--
; 若M≠0
,為真,計(jì)算a++
; 若要求與M
等價(jià),則要滿足M
取0
時(shí)為假,取非0
數(shù)值時(shí)為真。
C選項(xiàng)中:假定M
取0
,則M
表示假,當(dāng)M
是0
時(shí),表達(dá)式M!=0
不成立,為假,計(jì)算a--
;當(dāng)M
取非0
數(shù)值時(shí),M
為真,表達(dá)式M!=0
成立,為真,計(jì)算a++
; 符合題意,選C
- 有如下定義語(yǔ)句,則
正確
的輸入語(yǔ)句是【多選】( )
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);
??正確答案:
AB
【解析】:
根據(jù)C語(yǔ)言中的scanf
函數(shù),正確的輸入語(yǔ)句應(yīng)該將變量的地址
作為參數(shù)傳遞給scanf
函數(shù)。
選項(xiàng)A和B是正確的輸入語(yǔ)句。在選項(xiàng)A中,雖然在第二個(gè)參數(shù)中使用"&c" 與一般情況下使用數(shù)組名" c " (即選項(xiàng)B) 稍有不同,但兩者地址值是一樣的,程序的效果相同,因?yàn)樗硎緮?shù)組首元素的地址。而選項(xiàng)C和D均不正確,因?yàn)樵谧x取整數(shù)時(shí)需要使用"&b"來(lái)獲取變量b的地址。
??編程題
??打印從1到最大的n位數(shù)
【牛客網(wǎng)鏈接:JZ17 打印從1到最大的n位數(shù)】
【題目信息】:
【答案解析】:
這里首先要清楚n位數(shù)中最大的數(shù)字,實(shí)際上就是 10^n - 1
。 比如:
1位數(shù): 10^1 - 1
2位數(shù): 10^2 - 1
3位數(shù): 10^3 - 1
...
這個(gè)清楚后動(dòng)態(tài)申請(qǐng)空間,將數(shù)值填入就可以了,需要注意的是數(shù)組下標(biāo)從0開(kāi)始,而數(shù)值從1開(kāi)始
int* printNumbers(int n, int* returnSize)
{
*returnSize = pow(10, n) - 1; //確定最大的數(shù)字
int* arr = (int*)malloc(sizeof(int) * (*returnSize));//申請(qǐng)足夠大小的空間
for (int i = 0; i < *returnSize; i++)
{
arr[i] = i + 1;//下標(biāo)從0開(kāi)始,而數(shù)值從1開(kāi)始
}
return arr;
}
【知識(shí)拓展】:
(1)pow函數(shù)
(2)malloc函數(shù)
這里只是簡(jiǎn)單的介紹了malloc函數(shù)的原型,具體如何使用還是需要大家多多探索,畢竟熟能生巧,大家只有多多練習(xí)才能提升自己的代碼水平。
??計(jì)算日期到天數(shù)轉(zhuǎn)換
【??途W(wǎng)鏈接:HJ73 計(jì)算日期到天數(shù)轉(zhuǎn)換】
【題目信息】:
【答案解析】:
- 這道題簡(jiǎn)單解法其實(shí)將每個(gè)月的天數(shù)枚舉出來(lái),然后根據(jù)當(dāng)前月份向前累加滿月的天數(shù),然后再加上當(dāng)前月所在的
天數(shù)。最終考慮平閏年的 2 月份區(qū)別是否增加一天。 - 其中需要注意的是平年和閏年的判斷,而且是閏年的月份大于 2 的時(shí)候,也就是 2 月走完,總天數(shù)才能加 1 (比
如 2000年2月18日 ,雖然是閏年,但是 2月 都沒(méi)走完那是不能加上閏年多出的一天的).
#include <stdio.h>
int is_leap_year(int year) //判斷是否為閏年的函數(shù)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return 1;
}
return 0;
}
int main()
{
int month_day[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//下標(biāo)對(duì)應(yīng)月份
int year, month, day;
while (~scanf("%d %d %d", &year, &month, &day))//多組輸入
{
int total_day = day;//先把當(dāng)前月份天數(shù)加上
if (is_leap_year(year) && month > 2)
{
total_day += 1;//若閏年,且月份大于2月,則在平年基礎(chǔ)上+1
}
for (int i = month - 1; i > 0; i--)
{
total_day += month_day[i];//向前累加每月的天數(shù)即可
}
printf("%d\n", total_day);
}
return 0;
}
【拓展】:注意上述代碼中的 while (~scanf(“%d %d %d”, &year, &month, &day)),這條語(yǔ)句也可以寫成 while (scanf(“%d %d %d”, &year, &month, &day)!=EOF)。
scanf
是一個(gè)函數(shù),用于從標(biāo)準(zhǔn)輸入(通常是鍵盤)讀取數(shù)據(jù)并將其存儲(chǔ)到變量中。它的基本語(yǔ)法是:
scanf("%format", &variable1, variable2, ...)
其中"%format"是用于指定輸入數(shù)據(jù)的格式,如整數(shù)(%d),浮點(diǎn)數(shù)(%f),字符(%c)等。"&variable1, variable2, …"是要存儲(chǔ)輸入的變量的地址。
然后,~是一個(gè)位運(yùn)算符,表示按位取反。它對(duì)操作數(shù)的每一位進(jìn)行取反,即把0變?yōu)?,把1變?yōu)?。在計(jì)算機(jī)中,數(shù)的存儲(chǔ)是以二進(jìn)制的形式進(jìn)行的,所以按位取反操作可以實(shí)現(xiàn)對(duì)一個(gè)數(shù)的所有二進(jìn)制位取反。scanf
返回值是成功讀取數(shù)據(jù)的個(gè)數(shù),如果scanf
遇到問(wèn)題(如用戶輸入的不是數(shù)字,或者已經(jīng)到達(dá)了文件尾),那么scanf
會(huì)返回-1,-1在內(nèi)存中存儲(chǔ)的是補(bǔ)碼,其補(bǔ)碼是全1,所以~scanf
取反后就變?yōu)槿?,就會(huì)返回0,循環(huán)就會(huì)停止。
??今天的內(nèi)容就到這里了,有什么問(wèn)題的話歡迎大家在評(píng)論區(qū)討論,也可以私信博主為你解答,如果覺(jué)得博主的文章還不錯(cuò)的話, 請(qǐng)??三連支持一下博主哦??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-682956.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-682956.html
到了這里,關(guān)于C語(yǔ)言練習(xí)題解析:挑戰(zhàn)與突破,開(kāi)啟編程新篇章!(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!