數據結構12: 實踐項目之進制轉換器
阿新 • • 發佈:2018-05-13
emp string ret 對數 () getch 存儲 進制 etc
轉化時,最直接的思路就是先將該數轉化為十進制數據,然後再由十進制轉化成要求的進制數,最終的結果用棧結構存儲(先進後出),這樣最終顯示給用戶的是正常的數據。
進制轉換器項目要求:用戶提供需要轉換的數據和該數據的進制,以及要轉換的進制,進制轉換器提供給用戶最終的正確轉換的結果。
轉換器實例
例如,用戶提供了一個十進制數:10,要求將此數據以二進制形式轉換,則通過進制轉換器轉換的最終結果應該:1010。提示:此進制轉換器可以在 2-36 進制之間對數據進行任意轉換。各進制中對應的數字如下表:
設計思路
當用戶給定 2 - 36 進制中的任意一進制數時,最簡單的方法是使用順序存儲結構進行存儲,即使用字符串數組存儲。轉化時,最直接的思路就是先將該數轉化為十進制數據,然後再由十進制轉化成要求的進制數,最終的結果用棧結構存儲(先進後出),這樣最終顯示給用戶的是正常的數據。
實現代碼
#include <stdio.h> #include <string.h> #include <math.h>
int top = -1; //top變量時刻表示棧頂元素所在位置 void push(char *a, char elem)
{ a[++top] = elem; }
void pop(char *a)
{ if (top == -1)
{ return ; }
//輸出時要按照正確的格式顯示給用戶 if (a[top] >= 10)
{ printf("%c", a[top]+55); }
else
{ printf("%d",a[top]); } top--; }
//將各進制數轉換成十進制數 int scaleFun(char *data, int system)
{ int k = (int)strlen(data) - 1; int system_10_data = 0; int i; for (i=k; i>=0; i--)
{ int temp; if (data[i]>=48 && data[i]<=57)
{ temp = data[i] - 48; }
else
{ temp = data[i] - 55; } system_10_data += temp * pow(system, k-i); }
return system_10_data; }
int main()
{ char data[100]; printf("進制轉換器,請輸入原數據的進制(2-36):"); int system; scanf("%d", &system); getchar(); printf("請輸入要轉換的數據:"); scanf("%s", data); getchar(); int system_10_data = scaleFun(data, system); printf("請輸入轉換後的數據的進制:"); int newSystem; scanf("%d", &newSystem); getchar(); while (system_10_data/newSystem)
{ push(data, system_10_data % newSystem ); system_10_data /= newSystem; } push(data, system_10_data%newSystem); printf("轉換後的結果為:\n"); while (top != -1)
{ pop(data); } }
運行結果: 進制轉換器,請輸入原數據的進制(2-36):10 請輸入要轉換的數據:100 請輸入轉換後的數據的進制:16 轉換後的結果為: 64
數據結構12: 實踐項目之進制轉換器