2018软工实践作业二之个人作业

2018软工作业二之个人项目

PSP

  • 解题思路
  1. 刚看到题目,我就思考这个应该使用什么来解决,第一想法是数组,但是后面觉得数组大小拓展不方便,还可能浪费内存,相对而言,链表的内存利用率高,而且容易拓展,不存在越界
  2. 至于编程语言,肯定是c/c++ ,因为其他的需要不熟悉!
  3. 最后把题目copy一下,百度一下,参考一下别人的思路,毕竟柯大神说过类似的话 ”在目前最好的基础上改进,改进了你就是top1”,”有参考的为什么不参考呢”。
  • 代码设计过程
  1. 我的想法是有两部分,读取文本和检测字符 + 统计top10并按字母表输出。
  2. 代码分成两个函数,一个是 **readfile(struct word*&head)**,用来去读文本并且统计统计

        characters: number
        words: number
        lines: number

    另外一个是 **sort(struct word*&head)**,用来挑选出单词中出现频率TOP10的单词。

  • 设计实现过程

1.readfile()

        基本思想:
        1.count记录单词出现的次数,word存储新单词。
        2.一个字符一个字符进行判断, 判断前将‘A-Z’转为‘a-z’
        判断条件为:
            1.如果没有到单词分割位,则将‘a-z’存入临时字串temp[30],
            2.如果出现超过30位的单词,则认为文档出错,将这个单词舍去,直到下一个分割符后才重新进行记录。
            3.每个单词分割位为非‘a-z’的ASCII码,但是‘-’除外,有些合成单词会使用‘-’
            4.汉字不考虑
struct word {
    char name[30];
    int num;
    struct word *next;
};
void readfile(struct word*&head)
{
    FILE *fp;
    int n = 0,m = 0,sum=0;
    if ((fp = fopen("D:\\VSprogram\\ConsoleApplication1\\hao.txt", "r")) == NULL)//读取文本
    {
        printf("无法打开此文件!\n");
        exit(0);
    }
    
    char ch, temp[30];
    struct word *p;
    while (!feof(fp))
    {
        int i = 0;
        ch = fgetc(fp);//读取字符
        temp[0] = ' ';
        while ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || temp[0] == ' '||ch == '\n')
        {
            if (ch >= 'a'&&ch <= 'z' || ch >= 'A'&&ch <= 'Z')
            {
                temp[i] = ch;
                i++;
                n++;//字符计算
                
            
            }
            if (ch == '\n') sum++;//行数计算
            ch = fgetc(fp);
            if (feof(fp)) break;
        }
        
        temp[i] = '\0';
        p = head->next;
        while (p)
        {
            if (!_stricmp(temp, p->name))
            {
                p->num++; break;
            }
            p = p->next;
        }
        if (!p&&temp[0] != '\0')
        {
            p = new word;
            m++;//单词计算
            strcpy_s(p->name, temp);
            p->num = 1;
            p->next = head->next;
            head->next = p;
        }
        /* if(!p&&temp[0] == '\n')
        {
            sum++;
            p->next = head->next;
            head->next = p;
        }*/
        
    }
    printf("characters: %d\n", n);
    printf("words: %d\n",m);
    printf("lines: %d\n", sum+1);
    
}

2.sort()

    基本思想:将所有单词统计形成链表之后,需要对链表的top10进行统计。
    
    基本思路:

    1.用Top指针指引head指针所指引的原链表的前10项。用p指针指向第11项

    2.Top的尾指针指为空

    3.对top引导的十项使用排序算法进行排序。
    排序算法基本思想:

    1.用计数器和指针,记录指向从当前项到末尾项的最高count,然后用一个指针指向这个节点,最后和当前项进行节点内容数据进行交换,使得各节点的物理地址不发生变化。
    2.从第11项开始,将每个节点的记录count同前十个进行比较,如果大于当前项则进行节点的插入,同时将最后一个节点删除。需要记录的节点指针位置有:当前节点的前一项以及top10节点中的第十项,主链表的当前项。

void sort(struct word*&head)
{
    struct word *q;
    int a[10], i;
    for (i = 0; i < 10; i++)
        a[i] = 0;
  //top10
    for (i = 0; i < 10; i++)
    {
        q = head;
        while (q != NULL)
        {
            if (q->num > a[i])
                a[i] = q->num;
            else
                q = q->next;
        }
        q = head;
        while (q != NULL)
        {
            if (a[i] == q->num)
            {
                q->num = 0;
                printf("%s:", q->name);
                printf("%d\n",a[i]);
                //puts(q->name);
                break;
            }
            else
                q = q->next;
        }
    }
}

3.单元测试


  • 性能分析

大概花费花费30min在性能分析上,main()函数连续10000执行的性能分析图如下:
这里写图片描述

大致可以看出,fopen和fgetc耗时较多

这里写图片描述

函数的性能分析图

这里写图片描述


  • 函数单元测试

这里写图片描述

  • 心得体会

    这次作业,原本以为只是小试牛刀,想不到是大伤筋骨。远远低估了软工,这学期其实应该叫做“软工时间”。真的可以占据我百分80的spare time,心态崩了啊!上周末我的“蜗牛神机”又拿去大利嘉维修,两天都没能着手,拿回来还得重装系统和软件。眼看DDL就要了,连续三天爆肝!过程痛苦,结果美好。这次作业,颇有收获:
    1. 捡起来了git
    2. 学会了vs的各种调试分析工具和各种用法如:函数覆盖率、单元测试、性能堪查器、还有dll的封装和使用(虽然后面采用的不是这种封装方式,不过也学到了)。

    至于构建之法,很尴尬,书还没买,还没看。等书到了再更新下博客吧。心态崩了啊!!

转载于:https://www.cnblogs.com/luzeming/p/9637909.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值