17.05.2015 Views

Pascal News

Pascal News

Pascal News

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

61<br />

trsl ~~RAY [t •• maxlengthl OF treept<br />

119 VAR 179<br />

120 temp: treept: 180<br />

121<br />

62<br />

END;<br />

122<br />

63 newcharsetl ARRAY [alphabet1 OF newchar:<br />

123<br />

64 stactc: newchar;<br />

124<br />

65<br />

66<br />

61 PROCEDURE get_char:<br />

125<br />

126<br />

127<br />

68<br />

128<br />

69 BEGIN<br />

129<br />

70<br />

REPEAT num_in_cnars:= num_ln-ehars + t;<br />

no<br />

71 UNTIL eof(ln_flle) OR (ord(1n-flh-.) 0)<br />

III<br />

72 ENDtGET_CHAR);<br />

1J2<br />

73<br />

III<br />

74<br />

134<br />

75 PROCEDURE fIll_tally:<br />

135<br />

H. (Scan the file the first tIme and get a character count on<br />

U6<br />

77 WhIch to maKe the new Huffman character set.)<br />

78<br />

117<br />

U8<br />

79 VAR 139<br />

80 count: integer:<br />

140<br />

81<br />

141<br />

82 BEGIN<br />

142<br />

83 reset(1n_file 1I<br />

143<br />

84<br />

FOR count := 'ftlnchar.J'O 127 DC?,<br />

144<br />

85<br />

WIrH tallylcountl'DO .<br />

145<br />

86<br />

BEGIN marKed: e falsel<br />

1= 0<br />

146<br />

87 IF NOr eol(1n_file)<br />

147<br />

88<br />

THEN<br />

148<br />

89<br />

BEGIN<br />

149<br />

90<br />

IJet_char:<br />

150<br />

91<br />

WHILE NOT eofCin_file) DO<br />

1!>1<br />

92<br />

8EGIN<br />

152<br />

93<br />

If' ord(1n_flle-) < minchar THEN<br />

153<br />

94<br />

BEGU<br />

154<br />

95<br />

writelnCtty, 'Bad character in input!·~·, ordC<br />

l!>5<br />

96<br />

in_file-» :<br />

156<br />

97<br />

GOTO 13<br />

157<br />

98<br />

END:<br />

158<br />

99<br />

tallylord(1n_Hle-)]. num_of 1= tally[ordCin_flle-.><br />

159<br />

100<br />

]. nu .._of + 1;<br />

1&0<br />

101<br />

get_Char I<br />

lot<br />

102<br />

END<br />

102<br />

103<br />

END<br />

163<br />

104 END (FILL_T~LLr):<br />

Ib4<br />

105<br />

Ib5<br />

106<br />

166<br />

101 PROCEDURE exchangeCVAR x, Y: integer):<br />

167<br />

108<br />

t&8<br />

109 VAR 11>9<br />

110 temp: integer:<br />

110<br />

111<br />

111<br />

112 BEGTN temp := x, x := VI V := temp E~D (EXCHANGE):<br />

112<br />

113<br />

173<br />

114<br />

114<br />

115 PROCEDURE .. aKe_new_chars:<br />

115<br />

116 (~aKe the Huffman Characters based on the character frequencies<br />

176<br />

117 of the file.)<br />

117<br />

118<br />

178<br />

poSl, pos2, cOQnt: inteqer:<br />

done, trl, tr2: boolean:<br />

PROCE~URE 1roundCt: treept: val: Integer):<br />

(Ground the character tree With NIL's)<br />

BEGIN<br />

WITH t-, DO<br />

B£GIN left:= NIL:<br />

ENO (GROUND):<br />

sum := val END<br />

PROCEDURE 1et_2_minsCVAR posl, pos2: inte1er: VAR trl, tr2:<br />

boolean):<br />

(Find the two Characters or character trees with the smallest<br />

frequpncles.)<br />

VAR<br />

count. mini, mln2: integer:<br />

BEGIN tGET_2_MINS}<br />

mint := ~axlnt; mln2:= maxlnt;<br />

faR count := MinChar TO 127 00<br />

WITH tallvlcountJ DO<br />

If' Nor marlced<br />

THEN<br />

If' num_of < min2<br />

THEN<br />

IF num_of < minl<br />

THEN<br />

BEGIN<br />

min2 := mint:<br />

pos2 := posl:<br />

trl := falSe;<br />

END<br />

ELSE<br />

BEGIN<br />

pos2 := count:<br />

11I1n2 := num_of<br />

END:<br />

TO trees. t_num on<br />

trs [count] ., DO<br />

dn2<br />

FOR count : = 1<br />

WITH trees.<br />

If' sum <<br />

rH I!: Pi<br />

If' NOT trl<br />

IF NOT tr2<br />

IF su'" < mini<br />

THEN<br />

BEGlPi<br />

mi02 := m1nl:<br />

post := count,<br />

I!: NO<br />

I!:LSE<br />

BEGIN<br />

END tGEr_2_~INSJ:<br />

tr2 :<br />

DOSl<br />

mini<br />

trl:<br />

= c01Jnt:<br />

= num_of<br />

tr2 := false:<br />

tr2 := trl:<br />

trl := true,<br />

pos2 := posl:<br />

mini := sum<br />

mln2 := sum: 00s2 : =<br />

e:r~D;<br />

THEN<br />

THEN<br />

tally[posl]. marKed := truel<br />

tally[pos2]. marked := true<br />

count<br />

en<br />

rn<br />

"'tl<br />

.....<br />

rn<br />

3<br />

t:C<br />

rn<br />

::0<br />

.....<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!