前言:
每日一練系列,每一期都包含5道選擇題,2道編程題,博主會盡可能詳細地進行講解,令初學者也能聽的清晰。每日一練系列會持續更新,暑假時三天之內必有一更,到了開學之后,將看學業情況更新。
?五道選擇題:
1、請閱讀以下程序,其運行結果是( )
?
#include<stdio.h>
int main()
{
char c='A';
if('0'<=c<='9') printf("YES");//1
else printf("NO");
return 0;
}
A、YES? ? ? ?B、NO? ? ? ?C、YES? ? ??D、語句錯誤
解析:易錯題,很多人看到代碼1的時候就會下意識的認為,它的判定條件是變量c大于等于字符0且小于等于字符9才打印YES,實際上要實現這樣的功能代碼得是'0'<=c&&c<='9'
代碼1的執行是先進行'0'<=c這個運算,再把運算所得到的值與'9'進行比較,c存放的是字符變量'A',ASCII碼值為65,'0'的ASCII碼值為48。所以'0'<=c得到的值是1,再與'9'進行比較,顯然1<='9',最終表達式為真,執行YES的打印。故選C
2?、下列程序的輸出結果是什么( )
#include<stdio.h>
int main()
{
int n = 1001;
int ans = 0;
for(int i = 1; i <= n; ++i)
{
ans ^= i % 3;//1
}
printf("%d",ans);
return 0;
}
A、-2? ? ? ? ?B、0? ? ? ? C 、1? ? ? ? D、2
解析:^(異或)運算符的計算規則是將兩個數相同的位變為0,不同的位變為1,那么兩個相同的數^等于0,^運算符還滿足交換律,因此在進行^的時候可以任意地交換數字之間的位置。
觀察代碼發現,目標是打印出ans的值,ans在最開始的時侯被賦值為0,然后進入for循環,走向代碼1,不停地^i%3的值。i%3可以看出,會在0,1,2三個數中循環,而循環的開始i是為1,所以循環是1,2,0,那么ans就在不停地^1,2,0。觀察可知循環的次數為1001,1001/3=333余2。而第332次1,2,0的時候是偶數,意味著第332次時,1,2,0都是一對一對的,那么全部都會被^為0,故最后的結果為(0^1^2)^1^2,等于0,所以選B
3、下面有關空指針和未初始化指針,說法錯誤的是( )
A、對0x0這個地址取值是非法的
B、空指針可以確保不指向任何對象或函數; 而未初始化指針則可能指向任何地方
C、空指針與任何對象或函數的指針值都不相等? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D、malloc在其內存分配失敗時返回的是一個未初始化的指針
解析:不能對空指針進行解引用操作,A正確。空指針是沒有指先任何空間的指針,未初始化的指針是野指針,是不安全的可能指向任何地方,B正確。空指針沒指向任何空間,沒有值,故C正確。malloc創建失敗的話會返回空指針,故D錯誤。選D
4、有以下函數,該函數的功能是( )
int fun(char *s)
{
char *t = s;
while(*t++);//1
return(t-s);//2
}
A、比較兩個字符的大小? ? ? ? ?B、計算s所指字符串占用內存字節的個數
C、計算s所指字符串的長度? ?D、將s所指字符串復制到字符串t中
解析:易錯題,遇到這種題最好的方法就是傳一個東西進去試一下,我們傳字符串"abc"進去,可以看出,函數fun先使用字符指針t存放s的指針,所以此時t可以等效為"abc"的首地址,走到代碼1,是一個循環,循環會令t不停地走直到走到'\0',因為'\0'的ASCII碼值為0。而字符串"abc"走三次才會走到'\0'。但是要注意,*t++,也就是會走到'\0'之后的一個位置。最后走到代碼2,首地址和后面的一個地址一減,就會得到字符串"abc"的長度再+1=4。綜上所述,答案選B,計算的是字符串占用內存字節的個數,包含'\0'
?5、若有float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; 則 *pa 的值是()
A、1.5? ? ? B、2.5? ? ? C、3.5? ? ? D、4.5
解析:從左往右一步步看,首先定義了一個浮點型數組a,存放了1.5,2.5,3.5。接著,使用浮點型指針將浮點型數組a的首地址賦給pa,那么pa現在存放的值為1.5,最后*(pa++)*=3,先使用后++,根據優先級,解引用得到1.5*=3,那么數組a首地址所指向的值被修改為4.5。然后pa++,來到2.5所在的地址,*pa解引用,故最后得到的值為2.5,選B
??
編程題1:?
?統計每個月兔子的總數_牛客題霸_牛客網統計每個月兔子的總數_牛客題霸_牛客網
思路:通過一些計算你可以發現,第n個月的兔子總數就是第n個斐波那契數,接下來就很簡單了。
#include <stdio.h>
int main()
{int a=1;int b=1;int month=0;scanf("%d",&month);if(month<3)//當要計算的斐波那契數<3直接打印1{printf("%d",a);return 0;}while(month-2){int tmp=a;a=b;b=tmp+b;month--;}printf("%d",b);
}
?編程題2:
最大公約數__牛客網 (nowcoder.com)
思路:使用輾轉相除法解決問題,具體做法是:用較大數除以較小數,再用出現的余數(第一余數)去除除數,再用出現的余數(第二余數)去除第一余數,如此反復,直到最后余數是0為止。如果是求兩個數的最大公約數,那么最后的除數就是這兩個數的最大公約數。?
#include <stdio.h>
int main() {long long int a = 0; long long int b = 0;//使用long long,防止數據過大scanf("%lld %lld", &a, &b);while (b){long long int tmp = b;//儲存中間變量b = a % b;a = tmp;}printf("%lld", a);return 0;
}
??好了,今天的練習到這里就結束了,感謝各位友友的來訪,祝各位友友前程似錦O(∩_∩)O