描述:編寫一個程序,當輸入不超過60個字符組成的英文文字時,計算機將這個句子中的字母按英文字典字母順序重新排列,排列后的單詞的長度要與原始句子中的長度 相同。例如:
輸入:
THE PRICE OFBREAD IS ¥1 25 PER POUND
輸出:
ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU
並且要求只對A到Z的字母重新排列,其它字符保持原來的狀態。
分析:難點在待排序列中混有不相干的字符,我用的是冒泡排序法,在大寫字母間進行比較,用一個函數返回和最大值交換的字母的下標。
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 //返回第k位前的一個大寫字母的下標 6 int cal(string a, int k) 7 { 8 for (int i = k; i >= 0; i--) 9 { 10 if (a[i] >= 'A'&&a[i] <= 'Z') 11 return i; 12 } 13 return -1; 14 } 15 void exchange(string& a, int x, int y) 16 { 17 char swap = a[x]; a[x] = a[y]; a[y] = swap; 18 } 19 int main() 20 { 21 string a; 22 getline(cin, a); 23 int n=0;//記錄大寫字母的個數 24 for (int i = 0; i < a.size(); i++) 25 { 26 if (a[i] >= 'A'&&a[i] <= 'Z') 27 n++; 28 } 29 int start;//排序的初始值 30 for (int i = 0;; i++) 31 { 32 if (a[i] >= 'A'&&a[i] <= 'Z') 33 { 34 start = i; break; 35 } 36 } 37 int swap = cal(a,a.size()-1);//要交換的字母下標 38 for (int i = 0; i < n; i++) 39 { 40 int max = start; 41 for (int i = 0; i <= swap; i++) 42 { 43 if (a[i] >= 'A'&&a[i] <= 'Z'&&a[i]>a[max]) 44 max = i; 45 } 46 exchange(a, max, swap); 47 swap = cal(a, swap - 1); 48 } 49 cout << a << endl; 50 system("pause"); 51 return 0; 52 }
