1. 程式人生 > >數據結構12: 實踐項目之進制轉換器

數據結構12: 實踐項目之進制轉換器

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: 實踐項目之進制轉換器