重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
鳥類天堂:
?🦢一:函數(shù)類型的對(duì)應(yīng)
🦜代碼呈現(xiàn):
? 🦢二:浮點(diǎn)數(shù)運(yùn)算
? 🦢三:scanf的使用
?🦩?NUM 1:遇見空格,回車符,制表符,結(jié)束。
?🦩 NUM 2:達(dá)到域?qū)捊Y(jié)束
?🦩 NUM 3:輸入非法字符結(jié)束
??🦩 NUM 4:結(jié)束之后的回車會(huì)存儲(chǔ)在緩沖區(qū)
??🦜代碼呈現(xiàn):
? 🦢四:異或操作符的妙用
??🐦 NUM 1:找單身狗問題
??🦜代碼呈現(xiàn):
🐦 NUM 2:尋找缺失的數(shù)字
?🦜代碼呈現(xiàn):
🦢五:“字符串”部分移動(dòng)
? 🐦倒序字符串
? 🦚簡(jiǎn)易方法一
? 🦜代碼呈現(xiàn) :
? 🦚簡(jiǎn)易方法二
??🦜代碼呈現(xiàn) :
?🐦旋轉(zhuǎn)數(shù)組:
🦜代碼呈現(xiàn) :
? 🌻歡迎各位伙伴們來到我們以C語言為專題的冷知識(shí)課堂,每系列的博客當(dāng)中都會(huì)抽取五個(gè)最易錯(cuò)的冷知識(shí)和大家分享,快去看看吧!?
?🦢一:函數(shù)類型的對(duì)應(yīng)? 🐌(1)在編寫代碼的時(shí)候一定要注意函數(shù)的返回類型是否和自己標(biāo)明的一致,函數(shù)并不會(huì)檢查所有類型不匹配的問題,如整形和浮點(diǎn)型不匹配只會(huì)報(bào)一個(gè)警告,極容易被忽略。之前我定義過一個(gè)函數(shù),我定義函數(shù)的返回類型應(yīng)該是int但是卻將一個(gè)浮點(diǎn)數(shù)直接返回了,使得1.78-1.23的時(shí)候雖然結(jié)果是0.55,但是經(jīng)過強(qiáng)制類型轉(zhuǎn)換float->int之后就變成了0。導(dǎo)致程序運(yùn)行出現(xiàn)錯(cuò)誤。
? 🐌我們需要將函數(shù)的類型改為浮點(diǎn)型值后才可以正確計(jì)算。?
? 🐌如上圖的運(yùn)行結(jié)果所示。
🦜代碼呈現(xiàn)://#include//
減法函數(shù)
//int sub(double a, double b)
//{
// return a - b;
//}
//
//int main()
//{
// double a = 0.0, b = 0.0;
// scanf("%lf %lf", &a, &b);
// double ret=sub(a,b);
// printf("%.2lf", ret);
// return 0;
//}
#include//減法函數(shù)
double sub(double a, double b)
{
return a - b;
}
int main()
{
double a = 0.0, b = 0.0;
scanf("%lf %lf", &a, &b);
double ret = sub(a, b);
printf("%.2lf", ret);
return 0;
}
? 🦢二:浮點(diǎn)數(shù)運(yùn)算? 🐌(2)浮點(diǎn)數(shù)的比較只可以運(yùn)用一定的范圍進(jìn)行比較,如果大家去查閱資料的話,官方的比較浮點(diǎn)數(shù)的方法肯定都是范圍比較。范圍比較的含義也就是:想要判斷兩個(gè)浮點(diǎn)數(shù)誰大誰小,那么就需要把這兩個(gè)浮點(diǎn)數(shù)相減去和自定義的 “0” 進(jìn)行比較,也就是我們需要將兩數(shù)之差和1e-7進(jìn)行比較(1e-7在浮點(diǎn)數(shù)的精確度上等于0)。官方的解釋是:浮點(diǎn)數(shù)并非真正意義上的數(shù)字,只是其在某種范圍內(nèi)的近似。因此也就只能用近似的方法將實(shí)數(shù)與0進(jìn)行比較。 這個(gè)在超過七位小數(shù)運(yùn)算與0比較上值得大家注意。(7位之后是隨機(jī)數(shù)不一定為0),我們可以利用一個(gè)實(shí)例來理解這部分的知識(shí)。
就像是 上圖中我們看到的結(jié)果一樣,并不是所有的浮點(diǎn)數(shù)在內(nèi)存中儲(chǔ)存的都是我們輸入的準(zhǔn)確值,那么我們上面的浮點(diǎn)數(shù)需要進(jìn)行范圍比較的說法就容易理解得多了。浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)請(qǐng)參考:http://t.csdn.cn/7MFlV
? 🐌(3)關(guān)于 scanf 值得我們注意的是 scanf 的讀取結(jié)束判定條件,以及結(jié)束后的注意事項(xiàng)。
?🦩?NUM 1:遇見空格,回車符,制表符,結(jié)束。? 🐌也就是說當(dāng)你需要輸入一個(gè)字符串的時(shí)候,如果字符串中存在空格,制表符,(可以產(chǎn)生四個(gè)空格),回車,對(duì)于 scanf 可能無法正常讀取,遇到這三種符號(hào)會(huì)自動(dòng)判定第一次輸入結(jié)束。通常我們可以利用 gets 進(jìn)行替代 scanf 對(duì)存在空格等特殊符號(hào)的字符串進(jìn)行輸入。
?🦩 NUM 2:達(dá)到域?qū)捊Y(jié)束? 🐌雖然很少,但是我們刷題的時(shí)候也會(huì)看到輸入的數(shù)字等數(shù)據(jù)是一行輸入且沒有空格等分割標(biāo)志,那么我們就需要限定域?qū)拰?duì)輸入的兩個(gè)或多個(gè)數(shù)據(jù)進(jìn)行限定。如:我想輸入12和34,但是輸入的卻是1234這時(shí)候我們就需要將我們 scanf 中的內(nèi)容改為 sacnf("%2d%2d",&a,&b); 這樣我們的scanf 進(jìn)行數(shù)據(jù)讀取的時(shí)候就會(huì)讀到兩位之后自動(dòng)判定輸入為下一個(gè)數(shù)字。
?🦩 NUM 3:輸入非法字符結(jié)束? 🐌當(dāng)我們使用 sacnf 的時(shí)候我們一般都會(huì)有特定要求的輸入格式,比如:輸入一個(gè)整型就是 %d,那么我們?cè)阪I盤上輸入的只能是連續(xù)的數(shù)字,否則也會(huì)異常結(jié)束。就像我們想要輸入一個(gè)數(shù)字1234,但是我們?cè)佥斎氲臅r(shí)候卻一不小心打錯(cuò)了,打成了12e4,這個(gè)時(shí)候我們輸入的數(shù)字就變成了 12 。讀到字符 e 的時(shí)候由于 e 不屬于整形所以 scanf 判定輸入結(jié)束。
??🦩 NUM 4:結(jié)束之后的回車會(huì)存儲(chǔ)在緩沖區(qū)? 🐌當(dāng)我們輸入數(shù)據(jù)結(jié)束的時(shí)候一般都會(huì)輸入回車來告訴程序,我已經(jīng)輸入完畢了,你可以開始運(yùn)行了。但是我們需要特別注意的是,這個(gè)回車僅僅是告訴程序開始執(zhí)行后就消失了嗎?不,它會(huì)停留在緩沖區(qū)中。等待下一次被喚醒,就一個(gè)簡(jiǎn)單的例子:當(dāng)我們需要分兩次輸入的時(shí)候第一次輸入一個(gè)整數(shù),第二次輸入一個(gè)字符,那么我們必須對(duì)這個(gè)回車符進(jìn)行處理了。我們用一個(gè)程序來證明。
? 🐌我們可以看出的程序似乎出現(xiàn)了異常,第一次輸入一個(gè)整型 45 之后原本應(yīng)該再一次進(jìn)行輸入一個(gè)字符的,但是系統(tǒng)卻異常結(jié)束了,中間還空了一行。這就驗(yàn)證了我們上面所說的,我們?cè)谳斎氲谝粋€(gè)整形的時(shí)候殘留下的一個(gè)回車并沒有消失,下次讀取一個(gè)字符并打印的時(shí)候會(huì)先讀取回車。(但是不要擔(dān)心,假如你想輸入的第二個(gè)數(shù)據(jù)不是字符的話,那么不用考慮這個(gè)回車符,因?yàn)閟canf 會(huì)自動(dòng)匹配到第一個(gè)符合的數(shù)據(jù)進(jìn)行輸出。) 如果出現(xiàn)這種情況的話,可以利用 getchar 函數(shù)進(jìn)行讀取一個(gè)字符,我們將緩沖區(qū)的回車拿走之后就不會(huì)出現(xiàn)這種情況了。如下圖。
//scanf不會(huì)刪除輸入的回車符證明:
//#include//int main()
//{
// int n = 0;
// char ch = 0;
//
// scanf("%d", &n);
// printf("%d", n);
//
// scanf("%c", &ch);
// printf("%c", ch);
//
// return 0;
//}
//解決辦法:
#includeint main()
{
int n = 0;
char ch = 0;
scanf("%d", &n);
printf("%d\n", n);
getchar(); //拿走回車
scanf("%c", &ch);
printf("%c", ch);
return 0;
}
? 🦢四:異或操作符的妙用? 🐌在刷題的過程中你經(jīng)常會(huì)被一些很奇特的思想所震驚到,異或操作符就是其中之一。所謂的異或就是將兩個(gè)存儲(chǔ)在內(nèi)存中的數(shù)據(jù)按位進(jìn)行操作。兩個(gè)數(shù)據(jù)依次對(duì)其,每一位上的數(shù)字相等就為0,不相等就為1。例如:
? 🐌但是你看到這里肯定一頭霧水:這有什么用呀?別著急,這需要涉及異或操作符的一個(gè)特性,連續(xù)操作同一個(gè)數(shù)字時(shí)還會(huì)變成原來的數(shù)。
🐌那么接下來的內(nèi)容就有趣了,我們可以利用異或操作符的這個(gè)性質(zhì)做許多事,比如說加密,找到數(shù)組中的重復(fù)的數(shù)字,找落單的數(shù)字,對(duì) 1—N 無序數(shù)列找出缺失的數(shù)字等等。我們通過幾道題目來體會(huì)一下其中的奧秘。
? 🐌這個(gè)題目的要求是這樣的:有一個(gè)數(shù)組中的數(shù)字總是成對(duì)存在,但是有一個(gè)數(shù)字卻只有一個(gè),那么請(qǐng)找出這個(gè)數(shù)字。要是我們不適用異或的方法會(huì)怎么求解呢?循環(huán)嵌套之后一個(gè)一個(gè)匹配?這不免效率太慢了,但是我們要是使用異或操作符進(jìn)行求解的話只需要進(jìn)行一遍。就可以得到想要的答案。
? 🐌我們經(jīng)過嘗試可以發(fā)現(xiàn)0無論異或任何數(shù)字得到的結(jié)果都會(huì)是這個(gè)數(shù)字,那么我們就可以利用這個(gè)性質(zhì)對(duì)數(shù)組進(jìn)行操作。是不是一下子變得很簡(jiǎn)單?
??
? 🐌那么我們的問題是不是得到了解決?簡(jiǎn)單了不少吧?別著急精彩的還在后面!
🐦 NUM 2:尋找缺失的數(shù)字? 🐌這道題的題目要求是這樣的:從 1—N一共N個(gè)數(shù)字亂序存儲(chǔ)在一個(gè)數(shù)組中,但是存儲(chǔ)的時(shí)候不小心漏掉了一個(gè)數(shù)字,請(qǐng)找出漏掉的這個(gè)數(shù)字。看到這個(gè)題目的時(shí)候別著急取用循環(huán)嵌套,看咱們的大標(biāo)題!異或操作符呀!但是你可能會(huì)說這里沒有的數(shù)字呀?沒有槍沒有炮我們自己造!我們可以先使用0進(jìn)行從1—N進(jìn)行第一遍異或,之后將之后的結(jié)果再和數(shù)組中的數(shù)字異或,這么一來不是又出現(xiàn)落單的數(shù)字了嗎?我們按照這個(gè)思路來執(zhí)行我們的操作。
? 🐌這么一簡(jiǎn)化,是不是程序變得更加簡(jiǎn)潔了?編寫思路也更加清晰了呢?那么下一次再遇到對(duì)數(shù)組中的數(shù)字進(jìn)行修改的問題記得優(yōu)先考慮異或哦!
?🦜代碼呈現(xiàn):#includeint main()
{
//N為20 缺失的數(shù)字是 14
int arr[20] = { 3,2,5,4,7,9,8,1,6,10,13,16,12,15,18,19,17,20,11 };
int n = 20, i = 0, res = 0;
for (i = 1; i<= n; i++)
{
res ^= i;
res ^= arr[i-1];
}
printf("%d", res);
return 0;
}
🦢五:“字符串”部分移動(dòng)
? ? 🐦倒序字符串? 🐌還記得我們之前說到的我第一次oj考試嗎?上面有一道字符串逆序的題目,我當(dāng)時(shí)傻傻的使用 getchar 進(jìn)行一個(gè)字符串一個(gè)字符串的讀取,導(dǎo)致那道題我到最后時(shí)間到了也沒有寫完,現(xiàn)在想想真的好傻,那我們就利用這道題來給大家講講一個(gè)更加簡(jiǎn)單的思想:“字符串”的部分逆序。題目如下:
? 🐌拿到這道題的時(shí)候是不是覺得思路很簡(jiǎn)單,但是好復(fù)雜?先創(chuàng)建三個(gè)數(shù)組?將三個(gè)單詞分別裝起來?NO,NO,NO,題目中可沒說每次測(cè)驗(yàn)只對(duì)三個(gè)單詞進(jìn)行位置轉(zhuǎn)換。怎么樣?一下子被難住了?那么我們接下來看一種奇特的思想:
? 🦚簡(jiǎn)易方法一?🐌對(duì)于這種部分前置的題目我們可以先對(duì)部分進(jìn)行逆序操作,在對(duì)整體進(jìn)行逆序操作。示例如下:
?🐌是不是很神奇?我第一次也是這么覺得的,難以置信!這是怎么想出來的!沒辦法總有一些大佬能想到好的方法,我們只需要對(duì)這種方法進(jìn)行學(xué)習(xí)即可。那么在遇到對(duì)部分進(jìn)行不調(diào)換順序前置的情況我們就可以利用這種方式進(jìn)行操作。記住先部分逆序,再整體逆序。下面我們將上面的思想轉(zhuǎn)化為代碼的形式:
#include#includeint main()
{
char ch[100] = { 0 };
gets(ch); //像靜態(tài)區(qū)中輸入字符串包括空格
int i = 0, left = 0, right = 0;
char tmp = 0;
int len = strlen(ch);
//對(duì)部分進(jìn)行逆序
for (i = 0; i< len; i++)
{
if ((ch[i] == ' ')||(i==(len-1)))
{
if (ch[i] == ' ')
{
right = i-1;
}
else
{
right = i;
}
//對(duì)下標(biāo)為left到i-1的單詞進(jìn)行逆序
for (; left
? 🦚簡(jiǎn)易方法二? 🐌雖然上面的思路有了,但是是不是感覺還是有點(diǎn)復(fù)雜?我第一次編寫這個(gè)代碼的時(shí)候調(diào)試錯(cuò)誤調(diào)試了好幾個(gè)小時(shí),總會(huì)忽略一些細(xì)節(jié)。那么覺得麻煩的話我再來給大家介紹一種方法:部分倒置的時(shí)候肯定得有一個(gè)標(biāo)志吧?讓字符串從后向前查找,找到這個(gè)標(biāo)志對(duì)后面字符串中的內(nèi)容直接打印。如下:
🐌這樣的話我們就可以將我們的第二次兩次逆序操作都省去了,怎么樣?這次夠簡(jiǎn)單了吧?
? 🐌運(yùn)行效果和想象的一樣。那么接下來就將代碼呈現(xiàn)給大家:
??🦜代碼呈現(xiàn) :#include#includeint main()
{
char a[1000];
int len = 0, i = 0, j = 0;
gets_s(a);
len = strlen(a);
for (i = len - 1; i >= 0; i--)
{
if (a[i] == ' ')
{
for (j = i + 1; a[j] != '\0' && a[j] != ' '; j++)
{
printf("%c", a[j]);
}
printf(" ");
}
}
i = 0;
while (a[i] != ' ')
{
i++;
}
for (j = 0; j< i; j++)
{
printf("%c", a[j]);
}
return 0;
}
?🐦旋轉(zhuǎn)數(shù)組:🐌是不是感覺一道題做起來不過癮?我們接著看一道類似的題目:旋轉(zhuǎn)數(shù)組:給定一個(gè)數(shù)組arr[7]={1,2,3,4,5,6,7},旋轉(zhuǎn)N次,求旋轉(zhuǎn)之后的數(shù)組是什么樣的。(旋轉(zhuǎn)指的是將數(shù)組中的最后一個(gè)數(shù)字拿到第一個(gè)數(shù)字的位置上,其他數(shù)字向后移,例:旋轉(zhuǎn)一次:7,1,2,3,4,5,6)你可能沒發(fā)現(xiàn)這道題和我們前面講的旋轉(zhuǎn)數(shù)組有什么區(qū)別,但是仔細(xì)解析一下就會(huì)恍然大悟,把旋轉(zhuǎn)的次數(shù)作為數(shù)組的個(gè)數(shù),從后向前進(jìn)行計(jì)數(shù),然后直接打印。例如:
? 🐌這么一來我們就可以用我們的老方法進(jìn)行求解這道題了,簡(jiǎn)單又高效!只不過需要注意的是我們每旋轉(zhuǎn)七次都是一個(gè)循環(huán),數(shù)組會(huì)恢復(fù)到原本的樣子,因此我們需要對(duì)輸入的旋轉(zhuǎn)的次數(shù)進(jìn)行取余操作,防止運(yùn)行出錯(cuò)。我們程序的編寫效果如下:
#includeint main()
{
int arr[7] = { 1,2,3,4,5,6,7 };
int n = 0, i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
printf("請(qǐng)輸入旋轉(zhuǎn)的次數(shù):");
scanf("%d", &n);
n %= 7;
for (i = 0; i< n; i++)
{
printf("%d ", arr[sz-n+i]);
}
for (i = 0; i< sz - n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
?🐌那么本次介紹的五個(gè)使用小技巧也就到此為止了,感謝您的觀看,祝您天天開心。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧