算法训练 字符串变换

时间:2023-01-07 18:47:31

问题描述

   相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了。今天,徐老师想测试一下大家对于字符串操作的掌握情况。徐老师自己定义了1,2,3,4,5这5个参数分别指代不同的5种字符串操作,你需要根据传入的参数,按照徐老师的规定,对输入字符串进行格式转化。
  徐老师指定的操作如下:
  1. 表示全部转化为大写字母输出,如abC 变成 ABC
  2. 表示全部转换为小写字母输出,如abC变成abc
  3. 表示将字符串整个逆序输出,如 abc 变成 cba
  4. 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc
  5. 表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a-d,其次,-至少代表1个字母,既如果是ab,则不需要转换为缩写形式。

输入格式

   一共一行,分别是指代对应操作的数字和字符串,两者以空格分隔,字符串全部由英文字母组成

输出格式

   输出根据上述规则转换后对应的字符串

样例输入

5 ABcdEE

样例输出

a-ee

样例输出

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 // 将字符串全部转换为大写
  6 void SetToUpper(char* pszStr_)
  7 {
  8     while (*pszStr_ != '\0')
  9     {
 10         if (*pszStr_ >= 'a' && *pszStr_ <= 'z')
 11         {
 12             *pszStr_ -= 32;
 13         }
 14         pszStr_++;
 15     }
 16 }
 17 
 18 // 将字符串全部转换为小写
 19 void SetToLower(char* pszStr_)
 20 {
 21     while (*pszStr_ != '\0')
 22     {
 23         if (*pszStr_ >= 'A' && *pszStr_ <= 'Z')
 24         {
 25             *pszStr_ += 32;
 26         }
 27         pszStr_++;
 28     }
 29 }
 30 
 31 // 字符串反转
 32 void SetToReverse(char* pszStr_)
 33 {
 34     char* p = pszStr_;
 35     char* q = pszStr_;
 36     while (*q != '\0')
 37     {
 38         *q++;
 39     }
 40     q--;
 41     while (*p != *q)
 42     {
 43         char t = *p;
 44         *p = *q;
 45         *q = t;
 46         p++, q--;
 47     }
 48 }
 49 
 50 // 将字符串大写转小写、小写转大写
 51 void SetToConvert(char* pszStr_)
 52 {
 53     while (*pszStr_ != '\0')
 54     {
 55         if (*pszStr_ >= 'a' && *pszStr_ <= 'z')
 56         {
 57             *pszStr_ -= 32;
 58         }
 59         else if (*pszStr_ >= 'A' && *pszStr_ <= 'Z')
 60         {
 61             *pszStr_ += 32;
 62         }
 63         pszStr_++;
 64     }
 65 }
 66 
 67 // 字符串压缩
 68 void StrCompress(char* pszStr_, char* szResultStr_)
 69 {
 70     char _c1, _c2;
 71     bool _bFlag = false;    // 字符串压缩的标志
 72     int _nCount = 0;
 73     int _nIndex = 0;
 74 
 75     while (*pszStr_ != '\0')
 76     {
 77         _c1 = *pszStr_;
 78         _nCount = 0;
 79         while (*pszStr_ != '\0' && *pszStr_ == *(pszStr_ + 1) - 1)
 80         {
 81             _bFlag = true;
 82             _nCount++;
 83             pszStr_++;
 84             _c2 = *pszStr_;
 85         }
 86         szResultStr_[_nIndex++] = _c1;
 87         if ( _nCount > 1)
 88         {
 89             szResultStr_[_nIndex++] = '-';
 90             szResultStr_[_nIndex++] = _c2;
 91         }
 92         else if (_bFlag)    // 处理前后两个字符相同,但只有两个字符不能压缩的情况
 93         {
 94             szResultStr_[_nIndex++] = _c2;
 95         }
 96         pszStr_++;
 97     }
 98 }
 99 
100 int main(void)
101 {
102     int _nChoice = 0;
103     char _szStr[210] = { '0' };
104     cin >> _nChoice;
105     cin >> _szStr;
106 
107     switch (_nChoice)
108     {
109     case 1:
110         {
111             SetToUpper(_szStr);
112             cout << _szStr << endl;
113         }
114         break;
115 
116     case 2:
117         {
118             SetToLower(_szStr);
119             cout << _szStr << endl;
120         }
121         break;
122 
123     case 3:
124         {
125             SetToReverse(_szStr);
126             cout << _szStr << endl;
127         }
128         break;
129 
130     case 4:
131         {
132             SetToConvert(_szStr);
133             cout << _szStr << endl;
134         }
135         break;
136 
137     case 5:
138         {
139             SetToLower(_szStr);
140             char _szResult[80] = { '\0' };
141             StrCompress(_szStr, _szResult);
142             cout << _szResult << endl;
143         }
144         break;
145 
146     default:
147         cout << "please input [1-5]!" << endl;
148         break;
149     }
150     return 0;
151 }