变量名检查

FJNU.1762

Description
给定若干个double类型变量的声明语句,要求从中分离出变量名,并按是否有重定义,分成两部分,按字典序输出

Input
若干行double类型变量的声明语句(每行的字符数不超过128)

Output
首先按字典序输出未重定义的变量名,每行一个
其次按字典序输出产生重定义的变量名,每行除了输出变量名外,还要输出变量名在整个声明语句中出现的次数

Sample Input
double a,b,c,aa,ab=0,ac_a2; double A[256]={1,2,5},B[1024][1024]={0},*C;
 double aa , Aa, _a; double aa,aa; double b;
double *ac;

Sample Output
A
Aa
B
C
_a
a
ab
ac
ac_a2
c
aa 4
b 2

Hint
在所有测试数据中,没有Simple Input中不包含的情况,
例如,不需要考虑double a=1.0+2.0*3此类情况
即分隔符集为 ,={}[]* .;

Source
Piao@FNOJ

My Program 

#include < iostream >
#include
< string >
#include
< map >
#include
< algorithm >
using   namespace  std;

int  main()
{
    map
<string,int> var;
    
char str[130],*a;
    
int i,n;
    
bool flag;
    
while(scanf("%s",str)!=EOF)
    
{
        a
=strtok(str,",={}[]* .;");
        
while(a)
        
{
            flag
=false;
            n
=strlen(a);
            
for(i=0;i<n;i++)
                
if(a[i]<'0'||a[i]>'9')
                
{
                    flag
=true;
                    
break;
                }

            
if(strcmp(a,"double")&&flag)
                var[
string(a)]++;
            a
=strtok(NULL,",={}[]* .;");
        }

    }

    map
<string,int>::iterator iter;
    
for(iter=var.begin();iter!=var.end();iter++)
        
if(iter->second==1)
            cout
<<iter->first<<endl;
    
for(iter=var.begin();iter!=var.end();iter++)
        
if(iter->second>1)
            cout
<<iter->first<<" "<<iter->second<<endl;
    
return 0;
}

YOYO's Note:
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄它是华丽的分隔线

【题意简述】

给定若干个double类型变量的声明语句,要求从中分离出变量名,并按是否有重定义,分成两部分,按字典序输出


【粗略分析】

可以用map记录该变量名访问的次数,
接着先将次数为1的输出,
然后将>1的输出,
map默认是按字典排序,增好~

【C++源代码】

#include < iostream >
#include
< string >
#include
< map >
#include
< algorithm >
using   namespace  std;

int  main()
{
    map
<string,int> var;
    
char str[130],*a;
    
int i,n;
    
bool flag;
    
while(scanf("%s",str)!=EOF)
    
{
        a
=strtok(str,",={}[]* .;");
        
while(a)
        
{
            flag
=false;
            n
=strlen(a);
            
for(i=0;i<n;i++)
                
if(a[i]<'0'||a[i]>'9')
                
{
                    flag
=true;
                    
break;
                }

            
if(strcmp(a,"double")&&flag)
                var[
string(a)]++;
            a
=strtok(NULL,",={}[]* .;");
        }

    }

    map
<string,int>::iterator iter;
    
for(iter=var.begin();iter!=var.end();iter++)
        
if(iter->second==1)
            cout
<<iter->first<<endl;
    
for(iter=var.begin();iter!=var.end();iter++)
        
if(iter->second>1)
            cout
<<iter->first<<" "<<iter->second<<endl;
    
return 0;
}

【注意事项】

※ 他们说不要用gets要用scanf不然会WA~
※ double不是变量名~


【点评】

STL,STL,STL中的map练手题 = =//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值