计算器算法----C语言实现(堆栈法)
来源:互联网 发布:mysql 语句编写 编辑:程序博客网 时间:2024/06/08 20:29
1.字符串去空格处理
实现一:
void spacess(char *str)//删除空格{ int i = 0; int j = 0; while (str[i]!='\0') { str[i] = str[j]; if (str[i]!=' ') { i++; } j++; }}
实现二:
void spacess(char *str)//删除空格{ int i = 0; int j = 0; while ((str[i]=str[j++])!='\0') { if (str[i]!=' ') { i++; } }}
2.提取数值包含小数
int isnum(char ch)//判断是否为数字{ int is = 0;//默认不是 if (ch >= '0'&&ch <= '9') { is = 1; } return is;}double getnum(char *str,int *pin)//提取数字{ double value = 0.0; int index = *pin; while (isnum(*(str+index)))//处理整数 { value = value * 10 + (str[index] - '0'); index++; } if (*(str+index)=='.')//处理小数 { double xiaoshu = 1.0; while (isnum(*(str + ++index))) { xiaoshu /= 10; value += xiaoshu*(*(str + index) -'0'); } } *pin = index;//改变数字的位置 return value;}
3.实现简单的加减法
double fenxi(char *str)//加减法实现{ double value = 0.0; int index = 0;//下标地址 value = getnum(str, &index);//获取第一个数据 while (1) { char ch = *(str + index);//取出字符 index++;//循环遍历 switch (ch) { case '+': value += getnum(str,&index); break; case '-': value -= getnum(str, &index); break; case '\0': return value; break; default: break; } }}
4.实现简单的加减乘除法
double fenxi(char *str)//乘除加减法实现{ double value = 0.0; int index = 0;//下标地址 value = comfenxi(str, &index);//通过乘除获取第一个数据,乘除法优先级高 while (1) { char ch = *(str + index);//取出字符 index++;//循环遍历 switch (ch) { case '+': value += comfenxi(str,&index);//判断以后的数据有没有乘除,有的话先计算 break; case '-': value -= comfenxi(str, &index);//判断以后的数据有没有乘除,有的话先计算 break; case '\0': return value; break; default: break; } }}double comfenxi(char *str,int *pindex)//乘除法计算{ double value = 0.0;//保存数据 value = getnum(str, pindex);//获取第一个数据 while (1) { if (*(str+(*pindex))=='*') { (*pindex)++;//下标移动 value *= getnum(str, pindex); } else if (*(str + (*pindex)) == '/') { (*pindex)++;//下标移动 value /= getnum(str, pindex); } else { break; } } return value;}
5.带括号的加减乘除计算
全都代码
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <locale.h>#include <string.h>double comfenxi(char *str, int *pindex);double fenxi(char *str);int isnum(char ch)//判断是否为数字{ int is = 0;//默认不是 if (ch >= '0'&&ch <= '9') { is = 1; } return is;}char *kuohao(char *str,int *pindex)//处理括号{ char *pstr = NULL; int num = 0;//用以计算有多少括号 int leftindex = *pindex;//记录左括号位置 do { switch (*(str+(*pindex)))//处理字符 { case '(': num++; break; case ')': if (num==0) { (*pindex)++;//移动到括号的后面 pstr = malloc(sizeof(char)*(*pindex-leftindex));//分配内存大小 strncpy_s(pstr,*pindex-leftindex,str+leftindex, *pindex - leftindex-1); // printf("%s\n",pstr); return pstr; } else { num--;//处理右括号 } break; } } while (*(str+(*pindex)++)!='\0');//判断字符结尾}double getnum(char *str,int *pin)//提取数字{ double value = 0.0; int index = *pin; while (*(str+index)=='(')//检测左括号 { char *psubstr = NULL;//取出字符串 *pin = ++index;//跳到括号后面 psubstr = kuohao(str, pin);//获取字符串 value = fenxi(psubstr); // printf("value=%f\n", value); // free(psubstr);//释放内存 psubstr = NULL;//指针置空,防止野指针 return value; } while (isnum(*(str+index)))//处理整数 { value = value * 10 + (str[index] - '0'); index++; } if (*(str+index)=='.')//处理小数 { double xiaoshu = 1.0; while (isnum(*(str + ++index))) { xiaoshu /= 10; value += xiaoshu*(*(str + index) -'0'); } } *pin = index;//改变数字的位置 //printf("value=%f\n", value); return value;}void spacess(char *str)//删除空格{ int i = 0; int j = 0; while ((str[i]=str[j++])!='\0') { if (str[i]!=' ') { i++; } }}double fenxi(char *str)//乘除加减法实现{ double value = 0.0; int index = 0;//下标地址 value = comfenxi(str, &index);//通过乘除获取第一个数据,乘除法优先级高 while (1) { // printf("ind=%d\n", index); char ch = *(str + index);//取出字符 index++;//循环遍历 switch (ch) { case '+': value += comfenxi(str,&index);//判断以后的数据有没有乘除,有的话先计算 break; case '-': value -= comfenxi(str, &index);//判断以后的数据有没有乘除,有的话先计算 break; case '\0': return value; break; } }}double comfenxi(char *str,int *pindex)//乘除法计算{ double value = 0.0;//保存数据 //printf("pindex=%d\n",*pindex); value = getnum(str, pindex);//获取第一个数据 while (1) { if (*(str+(*pindex))=='*') { (*pindex)++;//下标移动 value *= getnum(str, pindex); } else if (*(str + (*pindex)) == '/') { (*pindex)++;//下标移动 value /= getnum(str, pindex); } else { break; } } return value;}void main(){ char str[1024] = {0}; scanf("%[^\n]s", str); spacess(str); int in = 0;// double a=getnum(str, &in);// printf("str=%s\n", str); printf("in=%f\n", fenxi(str));//打印计算结果 system("pause");}
阅读全文
0 0
- 计算器算法----C语言实现(堆栈法)
- 用C语言堆栈操作的计算器的实现(输入输出流使用的C++)
- C语言简易计算器(中缀表达式转后缀表达式,通过堆栈实现)
- C语言实现堆栈
- C语言实现堆栈
- c语言实现计算器
- C语言实现计算器
- 基于堆栈的计算器实现算法
- 基于堆栈的计算器实现算法
- 简单堆栈实现(C语言)
- 堆栈实现迷宫出路(C语言)
- 堆栈的实现(c语言)
- c语言计算器(栈实现)
- C语言实现四则运算(小型计算器)
- 数据结构与算法——在一个数组中实现两个堆栈(C语言)
- 栈应用之简易计算器算法的原理及实现(C语言)
- 堆栈的c 语言实现
- 堆栈的C语言实现
- 对话框操作
- “玲珑杯”线上赛 Round #17 河南专场 D -.妩钶取玳°月(FFT)
- 动态链接库的显示加载和隐式加载的区别
- Java中级开发工程师知识点归纳
- 初识golang
- 计算器算法----C语言实现(堆栈法)
- 小小人与编程的第一次邂逅
- (转)Steve Cohen:重出江湖?(上)
- spring配置文件头信息最全约束
- 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
- Android 通知栏Notification
- 判断其中一个radio被选中
- angularJS用于radio、checkbox
- Java实验一《基本程序设计、选择、循环》