我們都很清楚冒泡排序,光冒泡排序我已經講了好幾節,就是給定一組數據,這組數據兩兩比較大小,然後交換位置,最終将結果按從小到大排序。
那麼今天這道題目呢,正如标題所說:将冒泡排序用于字符串,給定任意的整數K和N,打印輸出掃描第K遍後的中間結果數列,K要滿足大于等于1,小于N,N要滿足小于等于100,此後N行,每行包含一個長度不超過10的、僅由小寫英文字母組成的非空字符串。
梳理邏輯
1、輸入整數N和K,用到一個scanf函數。
2、因為要用于字符串序列,而且是不停地輸入字符串,所以我們可以使用二維數組來存儲字符串,為什麼使用二維數組呢,因為二維數組有多行,這裡正好要輸入N個字符串,所以二維數組也能存儲多個字符串,而且它要求每行包含一個長度不超過10的,且僅由小寫字母組成的非空字符串。
至于長度不超過10,隻需要用一個二維數組滿足列為11即可,這樣就能保證長度不超過10,而僅由小寫字母組成的話,需要用到一個#include<ctype.h>庫當中的islower函數,當islower函數等于零的時候,就說明該字符串中有大寫字母,要重新輸入。
for(int i=0; i < N;i ){
if(islower(bubble[i]==0)){//如果字符串中有大寫字母,就重新輸入
scanf("%s",bubble[i]);
}
}
3、最關鍵的就是比較字符串大小,比較字符串大小該如何來理解呢,我在做這道題目的時候,我一開始理解錯了,以為比較字符串大小是比較字符串的長度多少,結果在驗證之後發現,得不到題目期望的結果,于是我開始考慮。
之後發現,C語言中有一個strcmp函數,是專門用來比較字符串大小的,如果第一個字符串和第二個字符串大小相同,則返回零,如果第一個字符串比第二個字符串小,則返回小于零,如果第一個字符串比第二個字符串大,則返回大于零。
4、除了用到strcmp函數外,我們還要用到另一個函數來交換兩個字符串之間的位置,當然,這裡與數字的冒泡排序相同,自然是要定義一個臨時變量來存儲字符串的,用到的複制函數則是strcpy,能夠把第二個字符串的内容給複制到第一個字符串當中,然後覆蓋第一個字符串中的所有内容。
5、打印輸出要換行,自然還是用到一個計數法。
代碼實現
//字符串的冒泡排序
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
int N;//N個整數
int K;//掃描K遍
scanf("%d %d", &N,&K);//第一行給出N和K
char bubble[10][100];
char Temp[100];//Temporary Variable,一個臨時變量來存儲元素
int count = 0;//計數法
if(K>=N){
scanf("%d %d", &N,&K);//第一行給出N和K
}
if(N>100){
scanf("%d %d", &N,&K);//第一行給出N和K
}
if(K<1){
scanf("%d %d", &N,&K);//第一行給出N和K
}
for(int i=0; i < N;i ){
scanf("%s",bubble[i]);
}
for(int i=0; i < N;i ){
if(islower(bubble[i]==0)){//如果字符串中有大寫字母,就重新輸入
scanf("%s",bubble[i]);
}
}
for(int j = 0; j < K; j ){
for(int i = 0; i < N-1; i ){
if(strcmp(bubble[i],bubble[i 1])>0){//比較前一個字符串和後一個字符串的大小
strcpy(Temp, bubble[i 1]);
strcpy(bubble[i 1], bubble[i]);
strcpy(bubble[i], Temp);//交換位置
}
}
}
for(int q = 0; q < N;q ){//打印輸出最終結果
if(count!=0){
printf("\n");
}
printf("%s", bubble[q]);
count ;
}
}
總結
這兩天的内容都是圍繞字符串的函數來講的,關鍵還是C語言當中的有些特定庫函數要熟悉,熟悉之後解決題目也會比較方便。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!