⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duoxiangshi.txt

📁 用C++实现数据结构多项式四则运算程序
💻 TXT
字号:
#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; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -