做了一个连续四则运算的计算器,不知道为什么还是停止运行
#include<stdio.h>#include<string.h>
main()
{
int i;
char s,p;
float sum=0.0;
printf("请输入表达式:");
scanf("%s",&s);
for(i=0;i<100;i++)
p=s;
for(i=0;s!='\n';i++)
{
if(s=='*')
sum+=((float)s-48)*((float)s-48),
s=s;
if(s=='/')
{
if(s!='0')
sum+=((float)s-48)/((float)s-48),s=s;
else
printf("input error!\n");
}
}
for(i=0;s!='\n';i++)
{
if(s=='+')
sum+=((float)s-48)+((float)s-48),s=s;
if(s=='-')
sum+=((float)s-48)-((float)s-48),s=s;
}
printf("%s",p);
printf("%f\n",sum);
} 本帖最后由 yundi 于 2016-6-30 09:31 编辑
貌似问题很多,举个例子输入“3+2*5回车”
1.scanf("%s",s);直接数组名,不加&
2.获取的s是"3+2*5"没有后面的回车
scanf("%s",str)在遇到'\n'(回车)或' '(空格)时输入结束,但'\n'(回车)或' '(空格)停留在出入缓冲区,如处理不慎会影响下面的输入;gets(str)遇到'\n'(回车)时输入结束,但'\n'(回车)已被替换为'\0',存储于字符串中,输入缓冲中没有遗留的'\n'(回车),不会影响后续的输入。
3.在第一轮循环,i=3时,s是*,进入if,这句s=s;是把数字5后面的未知内容给数字2,s串变成"3+??*5",后面就玩不下去了{:5_91:}
给个思路建议:不要把字符处理和计算混到一起。第一步,循环找出运算符,把运算符左右的数值存到一个float data,第二步进行浮点四则运算。 字符串数组s不用加& 这样试试
#include<stdio.h>
#include<string.h>
main()
{
int i;
char s,p;
float sum=0.0;
printf("请输入表达式:");
scanf("%s",s);
for(i=0;i<100;i++)
p=s;
for(i=0;s!='\n';i++)
{
if(s=='*')
sum+=((float)s-48)*((float)s-48),
s=s;
if(s=='/')
{
if(s!='0')
sum+=((float)s-48)/((float)s-48),s=s;
else
printf("input error!\n");
}
}
for(i=0;s!='\n';i++)
{
if(s=='+')
sum+=((float)s-48)+((float)s-48),s=s;
if(s=='-')
sum+=((float)s-48)-((float)s-48),s=s;
}
printf("%s",p);
printf("%f\n",sum);
} 还是会停止运行 本帖最后由 夜雨de街灯 于 2016-6-30 08:45 编辑
为什么要用字符串来实现计算器{:10_247:}就算能实现也很麻烦.........
例如我输入表达式6.5*0.5
那么s='6' s='.' s='5' s='*' s='0' s='.' s='5' s='\0'
下面是你的代码
printf("请输入表达式:");
scanf("%s",&s); //假如我输入 6.5*0.5
for(i=0;i<100;i++)
p=s; //这个复制字符串不知道要干嘛
for(i=0;s!='\n';i++)
{
if(s=='*') //看是否有符合的字符,这里是 s='*'
sum+=((float)s-48)*((float)s-48), //这里的s和s,你应该是想拿乘号前后两个数,但是这是字符串,你拿了 s='5'和s='0'两个字符,他们对应的ascii码表十进制是53和48,然后你强制转换为浮点数53.0和48.0,我看不明白你为什么减48
s=s; // s='.'赋给 s='5' 又不知道是什么鬼
以上都是基于我输入表达式6.5*0.5的解释 没有看出来有什么问题啊,大神们来看看啊 wstxh 发表于 2016-6-30 10:07
没有看出来有什么问题啊,大神们来看看啊
看了大神们的回复,我觉得我有必要再回去多学习学习了 yundi 发表于 2016-6-29 22:00
貌似问题很多,举个例子输入“3+2*5回车”
1.scanf("%s",s);直接数组名,不加&
2.获取的s是"3+2*5"没有后 ...
大神啊 唉,建议用atof,多方便!
f=atof(s);就可以了。。。 本帖最后由 yundi 于 2016-7-6 09:57 编辑
继续完善一下,按照我给的思路,代码其实也不好写。楼主做个参考吧。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char strin = "1+4*5*4.5+6.7";//为简化,直接给表达式串
char strtmp;
char * ps,* qs;
int slen,i=0,j=0,k,l;
float num={0};
char ch={0};
int f1;//循环开关
slen = strlen(strin);
//1.处理串,数符分别存到num、ch数组
ps = strin;//指向串首
while(ps<strin+slen)
{
qs = ps;//初始化游标,用于截取串中的数字字符串
f1 = 1;
while(qs<strin+slen && f1==1)
{
switch(*qs)
{
case '+':
case '-':
case '*':
case '/':
ch = *qs;//保存符号
memset(strtmp,0,10);
strncpy(strtmp,ps,qs-ps);//截取两运算符之间数字串
num = atof(strtmp);//数字串转换为浮点数,并保存该数
f1 = 0;//找到符号后退出内部循环,ps移到下一位置
ps = qs+1;
break;
default:
qs++;//游标移到下个位置
break;
}
}
if(qs==strin+slen)
{
memset(strtmp,0,10);
strncpy(strtmp,ps,qs-ps);
num = atof(strtmp);//保存最后一个数
ps = qs + 1;
}
}
//2.处理两个数组
//2.1处理* /
for(j=0;j<strlen(ch);j++)
{
if(ch == '*')
{
//1.运算相邻两个数
num = num*num;
//2.将后面的数、运算符前移
k = j;
while(ch!='\0')//移动运算符
{
ch = ch;
k++;
}
k = j;
while(num!=0.0) //移动数
{
num = num;
k++;
}
j--; //因移动,当前处理的数组元素前移,所以-1
}else if(ch == '/')
{
num = num/num;
k = j;
while(ch!='\0')
{
ch = ch;
k++;
}
k=j;
while(num!=0.0)
{
num = num;
k++;
}
j--;
}else{
;//非*/不作处理
}
}
//2.2处理+-
for(j=0;j<strlen(ch);j++)
{
if(ch == '+')
{
//1.运算相邻两个数
num = num+num;
//2.将后面的数、运算符前移
k = j;//移动运算符
while(ch!='\0')
{
ch = ch;
k++;
}
k=j;//移动数字
while(num!=0.0)
{
num = num;
k++;
}
j--;
}else if(ch == '-')
{
num = num-num;
k = j;
while(ch!='\0')
{
ch = ch;
k++;
}
k=j;
while(num!=0.0)
{
num = num;
k++;
}
j--;
}else{
;
}
}
//3.输出结果,保留二位小数
if(num==0.0 && ch=='\0'){
printf("%s = %.2f",strin,num);
}else{
printf("计算有误!");
}
getchar();
}
这种算式字符串计算更好的办法是:后缀表达式计算,要了解栈数据结构,代码网上一搜大把。 多谢了,是我取巧不想用栈反而变难了
页:
[1]