7-62 切分表达式——写个tokenizer吧(含重难点注释)-有疑问未解决

    xiaoxiao2023-09-24  152

    [先说点出题背景]

    这个题是为低年级同学、学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂。如果是高年级、学过了正则表达式(Regular Expression)的同学或者学过了Java等OO语言的同学做这个题,应当发现这题比较简单吧。哦,对了,什么是tokenizer?请自行查询解决。反正在此处不应翻译成“令牌解析器”。

    [正题]

    四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个token(标记)。现在,对于给定的一个四则运算表达式,请把她的每个token切分出来。题目保证给定的表达式是正确的,不需要做有效性检查。

    输入格式: 在一行中给出长度不超过40个字符的表达式,其中没有空格,仅由上文中token的字符组成

    输出格式: 依次输出表达式中的tokens,每个token占一行。

    输入样例:

    32*((2-2)+5)/(-15)

    输出样例:

    #include<stdio.h> /* 用这个来求各种字符的ASCII码 int main(){ char a; scanf("%c",&a); printf("%d",a); return 0; } */ #include<string.h> int main(){ char a[40]; //用gets(a);就是错的,不知道为什么... scanf("%s",a); int len=strlen(a); int flag=0; printf("%c",a[0]); /*下列这个条件我觉得应该是必要的,但是加上反而不对,不知道为什么... //这个if条件,是用来区分第一个%c是数字和负号,还是符号。因为如果是符号,下一个%c如果是数字是需要换行的 if(a[0]>47&&a[0]<58||a[0]=='-'){ flag=0; } else{ flag=1; } */ /* 下一个字符是符号或者负号的情况下,是一定要换行的。 我们在每种情况后面给flag赋值,是为了在后一个字符为数字和小数点的情况(也就是第一种情况)下判断需不需要换行, 所以,我们在给flag赋值的时候,要明白我们的目的什么,这样思路才不会混乱。 */ for(int i=1;i<len;i++){ //如果该字符为数字或者'.',那就直接接在上一个%c后面,但是负号要另作分类,因为它有可能是减号,比如'5-6'。 if(a[i]>47&&a[i]<58||a[i]=='.'){ //添加一个判断条件,flag为0直接接在上一个%c后面,flag为1则换行 if(flag){ printf("\n"); } printf("%c",a[i]); //这个flag=0的意思是,这个字符是数字的情况下,如果下一个字符还是数字的话就得连起来,所以flag=0 flag=0; } //这个是负号的情况,注意!不是减号! else if(a[i-1]=='('&&a[i]=='-'){ printf("\n%c",a[i]); //这个字符是负号的时候,后面一定要接一个数字的,所以flag为0 flag=0; } else{ printf("\n%c",a[i]); //这个字符是负号的时候,后面不管是数字还是负号,都是要回车的,所以flag为1 flag=1; } } return 0; }
    最新回复(0)