你们老师写的也不怎么样。n个数中移动m个的,应该只需要n+m个空间移动n+m次或0空间交换n次。他写成了n*m次移动,你用了2n的空间。
如果你有13个空间,可以直接向后移动三个元素再重新插入。
次数等于n+m次。
#define N 10
#define M 3
for (int i = 0i <N - M++i)
a[N + M - 1 + i] = a[N - 1 - i]
for (int i = 0i <M++i)
a[M - 1 - i] = a[N + M - 1 + i]
如果没有空间,哪也是整体交换,只交换3+3+4次,相当于int(n / m) * m + int(m / (n mod m))*(n mod m)次等于n次。把q位上的n个数移动到p位上。
void swapall(int a[], int p, int q, int n)
{
for (int i = 0i <ni ++) {
int x = a[q + i]
a[q + i] = a[p + i]
a[p + i] = a[q + i]
}
}
/* p <q, n >1 */
void move(int a[], int p, int q, int n) {
while ( p + n <q) {
swapall(a, p, q, n)
p = p + n
}
while ( q - p <n) {
int m = q - p
swapall (a, p, q, m)
n = n - m
p = q
q = p + m
}
}
1.2.1 正确性正确性是指软件按照需求正确执行任务的能力,涵盖“精确性”。正确性是第一重要的软件质量属性。技术评审和测试的第一关是检查工作成果的正确性。
从“需求开发”到“系统设计”再到“编程”,任何一个环节出现差错都会降低正确性。软件运行出错通常都是人造成的,开发者应做到为“正确”两字竭尽全力。
1.2.2 健壮性
健壮性是指在异常情况下,软件能够正常运行的能力。正确性与健壮性的区别是:前者描述软件在需求范围之内的行为,后者描述软件在需求范围之外的行为。想不到异常情况,把异常错当正常而不作处理,这些都会降低健壮性。提高软件的健壮性也是开发者的义务。
健壮性有两层含义:一是容错能力,二是恢复能力。
容错是指发生异常情况时系统不出错误的能力。高风险系统如航空航天、武器、金融等领域的系统,容错性设计非常重要。
容错是非常健壮的意思。而恢复则是指软件发生错误后(不论死活)重新运行时,能否恢复到没有发生错误前的状态的能力。
从语义上理解,恢复不及容错那么健壮。
1.2.3 可靠性
可靠性是指在一定环境下,在给定的时间内,系统不发生故障的概率。因为我们无法对软件进行彻底的测试,无法根除软件中潜在的错误,所以软件平时运行良好,说不准哪天就会不正常,如“千年虫”、“内存泄露”、“误差累积”等。
软件可靠性分析通常采用统计技术,但目前可供第一线开发人员使用的成果少见。
1.2.4 性能
性能通常是指软件的“时间—空间”效率,而不仅是指软件的运行速度。程序员可以通过优化数据结构、算法和代码来提高软件的性能。算法复杂度分析是很好的方法,可以达到“未卜先知”的功效。
1.2.5 易用性
易用性是指用户使用软件的容易程度。它直观体现为“界面友好”、“方便”等。
1.2.6 清晰性
清晰意味着工作成果易读、易理解。开发人员只有在自己思路清晰的时候才可能写出让别人清晰性好的程序和文档。可理解的东西通常是简洁的。简洁是人们对工作“精益求精”的结果,而不是潦草应付的结果。
1.2.7 安全性
安全性是指信息安全Security,不是safety。安全性是指防止系统被非法入侵的能力,既属于技术问题又属于管理问题。对于大多数软件产品而言,杜绝非法入侵既不可能也没必要。一般地,如果黑客为非法入侵花费的代价(考虑时间、费用、风险等因素)高于得到的好处,这样的系统被认为是安全的。
1.2.8 可扩展性
可扩展性反映软件适应“变化”的能力。在软件开发过程中,需求、设计、算法的改进、程序本身都有可能变化,
软件是否容易修改关键看它的规模和复杂性。可扩展性是系统设计阶段重点考虑的质量属性。
1.2.9 兼容性
兼容性是指两个或以上的软件相互交换信息的能力。开发某领域的新软件,应与已流行的软件相兼容,否则难以被市场接受。
1.2.10 可移植性
可移植性是指软件运行于不同软硬件环境的能力。编程语言越低级,程序越难移植。C比汇编可移植性好,Java号称“一次编程、到处运行”,具有100%的可移植性。
软件设计时应该将“设备相关程序”与“设备无关程序”分开,将“功能模块”
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)