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