TOJ4448 判断正确

港控/mmm° 2022-05-30 08:44 273阅读 0赞

描述

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

输入

多组数据,直到文件结束。每行输入 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。

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

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

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<string>
  4. #include<math.h>
  5. #include<vector>
  6. #include<map>
  7. #include<iostream>
  8. #include<algorithm>
  9. using namespace std;
  10. int main()
  11. {
  12. char shu[15][15]={"zero","one","two","three","four","five","six","seven","eight","nine"};
  13. char s[105];
  14. int len,i,j,k,a,b,c,o,f1,f2,op;
  15. double d;
  16. while(scanf("%s",s)!=EOF)
  17. {
  18. char sa[20],sb[20],sc[20];
  19. len=strlen(s);op=0;
  20. //第一个数
  21. for(i=0;i<len;i++)
  22. {
  23. if(s[i]>='a'&&s[i]<='z')
  24. {
  25. o=0;
  26. for(j=i;j<len;j++)
  27. {
  28. if(!(s[j]>='a'&&s[j]<='z'))
  29. {f1=j;break;}
  30. sa[o++]=s[j];
  31. }
  32. sa[o]='\0';
  33. //printf("%s\n",sa);
  34. for(k=0;k<10;k++)
  35. {
  36. if(strcmp(sa,shu[k])==0)
  37. {
  38. a=k;
  39. break;
  40. }
  41. }
  42. break;
  43. }
  44. }
  45. //第二个数
  46. for(i=f1+1;i<len;i++)
  47. {
  48. if(s[i]>='a'&&s[i]<='z')
  49. {
  50. o=0;
  51. for(j=i;j<len;j++)
  52. {
  53. if(!(s[j]>='a'&&s[j]<='z'))
  54. {f2=j;break;}
  55. sb[o++]=s[j];
  56. }
  57. sb[o]='\0';
  58. //printf("%s\n",sb);
  59. for(k=0;k<10;k++)
  60. {
  61. if(strcmp(sb,shu[k])==0)
  62. {
  63. b=k;
  64. break;
  65. }
  66. }
  67. break;
  68. }
  69. }
  70. //第三个数
  71. for(i=f2+1;i<len;i++)
  72. {
  73. if(s[i]>='a'&&s[i]<='z')
  74. {
  75. o=0;
  76. for(j=i;j<len;j++)
  77. {
  78. if(!(s[j]>='a'&&s[j]<='z'))
  79. {break;}
  80. sc[o++]=s[j];
  81. }
  82. sc[o]='\0';
  83. //printf("%s\n",sc);
  84. for(k=0;k<10;k++)
  85. {
  86. if(strcmp(sc,shu[k])==0)
  87. {
  88. c=k;
  89. break;
  90. }
  91. }
  92. break;
  93. }
  94. }
  95. //printf("%d %d %d\n",a,b,c);
  96. if(s[f1]=='+')
  97. d=a+b;
  98. else if(s[f1]=='-')
  99. d=a-b;
  100. else if(s[f1]=='*')
  101. d=a*b;
  102. else if(s[f1]=='/')
  103. {
  104. if(b==0)
  105. {
  106. printf("expression false\n");
  107. op=1;
  108. }
  109. if(op==0)
  110. d=1.0*a/b;
  111. }
  112. //printf("%d\n",d);
  113. //printf("%c\n",s[f2]);
  114. if(op==0)
  115. {
  116. int flag=0;
  117. if(s[f2]=='=')
  118. {
  119. if(d==c)
  120. flag=1;
  121. }
  122. else if(s[f2]=='>')
  123. {
  124. if(s[f2+1]=='=')
  125. {
  126. //if(d>c)
  127. //flag=1;
  128. //else if(d==c)
  129. flag=0;
  130. }
  131. else
  132. {
  133. if(d>c)
  134. flag=1;
  135. }
  136. }
  137. else if(s[f2]=='<')
  138. {
  139. if(s[f2+1]=='=')
  140. {
  141. //if(d<c)
  142. //flag=1;
  143. //else if(d==c)
  144. flag=0;
  145. }
  146. else
  147. {
  148. if(d<c)
  149. flag=1;
  150. }
  151. }
  152. if(flag)
  153. printf("true\n");
  154. else
  155. {
  156. printf("%s%c%s",shu[a],s[f1],shu[b]);
  157. if(d==c)
  158. printf(" = ");
  159. else if(d>c)
  160. printf(" > ");
  161. else if(d<c)
  162. printf(" < ");
  163. printf("%s\n",shu[c]);
  164. }
  165. }
  166. }
  167. }

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 判断用户名是否正确

    程序的开发过程中,经常需要判断用户输入的用户名是否正确,可以通过对比用户输入的用户名字符串是否与数据库中或者已经存在集合中的字符串相同,来决定用户输入的用户名是否正确。Java

    相关 TOJ1292 排序

    滴,集训第二十九天打卡。 (其实都快结束了... 距离老师上一次开比赛也是九天前了,于是我只能在TOJ划水了... 还在https://www.panda.tv/1352

    相关 TOJ4448 判断正确

    描述 小航比较粗心,判断他写的表达式是否正确。 输入 多组数据,直到文件结束。每行输入 a 运算符号 b 关系符号 c ,(0<=a,b,c<=9),用英文字母表示。

    相关 判断用户名是否正确

    在程序的开发过程中,经常需要判断用户输入的用户名是否正确,可以通过对比用户输入的用户名字符串是否与数据库中或者已经存在集合中的字符串相同,来决定用户输入的用户名是否正确。Jav