描述:编写一个程序,当输入不超过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 }