大家好,我是深魚~
【前言】:本部分是C語言初階學(xué)完階段性測試題,最后一道編程題有一定的難度,需要多去揣摩,代碼敲多了,自然就感覺不難了,加油,鐵汁們?。?!
一、選擇題
1.下面程序執(zhí)行后,輸出的結(jié)果為()
#include<stdio.h>
int cnt = 0;
int fib(int n)
{
cnt++;
if (n == 0)
return 1;
else if (n == 1)
return 2;
else
return fib(n - 1) + fib(n - 2);
}
void main()
{
fib(8);
printf("%d", cnt);
}
【解答】:67
函數(shù)遞歸的問題:進(jìn)入一次fib函數(shù),cnt++,要算cnt的值也就是算進(jìn)入了多少次fib函數(shù),那就列樹狀圖:直到列到1和0就不會(huì)再進(jìn)入fib函數(shù)為止,然后列出來的每一個(gè)數(shù)都會(huì)進(jìn)入函數(shù)使cnt++,算一共列有多少數(shù),對于的也就是cnt的值:1+2+4+8+16+22+12+2=67
2.以下程序k的最終值是()
int i = 10;
int j = 20;
int k = 3;
k *= i + j;
【解答】:90
本題考察的是操作符優(yōu)先級(jí)的問題
賦值操作符(*=,/=,+=,-=)的優(yōu)先級(jí)很低,所以肯定是i+j先算,然后再*k,也就是k*=30,也就是90
3.判斷正誤:C語言本身沒有輸入輸出語句
【解答】:正確
C語言是給定了語法,輸入輸出是庫函數(shù)提供的
C語言約定了一些函數(shù),規(guī)定了函數(shù)的名字,功能,參數(shù),返回類型
這些規(guī)定的函數(shù)是由編譯器的廠商實(shí)現(xiàn)的,msvc,gcc,clang的廠商在實(shí)現(xiàn)編譯器的時(shí)候提供實(shí)現(xiàn)的,這些函數(shù)是放在標(biāo)準(zhǔn)庫中,稱為庫函數(shù)
?4.若有定義語句int year=1009,*p=&year,以下不能使變量year中的值增至1010的語句是()
A.*p+=1? ? ? ? ? ? ? ? ? ? ? ? ?B.(*p)++? ? ? ? ? ? ? ? ? ? ???? ? ? ?? C.++(*p)??? ? ? ? ? ? ? ? D.*p++
【解答】:D
其實(shí)上面的代碼就相當(dāng)于int year=1009;int *p=&year
A.*(解引用操作符)的優(yōu)先級(jí)高于+=(賦值操作符),p解引用指向year,然后year++
B.有括號(hào)先算*p,然后year++
C.也有括號(hào),只要對(*p)也就是year++就可以
D.*p++,++優(yōu)先級(jí)高于*,++先執(zhí)行,p++后置++,值先為p,然后p++,這里就是地址++,而不是地址指向的元素++
5.char a;int b;float c;double d;
則表達(dá)式a*b+d-c值的類型為
【解答】:double類型
首先a*b(char*int),char類型整形提升變成int類型,int *int類型結(jié)果是int類型
然后int+double類型,這個(gè)時(shí)候int類型就算術(shù)轉(zhuǎn)化為double類型,double+double類型結(jié)果是double類型
最后double-float類型,這個(gè)時(shí)候float類型就算術(shù)轉(zhuǎn)化為double類型,double-double類型結(jié)果是double類型
【注意】:這個(gè)過程發(fā)生了整形提升和算術(shù)轉(zhuǎn)化,是先變類型再進(jìn)行運(yùn)算
二、編程題
1.求最小公倍數(shù)
【題目】:
?【題解1】:常規(guī)做法
最小公倍數(shù)一定是大于等于輸入的兩個(gè)數(shù)的,所以可以從兩個(gè)數(shù)的較大數(shù)開始加,看加到哪個(gè)數(shù)可以同時(shí)將兩個(gè)數(shù)整除
#include <stdio.h>
int main()
{
int a=0;
int b=0;
//輸入
scanf("%d %d",&a,&b);
//求較大值
int m=a>b?a:b;
//從較大者開始求最小公倍數(shù)
while(1)
{
if(m%a==0&&m%b==0)
break;
m++;
}
//輸出
printf("%d\n",m);
return 0;
}
【題解2】:最小公倍數(shù)=輸入的兩個(gè)數(shù)的積 / 最大公約數(shù)(輾轉(zhuǎn)相除法)
#include <stdio.h>
int main()
{
int a=0;
int b=0;
int c=0;
//輸入
scanf("%d %d",&a,&b);
int n=a*b;
//求最大公約數(shù)
while(c=a%b)
{
a=b;
b=c;
}
//輸出
printf("%d\n",n/b);
return 0;
}
【題解3】:效率最高
假設(shè)m是a和b的最小公倍數(shù),那么m既能被a整除,又能被b整除,m/a=i,m/b=j,那么我們就看a*i能否將b整除,eg:求3和5的最小公倍數(shù),首先看3*1能否整除5,再看3*2是否能整除5,以此類推,直到找到3*i可以整除5,那么這時(shí)3*i就是最小公倍數(shù)
#include <stdio.h>
int main()
{
int a=0;
int b=0;
//輸入
scanf("%d %d",&a,&b);
int i=1;
while(a*i%b)
{
i++;
}
//輸出
printf("%d\n",a*i);
return 0;
}
【注意】:我們最好把int類型都寫成long long類型,因?yàn)閍和b最大可以到達(dá)100000,他們相乘是很大的,long long類型的輸入輸出都是%lld
2.字符串的倒置?
【題目】:
【題解】:
思路:逆序整個(gè)字符串,再逆序每個(gè)單詞(或者先逆序每個(gè)單詞,再逆序整個(gè)字符串)
#include <stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] = {0};
gets(arr);
int len=strlen(arr);
//1.逆序整個(gè)字符串
reverse(arr,arr+len-1);
//2.逆序每個(gè)單詞
char*cur=arr;
while(*cur!='\0')
{
char*start=cur;
while(*cur!=' '&&*cur!='\0')
{
cur++;
}
char*end=cur-1;
reverse(start,end);
if(*cur==' ')
cur++;
}
printf("%s\n",arr);
return 0;
}
【注意事項(xiàng)】:
(1)輸入字符串:不能正常用scanf函數(shù)輸入,因?yàn)樗挥龅娇崭窬屯V棺x取了,gets(arr)
要用也得這樣寫scanf("%[^\n]s",arr);意思就是scanf函數(shù)直到讀到\n才停止
也可以用getchar:
int ch=0;
int i=0;
while(? ?(ch=getchar(? )?)!='\n')
{
? ? arr[i++]=ch;
}
(2)逆序整個(gè)字符串:思路是將左右字符一個(gè)一個(gè)交換,直到?left>right停止交換
還有就是reverse自定義函數(shù)傳參的時(shí)候最后字符的地址怎么傳:首字符地址+字符串的長度-1
?(3)逆序輸出:首先定義一個(gè)cur指針指向字符串的最前面,然后開始遍歷,以一個(gè)單詞為一個(gè)循環(huán),當(dāng)指針指向的不是空格或者\(yùn)0時(shí)cur繼續(xù)向下遍歷,直到遇到了,就倒置這個(gè)單詞,我們就用start和end指針分別來指向一個(gè)單詞的首尾,然后單詞也可以當(dāng)字符串倒置
當(dāng)一個(gè)單詞結(jié)束,就需要進(jìn)入下一個(gè)單詞,這個(gè)時(shí)候就要將cur++,但是如果這是最后一個(gè)單詞,就不需要cur++,因?yàn)樵?+就會(huì)造成數(shù)組越界
這次內(nèi)容就到此啦,有什么問題歡迎評(píng)論區(qū)或者私信交流,覺得筆者寫的還可以,或者自己有些許收獲的,麻煩鐵汁們動(dòng)動(dòng)小手,給俺來個(gè)一鍵三連,萬分感謝 !文章來源:http://www.zghlxwxcb.cn/news/detail-629211.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-629211.html
到了這里,關(guān)于C語言階段性測試題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!