首页 > 其他 > 详细

UVA 10815 (STL_C题)解题报告

时间:2018-01-20 23:58:11      阅读:407      评论:0      收藏:0      [点我收藏+]

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1756

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

题意:题目给出每行按空格分割的文本数据,要求统计出文章中所有的单词并按字典序输出,不区分大小写。

思路:首先读入数据,拆分成字符串,然后将大写字母转化为小写字母,并对多余的标点符号进行处理。此后将每个单词置入set中,set按字典序排列,输出即可。看上去很简单的一道题,但是有一些不容易注意到的坑。

注意:

1.本文中进行判断的时候,很容易将anscii码与‘A‘与‘z‘比较,但是,基于我们都知道的一个事实是‘A‘和‘a‘相差32,也就是说之间仍然有字符,91-96分别是[,\,],^,\,` 也就是说不能简单按照‘A‘与‘z‘进行判断。当然可以使用isalpha()判断。

2.很自然的会想到标点符号可能会在字符首末,然而存在这样的情况"Andy‘s apple",在这种情况下,输出应为"andy s apple",所以,应该首先对字符串进行处理,即将不是字母的符号替换为‘ ‘(空格),然后再进行分割。

代码:

技术分享图片
#include<cstdio>
#include<string>
#include<iostream>
#include<set>
#include<sstream> 
#include <cstring>
using namespace std;
string s1;
string cur;
set<string> s;

int main(void){
    while(getline(cin,s1)){    
        for(int i=0;i<s1.length();i++){
                if(s1[i]<A||s1[i]>z||(s1[i]>Z&&s1[i]<a)){
                    s1[i]= ;
                }
            }
        stringstream input1(s1);
        while(input1>>cur){
            
            for(int i=0;i<cur.length();i++){
                if(cur[i]>=A&&cur[i]<=Z){
                    cur[i]=cur[i]+32;
                }
            }
            if(cur.length()>0)    s.insert(cur);
        }    
    }
    set<string>::iterator it;
        for(it=s.begin();it!=s.end();it++) {
            cout<<*it<<\n;  
        } 
    

    return 0;

}
View Code

 

UVA 10815 (STL_C题)解题报告

原文:https://www.cnblogs.com/caomingpei/p/8322204.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!