TOJ4448 判断正确

描述

小航比较粗心,判断他写的表达式是否正确。

输入

多组数据,直到文件结束。每行输入  a 运算符号 b 关系符号  c ,(0<=a,b,c<=9),用英文字母表示。

运算符号 "+", "-", "*" or "/"     and    关系符号  ">", "<" ,"=","<=" or ">="。

输出

首先若出现除零的情况,输出expression  false,否则若表达式正确并且精确,输出true,再其次表达式不正确的话输出正确并且精确的表达式。输出格式参照样例。


样例输入

one+two=three
two-three=zero
five/four>one

nine*nine<=zero

样例输出

true
two-three < zero
true

nine*nine > zero

提示

例如4/4>=1是正确的,但不是精确地,正确并且精确地是4/4=1。


有点坑,“精确的”意思是“>=”和“<=”必定是不精确的。

我是先把三个数提取出来的,但是标记了运算符和关系符的位置再判断的。

#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<vector>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	char shu[15][15]={"zero","one","two","three","four","five","six","seven","eight","nine"};
	char s[105];
	int len,i,j,k,a,b,c,o,f1,f2,op;
	double d;
	while(scanf("%s",s)!=EOF)
	{
		char sa[20],sb[20],sc[20]; 
		len=strlen(s);op=0;
		//第一个数
		for(i=0;i<len;i++)
		{
			if(s[i]>='a'&&s[i]<='z')
			{
				o=0;
				for(j=i;j<len;j++)
				{
					if(!(s[j]>='a'&&s[j]<='z'))
					{f1=j;break;}
					sa[o++]=s[j];
				}
				sa[o]='\0';
				//printf("%s\n",sa);
				for(k=0;k<10;k++)
				{
					if(strcmp(sa,shu[k])==0)
					{
						a=k;
						break;
					}
				}
				break;
			} 
		}
		//第二个数 
		for(i=f1+1;i<len;i++)
		{
			if(s[i]>='a'&&s[i]<='z')
			{
				o=0;
				for(j=i;j<len;j++)
				{ 
					if(!(s[j]>='a'&&s[j]<='z'))
					{f2=j;break;}
					sb[o++]=s[j];
				}
				sb[o]='\0';
				//printf("%s\n",sb);
				for(k=0;k<10;k++)
				{
					if(strcmp(sb,shu[k])==0)
					{
						b=k;
						break;
					}
				}
				break;
			} 
		}
		//第三个数 
		for(i=f2+1;i<len;i++)
		{
			if(s[i]>='a'&&s[i]<='z')
			{
				o=0;
				for(j=i;j<len;j++)
				{ 
					if(!(s[j]>='a'&&s[j]<='z'))
					{break;}
					sc[o++]=s[j];
				}
				sc[o]='\0';
				//printf("%s\n",sc);
				for(k=0;k<10;k++)
				{
					if(strcmp(sc,shu[k])==0)
					{
						c=k;
						break;
					}
				}
				break;
			} 
		}
		//printf("%d %d %d\n",a,b,c);
		if(s[f1]=='+')
		d=a+b;
		else if(s[f1]=='-')
		d=a-b;
		else if(s[f1]=='*')
		d=a*b;
		else if(s[f1]=='/')
		{
			if(b==0)
			{
				printf("expression  false\n");
				op=1;
			}
			if(op==0)
			d=1.0*a/b;
		}
		//printf("%d\n",d);
		//printf("%c\n",s[f2]);
		if(op==0)
		{
			int flag=0;
			if(s[f2]=='=')
			{
				if(d==c)
				flag=1;
			}
			else if(s[f2]=='>')
			{
				if(s[f2+1]=='=')
				{
					//if(d>c)
					//flag=1;
					//else if(d==c)
					flag=0;
				}
				else
				{
					if(d>c)
					flag=1;
				}
			}
			else if(s[f2]=='<')
			{
				if(s[f2+1]=='=')
				{
					//if(d<c)
					//flag=1;
					//else if(d==c)
					flag=0;
				}
				else
				{
					if(d<c)
					flag=1;
				}
			}
			if(flag)
			printf("true\n");
			else
			{
				printf("%s%c%s",shu[a],s[f1],shu[b]);
				if(d==c)
				printf(" = ");
				else if(d>c)
				printf(" > ");
				else if(d<c)
				printf(" < ");
				printf("%s\n",shu[c]);
			}
		}
	} 
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值