简单的计数器程序

这是一个简单的C语言实现的计算器程序,能够处理加、减、乘、除运算,支持括号和多级运算。程序通过读取用户输入的表达式,解析数字和运算符,然后进行计算并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



#include <stdio.h>
#include <string.h>

int add(int x, int y)
{
 return (x+y);
}

int sub(int x, int y)
{
 return (x-y);
}

int mul(int x, int y)
{
 return (x*y);
}

int divi(int x, int y)
{
 return (x/y);
}

int (*func[])(int x, int y) = {add, sub, mul, divi};

int num;       //参数的字符串转换的数值
int curch;       //当前的字符
char chtbl[] = "+-*/()=";   //
char corch[] = "+-*/()=0123456789"; //

int getach(void)
{
 unsigned int i;
 while(true)
 {
  curch = getchar();   //获取一个输入字符
  if (curch == EOF)
   return -1;

  //判断curch是否属于corch数组的内容
  for (i =0; corch[i] && curch!=corch[i]; i++); 
  
  if (i < strlen(corch))
   break;     //出口:curch属于corch数组中的内容
 }
 return curch;     //
}

int getid(void)      //获取curch在chtbl数组中的下标值,或表示输入时数据的返回值-1
{
 int i;
 if (curch>='0' && curch<='9') //若curch属于0-9,则将其转换为数字(可为多位数)
 {
  for(num=0; curch>='0' && curch<='9'; getach()) //结束时还有一次获取curch(getach())
  {
   num = num*10 + curch-'0';
  }
  return -1;     //表示输入的是数据,不是运算符
 }
 else       //curch 不属于 0-9
 {
  for (i=0; chtbl[i]; i++) //判断curch是否在为 +-*/()=;若在,则跳出
  {
   if (chtbl[i] == curch)
    break;
  }
  if (i <= 5)     //若curch 为+-*/(),则获取下一个字符
   getach();    //若curch 为 =, 则跳过:表达式结束,进入计算

  return i;     //表示输入的是运算符
 }
}
/*
总结: 若输入的为数据字符串,则会将该字符串转换成相应是数值,并获取一个非数值的字符,存到curch;
  若输入的为+ - * / ()时,则会返回一个其在chtbl数组中的下标值,并获取下一个字符;
  若输入的为 = 时,则直接返回其在chtbl数组中的下标值;
*/


//一个表达式可以分成一个或多个计算单元;
//多个单元: 分别计算完后,再合成为一个计算单元;
int cal(void)      //eg :1+2=;1+(2+3)=; 1*2=
{
 int x1;       //x1 = 1; 1; 1
 int x2;       //x2 = 2; (2+3); 2
 int x3;       //
 int op1;      //op1: 计算单元的第一个运算符
 int op2;      //op2: 计算单元的第二个运算符
 int i;       //i: 1、2 (-1);

 i = getid();     //获取curch在chtbl数组中的下标值,或不属于该数组(-1)
 if (i == 4)      //若curch为'(',则继续获取数据
  x1 = cal();
 else
  x1 = num;
 op1 = getid();
 if (op1 >= 5)     //若curch为'=',表示输入结束,进入计算
  return x1;

 i = getid();
 if (i == 4)
  x2 = cal();
 else
  x2 = num;
 op2 = getid();

 while(op2>=0 && op2<5)   //op2: + - * / ()
 {
  i = getid();
  if (i == 4)
   x3 = cal();
  else
   x3 = num;
         //op1: + * (
  if ((op1/2==0)&&(op2/2==1)) //op2: - / )
   x2 = func[op2](x2, x3);
  else
  {
   x1 = func[op1](x1, x2);
   x2 = x3;
   op1 = op2;
  }
  op2 = getid();
 }
 return (func[op1](x1, x2));
}

void main()
{
 int value;
 printf("please input an expression:\n"); //输入表达式: 1+2=
 getach();
 while(curch != '=')       //如果curch不为 '='
 {
  value = cal();
  printf("the result is: %d\n", value);
  
  printf("please input an expression:\n");
  getach();        //重新输入表达式
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值