十进制转化为二进制的函数(自己写的)谁帮我看看(50分)

  • 主题发起人 主题发起人 cmdline
  • 开始时间 开始时间
C

cmdline

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
arr =array of char;
var
I,Temp :Integer;
J,NCount :Integer;
S :string;
arr1 :arr;
begin
S:=Edit1.Text;
I:=StrToInt(S);//
Temp:=I;//临时变量
NCount:=0;
ShowMessage(IntToHex(I,4));//转换为16进制
while I<>0 do
begin
I:=I div 2;
NCount:=NCount+1;
end;
SetLength(arr1,NCount-1);//建立动态数组
I:=Temp;
for J:=0 to NCount-1 do //开始转换二进制
begin
if (I mod 2)=1 then
arr1[NCount-J-1]:='1'
else
arr1[NCount-J-1]:='0';
I:=I div 2;
end;
s:='';
for Temp:=0 to NCount-1 do //输出二进制
S:=S+arr1[Temp];
Edit1.Text:=S;
end;

end.
上面这个程序完全通过,但是如果用整形数组,好像程序运行不了。
type
arr =array of integer;//改了这个
原程序在下面
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
arr =array of integer;
var
I,Temp :Integer;
J,NCount :Integer;
S :string;
arr1 :arr;
begin
S:=Edit1.Text;
I:=StrToInt(S);&amp;#63729;
Temp:=I;
NCount:=0;
ShowMessage(IntToHex(I,4));
while I<>0 do
begin
I:=I div 2;
NCount:=NCount+1;
end;
SetLength(arr1,NCount-1);
I:=Temp;
for J:=0 to NCount-1 do
begin
if (I mod 2)=1 then
arr1[NCount-J-1]:=1
else
arr1[NCount-J-1]:=0;
I:=I div 2;
end;
s:='';
for Temp:=0 to NCount-1 do
S:=S+IntToStr(arr1[Temp]);
Edit1.Text:=S;
end;

end.
我还想问一下,有不有直接把二进制转换成十进制的函数和十进制转换成二进制的函数?
c语言和c++语言中的也行
我还想问一下,delphi中的记录类型想当于c语言和c++语言中的什麽类型?delphi的类又相当于他们中的什麽?
本人同时在学三门语言有很多地方不明白。恳请指教。上面的程序应该和可以简化,
谁可以在给出个优化算法
 
delphi自带有十进制与二进制转换函数,也有10->16
 
inttobin() 10->2 需 uses IdGlobal
inttohex() 10->16

delphi中的记录类型想当于c语言和c++语言中的什麽类型? struct

delphi的类又相当于他们中的什麽?
C是面向过程的,而类是面向对象语言所特有的,C中无此概念,C++同样是类
 
一个不会指针的受害者
 
来自:白河愁, 时间:2008-5-14 9:49:48, ID:3893183
一个不会指针的受害者

不知兄台此话何意?指针我也会啊
用数组和用指针到底有什麽区别?
指针和数组运算速度不一样吗?
另外,二进制转换到十进制的函数有吗?上面只有十到二进制的转换
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
arr =array of integer;//为什麽程序这里使用整形数组会出错??????
var
I,Temp :Integer;
J,NCount :Integer;
S :string;
arr1 :arr;
begin
S:=Edit1.Text;
I:=StrToInt(S);&amp;#63729;
Temp:=I;
NCount:=0;
ShowMessage(IntToHex(I,4));
while I<>0 do
begin
I:=I div 2;
NCount:=NCount+1;
end;
SetLength(arr1,NCount-1);
I:=Temp;
for J:=0 to NCount-1 do
begin
if (I mod 2)=1 then
arr1[NCount-J-1]:=1
else
arr1[NCount-J-1]:=0;
I:=I div 2;
end;
s:='';
for Temp:=0 to NCount-1 do
S:=S+IntToStr(arr1[Temp]);
Edit1.Text:=S;
end;
为什麽程序里使用整形数组会出错,而改用字符数组没有问题,这个好像还没有人回答
 
type
arr =array of integer;//为什麽程序这里使用整形数组会出错??????

需要指定数组大小的
type
arr = array [1..9] of Integer;
 
SetLength(arr1,NCount-1);//建立动态数组,并指定大小
我在这里是指定了大小的
程序里有
 
所谓进制,只是用不同的方法去读取指针指向的数据的一种表示方式。
所以其实什么进制根本没区别,你怎么读,就是什么进制,或者什么格式。
 
十六进制的话
还可以四个一读0011,1100.
十进制的话
该怎麽读?用几个二进制位来表示?
高手指导一下,数据存储原理我还是知道一些的
 
不报措呀,靠
 
搞不懂要干吗了,靠
 
while I<>0 do
begin
I:=I div 2;
NCount:=NCount+1;
end;
SetLength(arr1,NCount-1);//你如果输入1的话,这里的NCount-1就等于0了。所以就会报错了,问题在这里,你看下是哪里不对了
 
比如在内存中一个A字符,
按字符都就是 A,按10进读就是65,按16进读就是0x41,按2进制就是01000001,
但在内存中都只占一个字节。那又谈何转换?
 
楼主的程序代码中有个简单的序号错误, 其实也是概念的混淆.
1. 楼主注意到了动态数组的下标是从0开始的, 最后一个单元下标是(总数-1);
2. 但是楼主没有注意到setLength(arr1, NCount-1)的错误, 这其实分配少了一个单元, 是错误的
例如 setLength(arr1, 4-1), 实际上只分配了0,1,2 共3个单元
正确的写法应该是 setLength(arr1, NCount);
3. 用 array of char 之所以没有出错(其实本身也是错误的)是因为内存分配的问题:
array of integer 一个单元要分配4个字节, 而 array of char 一个单元就一个字节;
因为内存分配最小的单位是4个字节(有的系统是8个字节或者16个字节), 所以你用char的时候, 你申请了3个char, 实际上给你了4个char的空间, 所以不会出错;
但用integer的时候, 你申请了3个integer, 给您了3个integer的空间, 但你最后要用4个integer, 所以出错了
// 我已经说得很详细了, 希望能明白!
 
SetLength(arr1,NCount-1)改为SetLength(arr1,NCount)就可以
 
看下一个
Function WordToboolStr(Const Aword:Integer):String;
var
i:integer;
W:Dword;
OutBool:String;
begin
Result:='';
for i :=32 DOWNTO 1 do begin
w:=(Aword shr (i-1)) and $1;
if w=0 then
Outbool:='0'
else
Outbool:='1';
Result:=Result+Outbool;
end;
end;
 
我想到的和楼上差不多
delphi中的记录类型想当于c语言和c++语言中的什麽类型?delphi的类又相当于他们中的什麽?
delphi中的记录类型想当于c语言和c++语言中的“结构”。
delphi的类又相当于“c++中的类(class)”。
 
dorry的写法,似乎就的delphi自带的inttohex实现方式啊,呵呵
 
来自:新世纪, 时间:2008-5-14 14:43:22, ID:3893345
楼主的程序代码中有个简单的序号错误, 其实也是概念的混淆.
1. 楼主注意到了动态数组的下标是从0开始的, 最后一个单元下标是(总数-1);
2. 但是楼主没有注意到setLength(arr1, NCount-1)的错误, 这其实分配少了一个单元, 是错误的
例如 setLength(arr1, 4-1), 实际上只分配了0,1,2 共3个单元
正确的写法应该是 setLength(arr1, NCount);
3. 用 array of char 之所以没有出错(其实本身也是错误的)是因为内存分配的问题:
array of integer 一个单元要分配4个字节, 而 array of char 一个单元就一个字节;
因为内存分配最小的单位是4个字节(有的系统是8个字节或者16个字节), 所以你用char的时候, 你申请了3个char, 实际上给你了4个char的空间, 所以不会出错;
但用integer的时候, 你申请了3个integer, 给您了3个integer的空间, 但你最后要用4个integer, 所以出错了
// 我已经说得很详细了, 希望能明白!

对于这个本人还有点疑问,忘新世纪兄解答
因为内存分配最小的单位是4个字节(这个我不太明白)。
如果
var
I:shortint;
这个变量I属于短整形在内存中应该是占一个字节吧

本人上网及不方便,所以现在才来,分数我一定会给的
 

Similar threads

S
回复
0
查看
896
SUNSTONE的Delphi笔记
S
S
回复
0
查看
873
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部