long double ToSum10(int Num[] , int base , int T , int TT); //把輸入字元計算成十進位數字
void To_2_8_10_16(long double Sum10,int base,int check2); //=====數字型態10進位,轉成4種型態輸出
int CheckFunction(int Num[] , int base , int T); //===檢查輸入字元是否符合選擇的base
void main(void)
{
int debug=1; //=================對付getchar無法重複執行的缺點=>執行後+1,奇數時執行,偶數時跳過BUG
int T=0 , TT=-1 , check , check2; //======輸入字元數量,小數點位置,小數點數量,正負號
int Num[30]={0} , N , base ; //=存入字元的陣列,N=暫存器,base=進制
long double Sum10=0; //==========10進制總和
while(1) { //使程式無限重複執行
do {
check=check2=T=base=Sum10=0; //================給初始值
TT=-1; //===============================給初始值
if (debug%2==1) //======================偶數跳過不處理
printf("請輸入一個數字(整數最多10位,小數3位!!):");
do { //=================================debug偶數時照樣執行,使錯誤消失
N=getchar();
if (N!='\n')
Num[T++]=N; //===================累計輸入數量,存入陣列
if (N=='.')
{
TT=T; //========================記下小數點的位置
check++;
}
} while(N!='\n');
if (TT==-1)
TT=T+1; //==========================沒有小數點的情況,給值方便後面計算
while (Num[0]=='-') //如果Num[0]為負號,陣列往前取代一格,直到Num[0]不為負號,方便計算
{
for (int d=0;d<T;d++)
Num[d]=Num[d+1];
T--; //字元數量扣1
TT--; //小數點位置扣1
check2=1; //為負值,使後面輸出負號
}
if (check==1)
while ( Num[T-1]=='0') //===========小數點後無效的0去掉,T扣回來
T--;
} while (check>1 || TT>11 || T-TT>3); //避免多個小數點,避免整數超過10位,避免小數超過3位
if (debug%2==1) //偶數跳過不處理
do {
printf("請輸入進制 <2、8、10、16>:");
scanf("%d",&base);
} while(base!=2 && base!=8 && base!=10 && base!=16 ); //確保輸入為(2 8 10 16)其中之一
/*==========================================輸入部分完成========================================*/
debug++;
if ( CheckFunction(Num,base,T) == 0 ) //呼叫函式,確認輸入是否符合進制
continue;
Sum10 = ToSum10(Num ,base ,T ,TT); //===呼叫函式,求得10進位總數
switch(base)
{
case 2: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,8,check2);
To_2_8_10_16(Sum10,10,check2);
To_2_8_10_16(Sum10,16,check2);
break;
case 8: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,2,check2);
To_2_8_10_16(Sum10,10,check2);
To_2_8_10_16(Sum10,16,check2);
break;
case 10: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,2,check2);
To_2_8_10_16(Sum10,8,check2);
To_2_8_10_16(Sum10,16,check2);
break;
case 16: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,2,check2);
To_2_8_10_16(Sum10,8,check2);
To_2_8_10_16(Sum10,10,check2);
break;
} //switch(base)結束
printf("===================================================\n");
} //重複執行的while結束
} /*end function main*/
void To_2_8_10_16(long double Sum10,int base,int check2) //傳入(總數,進制,正負號)
{
long S = Sum10 ; //========S====>整數部分
double Sp = Sum10 - S; //==Sp===>小數部份
int a[40]={0};
int t=0,tt=0;
printf("\n轉換成<%d>進制\n",base);
do {
if ( S%base < 10 )
a[t++] = S % base + 48 ; //==以字元方式存入陣列
else
a[t++] = S % base + 55 ; //==存入A~F
S=S/base;
}while ( S>0 );
if (t>=11) //=========================如整數超過10位 輸出溢位
printf("發生溢位!!\n需要的位數為:%d\n",t);
else
{
printf("不會發生溢位!!,轉換的數值如下:");
if (check2==1) //若為負值先輸出負號
printf("-");
for (int ss=t-1 ; ss>=0 ; ss--)
printf("%c",a[ss]); //======整數部份輸出結束
if (Sp!=0.0) //小數點後面
{
printf(".");
while (Sp!=0.0 && tt<3)
{
int Spp=0;
Sp=Sp*base;
Spp=Sp; //擷取整數部份
Sp=Sp-Spp; //留下小數部份
if (Spp<10)
printf("%c",Spp+48); //1~9
else
printf("%c",Spp+55); //A~F
tt++; //計數器++,控制小數點後面輸出位數
} //while結束
} //if(Sp)結束
printf("\n");
} //else結束
} //函式結束
int CheckFunction(int Num[] , int base ,int T) //傳入(陣列,進制,字元數量)
{
int base2[3] = {'0','1','.'}; //給各進制範圍
int base8[9] = {'0','1','2','3','4','5','6','7','.'};
int base10[11]={'0','1','2','3','4','5','6','7','8','9','.'};
int base16[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.'};
long int ToSum10(int Num[] , int base , int T , int TT); //把輸入字元計算成十進位數字
void To_2_8_10_16(long int Sum10,int base,int check2); //=====數字型態10進位,轉成4種型態輸出
int CheckFunction(int Num[] , int base , int T); //===檢查輸入字元是否符合選擇的base
void main(void)
{
int debug=1; //=================對付getchar無法重複執行的缺點=>執行後+1,奇數時執行,偶數時跳過BUG
int T=0 , TT=-1 , check , check2; //======輸入字元數量,小數點位置,小數點數量,正負號
int Num[30]={0} , N , base ; //=存入字元的陣列,N=暫存器,base=進制
long int Sum10=0; //==========10進制總和
while(1) { //使程式無限重複執行
do {
check=check2=T=base=Sum10=0; //================給初始值
TT=-1; //===============================給初始值
if (debug%2==1) //======================偶數跳過不處理
printf("請輸入一個數字(整數最多10位,小數3位!!):");
do { //=================================debug偶數時照樣執行,使錯誤消失
N=getchar();
if (N!='\n')
Num[T++]=N; //===================累計輸入數量,存入陣列
if (N=='.')
{
TT=T; //========================記下小數點的位置
check++;
}
} while(N!='\n');
if (TT==-1)
TT=T+1; //==========================沒有小數點的情況,給值方便後面計算
while (Num[0]=='-') //如果Num[0]為負號,陣列往前取代一格,直到Num[0]不為負號,方便計算
{
for (int d=0;d<T;d++)
Num[d]=Num[d+1];
T--; //字元數量扣1
TT--; //小數點位置扣1
check2=1; //為負值,使後面輸出負號
}
if (check==1)
while ( Num[T-1]=='0') //===========小數點後無效的0去掉,T扣回來
T--;
} while (check>1 || TT>11 || T-TT>3); //避免多個小數點,避免整數超過10位,避免小數超過3位
if (debug%2==1) //偶數跳過不處理
do {
printf("請輸入進制 <2、8、10、16>:");
scanf("%d",&base);
} while(base!=2 && base!=8 && base!=10 && base!=16 ); //確保輸入為(2 8 10 16)其中之一
/*==========================================輸入部分完成========================================*/
debug++;
if ( CheckFunction(Num,base,T) == 0 ) //呼叫函式,確認輸入是否符合進制
continue;
Sum10 = ToSum10(Num ,base ,T ,TT); //===呼叫函式,求得10進位總數
switch(base)
{
case 2: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,8,check2);
To_2_8_10_16(Sum10,10,check2);
To_2_8_10_16(Sum10,16,check2);
break;
case 8: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,2,check2);
To_2_8_10_16(Sum10,10,check2);
To_2_8_10_16(Sum10,16,check2);
break;
case 10: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,2,check2);
To_2_8_10_16(Sum10,8,check2);
To_2_8_10_16(Sum10,16,check2);
break;
case 16: //==================呼叫函式轉換其他三種進制
To_2_8_10_16(Sum10,2,check2);
To_2_8_10_16(Sum10,8,check2);
To_2_8_10_16(Sum10,10,check2);
break;
} //switch(base)結束
printf("===================================================\n");
} //重複執行的while結束
} /*end function main*/
void To_2_8_10_16(long int Sum10,int base,int check2) //傳入(總數,進制,正負號)
{
long S = Sum10 ; //========S====>整數部分
int Sp = Sum10 - S; //==Sp===>小數部份
int a[40]={0};
int t=0,tt=0;
printf("\n轉換成<%d>進制\n",base);
do {
if ( S%base < 10 )
a[t++] = S % base + 48 ; //==以字元方式存入陣列
else
a[t++] = S % base + 55 ; //==存入A~F
S=S/base;
}while ( S>0 );
if (t>=11) //=========================如整數超過10位 輸出溢位
printf("發生溢位!!\n需要的位數為:%d\n",t);
else
{
printf("不會發生溢位!!,轉換的數值如下:");
if (check2==1) //若為負值先輸出負號
printf("-");
for (int ss=t-1 ; ss>=0 ; ss--)
printf("%c",a[ss]); //======整數部份輸出結束
if (Sp!=0.0) //小數點後面
{
printf(".");
while (Sp!=0.0 && tt<3)
{
int Spp=0;
Sp=Sp*base;
Spp=Sp; //擷取整數部份
Sp=Sp-Spp; //留下小數部份
if (Spp<10)
printf("%c",Spp+48); //1~9
else
printf("%c",Spp+55); //A~F
tt++; //計數器++,控制小數點後面輸出位數
} //while結束
} //if(Sp)結束
printf("\n");
} //else結束
} //函式結束
int CheckFunction(int Num[] , int base ,int T) //傳入(陣列,進制,字元數量)
{
int base2[3] = {'0','1','.'}; //給各進制範圍
int base8[9] = {'0','1','2','3','4','5','6','7','.'};
int base10[11]={'0','1','2','3','4','5','6','7','8','9','.'};
int base16[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.'};