選擇題:
題一:
1、設(shè)變量已正確定義,以下不能統(tǒng)計(jì)出一行中輸入字符個(gè)數(shù)(不包含回車符)的程序段是( )
A: n=0;while(ch=getchar()!='\n')n++;? ? ?B: n=0;while(getchar()!='\n')n++;
C: for(n=0;getchar()!='\n';n++);? ? ? ? ? ? ? D: n=0;for(ch=getchar();ch!='\n';n++);
答案解析:? ? ??
????????對(duì)于for循環(huán),其中第一項(xiàng)初始化表達(dá)式只執(zhí)行一次,因此ch只從輸入流中取一個(gè)字符,之后就再不會(huì)取字符,因此會(huì)死循環(huán)。
題二:
2、運(yùn)行以下程序后,如果從鍵盤上輸入 65 14<回車> ,則輸出結(jié)果為( )
int main()
{
????????int m, n;
????????printf("Enter m,n;");
????????scanf("%d%d", &m,&n);while(m!=n)? ? ? ? ? ? //1
{
????????while(m>n) m=m-n; //2
????????while(n>m) n=n-m; //3
}
????????printf("m=%d\n",m);
????????return 0;
}
A: 3? ? B: 2? ? C: 1? ? D: 0
答案解析:
????????此題技巧是耐心,考查while循環(huán)和循環(huán)嵌套的理解,初值m=65,n=14;循環(huán)1判斷m!=n為真,來(lái)到循環(huán)2判斷m>n為真,執(zhí)行m=m-n;直到m=9,n=14;循環(huán)2結(jié)束來(lái)到循環(huán)3判斷n>m為真,執(zhí)行n=n-m;直到m=9,n=5;循環(huán)3結(jié)束回到循環(huán)1,如此往復(fù)直到m==n時(shí),循環(huán)結(jié)束。
題三:
3、若運(yùn)行以下程序時(shí),從鍵盤輸入 ADescriptor<回車> ,則下面程序的運(yùn)行結(jié)果是( )
#include <stdio.h>
int main()
{
????????char c;
????????int v0=0,v1=0,v2=0;
do
{
????????switch(c=getchar())
????????{
????????case'a':case'A':
????????case'e':case'E':
????????case'i':case'I':
????????case'o':case'O':
????????case'u':case'U':v1 += 1;
????????default:v0+= 1;v2+=1;
????????}
}while(c!='\n');
????????printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
????????return 0;
}
A: v0=7,v1=4,v2=7? ? ? ? ? ?B: v0=8,v1=4,V2=8
C: v0=11,v1=4,v2=11? ? ? ?D: v0=12,v1=4,v2=12
答案解析:
????????代碼switch語(yǔ)句中沒(méi)有break,則每次找到入口進(jìn)入后,順序執(zhí)行到代碼塊結(jié)束為止。例如當(dāng)c為'A'時(shí),從case 'A'進(jìn)入,先后執(zhí)行v1+=1;v0+=1;v2+=1;,而當(dāng)c為'p'時(shí),從default進(jìn)入,先后執(zhí)行v0+=1;v2+=1;,容易看出最終v0和v2是相等的。
題四:
4、如下函數(shù)是求兩個(gè)int數(shù)字最大公約數(shù)的,指出其中存在的問(wèn)題【多選】( )
int gcd(char x,char y)
{
????????int min = x < y ? x : y;
????????for (min = 0; min > 0; min--)
????????if (x % min = 0 && y % min = 0)
????????return min;
}
A: 參數(shù)類型不對(duì) B: 循環(huán)變量min初值不對(duì) C: 判斷等于的符號(hào)不對(duì) D: 返回類型不對(duì)
答案解析:
?????????1.函數(shù)實(shí)參是int,形參用char不對(duì),會(huì)發(fā)生截?cái)鄟G失數(shù)據(jù);2.min在for循環(huán)開始時(shí)更新為0,不再是兩個(gè)形參中的較小值;3.判斷是否整除的時(shí)候誤將==寫成=賦值運(yùn)算符;4.函數(shù)最終要返回一個(gè)int值,返回值類型沒(méi)問(wèn)題,但是這里要強(qiáng)調(diào)一個(gè)選項(xiàng)中沒(méi)寫出的問(wèn)題,如果是??途W(wǎng)上的題,會(huì)報(bào)編譯錯(cuò)誤,說(shuō)該函數(shù)不是在所有情況下都有返回值,只有在if條件成立的情況下有返回值,一般在vs上這種情況能通過(guò),編譯器會(huì)給一個(gè)默認(rèn)的返回值。
題五:
5、執(zhí)行下面的程序段,語(yǔ)句3的執(zhí)行次數(shù)為( )
for(i = 0; i <= n-1; i++) // (1)
for(j = n; j > i; j--) // (2)
state; // (3)
A: n(n+2)/2? ? B: (n-1)(n+2)/2? ? C: n(n+1)/2? ?D: (n-1)(n+2)
答案解析:? ? ? ??
????????外循環(huán)有n次,當(dāng)i=0,內(nèi)循環(huán)為n次,當(dāng)i=1,內(nèi)循環(huán)為n-1次,當(dāng)i=2時(shí),內(nèi)循環(huán)為n-2次,以此類推,總次數(shù)為n+(n-1)+(n-2)+......+2+1,就是個(gè)等差數(shù)列,等于n(n+1)/2。
編程題:
題一:錯(cuò)誤的集合
?645. 錯(cuò)誤的集合 - 力扣(LeetCode)
示例:
輸入:nums = [1,2,2,4]
輸出:[2,3]
?思路一:
? ? ? ? 排序法:由于題目沒(méi)有說(shuō)明數(shù)組是否有序,所以需要我們自己將數(shù)組排序,才能去遍歷;同時(shí)需要知道的是returnSize是指返回?cái)?shù)組元素的個(gè)數(shù)。
第一步:使用qsort()函數(shù)將數(shù)組排序成升序;
第二步:為返回值數(shù)組開辟動(dòng)態(tài)內(nèi)存空間,否則在出函數(shù)時(shí)會(huì)釋放;
第三步:定義一個(gè)數(shù)來(lái)記錄數(shù)組的前一個(gè)數(shù);
第四步:遍歷數(shù)組:相同記錄為num[0],數(shù)組當(dāng)前元素-前一個(gè)元素值大于一說(shuō)明中間的就是缺的元素num[1];
第五步:如果最后一個(gè)元素不等于長(zhǎng)度,說(shuō)明最后一個(gè)就是缺的元素。
int my_cmp(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
//將數(shù)組進(jìn)行升序排序
qsort(nums,numsSize,4,my_cmp);
//returnSize為返回?cái)?shù)組元素個(gè)數(shù)
*returnSize = 2;
//開辟動(dòng)態(tài)內(nèi)存空間,否則在出函數(shù)時(shí)會(huì)釋放
int* num = (int*)malloc(sizeof(int)*2);
//定義數(shù)組的前一個(gè)數(shù)
int front = 0;
//遍歷數(shù)組
for(int i = 0; i < numsSize;i++ )
{
//相同記錄為num[0]
if(nums[i] == front)
{
num[0] = nums[i];
}
//數(shù)組當(dāng)前元素-前一個(gè)元素值大于一說(shuō)明中間的就是缺的元素
else if(nums[i] - front > 1)
{
num[1] = nums[i]-1;
}
front = nums[i];
}
//最后一個(gè)元素不等于長(zhǎng)度,說(shuō)明最后一個(gè)就是缺的元素
if(nums[numsSize-1] != numsSize)
{
num[1] = numsSize;
}
return num;
}
?思路二:
????????使用標(biāo)記的方式就可以找出重復(fù)的數(shù)字,數(shù)組中出現(xiàn)過(guò)哪個(gè)數(shù)字就把對(duì)應(yīng)數(shù)字作為下標(biāo)在對(duì)應(yīng)位置1,表示已經(jīng)標(biāo)記出現(xiàn)過(guò),如果哪個(gè)數(shù)據(jù)對(duì)應(yīng)位已經(jīng)置1,則表示就是重復(fù)的數(shù)字。有了重復(fù)的數(shù)字,拿 [1, n] 的總和減去去掉重復(fù)數(shù)據(jù)的數(shù)組總和就是丟失的數(shù)據(jù)。 其實(shí)使用標(biāo)記法時(shí)出現(xiàn)的數(shù)字對(duì)應(yīng)位每次 ++ ,則最后出現(xiàn)0次的就是丟失,出現(xiàn)2次的就是重復(fù)的,這樣的方式也可以,不過(guò)需要多次遍歷。
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
*returnSize = 2;
//遍歷nums數(shù)組,將其中數(shù)據(jù)對(duì)應(yīng)的位置1, 哪一位如果已經(jīng)重置過(guò)則意味著數(shù)據(jù)重復(fù)了
int *arr = (int *)calloc(numsSize + 1, sizeof(int));//申請(qǐng)numsSize個(gè)整形空間,并初始化為0
int *ret = (int *)calloc(*returnSize, sizeof(int));//申請(qǐng)2個(gè)整形空間,并初始化為0
int cur_sum = 0, old_sum = 0;
for (int i = 0; i < numsSize; i++) {
if (arr[nums[i]] == 1)
{ //這個(gè)數(shù)字在上邊數(shù)組的對(duì)應(yīng)位置已經(jīng)置過(guò)1了,則重復(fù)
ret[0] = nums[i];//找到重復(fù)的數(shù)字
}
arr[nums[i]] = 1; //將標(biāo)記數(shù)組的對(duì)應(yīng)數(shù)據(jù)位置1
old_sum += i + 1; // 1~n的求和
cur_sum += nums[i]; //當(dāng)前數(shù)組中的數(shù)據(jù)求和(多了一個(gè)重復(fù)的,少了一個(gè)丟失的)
}
ret[1] = old_sum - (cur_sum - ret[0]);//原始總和,減去去掉重復(fù)后的當(dāng)前總和就是丟失的數(shù)字
free(arr);
return ret;
}
題二:密碼檢查?
密碼檢查_??皖}霸_??途W(wǎng) (nowcoder.com)
示例1
輸入:
1 CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR
輸出:
YES
思路一:
? ? ? ? 暴力的不能再暴力的方法:
第一步:創(chuàng)建輸入密碼數(shù)量的n,和字符串a(chǎn)rr;
第二步:for循環(huán)遍歷,創(chuàng)建用于記錄密碼的字符是否正確count,順便求字符串長(zhǎng)度;
第三步:判斷字符串長(zhǎng)度是否合法;
第四步:遍歷一遍字符串,格式正確就記錄count;
第五步:最后將字符串長(zhǎng)度與count比較,相同“YES”,反之“NO”。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-707588.html
int main()
{
int n = 0;
scanf("%d",&n);
//字符串長(zhǎng)度限制
char arr[100] = {0};
//密碼個(gè)數(shù)
for(int j = 0;j < n;j++)
{
scanf("%s",arr);
//用于記錄密碼的字符是否正確
int count =0;
//字符串長(zhǎng)度
int sz = strlen(arr);
//是否符合長(zhǎng)度要求
if(sz >= 8 && sz <= 100)
{
//遍歷一遍字符串,格式正確就記錄
for(int i = 0;i < sz;i++)
{
if(arr[i] >= 'A' && arr[i] <='Z'||
arr[i] >= 'a' && arr[i] <='z' ||
arr[i] >= '0' && arr[i] <='9')
{
count++;
}
}
}
//長(zhǎng)度對(duì)比
if(sz == count)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
?本人實(shí)力有限可能對(duì)一些地方解釋和理解的不夠清晰,可以自己嘗試讀代碼,或者評(píng)論區(qū)指出錯(cuò)誤,望海涵!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-707588.html
到了這里,關(guān)于C語(yǔ)言:選擇+編程(每日一練Day4)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!