变量名检查

来源:互联网 发布:pua倪网络课程百度云 编辑:程序博客网 时间:2024/05/01 11:01

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练手题 = =//

原创粉丝点击