解题思路:分析p1、p2、p3代表的意思。利用tolower() 于toupper() 函数
代码中出现了insert() 增加字符 erase() 删除字符,已及sb测试样例1;
p1_other() 代表数字填充
p1_fun1代表填充小写
p1_fun2代表填充大写
p1_fun2代表填充‘*’
p_sum为输出s(目标串)
main为模拟测试样例1(sb)
注意事项:
if('0' <= s1[0] && s1[0] <= '9'){参考代码)满足条件说明是三个数字,跳到f=1输出正常测试样例。
否则是模拟测试样例1,s2为对应字符串(输人样例)ji为次数变化。s2用来与s1做判断。循环输入与输出。
参考代码:
#include<iostream>
#include<string>
#include<cctype> //大写转小写tolower()
#include<cstdio> //小写转大写toupper()
#include<cstring>
using namespace std;
int p1,p2,p3;
string s,s1,s_j;
int sub_s;
bool f=0;
//输出样例次数
int ji=1;
void p1_otther(){
char r = s[sub_s+1]-1 , h1 = s[sub_s-1]+1;
int sub4 = sub_s;
if(p3==1){ //顺序填充
for(char h=h1;h<=r;h++){
//填充p2个字符
s.insert(sub4,p2,h);
sub4+=p2;
}
}
else if(p3==2){ //逆序填充
for(char h=r;h>=h1;h--){
//填充p2个字符
s.insert(sub4,p2,h);
sub4+=p2;
}
}
s.erase(sub4,1);
sub_s=sub4;
}
//p1=1时小写字母
void p1_fun1(){
//无论什么字符都转成 大写转小写
char r = s[sub_s+1]-1 , h1 = s[sub_s-1]+1;
r=tolower(r); h1=tolower(h1);
int sub1 = sub_s;
if(p3==1){ //顺序填充
for(char h=h1;h<=r;h++){
//填充p2个元素
s.insert(sub1,p2,h);
//向后移动
sub1+=p2;
}
}
else if(p3==2){ //逆序填充
for(char h=r;h>=h1;h--){
//填充p2个元素
s.insert(sub1,p2,h);
sub1+=p2;
}
}
//删除多的减号-
s.erase(sub1,1);
sub_s=sub1;
}
//p1=2输出大写字母
void p1_fun2(){
//无论什么字符都 小写转大写
char r=s[sub_s+1]-1 , h1=s[sub_s-1]+1;
r = toupper(r); h1 = toupper(h1);
int sub2=sub_s;
if(p3 == 1){ //顺序填充
for(char h=h1;h<=r;h++){
//填充p2个字符
s.insert(sub2,p2,h);
sub2+=p2;
}
}
else if(p3 == 2){ //逆序填充
for(char h=r;h>=h1;h--){
//填充p2个字符
s.insert(sub2,p2,h);
sub2+=p2;
}
}
//删除多余减号
s.erase(sub2,1);
sub_s=sub2;
}
void p1_fun3(){
char r = s[sub_s+1]-1 , h1 = s[sub_s-1]+1;
r = toupper(r); h1 = toupper(h1);
//要填充星号
char ch='*';
int sub3=sub_s;
for(int i=h1;i<=r;i++){
s.insert(sub3,p2,ch);
sub3+=p2;
}
//删除多余减号
s.erase(sub3,1);
sub_s=sub3;
}
void p_sum(){
sub_s = s.find('-');
while(sub_s != -1){
//如果前后之间为后继与前驱之间的关系
if(s[sub_s-1]+1== s[sub_s+1]) s.erase(sub_s,1);
//右边大于左边
else if(s[sub_s-1] < s[sub_s+1]){
//p1不等于3时 填充
if(p1!=3 && ('0' <= s[sub_s-1] && s[sub_s+1] <= '9') ) p1_otther();
//p1=1时小写字母
else if(p1 == 1 && ( ('a'<=s[sub_s-1] && s[sub_s+1]<='z')
|| ('A' <= s[sub_s-1] && s[sub_s+1] <= 'Z') ) ){
p1_fun1();
}
//输出大写字母
else if(p1==2 && ( ('a' <= s[sub_s-1] && s[sub_s+1] <= 'z')
|| ('A' <= s[sub_s-1] && s[sub_s+1] <= 'Z') ) ){
p1_fun2();
}
//输出星号 无论是什么字符
else if(p1 == 3 && ( ('a' <= s[sub_s-1] && s[sub_s+1] <= 'z')
|| ('A' <= s[sub_s-1] && s[sub_s+1] <= 'Z')
|| ('0' <= s[sub_s-1] && s[sub_s+1] <= '9')
) ) {
p1_fun3();
}
}
sub_s=s.find('-',sub_s+1);
}
cout << s;
//清空元素
s.clear();
}
int main(){
char s2[]="输入样例1";
do{
getline(cin,s1);
if('0' <= s1[0] && s1[0] <= '9'){
int lens1=s1.size();
for(int i=0;i<lens1;i++)
if(s1[i]==' ') s1.erase(i,1);
p1=(int)(s1[0]-'0'); p2=(int)(s1[1]-'0'); p3=(int)(s1[2]-'0');
f=1;
break;
}
else if(s1 == s2){
cin >> p1 >> p2 >> p3
>> s_j;
//跑多行
if(ji!=4){
cout<<"输出样例"<<ji<<endl;
s=s_j;
p_sum();
cout<<endl;
}
//清空数组
memset(s2,0,sizeof(s2));
ji++;
sprintf(s2,"输入样例%d",ji);
}
}while(ji != 4);
//输入为数字字符
if(f==1) {
cin>>s;
p_sum();
}
return 0;
}
0.0分
1 人评分