
2. word.php
<html><style>td{background-color:#CF6;width:100px;margin:5px;}</style><body><?php/** * 程序开始运行, 按"浏览"钮选择一个英文文档, 再按"统计"钮, * 即可得到按字母顺序列出的所有单词,及其出现的次数 ** 作者: 许同春 author Tongchun Xu* @开源中国 Open Source, Chna communiity * 完成日期:2016年6月10日 completion date: 10 June, 2016 */ require("StringTokenizer.php");require("output.php");if($_POST["submit"]){if ($_FILES["file"]["error"] > 0)echo "Error: " . $_FILES["file"]["error"] . "<br />";else {$myfile = fopen($_FILES["file"]["tmp_name"], "r") or die("Unable to open file!");$str = fread($myfile,filesize($_FILES["file"]["tmp_name"]));$delim = "?\,. /:!"()
f%";$st = new StringTokenizer($str, $delim);echo "找到字符串: ".$st->countTokens();$list=new LinkedList(); while ($st->hasMoreTokens()) { $list->orderInsert($st->nextToken()); }$list->words_count();$list->traversal();fclose($myfile);}}?><h2>英文文档单词统计 Statistics on English words </h2><p>程序开始运行, 按"浏览"钮选择一个英文文档, 再按"统计 Statistics"钮, 即可得到按字母顺序列出的所有单词,及其出现的次数 </p> <form action="word.php" method="post"enctype="multipart/form-data"><label for="file">英文文档名 File Name:</label><input type="file" name="file" id="file" /> <input type="submit" name="submit" value="统计 Statistics" /></form></body></html>3. output.php<meta charset="utf-8" /><?/** * The class LinkedList allows an application to store strings in * alphabetical order by calling orderInsert(). * 此处定义的 LinkedList 类,可以调用它的 方法 orderInsert(),来以字母 * 大小的顺序储存 英文字符串。 * 同时记录 英文单词出现的次数 * 作者: 许同春 author Tongchun Xu* @开源中国 Open Source, China communiity * 完成日期:2016年6月10日 completion date: 10 June, 2016 */class Node{public $data;public $frequency;public $next;function __construct($data, $next = null, $frequency = 1){$this->data = $data; //英文字符串$this->next = $next; //指向后继结点的指针$this->frequency=$frequency; //英文字符串出现的次数}} class LinkedList{private $head; //单链表的头结点,不存储数据 function __construct(){//单链表的构造方法//头结点的数据为"傀儡", 不代表 任何数据$this->head = new Node("dummy 傀儡"); $this->first = null;}function isEmpty(){ return ($this->head->next == null);}/* orderInsert($data) 方法,* 按给定字符串 $data 的大小, 将其安插到适当的位置, * 以保证单链表中字符串的存储,始终是有序的。*/ function orderInsert($data){$p = new Node($data);if($this->isEmpty()){$this->head->next = $p;}else {$node= $this->find($data);if(!$node){$q = $this->head;while($q->next != NULL && strcmp($data, $q->next->data)> 0 ){$q = $q->next;}$p->next = $q->next; $q->next = $p;}else$node->frequency++;} }function insertLast($data){//将字符串插到单链表的尾部$p = new Node($data); if($this->isEmpty()){$this->head->next = $p;}else{$q = $this->head->next;while($q->next != NULL)$q = $q->next;$q->next = $p; } } function find($value){//查询是否有给定的字符串$q = $this->head->next;while($q->next != null){if(strcmp($q->data,$value)==0){break;}$q = $q->next;}if ($q->data == $value)return $q; elsereturn null;} function traversal(){//遍历单链表if(!$this->isEmpty()){$p=$this->head->next;echo "输出结果:<table><tr>";echo "<td>".$p->data."<br>出现次数:".$p->frequency."</td>";$n=1;while($p->next != null){$p=$p->next;echo "<td>".$p->data."<br>出现次数:".$p->frequency."</td>";$n++;if ($n%11==0) echo "</tr><tr>";} echo "</tr></table>";}elseecho "链表为空!";}function words_count(){if($this->isEmpty())echo "<br>没有储存字符串 <br>";else{$counter=0;$p=$this->head->next;while($p->next != null){$p=$p->next;$counter++;};echo "***共有单词 ".$counter." 个***";}}} ?>4. StringTokenizer.php<?php /** * The string tokenizer class allows an application to break a string into tokens. * * @author Azeem Michael * @example The following is one example of the use of the tokenizer. The code: * <code> * <?php * $str = "this is:@
a test!"; * $delim = " !@:"
"; // remove these chars * $st = new StringTokenizer($str, $delim); * echo "Total tokens: ".$st->countTokens()."<br/>"; * while ($st->hasMoreTokens()) { * echo $st->nextToken() . "<br/>"; * } * prints the following output: * Total tokens: 4 * this * is * a * test * ?> * </code> */class StringTokenizer { /** @var string */private $string; /** @var string */private $token; /** @var string */private $delim; /** * Constructs a string tokenizer for the specified string. * @param string $str String to tokenize * @param string $delim The set of delimiters (the characters that separate tokens) * specified at creation time, default to "
" */public function __construct($str, $delim="
") {$this->string = $str;$this->delim = $delim;$this->token = strtok($str, $delim); } /** * Destructor to prevent memory leaks */public function __destruct() {unset($this);} /** * Calculates the number of times that this tokenizer"s nextToken method can * be called before it generates an exception * @return int - number of tokens */public function countTokens() {$counter = 0;while($this->hasMoreTokens()) {$counter++;$this->nextToken();}$this->token = strtok($this->string, $this->delim);return $counter; } /** * Tests if there are more tokens available from this tokenizer"s string. It * does not move the internal pointer in any way. To move the internal pointer * to the next element call nextToken() * @return boolean - true if has more tokens, false otherwise */public function hasMoreTokens() {return ($this->token !== false);} /** * Returns the next token from this string tokenizer and advances the internal * pointer by one. * @return string - next element in the tokenized string */public function nextToken() {$hold = $this->token; //hold current pointer value$this->token = strtok($this->delim); //increment pointerreturn $hold; //return current pointer value}}?> 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。