软件工程-第二次作业

博客
(10分)
发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,展示你感觉得意、突破、困难的地方。

词频统计

重点是利用哈希表统计语句中的单词出现次数,用哈希表长度表示单词数量。

难点是自己对C#很陌生,不知道如何去读取文件,输出文件。

解决的困难是在调用文件的过程中犯了一个非常低级的错误,因为文件隐藏导致只输入了文件名,没能输入文件名后缀导致无法调用。还有就是开启控制台的时候,出现闪退情况。加入了Console.ReadKey();后得到了解决。

功能一

代码:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.IO;

class wf
{

    static void Main(string[] args)
    {

        string file_name = args[1];
        //file_name = Console.ReadLine();
        StreamReader sr = new StreamReader(file_name);
        string line;
        //Console.WriteLine(sline.ToString());
        string t = "";
        while ((line = sr.ReadLine()) != null)
        {
            line = line.ToLower();//全部变为小写字母
            //Console.WriteLine(line);
            //Console.ReadKey();//防止闪退-/*
            t += line;
            t += " ";
        }

        char[] c = { ' ', ',', '.', '?', '!', ':', ';', '\'', '\"' };
        //分隔字符串后产生的字符串数组
        string[] ss = t.Split(c);
        //建立哈希表
        Hashtable ha = new Hashtable();
        for (int ii = 0; ii < ss.Length; ii++)
        {
            //判断文本是否进入
            if (ha.ContainsKey(ss[ii]))
            {
                ha[ss[ii]] = (int)ha[ss[ii]] + 1;
            }
            else
            {
                ha.Add(ss[ii], 1);
            }
        }
        //int sum = 0;
        bool flag = false;
        //遍历哈希表

        foreach (DictionaryEntry de in ha)
        {
            if (de.Key == "")
            {
                flag = true;
                continue;
            }
            //追加文本
            //Console.WriteLine(de.Key + ":" + de.Value);


        }
        //string ss = "total:";
        if (flag == true)
        {
            Console.Write("total:");
            Console.WriteLine(ha.Count - 1);
            //Console.ReadKey();//防止闪退  
            //Console.WriteLine("total:", ha.Count - 1);
        }
        else
        {
            Console.Write("total:");
            Console.WriteLine(ha.Count);
            //Console.ReadKey();//防止闪退  
        }


        foreach (DictionaryEntry d in ha)
        {
            if (d.Key == "")
            {
                //flag = true;
                continue;
            }
            Console.WriteLine(d.Key + ":" + d.Value);

        }
        Console.ReadKey();//防止闪退

    }
}

实现截图如下:

 功能二

在控制台输入文件的名字,对文章中单词的数目进行统计。然后对该文件目录进行遍历,并且对每一个文件中的单词进行统计,输出文章中出现的单词以及出现次数,要对单词按照淑贤频率由高到低进行排序。

 

 

FileUtil file2 = new FileUtil();
                        Console.WriteLine("请输入文章名War_and_Peace或Jane_Eyre :");
                        string fileName = Console.ReadLine();
                        string url_choiceTwo = "..\\..\\essay\\" + fileName + ".txt"; 
                        if (File.Exists(url_choiceTwo))
                        {
                            file2.CountEachWord(url_choiceTwo, 2);
                        }
                        else
                        {
                            Console.WriteLine("无效文件");
                        }

实现截图如下:

 功能三

读取已经录入的两篇文章,统计词数,对前十出现频率的单词进行统计并输出。

string[] files = Directory.GetFiles("..\\..\\essay\\");
                        foreach (string f in files)
                        {
                            Console.WriteLine(f);
                            FileUtil file3 = new FileUtil();
                            file3.CountEachWord(f, 3);
                        }

实现截图如下:

 功能四

 该功能支持输入文本并且将文本的内容中的单词量统计出来,如果是小文本,支持全部统计输出,如果是大文本就只输出前十个单词和出现的次数。

 public int Division(int[] valueArray, string[] keyArray, int v1, int v2)
        {
            while (v1 < v2)
            {
                int num = valueArray[v1];
                string num2 = keyArray[v1];
                if (num < valueArray[v1 + 1])
                {
                    valueArray[v1] = valueArray[v1 + 1];
                    valueArray[v1 + 1] = num;

                    keyArray[v1] = keyArray[v1 + 1];
                    keyArray[v1 + 1] = num2;

                    v1++;
                }
                else
                {
                    int temp = valueArray[v2];
                    valueArray[v2] = valueArray[v1 + 1];
                    valueArray[v1 + 1] = temp;

                    string temp2 = keyArray[v2];
                    keyArray[v2] = keyArray[v1 + 1];
                    keyArray[v1 + 1] = temp2;

                    v2--;
                }

            }

 

 实现截图如下:

 

PSP
(8分)

在同一篇博客中,参照教材第35页表2-2和表2-3,为上述“项目”制作PSP阶段表格。
PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。

要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求3中每项时间花费的差距,分析原因。

 

 

       预计时间和实际时间相差有点多,造成的原因是自己对C#语言不够熟练,在上传文件和读取文件的环节中遇到了问题,并且在修改和测试的过程中遇到很多问题如控制台闪退,输出单词中包含空格等。这些都是自己不够细心和经验不足造成的。

 

 

 代码及版本控制:HTTPS:https://git.coding.net/ZhangEJ/wf.git

                                SSH:   git@git.coding.net:ZhangEJ/wf.git

                                 GIT:   git://git.coding.net/ZhangEJ/wf.git

 

posted on 2017-09-18 11:21  张恩聚  阅读(149)  评论(0编辑  收藏  举报