1. 程式人生 > >《資料結構學習與實驗指導》3-7:求字首表示式的值

《資料結構學習與實驗指導》3-7:求字首表示式的值

實驗內容:計算字首表示式的值。
輸入說明:輸入一行不超過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; }