一、实验目的
1.理解不同体系结构风格的具体内涵。
2.学习体系结构风格的具体实践。
二、实验环境
硬件: (依据具体情况填写)
软件:Java或任何一种自己熟悉的语言
三、实验内容
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。
尝试用不同的策略实现这个系统。选择2-3种体系结构风格来实现。
四、实验步骤:
要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图,以及运行结果截图。
①采用主/子程序的风格
a.体系结构图
b.简述体系结构各部件的主要功能,实现思想。
文本输入:通过命令行提示输入文本
循环移位:把输入的文本进行循环位移
输出位移过程:将位移的每个过程结果输出
排序:对移位后的结果进行排序
输出:输出排序后的结果
c.代码:
<?php //定义全局共享变量 $data = []; $all = []; $index = 0; $yield = null; /** * * 行输入 * **/ function input() { global $data; while(1){ $string = trim(fgets(STDIN)); //按ctrl+p 结束输入 if(16 === ord($string)){ break; } array_push($data,$string); } return; } /** * * 记录位移过程,累加到到迭代器 * **/ function shifter() { global $data; global $index; while($index<count($data)){ $tempArr = explode(‘ ‘,$data[$index]); $count = count($tempArr); yield implode(‘ ‘,$tempArr)."\n"; for($i=0;$i<$count-1;++$i){ $shift = array_shift($tempArr); array_push($tempArr,$shift); yield implode(‘ ‘,$tempArr)."\n"; } $index+=1; } } /** * * 位移过程输出 * **/ function pcOutput() { global $yield; $collector = []; foreach($yield as $k=>$v){ array_push($collector,$v); echo $v; } return $collector; } /** * * 按字母排序 * **/ function alphabetizer() { //使用全局变量 global $all; //排序 return natcasesort($all); } /** * * 排序结果输出 * **/ function output() { global $all; foreach($all as $v) { print($v); } } /** * * 主函数 * **/ function main() { global $yield; global $all; print("----------input---------\n"); //输入 input(); //循环位移 $yield = shifter(); //过程输出 print("\n---------process--------\n"); $all = pcOutput(); //按字母表排序 alphabetizer(); //排序结果输出 print("\n----------output---------\n"); output(); } main(); ?>
d.结果
②采用管道过滤器的风格
a.体系结构图
b.简述体系结构各部件的主要功能,实现思想。
文本输入:通过命令行提示输入文本,并经过输入过滤器,转换成字符数组
循环移位:把,转换成的字符数组,通过循环移位过滤器,生成移位过程行文本
排序:对移位后的结果进行排序
输出:输出排序后的结果
c.代码
1 <?php 2 /** 3 * 4 * 过滤器 5 * 6 **/ 7 abstract class Filter{ 8 protected abstract function trans(); 9 } 10 /** 11 * 12 * 13 * 管道类 14 * 15 **/ 16 class Pipe{ 17 private $inputPipe = []; 18 private $outputPipe = []; 19 private function writeLine(){ 20 $input = new Input(); 21 print("--------input---------\n"); 22 while(1){ 23 $buffer = $input->input(); 24 if($buffer === false) 25 break; 26 array_push($this->inputPipe,$buffer); 27 } 28 return $this->inputPipe; 29 } 30 private function readLine(){ 31 $CircleShift = new CircleShift($this->inputPipe); 32 $outputPipe = $CircleShift->trans(); 33 $Alpha = new Alphabetizer($outputPipe); 34 $outputPipe = $Alpha->trans(); 35 return $outputPipe; 36 } 37 public function start(){ 38 return $this->writeLine(); 39 } 40 public function stop(){ 41 $this->outputPipe = $this->readLine(); 42 $output = new Output($this->outputPipe); 43 $output->trans(); 44 } 45 } 46 47 /** 48 * 49 * 输入,并将输入过滤生成数组 50 * 51 **/ 52 class Input extends Filter{ 53 private $input = ‘‘; 54 public function input(){ 55 $this->input = trim(fgets(STDIN)); 56 if(ord($this->input) === 16){ 57 return false; 58 } 59 return $this->trans(); 60 } 61 62 public function trans(){ 63 return explode(‘ ‘,$this->input); 64 } 65 } 66 /** 67 * 68 * 输出 69 * 70 **/ 71 class Output extends Filter{ 72 private $output = null; 73 function __construct($output){ 74 $this->output = $output; 75 } 76 function trans(){ 77 foreach($this->output as $k=>$v){ 78 print($v); 79 } 80 } 81 } 82 /** 83 * 84 * 循环移位 85 * 86 **/ 87 class CircleShift extends Filter{ 88 private $input = null; 89 private $output = []; 90 private $index = 0; 91 function __construct($input){ 92 $this->input = $input; 93 } 94 //循环移动单词的位置 95 public function trans(){ 96 97 foreach($this->input as $value){ 98 $count = count($value); 99 array_push($this->output,implode(‘ ‘,$value)."\n"); 100 for($i=0;$i<$count-1;++$i){ 101 $shift = array_shift($value); 102 array_push($value,$shift); 103 array_push($this->output,implode(‘ ‘,$value)."\n"); 104 } 105 } 106 107 return $this->output; 108 } 109 } 110 /** 111 * 112 * 按照字母排序 113 * 114 **/ 115 class Alphabetizer extends Filter{ 116 private $data = null; 117 function __construct($data){ 118 $this->data = $data; 119 } 120 public function trans(){ 121 natcasesort($this->data); 122 return $this->data; 123 } 124 } 125 class KWIC{ 126 public function main(){ 127 //实例化管道 128 $Pipe = new Pipe(); 129 $input = $Pipe->start(); 130 $output = $Pipe->stop(); 131 } 132 } 133 134 $kwic = new KWIC(); 135 $kwic->main(); 136 ?>
d.结果
时间: 2024-10-07 22:52:45