浮點數進位制轉換器
阿新 • • 發佈:2019-02-08
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> void work(); //驅動函式 int Menu(); //選單函式 void AnytoAny(); //任意進位制轉換為任意進位制 void ConversionTable(); //任意進位制轉換為常用進位製表 void DecimaltoAny(double m,int n); //十進位制轉換為任意進位制 double AnytoDecimal(char str[],int n); //任意進位制轉換為十進位制 double t3; int n,m; char str[100]; int main() { printf("\n\n\n\n\n\n\n\n\n"); printf(" +----------------------+\n"); printf(" + 歡迎使用進位制轉換器 +\n"); printf(" +----------------------+\n"); printf(" 請按任意鍵開始!"); getch(); system("cls"); work(); return 0; } void work() { int Choice; do { Choice=Menu(); //從選單中獲得功能程式碼 switch(Choice) { case '1': AnytoAny(); break; case '2': ConversionTable(); case '0': { system("cls"); printf("\n\n\n\n\n\n\n\n\n\n"); printf(" 歡迎您再次使用! \n"); } } getch(); system("cls"); } while(Choice!='0'); } int Menu() { char c; while(1) { printf("\n\n\n\n\n\n\n"); printf(" +----------------------------+\n"); printf(" + 1任意進位置間的轉換 +\n"); printf(" + 2常用進位置轉換表 +\n"); printf(" + 0退出程式 +\n"); printf(" +----------------------------+\n"); printf("\n 請輸入操作指令:"); c=getch(); if(c>='0'&&c<='2') break; else { system("cls"); printf(" 請重新選擇功能!\n\n"); } } return c; } void AnytoAny() { system("cls"); //開始時清屏 printf("請輸入待轉換數的進位制:\n"); scanf("%d",&n); printf("請輸入待轉換的數:\n"); getchar(); //消除回車影響 gets(str); printf("請輸入將轉換的進位制:\n"); scanf("%d",&m); t3=AnytoDecimal(str,n); //將輸入字串轉換為十進位制 printf("轉換為%d進位制數為:\n",m); DecimaltoAny(t3,m); //迴圈將轉換後的十進位制轉換為m進位制 getch(); } void ConversionTable() { int i; system("cls"); //開始時清屏 printf("請輸入待轉換數的進位制:\n"); scanf("%d",&n); printf("請輸入待轉換的數:\n"); getchar(); //消除回車影響 gets(str); t3=AnytoDecimal(str,n); //將輸入字串轉換為十進位制 for(i=2; i<17; i+=2) //迴圈將轉換後的十進位制轉換為2,4,6,8,10,12,14,16進位制 { printf("%d進置:\n",i); DecimaltoAny(t3,i); printf("\n"); } printf("32進置:\n"); DecimaltoAny(t3,32); printf("\n64進置:\n"); DecimaltoAny(t3,64); getch(); } void DecimaltoAny(double m,int n) { int i=0,j,a,num[99999]; double b=0; char ch[99999]= {'\0'}; a=(int)m; do //用除n取餘法獲得小數點前的n進位制的每一位 { num[i]=a%n; if(num[i]>=10) ch[i]='A'+num[i]-10; a=a/n; i++; } while(a!=0); for(j=i-1; j>=0; j--) //輸出整數部分n進位制的每一位 { if(ch[j]=='\0') printf("%d",num[j]); else printf("%c",ch[j]); } printf("."); //小數點單獨輸出 int sh[99999]= {0}; b=m-(int)m; i=0; do //用乘n取整法獲取小數點後n進位制的每一位 { num[i]=(int)(b*n); if(num[i]>=10) sh[i]=65+num[i]-10; b=b*n-num[i]; i++; } while(b!=0); for(j=0; j<i; j++) //輸出小數部分n進位制的每一位 { if(sh[j]==0) printf("%d",num[j]); else printf("%c",sh[j]); } } double AnytoDecimal(char str[],int n) { long t1; int i,t,len; int j = 0,k=0; /* 宣告幾個整形變數,下面要用到 */ char lis[1000][1000],a[1000]= {0},b[1000]= {0}; /* 這個是用於儲存分離後的各個字串,二維陣列,最多分離出100個字串,每個字串的元素最多100個 */ memset(lis,0,sizeof(lis)); /* 使用memset函式,對list中的所有元素賦值為0,sizeof(list)是用於獲取list的總佔用空間 */ int l=strlen(str); for(i=0; i<l; ++i) /* for迴圈,從0開始,每次迴圈後,i自增,迴圈條件是i必須小於str的長度,否則退出迴圈 */ { if(str[i] == '.') /* 如果str中的第i個字元為逗號 */ { lis[j][k] = 0; /* 分離出的第j個字串中的第k個字元為0,也就是字串的結束符 */ ++j; /* j自增,這就是表示下一個被分離出的字串的序號 */ k = 0; /* 因為要將字元寫到下個被分離出的字串中,所以要從0開始 */ } else /* 否則,不是逗號 */ { lis[j][k] = str[i]; /* 二維陣列list中的第j個字串的第k個字元是符串str中的第i個字元 */ ++k; /* 切換到下一個字元 */ } } l=strlen(lis[0]); int w=strlen(lis[1]); for(i=0; i<l; i++) //將小數點之前部分用字元陣列a儲存 a[i]=lis[0][i]; for(i=0; i<w; i++) //將小數點之後部分用字元陣列b儲存 b[i]=lis[1][i]; strupr(a); //將陣列中的小寫字母轉化為大寫字母 len = strlen(a); //求出陣列的長度 t1 = 0; for(i=0; i<len ; i++) { if((a[i] - '0' >= n && a[i] < 'A') || a[i] - 'A' + 10 >n ) //判斷輸入的資料和進位制數是否符合 { printf("data error!!\n"); //錯誤 exit (0); } if(a[i] >='0' && a[i] <= '9') //判斷是否為數字 t = a[i] - '0'; //求出該數字賦值給t else if (n >=11 && (a[i] >= 'A' && a[i] <= 'A' +n -10)) //判斷是否為字母 t = a[i] - 'A' +10; //求出該字母所代表的十進位制數 t1 = t1 *n +t; //求出最終轉換成的10進位制數 } t=0; strupr(b); len=strlen(b); double t2=0,t3=0; for(i=len-1; i>=0; i--) { if((b[i] - '0' >= n && b[i] < 'A') || b[i] - 'A' + 10 >n ) //判斷輸入的資料和進位制數是否符合 { printf("data error!!\n"); //錯誤 exit (0); } if(b[i] >='0' && b[i] <= '9') //判斷是否為數字 t = b[i] - '0'; //求出該數字賦值給t else if (n >=11 && (b[i] >= 'A' && b[i] <= 'A' +n -10)) //判斷是否為字母 t = b[i] - 'A' +10; t2=t2/n+(double)t/n; } t3=t1+t2; return t3;}
}