2017-2018-1 20179215 《构建之法》第一章总结

《构建之法》第一章总结

1.程序=数据结构+算法、 软件=程序+软件工程

 客户们对程序员的需求从一个简单的程序,扩展到一个满足各种功能的应用软件,再扩展到一个能保证维修的软件服务程序,在这里指的是源程序,就是一行行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法程序还要对数据进行操作,这些数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序通过网络下载的数据、用户的文字或语音输入等)但是光有代码和静态数据还是不行,工程师要把它们构建为机器能懂的可执行代码。构建不仅仅是cc和link命令一个复杂的软件不但要有合理的软件架构(Software Architecture)、软件设计与实现(Software Design, Implementation and Debug),还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数,等等。这些都是软件构建的过程。

 源代码管理(Source Code Control)的问题—有时候也叫配置管理(Software Configuration Management)有一系列的工具和程序来保证程序的正确性,这些工具流程和程序本身应该更正确,才能保证别的软件的质量。这就是质量保障(Quality Assurance),具体的验证过程叫做软件测试(Testing)软件团队要从需求分析(Re-quirement Analysis)开始,把合适的需求梳理出来,然后逐步展开后续工作,如设计(软件架构)、实现(写数据结构和算法)、测试,到最后发布软件软件团队的人员也会流动,新的成员要尽快读懂已有的程序,了解程序的设计,这叫程序理解(Pro-gramComprehension)软件在运行过程中还会出这样那样的问题,也许我们要时不时给软件打一个补丁,或者维护众多的服务器,团队的新老成员要一起工作,修复各种各样的问题,这叫软件维护(Software Maintenance),或者服务运营(Service Operation)。

 这一系列过程就是软件的生命周期(Software Life Cycle,SLC),有人得负责软件项目的管理(Project Management)一个好的软件,即使功能和同类软件区别不大,但是会让人感觉到非常好用。这就是软件的用户体验(User Experience)。用户体验和数据结构、算法没有直接的关系,但是很多非常成功的软件就赢在这个方面上面这些和软件开发活动(构建管理、源代码管理、软件设计、软件测试、项目管理)相关的内容,是软件工程的核心部分。广义上的软件工程也包括用户体验、用户界面设计(User Interface Design)等。所以,一个推论是:软件 = 程序 + 软件工程。一个扩展的推论是:软件企业 = 软件 + 商业模式。程序(算法、数据结构)是基本功,但是在算法和数据结构之上,软件工程决定了软件的质量;商业模式决定了一个软件企业的成败。软件从业人员和软件企业的道德操守会极大地影响软件用户的利益。

2.软件开发、软件工程

 2.1软件开发的不同阶段

 2.2软件工程

 软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。

 人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。

软件是可以运行在计算机及电子设备中的指令和数据的有序集合,软件有各种形式:

- 系统软件:操作系统、设备驱动程序、工具软件等

- 应用软件:用户使用它们来完成工作,从管理核电厂到写文章,或者是通信、游戏、浏览网页、播放视频等

- 恶意软件:软件病毒等软件

1. 复杂性(Complexity)

 软件可以说是人类创造的最复杂的系统类型,软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长

2. 不可见性(Invisibility)

 工程师是“看”不到自己的源代码如何具体地在用户的机器上被执行的

3. 易变性(Changeability)

 人们自然地期待软件能在下面两种情况下“改变”: a) 让软件做新的事情;b) 让软件适应新的硬件

4. 服从性(Conformity)

 软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求

5. 非连续性(Discontinuity)

 输入上很小的变化,会引起输出上极大的变化

3.简单的四则运算

 根据指定随机出题,小学的四则运算。使用rand()函数及srand()函数,查了下相关使用方法:rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。 rand()返回一随机数值的范围在0至RAND_ MAX 间。RAND_ MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。用户未设定随机数种子时,系统默认的随机数种子为1。rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它(下面这段代码测试了下两者的不同):

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
	int i;
	//srand((unsigned)time(NULL)); //初始化随机数种子
	for (i=0; i<10; i++)      //产生10个随机数
	{
		cout<<rand()<<" ";
	}
	cout<<endl;
	return 0;
}

四则运算代码:

include <stdio.h>
include <stdlib.h>
include <time.h>
include <math.h>

int main()
{
     int i=0;
     int n=0;
     int x=0;
     int type;
     char flag;
     int left, right;
     float result;
     printf("请输入要出的题目数量\n");
     scanf("%d",&n);
     srand(unsigned(time(NULL)));
		while(x<n)
		{
   			 type = rand() % 4;
    		left = rand() % 100;
    		right = rand() % 100;
    		switch(type)
    		{
   				 case 0:
       				 printf("%d + %d = ?\n", left, right);
       				 break;
   				 case 1:
        			 printf("%d - %d = ?\n", left, right);
       				 break;
    			 case 2:
       				 printf("%d * %d = ?\n", left, right);
       				 break;
   			     case 3:
        			 printf("%d / %d = ?\n", left, right);
        			 break;
    		}

    		i++;
   			 while(i>=n)
   				 {
        			printf("一共 %d 题\n",i); 
       			    printf("继续?[Y/N]\n");
        			fflush(stdin);
        			scanf("%c",&flag);
        			if(flag=='Y'||flag=='y')
        			{
            			printf("请输入要出的题目数量\n");
            			scanf("%d",&n);
            			i=0;
           			    break;
         			}
        	printf("谢谢使用!\n");
        	fflush(stdin);
        	getchar();
        	return 0;
    }
  }
}

结果如图:

      

posted @ 2017-12-03 15:41  20179215袁琳  阅读(237)  评论(1编辑  收藏  举报