《資料結構學習與實驗指導》3-7:求字首表示式的值
阿新 • • 發佈:2019-02-02
實驗內容:計算字首表示式的值。
輸入說明:輸入一行不超過30個字元的字首表示式,只包含+、-、*、/以及運算數,不同物件之間用空格分隔。
輸出說明:輸出字首表示式的運算結果,精確到小數點後1位,或輸出錯誤資訊“ERROR“。
測試用例:
輸入 | 輸出
+ + 2 * 3 - 7 4 / 8 4 | 13.0
/ -25 + * - 2 3 4 / 8 4 | 12.5
/ 5 + * - 2 3 4 / 8 2 | ERROR
+10.23 | 10.2
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 30
typedef struct {
char *arr;
int size;
} *PList_3_7;
PList_3_7 initList_3_7();
void addList_3_7(PList_3_7 list, char c);
void printList_3_7(PList_3_7 list);
void clearList_3_7(PList_3_7 list);
void releaseList_3_7(PList_3_7 list);
float doCharArr2Float_3_7(char *arr, int startIndex, int size);
float doCal_3_7(char opt, float num1, float num2);
int main() {
float n = test_3_7_0();
if (n > -9999999) {
printf("%.1f\n", n);
}
return 0;
}
float test_3_7_0() {
float num = 0;
PList_3_7 list = initList_3_7();
char c;
while (1) {
c = getchar();
if (c != ' ' && c != '\n') {
addList_3_7(list, c);
} else {
if (list->size > 1) {
if (list->arr[0] == '-' || list->arr[0] == '+') {
num = doCharArr2Float_3_7(list->arr, 1, list->size);
if (list->arr[0] == '-') {
num *= -1;
}
} else {
num = doCharArr2Float_3_7(list->arr, 0, list->size);
}
break;
} else if (list->size == 1) {
if (list->arr[0] >= '0' && list->arr[0] <= '9') {
num = doCharArr2Float_3_7(list->arr, 0, list->size);
break;
} else {
char opt = list->arr[0];
float num1 = test_3_7_0();
float num2 = test_3_7_0();
if (num1 <= -8999999 || num2 <= -8999999) {
num = -9999999;
} else {
num = doCal_3_7(opt, num1, num2);
}
break;
}
}
clearList_3_7(list);
}
if (c == '\n') {
break;
}
}
return num;
}
PList_3_7 initList_3_7() {
PList_3_7 list = (PList_3_7) malloc(sizeof(PList_3_7));
list->arr = (char *) malloc(sizeof(char) * MaxSize);
list->size = 0;
return list;
}
void addList_3_7(PList_3_7 list, char c) {
if (list->size < MaxSize) {
list->arr[list->size] = c;
list->size ++;
}
}
void printList_3_7(PList_3_7 list) {
for (int i = 0; i < list->size; i++) {
printf("%c", list->arr[i]);
}
printf("\n");
}
void clearList_3_7(PList_3_7 list) {
list->size = 0;
}
void releaseList_3_7(PList_3_7 list) {
free(list->arr);
free(list);
}
float doCharArr2Float_3_7(char *arr, int startIndex, int size) {
int num1 = 0;
float num2 = 0;
int i = startIndex;
while (i < size) {
if (arr[i] == '.') {
i++;
break;
}
num1 = num1 * 10 + (arr[i] - '0');
i++;
}
float j = 10.0;
while (i < size) {
num2 += (arr[i] - '0') / j;
j *= 10;
i++;
}
return num1 + num2;
}
float doCal_3_7(char opt, float num1, float num2) {
float num = 0;
switch (opt) {
case '+' :
num = num1 + num2;
break;
case '-' :
num = num1 - num2;
break;
case '*' :
num = num1 * num2;
break;
case '/' :
if (num2 > -0.000001 && num2 < 0.000001) {
printf("ERROR\n");
num = -9999999;
} else {
num = num1 / num2;
}
}
return num;
}