现在的位置: 首页 > 综合 > 正文

文本行查询系统[6]-系统用户接口的实现

2013年05月22日 ⁄ 综合 ⁄ 共 6563字 ⁄ 字号 评论关闭
// QTL.cs
using System;
using System.Collections;
using System.IO;

namespace SEI.DL88250.SourceCodes.CSharp.QTL
{        
    
/// <summary>查询系统类
    
/// </summary>
    public class QTL
    {
        
/// <summary>文本缓冲区
        
/// </summary>
        internal static ArrayList textContentBuffer;
        
/// <summary>查询结果集,行号集合
        
/// </summary>
        private ArrayList _queryResult;    
        
/// <summary>表达式分析器
        
/// </summary>
        private ExpressionAnalyser _ea;
        
        
/// <summary>构造器,初始化文本集
        
/// </summary>
        public QTL()
        {
            textContentBuffer 
= new ArrayList();
            textContentBuffer.Add(
null);        // 填掉第0个位置
            _queryResult = new ArrayList();
        }

        /// <summary>清空查询结果
        
/// </summary>
        public void ClearResults()
        {
            _queryResult.Clear();
        }

        /// <summary>清屏
        
/// </summary>
        public void ClearScreen()
        {
            Console.ReadLine();
            Console.Clear();
        }

        /// <summary>让用户输入查询字串,并开始分析
        
/// </summary>
        public void UserInputQuery()
        {
            Console.Write(
"Please enter a query or 'q' to Quit: ");
            
string query = Console.ReadLine();
            
if ("q" == query)
            {
                Environment.Exit(
0);
            }
            _ea 
= new ExpressionAnalyser(query);
        }

        /// <summary>根据用户输入的字串进行查询处理
        
/// </summary>
        public void ProcessQuery()
        {
            ArrayList expression 
= _ea.ToPostfix();        // 后缀表达式集
            #region 后缀表达式正确性验证显示测试
            
//IEnumerator ie = expression.GetEnumerator();
            
//while (ie.MoveNext())
            
//{
            
//    Console.Write(((Expression)ie.Current).ExpressionString);
            
//}
            
//Console.WriteLine();
            #endregion 正确性验证显示结束
            Stack s 
= new Stack();                // 运算过程栈
            Stack p = new Stack();                // 运算字串栈,用于分步打印
            
            
#region 基于后缀表达式进行查询运算与结果分步显示
            
for (int i = 0; i < expression.Count; i++)
            {
                Expression exp 
= (Expression)expression[i];
                
switch (exp.ExpressionType)
                { 
                    
case "query":
                    {
                        s.Push(
new UnitaryQuery(exp.ExpressionString));
                        
#region 打印当前关键字运算的结果
                        
string curExp = exp.ExpressionString;
                        p.Push((
object)curExp);
                        PrintSetpResult(curExp, s);
                        
#endregion 打印结束
                        
break;
                    }
                    
case "&&":
                    {
                        Query q1 
= (Query)s.Pop();
                        Query q2 
= (Query)s.Pop();
                        s.Push(
new AndQuery(q1, q2));
                        
#region 打印当前"&&"运算的结果
                        
string curExp = "";
                        curExp 
+= (string)p.Pop();
                        curExp 
+= " && ";
                        curExp 
+= (string)p.Pop();
                        p.Push((
object)(curExp));
                        PrintSetpResult(curExp, s);
                        
#endregion 打印结束
                        
break;
                    }
                    
case "||":
                    {
                        Query q1 
= (Query)s.Pop();
                        Query q2 
= (Query)s.Pop();
                        s.Push(
new OrQuery(q1, q2));
                        
#region 打印当前"||"运算的结果
                        
string curExp = "";
                        curExp 
+= (string)p.Pop();
                        curExp 
+= " || ";
                        curExp 
+= (string)p.Pop();
                        
//curExp = curExp.Insert(curExp.Length, ")");
                        p.Push((object)(curExp));
                        PrintSetpResult(curExp, s);
                        
#endregion 打印结束
                        
break;
                    }
                
case "!":
                    {
                        Query q 
= (Query)s.Pop();
                        s.Push(
new NotQuery(q));
                        
#region 打印当前"!"运算的结果
                        
string curExp = "!";
                        curExp 
+= (string)p.Pop();
                        p.Push((
object)(curExp));
                        PrintSetpResult(curExp, s);
                        
#endregion 打印结束
                        
break;
                    }
                    
default:
                        Console.Error.WriteLine(
"Expression error!");
                        
break;
                }
            }
            
#endregion 核心运算完毕
            
#region 将结果转换成整型行号数组
            
for (int i = 0; i < ((Query)s.Peek()).Solution.Count; i++)
            {
                _queryResult.Add(Convert.ToInt32(((Query)s.Peek()).Solution[i].ToString()));
            }
            
#endregion
        }

        /// <summary>打印运算过程中的分步结果概要
        
/// </summary>
        
/// <param name="curExp">当前表达式字串</param>
        
/// <param name="s">表达式栈</param>
        private void PrintSetpResult(string curExp, Stack s)
        {
            Console.WriteLine(curExp);
            Console.Write(
"        " + ((Query)s.Peek()).Solution.Count + " line(s) math ");
            
for (int j = 0; j < ((Query)s.Peek()).Solution.Count; j++)
            {
                Console.Write(
" [{0}] ", ((Query)s.Peek()).Solution[j]);
            }
            Console.WriteLine();    
        }

        /// <summary>打印结果的详细情况
        
/// </summary>
        public void PrintResultDetails()
        {
            IEnumerator e 
= _queryResult.GetEnumerator();
            
while (e.MoveNext())
            {
                Console.WriteLine(
"[{0}]: {1}",
                    e.Current.ToString(), textContentBuffer[Convert.ToInt32(e.Current.ToString())].ToString());
            }
        }

        /// <summary>读取一个查询文本
        
/// </summary>
        public void AddFile()
        {
            
string fileName = "Test.txt";
            StreamReader fReader 
= File.OpenText(fileName);
            Console.WriteLine(
"Reading " + fileName + " -- please wait!");
            
string aLine = fReader.ReadLine();
            
for (int i = 1null != aLine; i++)
            {
                textContentBuffer.Add((
object)(aLine));
                aLine 
= fReader.ReadLine();
            }
            Console.WriteLine(
"Reading " + fileName + " -- OK, done!");
            Console.WriteLine(
"The text file " + new FileInfo(fileName).Name + ' '
                
+ "         contains " + textContentBuffer.Count
                
+ " lines in " + new FileInfo(fileName).Length + " bytes.");
        }
    }
}

 

抱歉!评论已关闭.