Partager via


Cool Code Using VFP 9 (by John Koziol)

(UPDATED) ... Whoops, wrong alias name used in the USE IN command.  Repaired now <g>

So Richard Stanton, part of the VFP Dev team and the author of all the great VFP Report enhancements in VFP 9, and I were going over a very cool algorithm.  I can't get into what it does as we haven't decided what to do with it, but it's slick. 

You know what I mean by slick, right? In my experience, developers will ooh-and-ahh at great algorithms regardless of how useful they are.  If the code is elegant we get a warm-and-fuzzy feeling. I have a pet theory that this asthetic appreciation gets developers into trouble sometime - we love th code so much we refuse to see it may not be the right solution.

So Richard mentioned an old project of his to convert Arabic numbers (our standard numbers) into Roman numbers.  I thought about it, and replied that I thought I could do it in 30 lines of code or less, not including any setup code like asking for the number or creating data structures that can be re-used. He sort of challenged me on that, and here's the result.  Kinda cool but with very little real-world usefulness (heh).  Sorry about the formatting.

 

 

* Arabic to Roman ... John Koziol May 10, 2005

* Public domain: Share and enjoy.

cNum=INPUTBOX("Enter a number between 1 and 3999","Enter number")

nVal=VAL(cNum)

IF

!BETWEEN(nVal,1,3999)

=MESSAGEBOX("Can't even follow simple instructions?, Well begone!","Input Issue",16)

RETURN

ENDIF

 

DO MakeCTable

SET DECIMALS TO

0

USE

AToRoman IN 0 ORDER main ALIAS ct

SELECT

ct

cRoman = ""

FOR

i = 3 TO 0 STEP -1

nAdd=10^i

nChrs=INT(nVal/nAdd)

SEEK nAdd

IF i#3

cRoman=cRoman+ICASE(nChrs=9,ct.nona,;

BETWEEN(nChrs,5,8),ct.penta+REPLICATE(ct.symb,nChrs-5),;

nChrs=4,ct.symb+ct.penta,;

REPLICATE(ct.symb,nChrs))

ELSE

cRoman=cRoman+REPLICATE(ct.symb,nChrs)

ENDIF

nVal=nVal- (nChrs* ct.narabic)

ENDFOR

USE IN ct

?cRoman

 

RETURN

FUNCTION

MakeCTable

IF FILE

("AToRoman.DBF")

RETURN

ENDIF

CREATE TABLE AToRoman(narabic N(4,0), symb C(1),penta C(1), nona C(2))

INSERT INTO AToRoman VALUES (1000,"M","","")

INSERT INTO

AToRoman VALUES (100,"C","D","CM")

INSERT INTO

AToRoman VALUES (10,"X","L","XC")

INSERT INTO

AToRoman VALUES (1,"I","V","IX")

INDEX ON

narabic TAG main

USE IN

AToRoman

RETURN

Comments

  • Anonymous
    May 11, 2005
    Actually John a great use for this would be if you needed to "write" a report that was broken into sections like a Word document.

    Although I would likely recommend using a cursor instead of the physical table (no need in leaving extra tables lying around), eh?
  • Anonymous
    May 11, 2005
    Well, true, Andrew, and the cursor if this was a one-shot but if this were real-world, reusable code then I imagine the conversion rules would be a static table.
  • Anonymous
    October 14, 2007
    PingBack from http://foxpro.ntsl119.com/scr/archives/474