Ranking methods: Difference between revisions
Content added Content deleted
Line 2,241: | Line 2,241: | ||
=={{header|Modula-2}}== |
=={{header|Modula-2}}== |
||
{{trans|C}} |
{{trans|C}} |
||
<lang modula2> |
<lang modula2>MODULE RankingMethods; |
||
FROM FormatString IMPORT FormatString; |
|||
FROM RealStr IMPORT RealToFixed; |
|||
FROM Terminal IMPORT WriteString,WriteLn,ReadChar; |
|||
PROCEDURE WriteCard(c : CARDINAL); |
|||
VAR buf : ARRAY[0..15] OF CHAR; |
|||
BEGIN |
|||
FormatString("%c", buf, c); |
|||
WriteString(buf) |
|||
END WriteCard; |
|||
TYPE Entry = RECORD |
|||
name : ARRAY[0..15] OF CHAR; |
|||
score : CARDINAL; |
|||
END; |
|||
PROCEDURE OrdinalRanking(CONST entries : ARRAY OF Entry); |
|||
VAR |
|||
buf : ARRAY[0..31] OF CHAR; |
|||
i : CARDINAL; |
|||
BEGIN |
|||
WriteString("Ordinal Ranking"); |
|||
WriteLn; |
|||
WriteString("---------------"); |
|||
WriteLn; |
|||
FOR i:=0 TO HIGH(entries) DO |
|||
FormatString("%c\t%c\t%s\n", buf, i + 1, entries[i].score, entries[i].name); |
|||
WriteString(buf) |
|||
END; |
|||
WriteLn |
|||
END OrdinalRanking; |
|||
PROCEDURE StandardRanking(CONST entries : ARRAY OF Entry); |
|||
VAR |
|||
buf : ARRAY[0..31] OF CHAR; |
|||
i,j : CARDINAL; |
|||
BEGIN |
|||
WriteString("Standard Ranking"); |
|||
WriteLn; |
|||
WriteString("---------------"); |
|||
WriteLn; |
|||
j := 1; |
|||
FOR i:=0 TO HIGH(entries) DO |
|||
FormatString("%c\t%c\t%s\n", buf, j, entries[i].score, entries[i].name); |
|||
WriteString(buf); |
|||
IF entries[i+1].score < entries[i].score THEN |
|||
j := i + 2 |
|||
END |
|||
END; |
|||
WriteLn |
|||
END StandardRanking; |
|||
PROCEDURE DenseRanking(CONST entries : ARRAY OF Entry); |
|||
VAR |
|||
buf : ARRAY[0..31] OF CHAR; |
|||
i,j : CARDINAL; |
|||
BEGIN |
|||
WriteString("Dense Ranking"); |
|||
WriteLn; |
|||
WriteString("---------------"); |
|||
WriteLn; |
|||
j := 1; |
|||
FOR i:=0 TO HIGH(entries) DO |
|||
FormatString("%c\t%c\t%s\n", buf, j, entries[i].score, entries[i].name); |
|||
WriteString(buf); |
|||
IF entries[i+1].score < entries[i].score THEN |
|||
INC(j) |
|||
END |
|||
END; |
|||
WriteLn |
|||
END DenseRanking; |
|||
PROCEDURE ModifiedRanking(CONST entries : ARRAY OF Entry); |
|||
VAR |
|||
buf : ARRAY[0..31] OF CHAR; |
|||
i,j,count : CARDINAL; |
|||
BEGIN |
|||
WriteString("Modified Ranking"); |
|||
WriteLn; |
|||
WriteString("---------------"); |
|||
WriteLn; |
|||
i := 0; |
|||
j := 1; |
|||
WHILE i < HIGH(entries) DO |
|||
IF entries[i].score # entries[i+1].score THEN |
|||
FormatString("%c\t%c\t%s\n", buf, i+1, entries[i].score, entries[i].name); |
|||
WriteString(buf); |
|||
count := 1; |
|||
FOR j:=i+1 TO HIGH(entries)-1 DO |
|||
IF entries[j].score # entries[j+1].score THEN |
|||
BREAK |
|||
END; |
|||
INC(count) |
|||
END; |
|||
j := 0; |
|||
WHILE j < count-1 DO |
|||
FormatString("%c\t%c\t%s\n", buf, i+count+1, entries[i+j+1].score, entries[i+j+1].name); |
|||
WriteString(buf); |
|||
INC(j) |
|||
END; |
|||
i := i + count - 1 |
|||
END; |
|||
INC(i) |
|||
END; |
|||
FormatString("%c\t%c\t%s\n\n", buf, HIGH(entries)+1, entries[HIGH(entries)].score, entries[HIGH(entries)].name); |
|||
WriteString(buf) |
|||
END ModifiedRanking; |
|||
PROCEDURE FractionalRanking(CONST entries : ARRAY OF Entry); |
|||
VAR |
|||
buf : ARRAY[0..32] OF CHAR; |
|||
i,j,count : CARDINAL; |
|||
sum : REAL; |
|||
BEGIN |
|||
WriteString("Fractional Ranking"); |
|||
WriteLn; |
|||
WriteString("---------------"); |
|||
WriteLn; |
|||
sum := 0.0; |
|||
i := 0; |
|||
WHILE i <= HIGH(entries) DO |
|||
IF (i = HIGH(entries) - 1) OR (entries[i].score # entries[i+1].score) THEN |
|||
RealToFixed(FLOAT(i+1),1,buf); |
|||
WriteString(buf); |
|||
FormatString("\t%c\t%s\n", buf, entries[i].score, entries[i].name); |
|||
WriteString(buf) |
|||
ELSE |
|||
sum := FLOAT(i); |
|||
count := 1; |
|||
j := i; |
|||
WHILE entries[j].score = entries[j+1].score DO |
|||
sum := sum + FLOAT(j + 1); |
|||
INC(count); |
|||
INC(j) |
|||
END; |
|||
FOR j:=0 TO count-1 DO |
|||
RealToFixed(sum/FLOAT(count)+1.0,1,buf); |
|||
WriteString(buf); |
|||
FormatString("\t%c\t%s\n", buf, entries[i+j].score, entries[i+j].name); |
|||
WriteString(buf) |
|||
END; |
|||
i := i + count - 1 |
|||
END; |
|||
INC(i) |
|||
END |
|||
END FractionalRanking; |
|||
(* Main *) |
|||
TYPE EA = ARRAY[0..6] OF Entry; |
|||
VAR entries : EA; |
|||
BEGIN |
|||
entries := EA{ |
|||
{"Solomon", 44}, |
|||
{"Jason", 42}, |
|||
{"Errol", 42}, |
|||
{"Garry", 41}, |
|||
{"Bernard", 41}, |
|||
{"Barry", 41}, |
|||
{"Stephen", 39} |
|||
}; |
|||
OrdinalRanking(entries); |
|||
StandardRanking(entries); |
|||
DenseRanking(entries); |
|||
ModifiedRanking(entries); |
|||
FractionalRanking(entries); |
|||
ReadChar |
|||
END RankingMethods.</lang> |
|||
{{out}} |
{{out}} |
||
<pre>Ordinal Ranking |
<pre>Ordinal Ranking |