跪求用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;
}