求大神分析一下演算法總體,列出所有自定義函式清單,說明每個函式的功能,各形式引數的意義,畫出各函式的流程圖。進行模塊功能說明,如函式功能、入口及出口引數說明,函式呼叫關系描述等
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define maxn 1000//定義一個陣列最大元素數
typedef struct valueStack {
double* data;
int capacity;
int size;
}valueStack;//定義一個記錄數值的堆疊
typedef struct operationStack {
char* data;
int capacity;
int size;
}operationStack;//定義一個記錄運算子的堆疊
operationStack operationstack;
valueStack valuestack;//定義兩個堆疊
void initValue(int sz) {
valuestack.capacity = sz;
valuestack.size = 0;
valuestack.data = (double*)malloc(sizeof(double) * valuestack.capacity);
}//初始化一個堆疊
void pushValue(double x) {
valuestack.data[valuestack.size++] = x;
}//往堆疊內放入一個元素
void popValue() {
--valuestack.size;
}//出堆疊
int emptyValue() {
return valuestack.size == 0;
}//判斷堆疊是否為空
double topValue() {
return valuestack.data[valuestack.size - 1];
}//回傳堆疊頂元素
void initOperation(int sz) {
operationstack.capacity = sz;
operationstack.size = 0;
operationstack.data = (char*)malloc(sizeof(char) * operationstack.capacity);
}
void pushOperation(char x) {
operationstack.data[operationstack.size++] = x;
}
void popOperation() {
--operationstack.size;
}
int emptyOperation() {
return operationstack.size == 0;
}
char topOperation() {
return operationstack.data[operationstack.size - 1];
}//函式操作同上
char s[maxn];
// + - * / % ^ ( )
int status(char op) {
if (op == '+' || op == '-')
return 1;
else if (op == '*' || op == '/' || op == '%' || op == '^')
return 2;
else if (op == '(')
return 0;
return -1;
}//回傳符號優先級
double calc(double x, double y, char op) {
if (op == '+')
return x + y;
else if (op == '-')
return x - y;
else if (op == '*')
return x * y;
else if (op == '/')
return x / y;
else if (op == '%') {
if (x != (int)x || y != (int)y) {
printf("小數不能進行%運算\n");
exit(0);
}
else {
return (int)x % (int)y;
}
}
else if (op == '^')
return pow(x, y);
}//計算x op y的值
void solve(char op) {
double x, y;
while (!emptyOperation() && status(topOperation()) >= status(op)) {
x = topValue();
popValue();
y = topValue();
popValue();
pushValue(calc(y, x, topOperation()));
popOperation();
}
}//計算堆疊內所有優先級不小于op的值
int main() {
initValue(1000);
initOperation(1000);
int i, j, len, cntNum = 0, cntOp = 0;
double value = 0;
double x, y, temp;
printf("請輸入運算式: ");
scanf("%s", s);
len = strlen(s);
s[len++] = '#';
for (i = 0; i < len;) {
j = i;
if (s[j] >= '0' && s[j] <= '9') {
while (j < len && (s[j] >= '0' && s[j] <= '9')) {
value = value + s[j] - '0';
j++;
}
if (j < len && s[j] == '.') {
temp = 0.1;
j++;
while (j < len && (s[j] >= '0' && s[j] <= '9')) {
value += (s[j] - '0') * temp;
temp *= 0.1;
j++;
}
}
i = j;
} else {
if (value != 0) {
cntNum++;
value = 0;
}
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '^' || s[i] == '%')
cntOp++;
i++;
}
}
if (cntNum != cntOp + 1) {
printf("運算式不合法\n");
exit(0);
}//看看運算子的數量是不是數字的個數-1
for (i = 0; i < len;) {
j = i;
if (s[j] >= '0' && s[j] <= '9') {
while (j < len && (s[j] >= '0' && s[j] <= '9')) {
value = value * 10 + s[j] - '0';
j++;
}//讀數字
if (j < len && s[j] == '.') {
temp = 0.1;
j++;
while (j < len && (s[j] >= '0' && s[j] <= '9')) {
value += (s[j] - '0') * temp;
temp *= 0.1;
j++;
}
}
i = j;//更改回圈變數
}//把整數讀出來
else {
if (value == 0 && s[i] == '(') {
pushOperation(s[i]);
i++;
continue;
}
if (value != 0)
pushValue(value), value = 0;//如果不為0就加入數值堆疊內
if (s[i] == '#') {
solve(s[i]);//如果為#,即為結束符,就得把堆疊內值算完
break;//退出回圈
} else if (s[i] == '(') {
pushOperation(s[i]);//如果是左括號,直接加入運算子的堆疊內
} else if (s[i] == ')') {
while (!emptyOperation() && topOperation() != '(') {
x = topValue();
popValue();//取出值堆疊頂元素
y = topValue();
popValue();//取出值堆疊頂元素
pushValue(calc(y, x, topOperation()));//把算出來的值加入值堆疊內
popOperation();//去掉運算子堆疊頂元素
}//如果是右括號,就一直操作到左括號處
popOperation();//去掉左括號
} else {
if (emptyOperation() || status(topOperation()) < status(s[i])) {
pushOperation(s[i]);//如果運算子堆疊為慷訓者運算子堆疊頂元素優先級小于s[i]的優先級,就直接把當前運算子加入堆疊中
} else {
solve(s[i]);//否則,就需要執行solve函式
pushOperation(s[i]);//往運算子堆疊中加入s[i]運算子
}
}
i++;
}
}
s[len - 1] = '\0';
printf("%s = %lf\n", s, topValue());//輸出答案
return 0;
}
uj5u.com熱心網友回復:
是什么意思呢?是要分析代碼嗎?uj5u.com熱心網友回復:
對的,主要是其中的函式,不是那么懂,能說一下其中有用到什么函式嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42719.html
標籤:C++ 語言
