史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
註冊帳號 論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2014-10-28, 11:51 PM   #1
zhengmin
註冊會員
榮譽勳章

勳章總數
UID - 368005
在線等級: 級別:1 | 在線時長:7小時 | 升級還需:5小時
註冊日期: 2014-10-26
文章: 3
精華: 0
現金: 4 金幣
資產: 4 金幣
預設 程式 - 十進位轉十六進位



剛學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;   
}

此帖於 2014-10-29 05:09 AM 被 getter 編輯. 原因: 把的 C 程式轉貼到論壇上
zhengmin 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2014-10-29, 05:12 AM   #2 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765381 金幣
預設

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

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

那你的問題是啥?
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26019 次
回覆時引用此帖
向 getter 送花的會員:
a471 (2014-11-01)
感謝您發表一篇好文章
舊 2014-10-29, 08:42 AM   #3 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 368005
在線等級: 級別:1 | 在線時長:7小時 | 升級還需:5小時
註冊日期: 2014-10-26
文章: 3
精華: 0
現金: 4 金幣
資產: 4 金幣
預設

我編譯成功,但是執行會有問題。
zhengmin 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2014-10-29, 10:19 PM   #4 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765381 金幣
預設

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

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

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 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26019 次
回覆時引用此帖
向 getter 送花的會員:
a471 (2014-11-01)
感謝您發表一篇好文章
舊 2014-10-29, 10:54 PM   #5 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765381 金幣
預設

以下是迪西自己的寫法

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;

getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26019 次
回覆時引用此帖
向 getter 送花的會員:
a471 (2014-11-01)
感謝您發表一篇好文章
發文 回覆


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 09:31 AM


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


SEO by vBSEO 3.6.1