PAT考试乙级1050(C语言实现) (重点题目)(按格式读取,使用容器vector)

#include<iostream>
#include <string> 
using namespace std;
int get (string hand,string a[]){//用于把初始三个字符串转换成不含[]的三个string数组
    int k=0;
    for(int i=0;i<hand.size();i++){
        if(hand[i]!='['&&hand[i]!=' '&&hand[i]!=']'){
            a[k]=a[k]+hand[i];
        }
        if(hand[i]==']'){
            k++;
        }
    }
    return k;
}
void paint(string a[],string b[],string c[],int len1,int len2,int len3,int select[]){//用于将萌萌哒表情画出来
    bool yes=false;             //是否该用户序号存在
    int len[5]={len1,len2,len3,len2,len1};
    for(int i=0;i<5;i++){
        if(select[i]<=len[i]&&select[i]>0)
            yes=true;
        else{
            yes=false;
            cout<<"Are you kidding me? @\\/@"<<endl;
            return;
        }
    }
    if(yes==true){
        cout<<a[select[0]-1]<<"(";
        cout<<b[select[1]-1];
        cout<<c[select[2]-1];
        cout<<b[select[3]-1]<<")";
        cout<<a[select[4]-1]<<endl;
    }
}
int main(){
    string hand,eye,mouth;
    string a[11],b[11],c[11];
    int K,select[5];
    getline(cin,hand);
    getline(cin,eye);
    getline(cin,mouth);
    cin>>K;
    int len1=get(hand,a);
    int len2=get(eye,b);
    int len3=get(mouth,c);
    for(int i=0;i<K;i++){
        for(int j=0;j<5;j++){
            cin>>select[j];
        }
        paint(a,b,c,len1,len2,len3,select);
    }
    return 0;
}

代码参考:
http://blog.csdn.net/wanmeiwushang/article/details/51545182
在大神代码的基础上进行了改良,用循环省去了不少代码。

总结:
1、一开始漏掉了paint函数中的select[i]>0的条件,导致结果出错。
2、最终的是方法,每次读取一行然后打印表情,不需要一次性把输入行全部读入完。select数组的用法十分巧妙。
3、getline函数是一次读取一整行。类似于C中的gets。
4、也有方法用到了容器。代码如下:

#include<iostream>  
#include<cstring>  
#include<vector>  
using namespace std;  

int main(){  
    vector<vector <string> > str;  
    for(int i=0;i<3;i++){  
        string s;  
        getline(cin,s);  
        vector<string> temp;  
        for(int j=0;j<s.length();j++){  
            if(s[j]=='['){  
                for(int k=j;k<s.length();k++){  
                    if(s[k]==']') {  
                        temp.push_back(s.substr(j+1,k-j-1));  
                        break;  
                    }  
                }  
            }  
        }  
        str.push_back(temp);  
    }  
    int n,a,b,c,d,e;  
    cin>>n;  
    while(n--){  
        cin>>a>>b>>c>>d>>e;  
        if(a<1||b<1||c<1||d<1||e<1||a>str[0].size()||b>str[1].size()||c>str[2].size())  
            cout<<"Are you kidding me? @\\/@"<<endl;  
        else cout<<str[0][a-1]<<'('<<str[1][b-1]<<str[2][c-1]<<str[1][d-1]<<')'<<str[0][e-1]<<endl;  
    }  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值