2017-07-06 23 views
1

我想提出一個單位轉換程序,但我的代碼太長,只是永遠持續下去,這裏是我的代碼的第一部分:有沒有更簡單的方法來製作一個C單位轉換器程序?

int measure; 
int from; 
int to; 
float input; 
float output; 

printf("Choose measurement :\n1 : Length\n2 : Area\n3 : Temparture\n"); 
measure = getch(); 

switch(measure){ 
    case '1' : 
     printf("\nYou want to change from :\n1 : mm\n2 : cm\n3 : dm\n4 : m\n5 : dcm\n6 : hm\n7 : km\n"); 
     from = getch(); 
     printf("\nTo : \n1 : mm\n2 : cm\n3 : dm\n4 : m\n5 : dcm\n6 : hm\n7 : km\n");  
     to = getch(); 

     printf("Enter number : "); scanf("%f", &input); 

     switch(from){ 
      case '1' : 
       switch(to){ 
        case '1' : output = input;    printf("%f mm = %f mm", input, output); break; 
        case '2' : output = input/10;    printf("%f mm = %f cm", input, output); break; 
        case '3' : output = input/1000;   printf("%f mm = %f dm", input, output); break; 
        case '4' : output = input/10000;   printf("%f mm = %f m", input, output); break; 
        case '5' : output = input/100000;   printf("%f mm = %f dcm", input, output); break; 
        case '6' : output = input/1000000;  printf("%f mm = %f hm", input, output); break; 
        case '7' : output = input/10000000;  printf("%f mm = %f km", input, output); break; 
       } 
       break; 

      case '2' : 
       switch(to){ 
        case '1' : output = input*10;   printf("%f cm = %f mm", input, output); break; 
        case '2' : output = input;    printf("%f cm = %f cm", input, output); break; 
        case '3' : output = input/10;   printf("%f cm = %f dm", input, output); break; 
        case '4' : output = input/100;   printf("%f cm = %f m", input, output); break; 
        case '5' : output = input/1000;   printf("%f cm = %f dcm", input, output); break; 
        case '6' : output = input/10000;  printf("%f cm = %f hm", input, output); break; 
        case '7' : output = input/100000;  printf("%f cm = %f km", input, output); break; 
       } 
       break; 

,它會繼續下去的情況下3,4,5, ...直到公里,不包括面積和溫度測量,以及其他我想添加的東西

有沒有更簡單的方法可以做到這一點?謝謝:)

+3

您應該使用單位表和轉換因子。 –

+5

如果您的程序正常工作,並且您只需要*代碼審查*,那麼您應該在http://codereview.stackexchange.com/上發帖。 –

+2

由於CodeReview.stackexchange.com是獲取設計建議的適當場所,因此我正在投票結束此問題。 – Barmar

回答

5

如果你選擇一個中級單位(任意?),你可以做到這一點,這是你在內部使用的單位。 (我總是用SI單位爲。)

然後到轉化的形式

Input Unit -> Intermediate Unit -> Output Unit的始終。

由於Unit -> Intermediate UnitIntermediate Unit -> Unit的倒數,所以您只需要維護一個單列表。

+0

好吧,我會嘗試:) tks –

1

是的,你可以刪除很多這種重複。試着看看事情不必要的重複,看看它們的不同之處。如果你認爲你可以通過編程來處理差異,那麼你應該嘗試一下,你可能會進一步簡化它。

我也建議你檢查用戶給你的輸入,這樣你就不會受到緩衝區溢出/下溢的影響。

編輯:刪除fromMeter;除以toMeter是一回事。

int fromIdx, toIdx; 
char measure, from, to; 
float input, output; 
char *unit[] = {"mm", "cm", "dm", "m", "dcm", "hm", "km"}; 
float toMeter[] = {0.001, 0.01, 0.1, 1, 10, 100, 1000}; 

printf("Choose measurement :\n1 : Length\n2 : Area\n3 : Temparture\n"); 
scanf("%c", &measure); 

switch(measure){ 
    case '1' : 
     printf("\nYou want to change from :\n1 : mm\n2 : cm\n3 : dm\n4 : m\n5 : dcm\n6 : hm\n7 : km\n"); 
     scanf(" %c", &from); 
     if(from < '1' || from > '7') { 
      // invalid choice 
      return; 
     } 
     fromIdx = from - '1'; 

     printf("\nTo : \n1 : mm\n2 : cm\n3 : dm\n4 : m\n5 : dcm\n6 : hm\n7 : km\n"); 
     scanf(" %c", &to); 
     if(to < '1' || to > '7') { 
      // invalid choice 
      return; 
     } 
     toIdx = to - '1'; 

     printf("Enter number : "); scanf(" %f", &input); 
     output = input * toMeter[fromIdx]/toMeter[toIdx]; 

     printf("%f %s = %f %s\n", input, unit[fromIdx], output, unit[toIdx]); 
     break; 
} 
+1

是不是'* fromMeter [toIdx];'相同'/ toMeter [toIdx]',即你的靜態數據有冗餘? – Bathsheba

+0

非常真實,會更新。 – kamoroso94

+0

謝謝你這樣做。有一個upvote! – Bathsheba

相關問題