目錄
選擇題:
題一:
題二:
題三:
題四:
題五:
編程題:
題一:數(shù)對
思路一:
題二:截取字符串
思路一:
本人實力有限可能對一些地方解釋和理解的不夠清晰,可以自己嘗試讀代碼,或者評論區(qū)指出錯誤,望海涵!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
選擇題:
題一:
1、指出下列代碼的缺陷【多選】( )
float f[10];
// 假設(shè)這里有對f進行初始化的代碼
for(int i = 0; i < 10;)
{
????????if(f[++i] == 0)
????????break;
}
A: for(int i = 0; i < 10;)這一行寫錯了
B: f是float型數(shù)據(jù)直接做相等判斷有風(fēng)險
C: f[++i]應(yīng)該是f[i++]D: 沒有缺陷
答案解析:
????????一般float型只能精確到小數(shù)后六位(即1e-6),將float型數(shù)據(jù)的絕對值與1e-6比較,來判斷是否相等(為零)。float的精度誤差在1e-6;double精度誤差在1e-15;所以要判斷一個float型數(shù):if(fabs(f)<1e-6);要判斷一個double型數(shù):if(fabs(f)<1e-15);若滿足,則為零??紤]B選項是對的。若要判斷float a,b是否相等,要看if(fabs(a-b)<1e-6)是否為真。C選項,考慮的是數(shù)組越界問題。
題二:
2、請指出以下程序的錯誤【多選】( )
void GetMemory(char **p, int num)
{
????????if(NULL == p && num <= 0)//1
????????????????return;
????????*p = (char*)malloc(num);
? ? ? ? return;
}int main()
{
????????char *str = NULL;
????????GetMemory(&str, 80); //2
????????if(NULL != str)
????????{
????????????????strcpy(&str, "hello"); //3
????????????????printf(str); //4
????????}????????return 0;
}
A: 1? ? B: 2? ? C: 3? ? D: 4
答案解析:
????????第1處兩種情況之一成立都是要返回的,應(yīng)該用或,此處用與錯誤。在語句GetMemory(&str,100);中傳入str的地址,在語句char*str=NULL;中str初始化為空指針,但是str指針變量也有地址,所以參數(shù)char**p里面的p保存的是指針變量str的地址,所以調(diào)用GetMemory函數(shù)之后,動態(tài)開辟的空間的地址存放在了str中,在函數(shù)返回之后沒有釋放內(nèi)存,但是這不會導(dǎo)致程序錯誤,只會導(dǎo)致內(nèi)存泄漏。第3處用&str是錯的,應(yīng)該直接用str,是剛申請下來的空間首地址,可以用來接收字符串的copy。
題三:
3、請問下列代碼的輸出結(jié)果有可能是哪些【多選】( )
#include <stdio.h>
typedef union
{
????????int a;
????????struct
????????{
????????????????short b;
????????????????short c;
????????};
}X;
int main()
{
????????X x;
????????x.a = 0x20150810;
????????printf("%x,%x\n", x.b, x.c);
????????return 0;
}
A: 2015,810? ? B: 50810,201? ? C: 810,2015? ? D:`20150,810
答案解析:
????????對于0x20150810如果按照大端模式存儲:從低地址到高地址:20 15 08 10 輸出從低地址到高地址:20 15 08 10如果按照小端模式存儲:從低地址到高地址:10 08 15 20 輸出從高地址到低地址:08 10 20 15此數(shù)以int類型賦值給聯(lián)合體x.a,而以結(jié)構(gòu)成員b和c分開訪問,分別拿到低地址的2個字節(jié)和高地址的2個字節(jié),大端下是2015和810,小端下是810和2015。
題四:
4、下面這個程序執(zhí)行后會有什么錯誤或者效果【多選】( )
#define MAX 255
int main()
{
????????unsigned char A[MAX], i;
????????for(i = 0; i <= MAX; i++)
????????????????A[i] = i;
????????return 0;
}
A: 數(shù)組越界? ? B: 死循環(huán)? ? C: 棧溢出? ? D: 內(nèi)存泄露
答案解析:
????????數(shù)組下標(biāo)越界:數(shù)組大小255,但是當(dāng)a[255]就是256個元素,導(dǎo)致越界了。死循環(huán):這個是因為無符號字符型的變量大小在0-255之間,所以說i永遠(yuǎn)不可能大于255的,是個死循環(huán)。內(nèi)存泄漏:創(chuàng)建的臨時變量,在棧中,應(yīng)該會由系統(tǒng)自動釋放,所以應(yīng)該是不存在內(nèi)存泄漏的問題。棧溢出:屬于緩沖區(qū)溢出的一種。棧溢出是由于C語言系列沒有內(nèi)置檢查機制來確保復(fù)制到緩沖區(qū)的數(shù)據(jù)不得大于緩沖區(qū)的大小,因此當(dāng)這個數(shù)據(jù)足夠大的時候,將會溢出緩沖區(qū)的范圍。
題五:
5、請問下列程序的輸出是多少( )
#include<stdio.h>
int main()
{
????????unsigned char i = 7;
????????int j = 0;
????????for(;i > 0;i -= 3)
????????{
????????????????++j;
????????}
????????printf("%d\n", j);
????????return 0;
}
A: 2? ? B: 死循環(huán)? ? C: 173? ? D: 172
答案解析:
????????本題就是找規(guī)律,計算什么時候能遇到0unsigned char 8位數(shù)據(jù)位,范圍在0-255,所以-2(11111110)時,變成254;同理-1(11111111)時,變成255;最后減到0時,不滿足循環(huán)條件,for停止。剛好173次。 7 4 1 ==> 共(7-1)/3+1=3次(1-3=-2,即254,繼續(xù)循環(huán))
254 251 ... 5 2 ==> 共(254-2)/3+1=85次(2-3=-1,即255,繼續(xù)循環(huán))255 252 ... 6 3 ==> 共(255-5)/3+1=85次(3-3=0,退出循環(huán)) 所以總共173次。
編程題:
題一:數(shù)對
數(shù)對_牛客題霸_??途W(wǎng) (nowcoder.com)
示例1
????????輸入:
????????5 2????????輸出:
????????7????????說明:
????????滿足條件的數(shù)對有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)
思路一:
假設(shè)輸入 n=10 , k=3
當(dāng) y <=k 時,意味著任何數(shù)字取模y的結(jié)果都在 [0, k-1]之間,都是不符合條件的。
當(dāng) y = k+1=4 時,x符合條件的數(shù)字有 3,7
當(dāng) y = k+2=5 時,x符合條件的數(shù)字有 3,4,8,9
當(dāng) y = k+3=6 時,x符合條件的數(shù)字有 3,4,5,9,10
當(dāng) y = k+n時,
x小于y當(dāng)前值,且符合條件的數(shù)字?jǐn)?shù)量是:y-k個;
x大于y當(dāng)前值,小于2*y的數(shù)據(jù)中,且符合條件的數(shù)字?jǐn)?shù)量是:y-k個;
從上一步能看出來,在y的整數(shù)倍區(qū)間內(nèi),x符合條件的數(shù)量就是 (n / y) * (y - k)個;
n / y 表示有多少個完整的 0 ~ y區(qū)間, y - k 表示有每個區(qū)間內(nèi)有多少個符合條件的數(shù)字
最后還要考慮的是6...往后這種超出倍數(shù)區(qū)間超過n的部分的統(tǒng)計;
n % y 就是多出完整區(qū)間部分的數(shù)字個數(shù),其中k以下的不用考慮,則符合條件的是 n % y - (k-1) 個;
這里需要注意的是類似于9這種超出完整區(qū)間的數(shù)字個數(shù) 本就小于k的情況,則為0。
最終公式:(n / y) * (y - k) + ((n % y < k) ? 0, (n % y - k + 1));
? ? ? ? 第一步:定義題目需要輸入的n、k,以及用于記錄符合條件的個數(shù)的count;
? ? ? ? 第二步:在while循環(huán)中只要兩個變量都有輸入就執(zhí)行判斷:如果k==0說明所有數(shù)都滿足條件,直接打印所有數(shù)對,然后回到循環(huán)起點;否則:因為k+1之前的數(shù)都不符合條件,從k+1開始記錄數(shù)在y的整數(shù)倍區(qū)間內(nèi),x符合條件的數(shù)量就是 (n / y) * (y - k)個,再加上n % y 就是多出完整區(qū)間部分的數(shù)字個數(shù),其中k以下的不用考慮,則符合條件的是 n % y - (k-1) 個。
????????第三步:最后的和就是需要打印的結(jié)果。?
#include <stdio.h>
int main()
{
long n,k;
while(scanf("%ld%ld",&n, &k) == 2)
{
//用于記錄符合條件的個數(shù)
long count = 0;
//如果k==0說明所有數(shù)都滿足條件
if(k == 0)
{
printf("%ld\n", n*n);
continue;
}
//從k+1之前的數(shù)都不符合條件
for(int y = k+1;y <= n;y++ )
{
//在y的整數(shù)倍區(qū)間內(nèi),x符合條件的數(shù)量就是 (n / y) * (y - k)個
count += (n / y) * (y - k);
//n % y 就是多出完整區(qū)間部分的數(shù)字個數(shù),其中k以下的不用考慮,則符合條件的是 n % y - (k-1) 個
count += (n % y < k) ? 0 : (n % y - k + 1);
}
printf("%ld\n",count);
}
return 0;
}
題二:截取字符串
截取字符串_牛客題霸_??途W(wǎng) (nowcoder.com)
示例1
????????輸入:
????????abABCcDEF ????????6????????輸出:
????????abABCc
思路一:
? ? ? ? 第一步:定義滿足題目要求大小的數(shù)組arr,以及截取數(shù)k;
? ? ? ? 第二步:當(dāng)輸入不為空時,將前k個逐個打?。?/span>
????????第三步:打印完后換行。文章來源:http://www.zghlxwxcb.cn/news/detail-707371.html
#include <stdio.h>
int main()
{
//滿足題目條件的數(shù)組
char arr[1000] = {0};
int k = 0;
//有熟人就執(zhí)行
while(scanf("%s%d", &arr, &k) != EOF)
{
//將前k個逐個打印
for(int i = 0; i < k; i++)
{
printf("%c",arr[i]);
}
printf("\n");
}
return 0;
}
本人實力有限可能對一些地方解釋和理解的不夠清晰,可以自己嘗試讀代碼,或者評論區(qū)指出錯誤,望海涵!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-707371.html
到了這里,關(guān)于C語言:選擇+編程(每日一練Day16)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!