一、注意事项
1、程序必须独立完成,不得讨论、代做或抄袭,可联网查阅资料或查阅参考书,但不可下载源码提交或做修改后提交。发现抄袭者,做零分处理。
2、本次命题的程序必须在今晚8点45分之前提交,发送到作业邮箱,方式与平时交作业相同,邮件标题为:学号+姓名+期中。
二、命题题目
完成一个实现英文文本文件的分词功能的程序(分词:是将句子中的每一个单词分离出来)。 程序分两个层次要求:
1、基本功能(完成此功能可得85分)
(1)程序由一个窗体实现,窗体有菜单、状态栏。菜单和状态栏之间有一个多行文本框(在左侧)、一个Listview控件(在右侧),它们之间用分隔条 (Splitter控件或SplitContainer控件)分开,它们会随窗体大小的变化和分隔条的移动而调整,并充满窗体的左右两边。
文本框用于显示要分词的英文文本文件。
Listview用于显示分词的结果(一个单词一项)。
状态栏显示已打开的要分词文件的文件路径和文件名。
(2)菜单有文件子菜单、工具子菜单、帮助子菜单。
文件子菜单有: 打开文件、退出项。两项用分隔条分开。
打开文件菜单项:可以选择一个.txt或*.*文件打开,文件内容显示在文本框内。状态栏显示已打开的文件名。
退出项:可以退出系统,退出前要询问“你真的要退出系统吗?”,按确定或取消来决定是否退出系统。
工具菜单里有一项“执行分词”。分词能将文本框内的英文内容逐个单词取出,写入Listview控件中,每个单词一行。该菜单项一开始不可用,只有在打开文件后方可用。
帮组菜单项有“关于本系统”子菜单项,有一个窗体介绍本系统的基本功能。
(3)快捷菜单功能:但右键点击窗体左边的文本框或右边的ListView控件,都会出现快捷菜单,菜单项包括“打开文件、执行分词”,菜单项的使能与主菜单项相同。
2、高级功能(在完成基本功能基础上,完成此功能可得100分)
(1)主菜单中增加一个“选项”菜单,点击此项出现一个选项窗,可选择设置“区分大小写”,表示分词统计相同单词时是否区分大小写。
(2)Listview控件分两栏,显示分词结果时只显示不相同的单词以及该单词的出现次数。统计单词次数时根据选项设置的“区分大小写”,按单词出现次数降序排序。保存分词结果时每个单词及出现次数按行存放,当中用空格分隔。
(3)在文件菜单里添加“保存分词结果”菜单项:可以将Listview控件中的分词结果保存在一个文本文件中,每个单词一行,显示保存文件对话框以选择保存路径。,输入保存文件名。该菜单项一开始不可用,只有在“执行分词”菜单项后方可用。
(4)系统退出时,若分词的结果尚未保存,提示选择是否保存,若确定保存,显示保存文件对话框用于保存分词结果。
(5)在快捷菜单中增加“保存分词”,与主菜单功能相同。

上图:

主要代码:


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    namespace Split
    {
        public partial class Form1 : Form
        {
            bool isSave;
            public Form1()
            {
                InitializeComponent();
            }
            private void 打开文件OToolStripMenuItem_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFile = new OpenFileDialog();
                openFile.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
                if (openFile.ShowDialog() == DialogResult.OK)
                {
                    isSave = false;
                    listView1.Items.Clear();
                    执行分词DToolStripMenuItem.Enabled = true;
                    执行分词DToolStripMenuItem1.Enabled = true;
                    保存文件StoolStripMenuItem.Enabled = false;
                    保存文件StoolStripMenuItem1.Enabled = false;
                    FileInfo fileInfo = new FileInfo(openFile.FileName);
                    toolStripStatusLabel1.Text = fileInfo.Name;
                    toolStripStatusLabel2.Text = openFile.FileName;
                    richTextBox1.LoadFile(openFile.FileName, RichTextBoxStreamType.PlainText);
                }
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                richTextBox1.Text = "";
                listView1.Items.Clear();
                toolStripStatusLabel1.Text = "";
                toolStripStatusLabel2.Text = "";
                执行分词DToolStripMenuItem.Enabled = false;
                执行分词DToolStripMenuItem1.Enabled = false;
                columnHeader.Width = listView1.Width - 44 - 18;
                columnHeader1.Width = 44;
                listView1.HotTracking = true;
                保存文件StoolStripMenuItem.Enabled = false;
                保存文件StoolStripMenuItem1.Enabled = false;
                isSave = true;
            }
            private void 退出QToolStripMenuItem_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (isSave)
                {
                    DialogResult dr = MessageBox.Show("你真的要退出系统吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (dr == DialogResult.No)
                    {
                        e.Cancel = true;
                    }
                }
                else
                {
                    DialogResult dr = MessageBox.Show("分词结果尚未保存,是否保存?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
                    if (dr == DialogResult.Yes)
                    {
                        保存文件StoolStripMenuItem_Click(sender, e);
                    }
                    if (dr == DialogResult.Cancel)
                    {
                        e.Cancel = true;
                    }
                }
            }
            private void 执行分词DToolStripMenuItem_Click(object sender, EventArgs e)
            {
                isSave = false;
                保存文件StoolStripMenuItem.Enabled = true;
                保存文件StoolStripMenuItem1.Enabled = true;
                char[] sp = new char[255];
                for (int i = 0; i < 255; ++i)
                {
                    sp[i] = ' ';
                    if (((char)(i) >= 'a' && (char)(i) <= 'z') || ((char)(i) >= 'A' && (char)(i) <= 'Z')) continue;
                    sp[i] = (char)(i);
                }
                string[] words = richTextBox1.Text.Split(sp, StringSplitOptions.RemoveEmptyEntries);
                SortedDictionary<string, int> sd = new SortedDictionary<string, int>();
                sd.Clear();
                listView1.Items.Clear();
                if (区分大小写CToolStripMenuItem.Checked)
                {
                    foreach (string word in words)
                    {
                        try
                        {
                            sd.Add(word, 1);
                        }
                        catch
                        {
                            sd[word]++;
                        }
                    }
                    foreach (string word in sd.Keys)
                    {
                        ListViewItem lvt = new ListViewItem();
                        lvt.Text = word;
                        lvt.SubItems.Add(sd[word].ToString());
                        listView1.Items.Add(lvt);
                    }
                }
                else
                {
                    foreach (string word in words)
                    {
                        try
                        {
                            sd.Add(word.ToUpper(), 1);
                        }
                        catch
                        {
                            sd[word.ToUpper()]++;
                        }
                    }
                    foreach (string word in sd.Keys)
                    {
                        ListViewItem lvt = new ListViewItem();
                        lvt.Text = word.ToUpper();
                        lvt.SubItems.Add(sd[word.ToUpper()].ToString());
                        listView1.Items.Add(lvt);
                    }
                }
            }
            private void listView1_SizeChanged(object sender, EventArgs e)
            {
                columnHeader.Width = listView1.Width - 44 - 18;
                columnHeader1.Width = 44;
            }
            private void 打开文件OToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                打开文件OToolStripMenuItem_Click(sender, e);
            }
            private void 执行分词DToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                执行分词DToolStripMenuItem_Click(sender, e);
            }
            private void 关于本系统AToolStripMenuItem_Click(object sender, EventArgs e)
            {
                MessageBox.Show("分词器能将文本框内的英文单词逐个取出;\n可以选择是否区分大小写。", "关于本程序", MessageBoxButtons.OK, MessageBoxIcon.None);
            }
            private void 区分大小写CToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
            {
                执行分词DToolStripMenuItem_Click(sender, e);
            }
            private void 区分大小写CToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (区分大小写CToolStripMenuItem.Checked)
                {
                    区分大小写CToolStripMenuItem.Checked = false;
                }
                else
                {
                    区分大小写CToolStripMenuItem.Checked = true;
                }
            }
            private void 保存文件StoolStripMenuItem_Click(object sender, EventArgs e)
            {
                SaveFileDialog saveFile = new SaveFileDialog();
                saveFile.Filter = "文本文件(*.txt)|*.txt";
                char[] sp = new char[255];
                for (int i = 0; i < 255; ++i) {
                    sp[i] = ' ';
                    if (((char)(i) >= 'a' && (char)(i) <= 'z') || ((char)(i) >= 'A' && (char)(i) <= 'Z')) continue;
                    sp[i] = (char)(i);
                }
                string[] words = richTextBox1.Text.Split(sp, StringSplitOptions.RemoveEmptyEntries);
                SortedDictionary<string, int> sd = new SortedDictionary<string, int>();
                sd.Clear();
                if (区分大小写CToolStripMenuItem.Checked)
                {
                    foreach (string word in words)
                    {
                        try
                        {
                            sd.Add(word, 1);
                        }
                        catch
                        {
                            sd[word]++;
                        }
                    }
                }
                else
                {
                    foreach (string word in words)
                    {
                        try
                        {
                            sd.Add(word.ToUpper(), 1);
                        }
                        catch
                        {
                            sd[word.ToUpper()]++;
                        }
                    }
                }
                if (saveFile.ShowDialog() == DialogResult.OK)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Clear();
                    if (区分大小写CToolStripMenuItem.Checked)
                    {
                        foreach (string word in sd.Keys)
                        {
                            sb.AppendLine(word + " " + sd[word]);
                        }
                    }
                    else
                    {
                        foreach (string word in sd.Keys)
                        {
                            sb.AppendLine(word.ToUpper() + " " + sd[word.ToUpper()]);
                        }
                    }
                    using (StreamWriter outfile = new StreamWriter(saveFile.FileName))
                    {
                        outfile.Write(sb.ToString());
                    }
                }
            }
            private void 保存文件StoolStripMenuItem1_Click(object sender, EventArgs e)
            {
                保存文件StoolStripMenuItem_Click(sender, e);
            }
        }
    }

转载保留版权:http://haipz.com/blog/i/1371 - 海胖博客