现代软件工程 第一章 【概论】练习与讨论
1.像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的“软件”,和同学们比较一下各自程序的功能、实现方法的异同等等。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int moshi;
int count;
void plus(int first,int second)
{
int result;
printf("%d + %d =",first,second);
scanf("%d",&result);
if(result == first+second)
{
printf("Right!\n");
}
else
{
printf("wrong!\nThe correct answer is:%d\n",first+second);
}
}
void minus(int first,int second)
{
int result;
printf("%d - %d =",first,second);
scanf("%d",&result);
if(result == first-second)
{
printf("Right!\n");
}
else
{
printf("wrong!\nThe correct answer is:%d\n",first+second);
}}
void multiply(int first,int second)
{
int result; //运算结果
printf("%d * %d =",first,second);
scanf("%d",&result);
if(result == first*second)
{
printf("Right!\n");
}
else
{
printf("wrong!\nThe correct answer is:%d\n",first*second);
}
}
void divide(int first,int second)
{
float result; //运算结果
float temp;
second = rand()%100;
printf("%d / %d =",first,second);
if(second==0)
{
printf("Error!\n");
return;
}
scanf("%f",&result);
temp=result*100 - ((float)first/(float)second)*100;
if(abs(temp)<0.01)
{
printf("Right!\n");
}
else
{
printf("wrong!\nThe correct answer is:%f\n",(float)first/(float)second);
}
}
int main()
{
printf("小提示:\n每种模式默认运行5次就得重新选择,中途退出直接按Ctrl+c!\n");
p: printf("请选择模式:\n\n");
printf("----------1:练习模式\n");
printf("----------2:计算模式\n");
count=0;
scanf("%d",&moshi);
switch(moshi)
{
case 1:
{ int n;
int first,second;//保存两个运算的数字
while(true)
{
n=first%4; //除以4取余数,随机确定调用函数
srand(time(NULL));
first = rand()%100;
second = rand()%100;
if(count==5)
goto p;
switch(n)
{
case 0:
{
plus(first,second);
count++;
break;
}
case 1:
{
minus(first,second);
count++;
break;
}
case 2:
{
multiply(first,second);
count++;
break;
}
case 3:
{
divide(first,second);
count++;
break;
}
default:
{
count++;
break;
}
}//switch
}//while
}//case1
case 2:
{
int first,second;
char c,c1; //保存运算符
while(true)
{
scanf("%d%c%d%c",&first,&c,&second,&c1);
if(count==5)
goto p;
switch(c)
{
case '+':
{
printf("%d+%d=%d\n",first,second,first+second);
count++;
break;
}
case '-':
{
printf("%d-%d=%d\n",first,second,first-second);
count++;
break;
}
case '*':
{
printf("%d*%d=%d\n",first,second,first*second);
count++;
break;
}
case '/':
{
printf("%d/%d=%f\n",first,second,(float)first/(float)second);
count++;
break;
}
default:
{
count++;
break;
}
}//switch
}//while
}//case2
default:
{
break;
}
}
return 0;
}
2.列举你在使用软件的时候观察到的“特殊”现象,它们能说明软件的某些本质特性么?
a)在使用软件的时候,因为现在操作系统包括应用程序都有着可视化界面,所以没有办法看到源代码,这个验证了软件的不可见性;
b)目前大多数软件都有一个更新设置,常用软件以及受欢迎的软件几乎每个月都要产生一个新的版本,这个就是软件的易变性;
c)很多流行的应用程序往往是多平台的,比如微软的onenote;
3.上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?
TFS(Team Foundation Server )是一个工作流协作的引擎,它允许一个团队使用他们自定义的流程,并使用在项目历史中实时收集起来的一个集中的数据仓库。
优点:集成性。版本控制系统和工作项存储器在注册时集成在一起。当注册时,可以将其与一个或多个工作项关联。新概念:搁置集
GitHub:Ruby社区的程序员使用Git以后,找不到好的Git托管网站,于是就开发了Github出来。
优点:重视社区活动,在GitHub,用户可以十分轻易地找到海量的开源代码。
Trac是一个为软件开发项目需要而集成了Wiki和问题跟踪管理系统的应用平台,是一个开源软件应用。
优点:力求不影响现有团队的开发过程,良好的扩充性,以里程碑的方式进行项目管理。
Bugzilla:是一款具有追踪系统的软件。
优点:开源免费,缺陷跟踪。强大的检索功能。
xcode集成了svn源代码管理客户端。
优点:分支管理系统,易于管理,集中式服务器更能保证安全性,管理方便,逻辑明确,符合一般人思维习惯.
4.软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?
个人认为是,而且软件工程不仅是教不会写程序的人开发软件,更是再教已经懂得开发语言的程序员如何更好地开发软件。
5.你所在的学校有计算机科学专业和软件工程专业么?相关专业的教学计划和毕业出路有什么不同?阅读有关软件工程和计算机科学的区别的文章,谈谈你的看法。
有。教学计划比较杂乱,比如说编程语言在毕业以后经常使用的也就一两种(必须精通熟练),但是在学校里各种语言都要学,导致都不精通,不能适应企业要求。
个人觉得软件工程本身是实践性很强的学科,而目前高校计算机专业的课程设置以理论知识为核心
- 软件工程永远不会成为一个严格的经过验证的结果,因为它涉及到人类活动。
- 论文是自我实现。如果解决了严格的软件工程的一些区域,你可以重新定义软件工程。
- 软件工程中的统计结果已经证明了论文。
- 我们应该停止试图证明软件工程结果
6.有学生提到,在大学选课的时候,可以写一个“刷课机”的程序,利用学校选课系统的弱点或漏洞,帮助某些人选到某些课程。或者帮助用户刷购票网站,先买到火车票。这些软件合法么?符合道德规范么?是在“软件工程”的研究范围么? 请大家讨论。
不合法,应该禁止。但是如果是在封闭网络内做网络安全研究,个人认为是可行的。
7.有人认为,“中文编程”, 是解决中国程序员编程效率一个秘密武器,请问它是一个 “银弹” 么?
中文编程技术关键不是简单程序编写汉字标识使用,而是程序代码的编译技术必须自己掌握,编程与编译必须互为统一发展。个人认为做得好必然是一个银弹。
11.请问 “软件” 和 “软件工程” 这些词汇是如何出现的 - 何时、何地、何人
1958 年Turkey在论文"The Teaching of Concrete Mathematics"中提出。最早见于Richard R. Carhart,1953年
软件工程,1968 年北大西洋公约组织在前联邦德国开会提出的