<pre id=\"best-answer-content\" class=\"reply-text mb10\">program arraySub;
{$APPTYPE CONSOLE}
uses Classes, SysUtils;
procedure ShowUsageAndExit;
const
C_sUsageFormat : string =
\'功能:数据组减法,两组数据来自两个文本文件\'#$0D#$0A
\'用法: %s 文件1 文件2\'#$0D#$0A
\'说明:运算结果将输出到屏幕,如需保存为文件,请用IO重定向\';
var
s : string;
begin
s := ChangeFileExt( ExtractFileName( ParamStr(0) ), \'\' );
s := Format( C_sUsageFormat, [ s ] );
Writeln( ErrOutput, s );
Halt;
end;
function GetCmdArguments( var sFN_1, sFN_2 : string ) : Boolean;
begin
Result := False;
if ParamCount2 then
Exit;
sFN_1 := ParamStr(1);
if not FileExists( sFN_1 ) then
Exit;
sFN_2 := ParamStr(2);
if not FileExists( sFN_2 ) then
Exit;
Result := True;
end;
function ScanNumberBeginning( P : PByte; nByteLimit : Integer ) : PByte;
begin
Result := P;
while nByteLimit0 do
begin
case Result^ of
Ord( \'.\' ), Ord( \'0\' )..Ord( \'9\' ): Exit;
else
Inc( Result );
end;
Dec( nByteLimit );
end;
Result := nil;
end;
function ReadANumberString( var P : PByte; nByteLimit : Integer ) : string;
begin
Result := \'\';
while nByteLimit0 do
begin
case P^ of
Ord( \'.\' ), Ord( \'0\' )..Ord( \'9\' ): Result := Result Chr( P^ );
else
Exit;
end;
Inc( P );
Dec( nByteLimit );
end;
end;
type
TArray_Double = array of Double;
function DataToArray( P0 : PByte; nLength: Integer; var afResult : TArray_Double ) : Integer;
var
P : PByte;
s : string;
begin
Result := 0;
P := ScanNumberBeginning( P0, nLength );
Dec( nLength, PChar( P ) - PChar( P0 ) );
while Pnil do
begin
s := ReadANumberString( P, nLength );
if s = \'\' then
Exit;
SetLength( afResult, Result 1 );
afResult[ Result ] := StrToFloat( s );
Inc( Result );
P0 := P;
P := ScanNumberBeginning( P0, nLength );
Dec( nLength, PChar( P ) - PChar( P0 ) );
end;
end;
procedure PrintResult( afData : TArray_Double; nNumberPerLine : Integer = 10 );
var
i : Integer;
begin
if nNumberPerLine = 1 then
nNumberPerLine := 1;
for i := 0 to High( afData ) do
begin
Write( Format( \'%7.1n\', [ afData ] ) );
if ( i 1 ) mod nNumberPerLine = 0 then
Writeln;
end;
Writeln;
end;
var
sFN_Data1: string;
sFN_Data2: string;
ms1 : TMemoryStream;
ms2 : TMemoryStream;
af1 : TArray_Double;
af2 : TArray_Double;
afX : TArray_Double;
i, n1, n2 : Integer;
begin
if not GetCmdArguments( sFN_Data1, sFN_Data2 ) then
ShowUsageAndExit;
ms1 := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
try
ms1.LoadFromFile( sFN_Data1 );
ms2.LoadFromFile( sFN_Data2 );
n1 := DataToArray( ms1.Memory, ms1.Size, af1 );
n2 := DataToArray( ms2.Memory, ms2.Size, af2 );
if n1 = n2 then
begin
SetLength( afX, n1 );
for i := 0 to n1 - 1 do
afX := af2 - af1;
PrintResult( afX );
end
else
Writeln( ErrOutput, \'两组数据个数不同,请检查原始数据文件...\' );
finally
ms2.Free;
ms1.Free;
end;
end.
执行方法:arraySub 1.txt 2.txtresult.txt |