zoukankan      html  css  js  c++  java
  • 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("无法打开此文件!
    ");
    		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 == '
    ')
    		{
    			if (ch >= 'a'&&ch <= 'z' || ch >= 'A'&&ch <= 'Z')
    			{
    				temp[i] = ch;
    				i++;
    				n++;//字符计算
    				
    			
    			}
    			if (ch == '
    ') sum++;//行数计算
    			ch = fgetc(fp);
    			if (feof(fp)) break;
    		}
    		
    		temp[i] = '';
    		p = head->next;
    		while (p)
    		{
    			if (!_stricmp(temp, p->name))
    			{
    				p->num++; break;
    			}
    			p = p->next;
    		}
    		if (!p&&temp[0] != '')
    		{
    			p = new word;
    			m++;//单词计算
    			strcpy_s(p->name, temp);
    			p->num = 1;
    			p->next = head->next;
    			head->next = p;
    		}
    		/* if(!p&&temp[0] == '
    ')
    		{
    			sum++;
    			p->next = head->next;
    			head->next = p;
    		}*/
    		
    	}
    	printf("characters: %d
    ", n);
    	printf("words: %d
    ",m);
    	printf("lines: %d
    ", 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
    ",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的封装和使用(虽然后面采用的不是这种封装方式,不过也学到了)。

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

  • 相关阅读:
    coredata相关文章,还不错
    Predicates
    iOS5新开发的API总述
    免费Excel教程及模板 微软自带 无木马
    历史的商业行为
    销售激励管理流程和Sales Force Mgmt流程
    亚马逊,应用网关 AWS API GATEWAY
    EXCEL 常用函数公式
    华尔街之狼 原型
    FW:Docker与CI持续集成/CD
  • 原文地址:https://www.cnblogs.com/luzeming/p/9637909.html
Copyright © 2011-2022 走看看