回 帖 发 新 帖 刷新版面

主题:十六进制转十进制

这是我买的辅导书上的一道题。
编程将十六进制数转换为十进制数。要求输入四位十六进制数(不足四位的数字前面补0),然后转换成十进制数并输出。
这是书里面的解:
program Shi;
var
  ch:char;
  dec,dec1,dec2,dec3,dec4:0..15;
  i:1..4;
  j:real;
begin
  writeln('Input Hex Number:');
  write('Hex:');
  for i:=1 to 4 do
   begin
       read(ch);
       ch:=upcase(ch);
       case ch of
        '0'..'9':dec:=ord(ch)-48;
        'A'..'F':dec:=ord(ch)-55;
       else
        exit;
       end;
       case i of
        1:dec1:=dec;
        2:dec2:=dec;
        3:dec3:=dec;
        4:dec4:=dec;
       end;
   end;
  writeln;
  j:=dec1*4096.0+dec2*256.0+dec3*16.0+dec4;
  write('dec:',j:5:0);
  readln
end.
运行结果:
Input Hex Number:
Hex:FFFF
dec:65535
我怎么看也看不懂,它为什么把 “ read(ch) ”放在了"for i:=1 to 4 do"的后面
放在前面不可以吗? 这个“for i:=1 to 4 do”是什么意思啊。还有他是怎么将十六进制的第一最高位转变成dec1的 怎么将最低位转变成dec2的?
谢谢,回答出者或用另一种方法解题者加30。谢了。

回复列表 (共8个回复)

沙发

你的问题:

把"READ(ch)"放在"FOR i:=1 TO 4 DO"的后面,表示他要一位一位输入,共4位,从高位到低位.

"FOR i:=1 TO 4 DO"表示这个FOR循环是1到4循环,每次增加1.
(其实我不提倡程序的那种写法,直接FOR i:=1 TO 4 DO BEGIN不就行了,干吗写成这样:
                           FOR i:=1 TO 4 DO
                           BEGIN
能写在1行就写在1行,不要写成2行)

[quote] case i of
        1:dec1:=dec;
        2:dec2:=dec;
        3:dec3:=dec;
        4:dec4:=dec;
       end;[/quote]

这个多分支判断语句实际是根据i的值来确定到底是哪一位,i为几就是从左到右数第几位.

板凳

怎么一个一个输入啊。不是一次就输入完了吗?
你不能 输一个按一下 回车 吧?
你看看他一次不都输玩了吗: ‘FFFF’??[em18][em18]

3 楼

他输的有问题,正常应该是一个一个输入的。

4 楼

怎么一位一位输入啊,大哥!说清楚点吗~[em7][em10]
能给出一个完整的程序吗?再给你+30[em12][em11]

5 楼

上面的程序也可以一次输入完,但是如果换成
                   READLN(ch)
就不行了.
另一种方法:(一次输入完的)
VAR
   m, m1, m2, m3, m4: CHAR; i, s, d, k: INTEGER;
BEGIN
    READLN(m1, m2, m3, m4);
    FOR i:=1 TO 4 DO BEGIN
        CASE i OF
             1: m := m1;
             2: m := m2;
             3: m := m3;
             4: m := m4;
        END;
        CASE m OF
             '0'..'9': s := ORD(m) - 48;
             'A'..'F': s := ORD(m) - 55;
        END;
        CASE i OF
             1: k := 1000;
             2: k := 100;
             3: k := 10
             4: k := 1;
        END;
        d := d + s * k;
    END;
    WRITELN(d);
END.

6 楼

有些错误吧 ?   d=d+s*k  是什么意思啊 ?十六进制转十进制啊! 解释一下?谢谢![em12]

7 楼

本人BLOG上有十进制转N进制以及N进制转十进制的算法,希望对你有帮助。
地址:
http://blog.sina.com.cn/u/4033131f010006ek

8 楼

谢了

我来回复

您尚未登录,请登录后再回复。点此登录或注册