- 註冊時間
- 2009-12-10
- 最後登錄
- 2014-8-28
- 主題
- 查看
- 積分
- 3665
- 閱讀權限
- 140
- 文章
- 5116
- 相冊
- 2
- 日誌
- 38
狀態︰
離線
|
將所有的double變成int
將void main(void) => int main(void)
程式就可以跑了,但是程式跑出的結果是有誤的
以下是把剛剛說要改的的地方改好的
--------------------
#include <stdio.h>
#include <math.h>
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進制總和
printf("======如輸入為16進制,﹝A-F﹞使用大寫才是有效輸入!======\n");
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','.'};
for (int f=0 ; f<T ; f++) //陣列字元一個個比對,檢查是否有錯誤輸入
{
int x=0;
for(int ff=0 ; ff < base+1 ; ff++)
{
if(base==2)
if(Num[f]==base2[ff])
x=1;
if(base==8)
if(Num[f]==base8[ff])
x=1;
if(base==10)
if(Num[f]==base10[ff])
x=1;
if(base==16)
if(Num[f]==base16[ff])
x=1;
} //for(ff)結束
if(x==0) //某輸入字元不在設定範圍內
{
printf("輸入錯誤,請重新來過!!\n\n");
return 0; //回傳錯誤
} //if結束
} //for(f)結束
return 1; //回傳無誤
}
long int ToSum10(int Num[] , int base , int T , int TT) //傳入(陣列,進制,字元數,小數點位置)
{
long int Sum10=0;
for (int o=0 ; o<T ; o++)
{
if ( Num[o]!='.' )
{
if (Num[o]<58) //======='1'~'9' ACEII=48~57 扣48=數值
Sum10 = Sum10 + (Num[o]-48) * (long int)pow( base , (long int)(TT-2-o) );
else //================='A'~'F' ACEII=65~70 扣55=數值
Sum10 = Sum10 + (Num[o]-55) * (long int)pow( base , (long int)(TT-2-o) );
}
else
TT++; //===========================配合位數轉換
} //for(o)結束
return Sum10; //回傳計算後的值
} |
-
總評分: 威望 + 3
查看全部評分
|