问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

跪求用C++实现数据结构多项式四则运算程序.请高人相助

发布网友 发布时间:2023-03-05 18:34

我来回答

1个回答

热心网友 时间:2024-03-10 06:59

没有对输入的运算式合法性进行检查
所以一定要保证输入的运算式正确,否则程序会出错
如 2*3-4/5+(3*(4+5))

#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define PAREN_L 40 // (
#define PAREN_R 41 // )
#define ADD 43 // +
#define SUB 45 // -
#define MUL 42 // *
#define DIV 47 // /

int scanParen(char*, int*);
void getMultres(char*, char*);
int checkInput(char*);
void getNumber(char*, int, char*, char*, int*, int*);
int getPosMUlDiv(char*);
int getPosAddSub(char*);

int main(int argc, char* argv[])
{
char mathe[1000];
char temp[1000];
char multres[10];
int pos[2];

memset(mathe, 0, sizeof(mathe));
memset(temp, 0, sizeof(temp));
memset(multres, 0, sizeof(multres));
memset(pos, 0, sizeof(pos));

printf("input\n");
scanf("%s", mathe);
if (checkInput(mathe)) {
printf("input error!!!");
return 0;
}

strcpy(mathe, "2*3-4/5+(3*(4+5))");
while (scanParen(mathe, pos) != -1) {
memset(temp, 0, sizeof(temp));
memcpy(temp, mathe + pos[0] + 1, pos[1] - pos[0] - 1);

memset(multres, 0, sizeof(multres));
getMultres(temp, multres);

memset(temp, 0, sizeof(temp));
memcpy(temp, mathe, pos[0]);
strcat(temp, multres);
strcat(temp, mathe + pos[1] + 1);
memset(mathe, 0, sizeof(mathe));
memcpy(mathe, temp, sizeof(temp));
}

getMultres(mathe, multres);
printf("%s\n", multres);
printf("press any key to continue");
getch();
return 0;
}

int scanParen(char* mathe, int* pos)
{
int step_l[2] = {0, 0};
int step_r[2] = {0, 0};
int temp = 0;
int irnt = -1;
int i = 0;
int ilength = 0;

ilength = strlen(mathe);

for (i = 0; i < ilength; i++) {
if (mathe[i] == PAREN_L) {
irnt = 0;
temp++;
if (temp > step_l[0]) {
step_l[0] = temp;
step_l[1] = i;
}
}
if (mathe[i] == PAREN_R) {
temp--;
}
}

for (i = step_l[1]; i < ilength; i++) {
if (mathe[i] == PAREN_R) {
step_r[0] = step_l[0];
step_r[1] = i;
break;
}
}

pos[0] = step_l[1];
pos[1] = step_r[1];

return irnt;
}

void getMultres(char* buff, char* multres)
{
int i = 0;
int ipos = 0;
bool bflg = false;
int iLength = strlen(buff);
int pos1, pos2;
char temp[1000];

char num1[1000];
char num2[1000];

memset(temp, 0, sizeof(temp));
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));

while ((ipos = getPosMUlDiv(buff)) != -1) {
bflg = true;
getNumber(buff, ipos, num1, num2, &pos1, &pos2);
memset(multres, 0, sizeof(multres));
if (buff[ipos] == MUL) {
sprintf(multres, "%f", atof(num1)*atof(num2));
}
if (buff[ipos] == DIV) {
sprintf(multres, "%f", atof(num1)/atof(num2));
}

memset(temp, 0, sizeof(temp));
memcpy(temp, buff, pos1);
strcat(temp, multres);
strcat(temp, buff + pos2 + 1);
memset(buff, 0, sizeof(buff));
memcpy(buff, temp, sizeof(temp));
}

while ((ipos = getPosAddSub(buff)) != -1) {
bflg = true;
getNumber(buff, ipos, num1, num2, &pos1, &pos2);
memset(multres, 0, sizeof(multres));

if (buff[ipos] == ADD) {
sprintf(multres, "%f", atof(num1)+atof(num2));
}
if (buff[ipos] == SUB) {
sprintf(multres, "%f", atof(num1)-atof(num2));
}
memset(temp, 0, sizeof(temp));
memcpy(temp, buff, pos1);
strcat(temp, multres);
strcat(temp, buff + pos2 + 1);
memset(buff, 0, sizeof(buff));
memcpy(buff, temp, sizeof(temp));
}

if (!bflg) {
memset(multres, 0, sizeof(multres));
memcpy(multres, buff, strlen(buff));
}
}

int checkInput(char* mathe)
{
if (strlen(mathe) > 100) {
return -1;
}
////////////////////////////////////////////////
// 运算式合法性检查 //
////////////////////////////////////////////////
return 0;
}

void getNumber(char* buff, int i, char* num1, char* num2, int* pos1, int* pos2)
{
int j = i;
int ilength = strlen(buff);
int pos = 0;

do {
j++;
} while (buff[j] != ADD && buff[j] != SUB && buff[j] != MUL
&& buff[j] != DIV && j < ilength);

*pos2 = j - 1;

j = i;
do {
j--;
} while (buff[j] != ADD && buff[j] != SUB && buff[j] != MUL
&& buff[j] != DIV && j >= 0);

*pos1 = j + 1;

memcpy(num1, buff + *pos1, i - *pos1);
memcpy(num2, buff + i + 1, *pos2 - i + 1);
}

int getPosMUlDiv(char* buff)
{
int i = 0;

while (buff[i] != 0) {
if (buff[i] == MUL || buff[i] == DIV) {
return i;
}
i++;
}
return -1;
}

int getPosAddSub(char* buff)
{
int i = 0;

while (buff[i] != 0) {
if (buff[i] == ADD || buff[i] == SUB) {
return i;
}
i++;
}
return -1;
}
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
怎么在家自制广东白切鸡? 绍兴白切鸡的酱油碟如何制作 滥用职权罪和徇私枉法罪区别有哪些 玩忽职守罪和徇私枉法罪区别是什么 发霉的斑点怎样去除 后背晒完有黑色的斑点,而且特别的痒,看起来像是发霉了一样,请问这是... 192168811登录入口19216881 1921681881路由器设置网址~冫? 黄岛特色美食推荐_济南摩托车骑行路线推荐 青岛黄岛的美食攻略 青岛黄岛美食店推荐 是We have mathe everyday,还是把have改成has? 8月17晚上去呼和浩特,18号去辉腾锡勒草原,19号回京,求助穿衣建议_百度... 大众辉腾维修模式怎么操作 中专初学UI设计需学什么软件? figma左滑删除的交互怎么做? 如何制作补间动画 视频和图片有什么区别 南北美洲究竟是怎么划分 T恤指的是什么衣服 炫舞时代情书怎么用 QQ炫舞手游怎么表白 表白活动详解 beatsfitpro充电盒没电好能连耳机吗 怎么添加好友 怎么加好友? 怎么加好友 一升酒相当于多少斤 pvc材质的拖鞋黑底吗 家里WiFi怎样改密码啊 12306忘记密码怎么办?我们可以这样修改密码 用华为平板连接打印机打印速度怎么那么慢苹果就很快 12年辉腾国几 全电动版大众辉腾前途未卜 面包含糖高吗 面包放很多糖为什么不甜 高效率经营管理的探索与实践:不变与变化 新辉腾的高科技配置的核心竞争力 桔多多为什么还款日凌晨就扣款 现在可以去医院 现在能去公立医院吗 人民医院北京现在可以去看病了吗? 2021年11月上海仁济医院可以正常去吗? 华宁北大青鸟动漫设计培训中心价格多少? 在哪个手绘动漫培训中心比较好? 杭州和苏州哪个动漫设计待遇好 云南省办事通申领身份证照片怎么采集 办事通实名认证不了怎么办 你好,我的辉腾车单项阀没坏,确尽气门室油,排气管冒烟,啥原因求解,谢谢... 人工投票团队怎么联系 迈腾b7使用什么平台? 我和大众一起走过的那些年,你好,迈腾! 把酒点着放在房间里对人体有哪些不好的地方?
  • 焦点

最新推荐

猜你喜欢

热门推荐