買(mǎi)了兩臺(tái)服務(wù)器可以做網(wǎng)站嗎濟(jì)南優(yōu)化網(wǎng)頁(yè)
目錄
9.查找字符數(shù)組中字符位置(輸入hello e ???輸出2);
10、查找字符數(shù)組中字符串的位置(輸入hello ll 輸出3);
11、字符數(shù)組中在指定位置插入字符;(輸入hello 3 a ??輸出heallo)
12、在字符數(shù)組中指定開(kāi)始位置插入字符串;(輸入hello 3 aa ?輸出heaallo)
13、有n個(gè)人圍成一圈,順序排號(hào),從第一個(gè)開(kāi)始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問(wèn)最后留下的是原來(lái)第幾號(hào)的那位?(約瑟夫環(huán),筆試???#xff09;
14、輸入一個(gè)字符串,計(jì)算字符串中子串出現(xiàn)的次數(shù)。
15、編寫(xiě)一個(gè)C函數(shù),將”I am from shanghai ”倒置為”shanghai from am I”,即將句子中的單詞位置倒置,而不改變單詞內(nèi)部結(jié)構(gòu)。
第一步:獲取鍵盤(pán)輸入的幾個(gè)單詞,
第二步:轉(zhuǎn)置每個(gè)單詞里面的每一個(gè)字母,
第三步:將每一個(gè)單詞里面的字母單獨(dú)裝置
16、輸入一個(gè)字符串,同時(shí)輸入幀頭和幀尾(可以是多個(gè)字符),將該字符串中合法的幀識(shí)別出來(lái)。
上一篇復(fù)習(xí)了關(guān)鍵字,這一篇我們來(lái)做第二次的8道編程題。
說(shuō)明:我們學(xué)過(guò)單片機(jī)的一般都是有C語(yǔ)言基礎(chǔ)的了,網(wǎng)上關(guān)于C語(yǔ)言的資料有很多,大家如果對(duì)C語(yǔ)言不熟悉的話可以先去詳細(xì)學(xué)一下,再以這篇博文作為復(fù)習(xí)資料學(xué)習(xí)。
這篇博文的目的是復(fù)習(xí)C語(yǔ)言,我們會(huì)陸續(xù)以30多個(gè)編程題作為復(fù)習(xí)要點(diǎn),這30多個(gè)編程題基本涵蓋了C語(yǔ)言所有的內(nèi)容了,只要你掌握了這30多個(gè)編程題,那么你的C語(yǔ)言基本就沒(méi)什么問(wèn)題了。
注意:由于本專欄是嵌入式全棧開(kāi)發(fā)專欄,為了我們能熟悉以后實(shí)際工作中的開(kāi)發(fā)環(huán)境,我們寫(xiě)C語(yǔ)言全部在Linux中的vim編輯器中寫(xiě),這么做事為了我們能夠熟練掌握Linux系統(tǒng)的常用命令以及Linux上的vim編輯器的常用工作命令,以達(dá)到對(duì)口訓(xùn)練的目的!
vim編輯器的一些工作命令在上一篇博文中已經(jīng)詳細(xì)介紹過(guò)了,如果不了解可以先去看看。
我們正式開(kāi)始:
建議新建一個(gè)homework目錄來(lái)存放這8個(gè)編程題的程序文件。
上次我們講過(guò)第1~8道編程題了
嵌入式全棧開(kāi)發(fā)學(xué)習(xí)筆記---C語(yǔ)言筆試復(fù)習(xí)大全7(編程題1~8)-CSDN博客
這次我們開(kāi)始講第9~16道:
9.查找字符數(shù)組中字符位置(輸入hello e ???輸出2);
提示:我們只要遍歷數(shù)組,將數(shù)組中的每一個(gè)元素和該字符對(duì)比,直到相等,則輸出字符的位置。
參考代碼:
#include <stdio.h>
#include <string.h>int get_char_index(char str[],char ch)
{int i;int length=strlen(str);for(i=0;i<length;i++){if(ch==str[i]){return i+1;}} ??return -1;
}int main()
{char str[32]={0};char ch;printf("輸入 字符串 字符\n");scanf("%s %c,str,&ch);int index=get_char_index(str,ch);if(-1==index){printf("沒(méi)有該字符\n");}else{printf("該字符的地址是%d\n",index);}return 0;
}
運(yùn)行結(jié)果:
10、查找字符數(shù)組中字符串的位置(輸入hello ll 輸出3);
提示:用strncmp()字符串處理函數(shù)比較兩個(gè)字符,如果相等則輸出字符串的位置。
參考代碼:
#include <stdio.h>
#include <string.h>int get_sub_index(char str[],char sub[])
{int length_str=strlen(str);int length_sub=strlen(sub);int i;for(i=0;i<length_str-length_sub+1;i++){ ??if(strncmp(str+i,sub,length_sub)==0){return i+1;}} ??return -1;
}int main()
{char str[32]={0};char sub[32]={0};printf("輸入 字符串 要查找的字符串\n");scanf("%s %s",str,sub);int index=get_sub_index(str,sub);if(-1==index){printf("沒(méi)有要查找的字符串\n");}else{printf("該字符串的位置是%d\n",index);}return 0;
}
運(yùn)行結(jié)果:
11、字符數(shù)組中在指定位置插入字符;(輸入hello 3 a ??輸出heallo)
我們可以把后面三個(gè)字符向后移動(dòng)三位,然后將a放在第三個(gè)位置,然后將那三個(gè)字符賦值給后面三個(gè)位置。
參考代碼:
#include <stdio.h>
#include <string.h>int main()
{int num;int ch;char str[32]={0};int i;printf("輸入 字符串 插入位置 插入字符\n");scanf("%s %d %c",str,&num,&ch);int length=strlen(str);//計(jì)算字符串長(zhǎng)度f(wàn)or(i=0;i<length-num+1;i++){ ??str[length-i]=str[length-1-i]; ?//移動(dòng)后三位字符} ??str[num-1]=ch;//插入字符printf("%s\n",str);return 0;
}
運(yùn)行結(jié)果:
12、在字符數(shù)組中指定開(kāi)始位置插入字符串;(輸入hello 3 aa ?輸出heaallo)
提示:將he用strncpy拷貝到另外一個(gè)字符數(shù)組里面,然后用strcat將he和aa拼接起來(lái),再將剩下的llo接在heaa后面,最后用strcpy將heaallo拷貝回原來(lái)的數(shù)組中去。
參考代碼:
#include <stdio.h>
#include <string.h>void insert_str(char str[],char insert[],int num)
{int length_str=strlen(str);int length_insert=strlen(insert);char tmp[32]={0};strncpy(tmp,str,num-1);strcat(tmp,insert);strcat(tmp,str+num-1);strcpy(str,tmp);
}int main()
{char str[32];char insert[32];int num;printf("請(qǐng)輸入 字符串 要插入的字符串 要插入的位置\n");scanf("%s %s %d",str,insert,&num);int length_str=strlen(str);if(num<=length_str){ ??insert_str(str,insert,num);} ??else{ ??printf("字符串長(zhǎng)度不夠,請(qǐng)重新確認(rèn)要插入的位置\n");} ?printf("%s\n",str);return 0;
}
運(yùn)行結(jié)果:
13、有n個(gè)人圍成一圈,順序排號(hào),從第一個(gè)開(kāi)始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問(wèn)最后留下的是原來(lái)第幾號(hào)的那位?(約瑟夫環(huán),筆試常考)
提示:題目的意思請(qǐng)看圖:
參考代碼:
#include <stdio.h>int main()
{int num;//總?cè)藬?shù)int person;//剩余人數(shù)int flag[1024]={0};//每個(gè)人的狀態(tài)位,0保持,1出局int k=1;//報(bào)數(shù)int i=1;//flag數(shù)組下標(biāo)printf("請(qǐng)輸入游戲人數(shù)\n");scanf("%d",&num);person=num;while(person>1)//當(dāng)剩余人數(shù)大于1就繼續(xù)報(bào)數(shù){ ??//每一次報(bào)數(shù)if(flag[i]==0)//沒(méi)有出局的人{(lán)k++;//報(bào)數(shù)if((k>3){flag[i]=1;//報(bào)到3的出局person--;//剩余人數(shù)減1k=1;//重新報(bào)數(shù)}}i++;//為了下一輪報(bào)數(shù)的時(shí)候先判斷這個(gè)人還是不是0if(num+1==i){i=1;}//重新開(kāi)始,從1號(hào)這人開(kāi)始}//找出狀態(tài)位為0的那個(gè)人for(i=1;i<num+1;i++){if(flag[i]==0){ printf("剩下的那個(gè)人是第%d號(hào)\n",i);break;}} ??return 0;
}
運(yùn)行結(jié)果:
14、輸入一個(gè)字符串,計(jì)算字符串中子串出現(xiàn)的次數(shù)。
提示:用strncmp進(jìn)行比較,如果比較的結(jié)果是0,那就計(jì)數(shù)count++
參考代碼:
#include <stdio.h>
#include <string.h>int get_sub_count(char str[],char sub[])
{int length_str=strlen(str);int length_sub=strlen(sub);int i;int count=0;for(i=0;i<length_str-length_sub+1;i++){ ??if(!strncmp(str+i,sub,length_sub)){count++;}} ??return count;
}int main()
{char str[32]={0};char sub[32]={0};printf("請(qǐng)輸入 字符串 要計(jì)算的子串\n");scanf("%s %s",str, sub);int count=get_sub_count(str,sub);printf("子串的次數(shù)為%d\n",count);return 0;
}
運(yùn)行結(jié)果:
15、編寫(xiě)一個(gè)C函數(shù),將”I am from shanghai ”倒置為”shanghai from am I”,即將句子中的單詞位置倒置,而不改變單詞內(nèi)部結(jié)構(gòu)。
提示:先將整個(gè)句子倒轉(zhuǎn)成”iahgnahs.....ma I.”,然后對(duì)單個(gè)單詞進(jìn)行倒轉(zhuǎn)”shanghai....am I”。這道題使用gets()和scanf()來(lái)獲取句子是不行的,我們要使用一個(gè)新的函數(shù)叫g(shù)etchar()函數(shù)可以獲取整個(gè)句子,空格也是字符,它遇到換行的時(shí)候結(jié)束。
第一步:獲取鍵盤(pán)輸入的幾個(gè)單詞,
參考代碼:
#include <stdio.h>int main()
{char str[1024]={0};int i=0;char ch;printf("請(qǐng)輸入幾個(gè)單詞\n");while(ch!='\n'){ ??ch=getchar();//從鍵盤(pán)中獲取單個(gè)字符str[i]=ch;i++;} ??printf("%s\n",str);return 0;
}
運(yùn)行結(jié)果:
第二步:轉(zhuǎn)置每個(gè)單詞里面的每一個(gè)字母,
參考代碼:
#include <stdio.h>void reverse(char str[], int start,int end)
{int i;char tmp;//交換專用變量for(i=0;i<(start+end)/2;i++){int tmp=str[end-1-i];str[end-1-i]=str[start+i];str[start+i]=tmp;} ??
}int main()
{char str[1024]={0};int i=0;char ch;printf("請(qǐng)輸入幾個(gè)單詞\n");while(ch!='\n'){ ??ch=getchar();//從鍵盤(pán)中獲取單個(gè)字符str[i]=ch;i++;}reverse(str,0,i);//0是整個(gè)句子的開(kāi)始位置,i是整個(gè)句子的結(jié)束位置printf("%s\n",str);return 0;
}
運(yùn)行結(jié)果:
第三步:將每一個(gè)單詞里面的字母單獨(dú)裝置
最終參考代碼:
#include <stdio.h>void reverse(char str[], int start,int end)
{int i;char tmp;//交換專用變量for(i=0;i<(end-start)/2;i++){ ??int tmp=str[end-1-i];str[end-1-i]=str[start+i];str[start+i]=tmp;} ??
}int main()
{char str[1024]={0};int i=0;char ch;printf("請(qǐng)輸入幾個(gè)單詞(單詞)\n");while((ch=getchar())!='\n'){ ??str[i++]=ch;} ??reverse(str,0,i);//0是整個(gè)句子的開(kāi)始位置,i是整個(gè)句子的結(jié)束位置i=0;int begin=0;while(str[i]!='\0')//翻轉(zhuǎn)所有單詞{if(str[i]==' ')//翻轉(zhuǎn)一個(gè)單詞{reverse(str,begin,i);begin=i+1;//下一個(gè)單詞的開(kāi)始}i++;//下一個(gè)字符}reverse(str,begin,i);//'\0'之前的一個(gè)單詞printf("%s\n",str);return 0;
}
最終運(yùn)行結(jié)果:
16、輸入一個(gè)字符串,同時(shí)輸入幀頭和幀尾(可以是多個(gè)字符),將該字符串中合法的幀識(shí)別出來(lái)。
提示:幀頭和幀尾分別是head和tail,字符串”asdheadhauboisoktail”中headhauboisoktail是合法幀。
可以先找到幀頭和幀尾的位置,最后把幀頭和幀尾的位置之間的字符拷貝到另一個(gè)數(shù)組中打印出來(lái)。
參考代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int get_index(char str[],char sub[])
{int length_str=strlen(str);int length_sub=strlen(sub);int i;for(i=0;i<length_str-length_sub+1;i++){if(strncmp(str+i,sub,length_sub)==0){return i;}} return -1;
}
int main()
{char str[32]={0};char head[32]={0};char tail[32]={0};printf("請(qǐng)輸入 字符串 幀頭 幀尾\n");scanf("%s %s %s",str, head, tail);int index_head=get_index(str,head);int index_tail=get_index(str,tail);if(-1==index_head||-1==index_tail){printf("輸入有誤\n");exit(1);//退出整個(gè)程序}char tmp[32]={0};int length_tail=strlen(tail);strncpy(tmp,str+index_head,index_tail-index_head+length_tail);printf("%s\n",tmp);return 0;
}
運(yùn)行結(jié)果:
以上就是這篇內(nèi)容,如想了解更多,歡迎訂閱本專欄!
如有問(wèn)題可評(píng)論區(qū)或者私信留言,如果想要進(jìn)交流群請(qǐng)私信!