1. 程式人生 > >浮點數進位制轉換器

浮點數進位制轉換器

#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;}




}