清风雪月 @ 2021-08-12 20:40:35
//eg
#include<bits/stdc++.h>
using namespace std;
int a,b,q,n,l,z;
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;
if(c==1)
{
cout<<a<<"+"<<b<<"="<<a+b<<endl;
z=a+b;
}
else if(c==2)
{
cout<<a<<"-"<<b<<"="<<a-b<<endl;
z=a-b;
}
else
{
cout<<a<<"*"<<b<<"="<<a*b<<endl;
z=a*b;
}
int x1;
x1=a;
while(x1>0)
{
x1/=10;
l++;
}
x1=b;
while(x1>0)
{
x1/=10;
l++;
}
x1=z;
while(x1>0)
{
x1/=10;
l++;
}
l+=2;
cout<<l<<endl;
q=c;
l=0;
}
else
{
int x1,x2=0;
x1=a;
while(x1>0)
{
x1/=10;
x2++;
}
a+=(c-48)*pow(10,x2);
c=q;
if(c==1)
{
cout<<a<<"+"<<b<<"="<<a+b<<endl;
z=a+b;
}
else if(c==2)
{
cout<<a<<"-"<<b<<"="<<a-b<<endl;
z=a-b;
}
else
{
cout<<a<<"*"<<b<<"="<<a*b<<endl;
z=a*b;
}
x1=a;
while(x1>0)
{
x1/=10;
l++;
}
x1=b;
while(x1>0)
{
x1/=10;
l++;
}
x1=z;
while(x1>0)
{
x1/=10;
l++;
}
l+=2;
cout<<l<<endl;
q=c;
l=0;
z=0;
}
}
return 0;
}
by 清风雪月 @ 2021-08-12 20:43:54
没有人吗?
by Terrible @ 2021-08-12 20:45:47
有,只不过你的程序写的有点啰嗦,大家不是很愿意给你改。
by 清风雪月 @ 2021-08-13 21:21:05
@Terrible 那我改了一下
by 清风雪月 @ 2021-08-13 21:21:44
```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 Terrible @ 2021-08-14 11:44:23
@清风雪月
今天0点才看到,故没有回。
这比最初的那个程序简练了。
问题:
1.读入两个数据的时候,如果第一个数只有1位,你的程序是不会输出的。有一个
2.对于算式a-b,虽然题目保证a、b都是正的,可是没说a-b也是正的。如果减法结果是负的或者0,你的程序就错了。大多数
其他建议:
1.
if(c=='a'||c=='b'||c=='c'){
c-=96;
switch(c){
case 1:...
case 2:...
case 3:...
}
这个程序段c可以不必减去96,case 'a'即可。
2.
x1=a;
while(x1>0){
x1/=10;
l++;
}
这个判断位数的方法有种种缺陷,它还不简练,可以写成函数的形式。
3.
if(c=='a'||c=='b'||c=='c')
对照ASCII表,其实可以写成
if(c>='a')
附上本人新写的代码:
#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:48:51
这里忘说一点了:
scanf(" %c",&c);
%c前面加空格
这个语句等于cin>>c;
会过滤掉
空格回车换行。
scanf("%c",&c);
则相当于c=getchar()
,会读入下一个任意的字符,不会过滤。(至于为什么,不必深究)
图链接挂了,你右键打开便是。
by 清风雪月 @ 2021-08-14 17:48:09
@Terrible 谢谢大佬,讲解真的很详细,以后我做题会注意这些的,
by 清风雪月 @ 2021-08-14 17:54:50
我自学的,以前没学过STL和大多数库函数,也不知道是什么意思,看来以后这些也要去学学