🔥個人主頁:@草莓熊Lotso
🎬作者簡介:C++研發方向學習者
📖個人專欄:?《C語言》?《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》
??人生格言:生活是默默的堅持,毅力是永久的享受。
前言:我們距離學習完C語言已經很久了,在數據結構學完后,博主準備通過這16天的強化訓練和大家一起回顧C語言的知識,每天都是五道選擇和兩道編程題,希望大家能有所收獲。
目錄
選擇題:
編程題:
1.打印從1到最大的n位數
2.計算日期到天數轉換
選擇題:
1.執行下面程序,正確的輸出是( )
A: 5,7 B: 7,5 C: 3,8 D: 8,3
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;
}
答案解析:
正確答案:Cswap函數調用時用的是全局變量,主函數中定義的變量只在主函數中有效,因為主函數也是一個函數,它與其他函數是平行關系;輸出語句這里,考慮局部優先的原則,故選C
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
本題B選項考查轉義字符,有如下格式,但八進制數字是0-7,沒有8,故B選項中'\8'是錯誤的\ddd ddd表示1到3個八進制數 如:\130 轉義為 字符X\xhh hh表示1到2位十六進制數 如:\x30 轉義為 字符0
3.test.c 文件中包括如下語句,文件中定義的四個變量中,是指針類型的變量為【多選】( )
A: a B: b C: c D: d
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;
答案解析:
正確答案:ACD
因為#define是宏定義,僅僅是直接替換,INT_PTR a, b; 進行宏替換后代碼是這樣的:int *a, b;這里的int *是a的類型,b的類型是int,故此次b只是int類型。而typedef是把該類型定義一個別名,別名是一個獨立的類型了,使用這個類型創建的變量都是這個類型的。所以 a,c,d才是指針類型
4.若給定條件表達式 (M)?(a++):(a--) ,則其中表達式 M ()
A: 和(M==0)等價 B: 和(M==1)等價 C: 和(M!=0)等價 D: 和(M!=1)等價
答案解析:
正確答案:C
給定條件表達式(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.有如下定義語句,則正確的輸入語句是【多選】( )
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&c和c兩個地址值是一樣的,程序的效果相同,也沒錯,但同時也必須把變量b的地址給scanf,故CD錯誤,AB正確
編程題:
1.打印從1到最大的n位數
題目鏈接:打印從1到最大的n位數_牛客題霸_牛客網
題目描述:
題目樣例:
代碼演示:
/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param n int整型 最大位數* @return int整型一維數組* @return int* returnSize 返回數組行數*/
int* printNumbers(int n, int* returnSize ) {// write code here*returnSize=pow(10,n)-1;int *arr=(int*)malloc(*returnSize*sizeof(int));for(int i=0;i<*returnSize;i++){arr[i]=i+1;}return arr;
}
題目解析:
- 這里首先要清楚n位數中最大的數字,實際上就是 10^n - 1,這個清楚后動態申請空間,將數值填入就可以了,需要注意的是數組下標從0開始,而數值從1開始
2.計算日期到天數轉換
題目鏈接:計算日期到天數轉換_牛客題霸_牛客網
題目描述:
題目樣例:
代碼演示:
#include <stdio.h>int main() {int y, m,d;scanf("%d%d%d",&y,&m,&d);int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int days=0;if((y%4==0&&y%100!=0)||(y%400==0)&&m==2){day[2]+=1;}for(int i=1;i<m;i++){days+=day[i];}days+=d;printf("%d",days);return 0;
}
題目解析:
這道題簡單解法其實將每個月的天數枚舉出來,然后根據當前月份向前累加滿月的天數,然后再加上當前月所在的天數。最終考慮平閏年的 2 月份區別是否增加一天。 其中需要注意的是平年和閏年的判斷,而且是閏年的月份大于 2 的時候,也就是 2 月走完,總天數才能加1(比如 2000年2月18日 ,雖然是閏年,但是 2月 都沒走完那是不能加上閏年多出的一天的).
往期回顧:
《解鎖 C++ 起源與核心:命名空間用法 + 版本演進全知道》
《解鎖 C++ 基礎密碼:輸入輸出、缺省參數,函數重載與引用的精髓》
結語:本篇博客就到此結束了,C 語言的精髓在于對細節的掌控和對底層的理解,這需要持續實踐。愿你帶著這份訓練中獲得的思維與習慣,在編程路上走得更穩、更遠。如果文章對你有幫助的話,歡迎評論,點贊,收藏加關注,感謝大家的支持。