鱼C论坛

 找回密码
 立即注册
查看: 2252|回复: 11

做了一个连续四则运算的计算器,不知道为什么还是停止运行

[复制链接]
发表于 2016-6-29 20:01:44 | 显示全部楼层 |阅读模式
10鱼币
#include<stdio.h>
#include<string.h>
main()
{
int i;
char s[100],p[100];
float sum=0.0;

printf("请输入表达式:");
scanf("%s",&s);
for(i=0;i<100;i++)
p[i]=s[i];
for(i=0;s[i]!='\n';i++)
{       

if(s[i]=='*')
sum+=((float)s[i-1]-48)*((float)s[i+1]-48),
s[i-1]=s[i+2];
if(s[i]=='/')
    {
           if(s[i+1]!='0')
                 sum+=((float)s[i-1]-48)/((float)s[i+1]-48),s[i-1]=s[i+2];
           else
                 printf("input error!\n");
    }
}
                for(i=0;s[i]!='\n';i++)
{
      if(s[i]=='+')
      sum+=((float)s[i-1]-48)+((float)s[i+1]-48),s[i-1]=s[i+2];
      if(s[i]=='-')
      sum+=((float)s[i-1]-48)-((float)s[i+1]-48),s[i-1]=s[i+2];
}
printf("%s",p);
printf("%f\n",sum);
}

最佳答案

查看完整内容

貌似问题很多,举个例子输入“3+2*5回车” 1.scanf("%s",s);直接数组名,不加& 2.获取的s是"3+2*5"没有后面的回车 3.在第一轮循环,i=3时,s是*,进入if,这句s=s;是把数字5后面的未知内容给数字2,s串变成"3+??*5",后面就玩不下去了 给个思路建议:不要把字符处理和计算混到一起。第一步,循环找出运算符,把运算符左右的数值存到一个float data[50],第二步进行浮点四则运算。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 20:01:45 From FishC Mobile | 显示全部楼层
本帖最后由 yundi 于 2016-6-30 09:31 编辑

貌似问题很多,举个例子输入“3+2*5回车”
1.scanf("%s",s);直接数组名,不加&
2.获取的s是"3+2*5"没有后面的回车
  1. scanf("%s",str)在遇到'\n'(回车)或' '(空格)时输入结束,但'\n'(回车)或' '(空格)停留在出入缓冲区,如处理不慎会影响下面的输入;gets(str)遇到'\n'(回车)时输入结束,但'\n'(回车)已被替换为'\0',存储于字符串中,输入缓冲中没有遗留的'\n'(回车),不会影响后续的输入。
复制代码

3.在第一轮循环,i=3时,s[i]是*,进入if,这句s[i-1]=s[i+2];是把数字5后面的未知内容给数字2,s串变成"3+??*5",后面就玩不下去了

给个思路建议:不要把字符处理和计算混到一起。第一步,循环找出运算符,把运算符左右的数值存到一个float data[50],第二步进行浮点四则运算。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
连心 + 5 + 5 + 3 多谢!了解了!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 20:18:26 | 显示全部楼层
字符串数组s不用加&
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 20:19:44 | 显示全部楼层
这样试试
  1. #include<stdio.h>
  2. #include<string.h>
  3. main()
  4. {
  5. int i;
  6. char s[100],p[100];
  7. float sum=0.0;

  8. printf("请输入表达式:");
  9. scanf("%s",s);
  10. for(i=0;i<100;i++)
  11. p[i]=s[i];
  12. for(i=0;s[i]!='\n';i++)
  13. {        

  14. if(s[i]=='*')
  15. sum+=((float)s[i-1]-48)*((float)s[i+1]-48),
  16. s[i-1]=s[i+2];
  17. if(s[i]=='/')
  18.     {
  19.            if(s[i+1]!='0')
  20.                  sum+=((float)s[i-1]-48)/((float)s[i+1]-48),s[i-1]=s[i+2];
  21.            else
  22.                  printf("input error!\n");
  23.     }
  24. }
  25.                 for(i=0;s[i]!='\n';i++)
  26. {
  27.       if(s[i]=='+')
  28.       sum+=((float)s[i-1]-48)+((float)s[i+1]-48),s[i-1]=s[i+2];
  29.       if(s[i]=='-')
  30.       sum+=((float)s[i-1]-48)-((float)s[i+1]-48),s[i-1]=s[i+2];
  31. }
  32. printf("%s",p);
  33. printf("%f\n",sum);
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-29 20:28:37 | 显示全部楼层
还是会停止运行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 08:40:38 | 显示全部楼层
本帖最后由 夜雨de街灯 于 2016-6-30 08:45 编辑

为什么要用字符串来实现计算器就算能实现也很麻烦.........
例如我输入表达式  6.5*0.5
那么s[0]='6'     s[1]='.'     s[2]='5'       s[3]='*'     s[4]='0'       s[5]='.'     s[6]='5'        s[7]='\0'


下面是你的代码
  1. printf("请输入表达式:");
  2. scanf("%s",&s);                       //假如我输入 6.5*0.5
  3. for(i=0;i<100;i++)
  4. p[i]=s[i];                                  //这个复制字符串不知道要干嘛
  5. for(i=0;s[i]!='\n';i++)
  6. {
  7. if(s[i]=='*')                              //看是否有符合的字符,这里是 s[3]='*'

  8. sum+=((float)s[i-1]-48)*((float)s[i+1]-48),      //这里的  s[i-1]和s[i+1],你应该是想拿乘号前后两个数,但是这是字符串,你拿了 s[2]='5'和s[4]='0'两个字符,他们对应的ascii码表十进制是53和48,然后你强制转换为浮点数53.0和48.0,我看不明白你为什么减48

  9. s[i-1]=s[i+2];                           // s[5]='.'赋给 s[2]='5' 又不知道是什么鬼
复制代码


以上都是基于我输入表达式6.5*0.5的解释
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 10:07:27 | 显示全部楼层
没有看出来有什么问题啊,大神们来看看啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 10:09:44 | 显示全部楼层
wstxh 发表于 2016-6-30 10:07
没有看出来有什么问题啊,大神们来看看啊

看了大神们的回复,我觉得我有必要再回去多学习学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 10:14:44 | 显示全部楼层
yundi 发表于 2016-6-29 22:00
貌似问题很多,举个例子输入“3+2*5回车”
1.scanf("%s",s);直接数组名,不加&
2.获取的s是"3+2*5"没有后 ...

大神啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 12:07:23 | 显示全部楼层
唉,建议用atof,多方便!
f=atof(s);就可以了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-6 09:12:48 | 显示全部楼层
本帖最后由 yundi 于 2016-7-6 09:57 编辑

继续完善一下,按照我给的思路,代码其实也不好写。楼主做个参考吧。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void main()
  5. {
  6.         char strin[100] = "1+4*5*4.5+6.7";//为简化,直接给表达式串
  7.         char strtmp[10];
  8.         char * ps,* qs;
  9.         int slen,i=0,j=0,k,l;
  10.         float num[50]={0};
  11.         char ch[25]={0};
  12.         int f1;//循环开关
  13.         slen = strlen(strin);
  14.         //1.处理串,数符分别存到num、ch数组
  15.         ps = strin;//指向串首
  16.         while(ps<strin+slen)
  17.         {
  18.                 qs = ps;//初始化游标,用于截取串中的数字字符串
  19.                 f1 = 1;
  20.                 while(qs<strin+slen && f1==1)
  21.                 {
  22.                         switch(*qs)
  23.                         {
  24.                         case '+':
  25.                         case '-':
  26.                         case '*':
  27.                         case '/':
  28.                                 ch[j++] = *qs;//保存符号
  29.                                 memset(strtmp,0,10);
  30.                                 strncpy(strtmp,ps,qs-ps);//截取两运算符之间数字串
  31.                                 num[i++] = atof(strtmp);//数字串转换为浮点数,并保存该数
  32.                                 f1 = 0;//找到符号后退出内部循环,ps移到下一位置
  33.                                 ps = qs+1;
  34.                                 break;
  35.                         default:
  36.                                 qs++;//游标移到下个位置
  37.                                 break;
  38.                         }
  39.                 }
  40.                 if(qs==strin+slen)
  41.                 {
  42.                         memset(strtmp,0,10);
  43.                         strncpy(strtmp,ps,qs-ps);
  44.                         num[i++] = atof(strtmp);//保存最后一个数
  45.                         ps = qs + 1;
  46.                 }
  47.         }
  48.         //2.处理两个数组
  49.         //2.1处理* /
  50.         for(j=0;j<strlen(ch);j++)
  51.         {
  52.                 if(ch[j] == '*')
  53.                 {
  54.                         //1.运算相邻两个数
  55.                         num[j] = num[j]*num[j+1];
  56.                         //2.将后面的数、运算符前移
  57.                         k = j;
  58.                         while(ch[k]!='\0')  //移动运算符
  59.                         {
  60.                                 ch[k] = ch[k+1];
  61.                                 k++;
  62.                         }
  63.                         k = j;
  64.                         while(num[k+1]!=0.0) //移动数
  65.                         {
  66.                                 num[k+1] = num[k+2];
  67.                                 k++;
  68.                         }
  69.                         j--; //因移动,当前处理的数组元素前移,所以-1
  70.                 }else if(ch[j] == '/')
  71.                 {
  72.                         num[j] = num[j]/num[j+1];
  73.                         k = j;
  74.                         while(ch[k]!='\0')
  75.                         {
  76.                                 ch[k] = ch[k+1];
  77.                                 k++;
  78.                         }
  79.                         k=j;
  80.                         while(num[k+1]!=0.0)
  81.                         {
  82.                                 num[k+1] = num[k+2];
  83.                                 k++;
  84.                         }
  85.                         j--;
  86.                 }else{
  87.                         ;  //非*/不作处理
  88.                 }
  89.         }
  90.         //2.2处理+-
  91.         for(j=0;j<strlen(ch);j++)
  92.         {
  93.                 if(ch[j] == '+')
  94.                 {
  95.                         //1.运算相邻两个数
  96.                         num[j] = num[j]+num[j+1];
  97.                         //2.将后面的数、运算符前移
  98.                         k = j;//移动运算符
  99.                         while(ch[k]!='\0')
  100.                         {
  101.                                 ch[k] = ch[k+1];
  102.                                 k++;
  103.                         }
  104.                         k=j;//移动数字
  105.                         while(num[k+1]!=0.0)
  106.                         {
  107.                                 num[k+1] = num[k+2];
  108.                                 k++;
  109.                         }
  110.                         j--;
  111.                 }else if(ch[j] == '-')
  112.                 {
  113.                         num[j] = num[j]-num[j+1];
  114.                         k = j;
  115.                         while(ch[k]!='\0')
  116.                         {
  117.                                 ch[k] = ch[k+1];
  118.                                 k++;
  119.                         }
  120.                         k=j;
  121.                         while(num[k+1]!=0.0)
  122.                         {
  123.                                 num[k+1] = num[k+2];
  124.                                 k++;
  125.                         }
  126.                         j--;
  127.                 }else{
  128.                         ;
  129.                 }
  130.         }

  131.         //3.输出结果,保留二位小数
  132.         if(num[1]==0.0 && ch[1]=='\0'){
  133.                 printf("%s = %.2f",strin,num[0]);
  134.         }else{
  135.                 printf("计算有误!");
  136.         }
  137.         getchar();
  138. }
复制代码


这种算式字符串计算更好的办法是:后缀表达式计算,要了解栈数据结构,代码网上一搜大把。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-7 00:35:13 | 显示全部楼层
多谢了,是我取巧不想用栈反而变难了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-16 10:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表