Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: script/programmeer vraag

1 view
Skip to first unread message

Skybuck Flying

unread,
Dec 7, 2009, 8:43:54 PM12/7/09
to
En klaar is kees !

Heeft me 2 uur en 4 minuutjes gekost.. maar dan heb je ook wat he ! ;) :)

Hier komt ie:

// *** Begin of Program ***

program Resched;

{$APPTYPE CONSOLE}

{

Re-Schedule example for "Radio" scheduling.

Version 0.01 and 0.02 created on 8 december 2009 by Skybuck Flying ! ;)

Compiles/Builds/Works with Delphi 2007 and FreePascal 2.2.4 For Win32.

input.txt example:

0800-1300;....data.....
1300-1700;....data.....
1800-1830;....data.....
0200-0257;....data.....
0400-0457;....data.....
0000-0300;....data.....
0600-0657;....data.....
0700-0900;....data.....
1000-1057;....data.....
1100-1157;....data.....
2130-0830:....data.....
1130-0500:....data.....
0000-2400:....data.....
0000-2359:....data.....
2400-0000:....data.....
2359-0001:....data.....

output.txt example:

0800-0900;....data.....
0900-1000;....data.....
1000-1100;....data.....
1100-1200;....data.....
1200-1300;....data.....
1300-1400;....data.....
1400-1500;....data.....
1500-1600;....data.....
1600-1700;....data.....
1800-1830;....data.....
0200-0257;....data.....
0400-0457;....data.....
0000-0100;....data.....
0100-0200;....data.....
0200-0300;....data.....
0600-0657;....data.....
0700-0800;....data.....
0800-0900;....data.....
1000-1057;....data.....
1100-1157;....data.....
2130-2200:....data.....
2200-2300:....data.....
2300-2400:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0830:....data.....
1130-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2300:....data.....
2300-2400:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0800:....data.....
0800-0900:....data.....
0900-1000:....data.....
1000-1100:....data.....
1100-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2300:....data.....
2300-2400:....data.....
0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0800:....data.....
0800-0900:....data.....
0900-1000:....data.....
1000-1100:....data.....
1100-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2359:....data.....
2400-0000:....data.....
2359-0001:....data.....

}

uses
SysUtils;

function ExtractString
(
ParaInputString : string;
ParaStartIndex : integer;
ParaStopIndex : integer
) : string;
var
vIndex : integer;

begin
result := '';

for vIndex := ParaStartIndex to ParaStopIndex do
begin
if (vIndex >= 1) and (vIndex <= Length(ParaInputString)) then
begin
result := result + ParaInputString[vIndex];
end;
end;
end;

function ConvertCharToDigit( ParaChar : char ) : integer;
const
ConstDigitValue : array['0'..'9'] of integer =
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
begin
result := 0;

if (ParaChar >= '0') and (ParaChar <= '9') then
begin
result := ConstDigitValue[ParaChar];
end;
end;

function ConvertStringToValue
(
ParaString : string
) : integer;
var
vIndex : integer;
vPosition : integer;
begin
result := 0;

vPosition := 1;
for vIndex := 1 to Length(ParaString) do
begin
result := result +
ConvertCharToDigit
(
ParaString[(Length(ParaString)-vIndex)+1]
) * vPosition;
vPosition := vPosition * 10;
end;
end;

procedure SwapIntegers( var ParaA : integer; var ParaB : integer );
var
vTemp : integer;
begin
vTemp := ParaA;
ParaA := ParaB;
ParaB := vTemp;
end;

function ConvertIntegerToHourString( ParaInteger : integer ) : string;
const
ConstDigitChar : array[0..9] of char =
('0','1','2','3','4','5','6','7','8','9');
begin
result :=
ConstDigitChar[(ParaInteger div 1000) mod 10] +
ConstDigitChar[(ParaInteger div 100) mod 10] +
ConstDigitChar[(ParaInteger div 10) mod 10] +
ConstDigitChar[(ParaInteger div 1) mod 10];
end;

procedure ReSchedule( ParaInputString : string; var ParaOutputFile : text );
var
vStartString : string;
vDashString : string;
vStopString : string;
vSemiColonString : string;
vDataString : string;

vStart : integer;
vStop : integer;

vStartHour : integer;
// vStartMinutes : integer;

vStopHour : integer;
// vStopMinutes : integer;

vHour : integer;

vCompensate : boolean;

vOutputString : string;
begin
vStartString := ExtractString( ParaInputString, 1, 4 );
vDashString := ExtractString( ParaInputString, 5, 5 );
vStopString := ExtractString( ParaInputString, 6, 9 );
vSemiColonString := ExtractString( ParaInputString, 10, 10 );
vDataString := ExtractString( ParaInputString, 11,
Length(ParaInputString) );

vStart := ConvertStringToValue( vStartString );
vStop := ConvertStringToValue( vStopString );

vStartHour := vStart div 100;
// vStartMinutes := vStart mod 100; // not needed

vStopHour := vStop div 100;
// vStopMinutes := vStop mod 100; // not needed

vCompensate := false;
if vStartHour > vStopHour then
begin
// compensate for wrap around
vStopHour := vStopHour + 24;
vCompensate := true;
end;

// debug strings
// writeln( ParaInputString );
// writeln( 'output: ', vStartString, vDashString, vStopString,
vSemiColonString, vDataString );
// writeln( 'converted: ', vStart, ' ', vStop );
// writeln( 'determined: ', vStartHour, ' ', vStartMinutes, ' ', vStopHour,
' ', vStopMinutes );

if (vStopHour - vStartHour) = 0 then
begin
// debug strings
// writeln( 'schedule: ', ParaInputString );

// output to file
writeln( ParaOutputFile, ParaInputString );
end else
begin
for vHour := vStartHour to vStopHour-1 do
begin
vOutputString := '';

if vHour = vStartHour then
begin
// start hour + start minutes
vOutputString := vOutputString + vStartString;
end else
begin
if vCompensate then
begin
// intermediate hour (wrapped back/compensated)
vOutputString := vOutputString +
ConvertIntegerToHourString((vHour mod 24)*100);
end else
begin
// intermediate hour
vOutputString := vOutputString +
ConvertIntegerToHourString(vHour*100);
end;
end;

vOutputString := vOutputString + vDashString;

if (vHour+1) = vStopHour then
begin
// stop hour + stop minutes
vOutputString := vOutputString + vStopString;
end else
begin
if vCompensate then
begin
// intermediate hour (wrapped back/compensated)
vOutputString := vOutputString +
ConvertIntegerToHourString(((vHour mod 24)+1)*100);
end else
begin
// intermediate hour
vOutputString := vOutputString +
ConvertIntegerToHourString((vHour+1)*100);
end;
end;

vOutputString := vOutputString + vSemiColonString;
vOutputString := vOutputString + vDataString;

// debug strings
// writeln( 'schedule: ', vOutputString );

// output to file
writeln( ParaOutputFile, vOutputString );
end;
end;
end;

procedure DisplayUsage;
begin
writeln('Radio re-scheduling program.');
writeln('Version 0.02 created on 8 december 2009 by Skybuck Flying.');
writeln;
writeln('Usage: ');
writeln(' resched.exe <input filename> <output filename>');
writeln;
writeln('Example: ');
writeln(' resched.exe input.txt output.txt');
writeln;
end;

procedure ProgramMain;
var
vInputFile : text;
vOutputFile : text;

vInputFilename : string;
vOutputFilename : string;

vInputString : string;
begin
if ParamCount < 2 then
begin
DisplayUsage;
exit;
end;

vInputFileName := ParamStr(1);
vOutputFileName := ParamStr(2);

// debug code
// writeln( 'Input filename: ', vInputFileName );
// writeln( 'Output filename: ', vOutputFileName );
// readln;
// exit;

write('Re-scheduling ' + vInputFilename + ' to ' + vOutputFilename + ' ');

// if compiler error then replace Assign with AssignFile or vice versa.
Assign( vInputFile, vInputFilename );
Assign( vOutputFile, vOutputFilename );

Reset(vInputFile);
Rewrite(vOutputFile);

while not EoF( vInputFile ) do
begin
ReadLn( vInputFile, vInputString );
ReSchedule( vInputString, vOutputFile );
end;

// if compiler error then replace Close with CloseFile or vice versa.
Close( vInputFile );
Close( vOutputFile );

writeln( 'done.');
end;

begin
try
ProgramMain;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
ReadLn;
end.

// *** End of Program ***

Bye,
Skybuck.


Skybuck Flying

unread,
Dec 7, 2009, 8:50:29 PM12/7/09
to
Uitkijken met de "debug strings" (commentaar) die verneuken de posting een
beetje... maar iemand met een klein beetje pascal ervaring die snapt wel hoe
ie dat moet corrigeren... """heb ik express zo gelaten ! LOL ;) :)"""

Het enigste andere wat ik er nog even over wil zeggen is:

Haal de readln helemaal op het einde weg (vlak voor de "end.") (zodat het
programma niet wacht op een enter commando...) en dan kan het gebruikt
worden in batchfiles bijvoorbeeld:

Resched Input1.txt Output1.txt
Resched Input2.txt Output2.txt
Resched Dit.txt Dat.txt

Tot slot:

Het programma kan gemaakt/gebuild worden met Delphi 2007
(demo's/trial's/free editions) of Free Pascal (gratis !)

Doei,
Skybuck ! ;) :)


Wil Taphoorn

unread,
Dec 8, 2009, 4:08:46 AM12/8/09
to
Skybuck Flying wrote:
> Heeft me 2 uur en 4 minuutjes gekost.. maar dan heb je ook wat he ! ;) :)

> output.txt example:
..
> 0700-0830:....data.....
..
> 2200-2359:....data.....
..
> 2359-0001:....data.....

Ik zou er nog een minuutje tegenaan gooien ... ;-)

--
Wil

Skybuck Flying

unread,
Dec 8, 2009, 7:18:45 AM12/8/09
to
"Wil Taphoorn" <w...@nogo.wtms.nl> wrote in message
news:WTMSB4...@wtms.nl...

Inderdaad, er zat nog een kleine bug in ! ;)
(Goed dat jij het zag ! ;):))

Bug opgelost, versie 0.03:

// *** Begin of Program ***

program Resched;

{$APPTYPE CONSOLE}

{

Re-Schedule example for "Radio" scheduling.

Version 0.01, 0.02, 0.03 created on 8 december 2009 by Skybuck Flying ! ;)

Compiles/Builds/Works with Delphi 2007 and FreePascal 2.2.4 For Win32.

input.txt example:

0800-1300;....data.....
1300-1700;....data.....
1800-1830;....data.....
0200-0257;....data.....
0400-0457;....data.....
0000-0300;....data.....
0600-0657;....data.....
0700-0900;....data.....
1000-1057;....data.....
1100-1157;....data.....
2130-0830:....data.....
1130-0500:....data.....

0540-0780:....data..... // new test data

output.txt example:

2300-0000:....data.....


0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....
0500-0600:....data.....
0600-0700:....data.....
0700-0800:....data.....

0800-0830:....data.....


1130-1200:....data.....
1200-1300:....data.....
1300-1400:....data.....
1400-1500:....data.....
1500-1600:....data.....
1600-1700:....data.....
1700-1800:....data.....
1800-1900:....data.....
1900-2000:....data.....
2000-2100:....data.....
2100-2200:....data.....
2200-2300:....data.....

2300-0000:....data.....


0000-0100:....data.....
0100-0200:....data.....
0200-0300:....data.....
0300-0400:....data.....
0400-0500:....data.....

0540-0600:....data.....
0600-0700:....data.....
0700-0780:....data.....

2200-2300:....data.....
2300-2359:....data.....
2400-0000:....data.....
2359-0000:....data.....
0000-0001:....data.....

}

uses
SysUtils;

begin
result := '';

vStart : integer;
vStop : integer;

vStopHour : integer;
vStopMinutes : integer;

vHour : integer;

vCompensate : boolean;

vOutputString : string;
begin
vStartString := ExtractString( ParaInputString, 1, 4 );
vDashString := ExtractString( ParaInputString, 5, 5 );
vStopString := ExtractString( ParaInputString, 6, 9 );
vSemiColonString := ExtractString( ParaInputString, 10, 10 );
vDataString := ExtractString( ParaInputString, 11,
Length(ParaInputString) );

vStart := ConvertStringToValue( vStartString );
vStop := ConvertStringToValue( vStopString );

vStartHour := vStart div 100;
// vStartMinutes := vStart mod 100; // not needed

vStopHour := vStop div 100;

vStopMinutes := vStop mod 100;

if vStopMinutes > 0 then
begin
vStopHour := vStopHour + 1;
end;

ConvertIntegerToHourString(((vHour+1) mod 24)*100);


end else
begin
// intermediate hour
vOutputString := vOutputString +

ConvertIntegerToHourString((vHour+1)*100);
end;
end;

vInputFilename : string;
vOutputFilename : string;

Reset(vInputFile);
Rewrite(vOutputFile);

writeln( 'done.');
end;

// ReadLn;
end.

// *** End of Program ***

Doei,
Skybuck ! ;) :)


Skybuck Flying

unread,
Dec 8, 2009, 7:21:25 AM12/8/09
to
Alleen de "nieuwe test data" klopt natuurlijk niet helemaal... ik moet zo
naar bed... ik ben niet meer zo scherp... heb net lekker dirt 2 gespeelt...
:)

> 0540-0780:....data..... // new test data

7 huur en 80 minute kan natuurlijk niet... maarja.. het programma corrigeert
dit soort fouten niet want dan blijf je bezig met programmeren ;)

Zolang de input voor het programmatje correct is moet het nu toch werken ?!
;) :)

Doei,
Skybuck =D


0 new messages