为什么只有20分

P1957 口算练习题

没有人吗?
by 清风雪月 @ 2021-08-12 20:43:54


有,只不过你的程序写的有点啰嗦,大家不是很愿意给你改。
by Terrible @ 2021-08-12 20:45:47


@[Terrible](/user/195942) 那我改了一下
by 清风雪月 @ 2021-08-13 21:21:05


```cpp ```cpp //eg #include<bits/stdc++.h> using namespace std; int a,b,q,n,l,z,x1,x2; char c; int main() { cin>>n; for(int i=1;i<=n;i++){ cin>>c; cin>>a>>b; if(c=='a'||c=='b'||c=='c'){ c-=96; switch(c){ case 1:z=a+b,cout<<a<<"+"<<b<<"="<<z<<endl;break; case 2:z=a-b,cout<<a<<"-"<<b<<"="<<z<<endl;break; case 3:z=a*b,cout<<a<<"*"<<b<<"="<<z<<endl;break; } x1=a; while(x1>0){ x1/=10; l++; } x1=b; while(x1>0){ x1/=10; l++; } x1=z; while(x1>0){ x1/=10; l++; } cout<<l+2<<endl; q=c;l=0; } else{ x1=a;x2=0; while(x1>0){ x1/=10; x2++; } a+=(c-48)*pow(10,x2);c=q; switch(c){ case 1:z=a+b,cout<<a<<"+"<<b<<"="<<z<<endl;break; case 2:z=a-b,cout<<a<<"-"<<b<<"="<<z<<endl;break; case 3:z=a*b,cout<<a<<"*"<<b<<"="<<z<<endl;break; } x1=a; while(x1>0){ x1/=10; l++; } x1=b; while(x1>0){ x1/=10; l++; } x1=z; while(x1>0){ x1/=10; l++; } cout<<l+2<<endl;q=c;l=0;z=0; } } return 0; } ``` ```
by 清风雪月 @ 2021-08-13 21:21:44


@[清风雪月](/user/388857) 今天0点才看到,故没有回。 这比最初的那个程序简练了。 问题: 1.读入两个数据的时候,如果第一个数只有1位,你的程序是不会输出的。有一个$\color{red}\text{WA}$是奇数行错了,应该是这种数据。 2.对于算式a-b,虽然题目保证a、b都是正的,可是没说a-b也是正的。如果减法结果是负的或者0,你的程序就错了。大多数$\color{red}\text{WA}$测试点的反馈是,你的偶数行错了,是这个原因。 其他建议: 1. ```cpp if(c=='a'||c=='b'||c=='c'){ c-=96; switch(c){ case 1:... case 2:... case 3:... } ``` 这个程序段c可以不必减去96,case 'a'即可。 2. ```cpp x1=a; while(x1>0){ x1/=10; l++; } ``` 这个判断位数的方法有种种缺陷,它还不简练,可以写成函数的形式。 3. ```cpp if(c=='a'||c=='b'||c=='c') ``` 对照ASCII表,其实可以写成 ```cpp if(c>='a') ``` ![ASCII图自百度](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg-blog.csdnimg.cn%2Fimg_convert%2F8ebb410a71cb2e78579a792af798d8d0.png&refer=http%3A%2F%2Fimg-blog.csdnimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631503991&t=7b07d80be16419ded690ce50a7a79ba4) 附上本人新写的代码: ```cpp #include<cstdio> #include<cstring> char s[200]; int main() { int n,a,b;char c,d; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf(" %c",&d); if(d<'a')ungetc(d,stdin);else c=d; //ungetc(d,stdin)表示把刚读入的d撤回到读入区 //先看看第一个字符是不是字母,不是的话退回去 //这样我们的程序就不必再写很多代码兼容两个数据的情况了 scanf("%d%d",&a,&b); switch(c) { case 'a':sprintf(s,"%d+%d=%d",a,b,a+b);break; case 'b':sprintf(s,"%d-%d=%d",a,b,a-b);break; case 'c':sprintf(s,"%d*%d=%d",a,b,a*b);break; //sprintf()是在printf()参数列前面加一个参数 //表示将结果输出到一个字符串s里,其他用法和printf() //一模一样,就不必手动判断字符串长度了 } printf("%s\n%d\n",s,strlen(s)); //strlen(s),s的长度 } } //学会用库函数很重要,库函数不是高高在上的存在 //有什么问题能用库函数解决的,就用库函数解决 //这(库函数、STL)都是大佬的代码,你要不要嘛?要不要? ``` 题外话: 第二个测试点: `Wrong Answer. wrong answer On line 21 column 2, read 7, expected 0. ` (21行第2个字符,你给的结果是7,人家要0) 鼠标移到某个测试点上会返回信息,虽然是英文,但这个不难理解吧。得学会看WA的反馈信息。 有什么问题可以靠题解解决,能自己解决不要发帖。
by Terrible @ 2021-08-14 11:44:23


这里忘说一点了: ```cpp scanf(" %c",&c); ``` `%c前面加空格`这个语句等于`cin>>c;`会过滤掉 空格回车换行。 ```cpp scanf("%c",&c); ``` 则相当于`c=getchar()`,会读入下一个任意的字符,不会过滤。(至于为什么,不必深究) 图链接挂了,你右键打开便是。
by Terrible @ 2021-08-14 11:48:51


@[Terrible](/user/195942) 谢谢大佬,讲解真的很详细,以后我做题会注意这些的,![](https://www.agri35.com/UploadFiles/img_1_847330463_3719291434_15.jpg)
by 清风雪月 @ 2021-08-14 17:48:09


我自学的,以前没学过STL和大多数库函数,也不知道是什么意思,看来以后这些也要去学学
by 清风雪月 @ 2021-08-14 17:54:50


|