int main(){ char a;//a用于存储运算符 int n,c,d;//n存储个数不解释,cd存储两个数字 char s[100],b[10];//s存储最终的字符串,b临时变量 cin>>n; for(int i=0;i<n;i++){ cin>>b;//输入一串字符,有可能是运算符,也有可能是数字 if(b[0]>='a' && b[0]<='z'){ a=b[0];//如果是运算符就存入a,然后输入数字 cin>>c>>d; }else{ sscanf(b,"%d",&c);//如果是数字就转换b为int存储到第一个数字 cin>>d;//然后输入剩下的第二个数字 } memset(s,0,sizeof(s));//清空原有的字符串,防止长度判断错误 if(a=='a')//用sprintf格式化 sprintf(s,"%d+%d=%d",c,d,c+d); else if(a=='b') sprintf(s,"%d-%d=%d",c,d,c-d); else if(a=='c') sprintf(s,"%d*%d=%d",c,d,c*d); cout<<s<<endl<<strlen(s)<<endl;//输出字符串和字符串长度 } return 0; }请改成C语言
时间: 2024-04-01 09:35:41 浏览: 56
#include <stdio.h>
#include <string.h>
int main(){
char a;
int n,c,d;
char s[100],b[10];
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%s", b);
if(b[0]>='a' && b[0]<='z'){
a=b[0];
scanf("%d%d", &c, &d);
} else{
sscanf(b,"%d",&c);
scanf("%d", &d);
}
memset(s,0,sizeof(s));
if(a=='a')
sprintf(s,"%d+%d=%d",c,d,c+d);
else if(a=='b')
sprintf(s,"%d-%d=%d",c,d,c-d);
else if(a=='c')
sprintf(s,"%d*%d=%d",c,d,c*d);
printf("%s\n%d\n", s, strlen(s));
}
return 0;
}
相关问题
#include<bits/stdc++.h> using namespace std; char str[110]; stack<int> sInt; //数字 stack<char> sChar; //运算符 bool iso(char c) //判读是否为运算符 { if(c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')') return true; return false; } int getRank(char c) //获取优先级 { if(c=='*' || c=='/') return 2; else if(c=='+' || c=='-') return 1; return 0; } void calc() //计算 { long long int b = sInt.top(); sInt.pop(); long long int a = sInt.top(); sInt.pop(); long long int c = sChar.top();sChar.pop(); long long int d; if(c=='+') d = a+b; else if(c=='-') d = a-b; else if(c=='*') d = a*b; else d = a/b; sInt.push(d); } int main() { scanf("%s",str); long long int len = strlen(str); for(long long int i=0;i<len;i++) { if(iso(str[i])) //如果不为数字 { if(str[i]=='(') sChar.push(str[i]); else if(str[i]==')') //将括号中的全部算完 { int c = sChar.top(); while(c!='(') { calc(); c = sChar.top(); } sChar.pop(); } else { int r = getRank(str[i]); //获取优先级 if(sChar.empty() || r>getRank(sChar.top())) sChar.push(str[i]); else //如果后面的优先级小于等于前面的就把前面的运算算出 { calc(); sChar.push(str[i]); } } } else //为数字 { long long int t; sscanf(str+i,"%d",&t); sInt.push(t); //将数字入栈 for(;!iso(str[i+1]);i++); //跳到是运算符的地方 } } while(!sChar.empty()) { calc(); } printf("%d\n",sInt.top()); }//80这段代码的问题
这段代码的问题是在计算表达式时,使用了整型变量来存储结果,但是输出的格式却使用了"%d"来打印,导致输出的结果可能不正确。应该将输出格式改为"%lld"来打印长整型数值。
另外,这段代码没有考虑到运算符的优先级,会导致表达式计算结果不准确。应该考虑运算符的优先级,按照正确的顺序计算表达式的值。
此外,代码中没有对输入表达式的有效性进行判断,如果输入的表达式不符合规则,可能会导致程序出错。应该增加对输入表达式的有效性进行检查。
最后,代码中的注释有些拼写错误,可以进行修正。
/* 函数功能:求一个后缀表达式的值 / double evalpost(char f[]); / 函数功能:判断一个字符是否为运算符 / int is_operation(char op); / 函数功能:将一个中缀表达式e转换为与它等价的后缀表达式f / void postfix(char e[], char f[]); / 函数功能:求运算符的优先级 / int priority(char op); / 函数功能:将数字字符串转变成相应的数 */ double readnumber(char f[], int i); / 函数功能:判断表达式括号是否匹配 */ int match_kuohao(char c[]); 为这段代码编写C语言测试代码,要求在同一个main文件里测试,不需要输入
以下是一份可能的测试代码,可以在同一个main文件里进行测试:
#include <stdio.h>
#include <string.h>
double evalpost(char f[]);
int is_operation(char op);
void postfix(char e[], char f[]);
int priority(char op);
double readnumber(char f[], int i);
int match_kuohao(char c[]);
int main() {
char e[100], f[100];
double result;
int match;
// 测试evalpost函数
strcpy(f, "23+4*");
result = evalpost(f);
printf("后缀表达式的值为:%f\n", result);
// 测试is_operation函数
char op = '+';
if (is_operation(op)) {
printf("%c是运算符\n", op);
} else {
printf("%c不是运算符\n", op);
}
// 测试postfix函数
strcpy(e, "2+3*4");
postfix(e, f);
printf("转换成后缀表达式为:%s\n", f);
// 测试priority函数
op = '+';
int p = priority(op);
printf("%c的优先级为:%d\n", op, p);
// 测试readnumber函数
strcpy(f, "3.14");
double num = readnumber(f, 0);
printf("转换成的数字为:%f\n", num);
// 测试match_kuohao函数
strcpy(e, "(2+3)*4");
match = match_kuohao(e);
if (match) {
printf("括号匹配\n");
} else {
printf("括号不匹配\n");
}
return 0;
}
阅读全文