史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   十進位轉十六進位 (http://forum.slime.com.tw/thread277654.html)

zhengmin 2014-10-28 11:51 PM

十進位轉十六進位
 
剛學C語言,請問各位高手哪裡有錯
http://ideone.com/RxY2D5

語法:

#include<stdio.h> 
#include<stdlib.h> 
int main(void){ 
  int num,i,j=0,x; 
  char s[999];
  char str[999];
 while(scanf("%d",&num)!=EOF){ 
      while (num!=0){
          i=num%16; 
          switch(i){ 
            case 10: 
                  s[j]='A';
                  break; 
            case 11: 
                    s[j]='B'; 
                  break; 
            case 12: 
                  s[j]='C'; 
                  break; 
            case 13: 
                    s[j]='D';
                  break; 
            case 14: 
                    s[j]='E';
                  break;   
              case 15: 
                    s[j]='F';
                  break; 
            default: 
                          s[j]=i;
          } 
          num=num/16; 
          j+=1;
      }
      j-=1;
      for(i=j;i>=0;i--){
          printf("%s",s[i]);
 
      }
      j=0;
      printf("\n");
  } 
    return 0; 
}


getter 2014-10-29 05:12 AM

以 C 來說有 printf 可以直接顯示 16 進位 好像是 %x 或是 %X

這讓迪西想起了以前學校老師說過的一些話 ...
1.C 程式本身有可以直接把 10 進位數以 16 進位顯示的功能。
2.要求同學寫一個 10 進位轉 16 進位的程式作業,但是不能用 printf 的 %x 來做喔。

那你的問題是啥?

zhengmin 2014-10-29 08:42 AM

我編譯成功,但是執行會有問題。

getter 2014-10-29 10:19 PM

看的我眼睛好痛 ... 有些乍看之下莫名其妙的地方 ...

可以的話建議上註解 ...

PHP 語法:

#include<stdio.h>  
#include<stdlib.h>  

 
int main(void){  
   
int num,i,j,x;  
   
char s[999]; 
   
//char str[999]; 這是多餘的 
// while(scanf("%d",&num)!=EOF) 這行 scanf 沒有輸入提示,會搞到後面很難除錯  
 
while(1)
   {  
    
printf("\nInput DEC Number: "); // 增加的輸入提示 
    
scanf("%d",&num)!=EOF
    
j=0// 把最下面的 j=0; 移上來比較容易了解作用: s 字串陣列 index 歸零    
    
while (num!=0)
      { 
       
i=num%16// 取餘數 
       
switch(i)
         {  
          case 
10:  
            
s[j]='A'
          break;  
          
          case 
11:  
           
s[j]='B';  
          break;  
          
          case 
12:  
            
s[j]='C';  
          break;  
          
          case 
13:  
            
s[j]='D'
          break;  
          
          case 
14:  
            
s[j]='E'
          break;    
          
          case 
15:  
            
s[j]='F'
          break;  
          
          default:  
              
// s[j]=i; 資料格式錯誤,必須要把數值格式轉換成 "文字格式"。 
               
s[j]=48+i// 這一行是以 ASCII 編碼直接做換算。 
         
}  
       
num=num/16//取商數,下一回的被除數  
       
j+=1
      } 
       
s[j]='\0'// 以據 C/C++ 語言的字串特性,給予的字串結尾符號。 
      
      // j-=1; 可以直接並到 接下來的 for loop 中。 

   
printf("Otput HEX Number:["); // 增加的輸出顯示   
   //for (i=j;i>=0;i--)
   //   { printf("%s",s[i]); } 這是錯的,要顯示出字元,要用 %c 不然會錯誤,編譯後出現錯誤當機應該也是這裡   
   
   
for (i=j-1;i>=0;i--)
      { 
printf("%c",s[i]); } 

   
printf("]");     // 增加的輸出顯示
   // j=0; 這行正確的作法,應該是要移到在上面的地方,需要明確的讓 s[j] 一開始規零的地方。 
   
printf("\n"); 
   } 

 return 
0;   



getter 2014-10-29 10:54 PM

以下是迪西自己的寫法

PHP 語法:

#include<stdio.h>  
#include<stdlib.h>  


// 副程式:輸入1~15 dec 轉 hex, if 公式
int HEX_ABC_if (int DECbool Caps)   
{
 if (
DEC 10// 數值 < 10 的
   
{ return 48+DEC; }   // 使用 ACSII 碼轉換為"文字格式" 的數字
 
else          // 數值 > 10 的轉換      
   
{
    if (
Caps)  // HEX 字母大小寫變換  
      
{ return 55+DEC; } // 使用 ACSII 碼轉換成大寫字母 
    
else        
      { return 
87+DEC; } // 使用 ACSII 碼轉換成小寫字母 
   
}       
 return 
0;
}



// 主程式 
int main(int argcchar *argv[]) 
{
 
int Index// 則位紀錄資料時,位置移位數。 
 
char Display[21]=""//提供儲存轉換的結果 
 
int Base,Quotient,Residue,Number
 
// Base=進位轉換的基數, Quotient=商數, 
 // Residue=餘數, Number=輸入的數值 
 
int i;       // 供 for loop 使用 
 
char Temp;   // 供 for loop 使用 
 

 
while(1// 重複執行輸入與轉換的 while loop  
   

    
// 構成數字輸入的功能 
    
printf("\n請輸入10進位數數字:");
    
scanf("%d", &Number);
    
    
// 係利用長除法以下的 while loop 實現,取得進位數轉換值。
    // 但是數值左右顛倒的。 
    
Quotient=Number// scanf 從取得的數值給 Quotient 
    
Base=16//設定底數的除數。 
    
Index=0// Display 的 Index 規零 
    
while (Quotient 0)    // 只要商數 > 0 就進入執行 
      
{
       
Residue Quotient// 設定長除法的被除數      
       
Quotient /= Base;   // 取得目前的商數 
       
Residue  %= Base;   // 取得目前的餘數 
       
Display [Index++] = HEX_ABC_if (Residue,1); 
       
// 將取得的餘數轉成 hex 編碼,並儲存到 Display 中。 
      
}
    
Display[Index+1]='\0'// 補上 C/C++ 語言的字串結尾。 

    // 以下的 for loop 是把 Display 中的左右顛倒結果,反轉修正回來。 
    
for (0Index/2i++)
       { 
        
Temp Display[i];
        
Display[i] = Display[Index-1-i];
        
Display[Index-1-i] = Temp;
       }       
 
    
printf("\n輸入的10進位數:[%d]\n",Number);
    
printf("輸出的16進位數:[%s]\n",Display);
   }
 return 
0;




所有時間均為台北時間。現在的時間是 09:07 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1