算法:
对特定问题求解步骤的一系列描述,也就是解决问题的步骤。
例如,以下是求解两个正整数m和n的最大公约数的算法:
(1) r = m mod n;
(2) 若r ==0,则输出n,算法结束。
(3)若r!==0,令m = n,n = r,转(1)继续。
一个算法应具有一下特性:
(1)有穷性:能够执行完,不能够是死循环。
(2)确定性:输入同一个值,无论在什么时候都是同样的输出。
(3)可行性:可运行的,没有语法错误。
(4)有输入:有0个或多个输入。
(5)有输出:好让程序员知道这个函数干了什么,有没有运行成功。
算法设计的目标
(1)正确性
(2)可使用性
(3)可读性
(4)健壮性:能够适应多种条件,提供异常处理。
(5)高效低储性
算法描述
计算机专业的同学应该熟练使用程序语言描述算法,其实也就是要你会编函数。
例如,以下是求解一个一元二次方程的根及其根的个数的算法。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double Delta(double b,double a,double c,int *num)
{
double delta;
delta = b*b - 4*a*c;
if (delta >0)
{
*num = 2;
}
else if (delta == 0)
{
*num = 1;
}
else
{
*num = 0;
}
return delta;
}
int solution(double a,double b,double c,double *x1,double *x2,int *num)
{
double delta;
delta = Delta(b,a,c,num);
if (*num ==2)
{
*x1 = (-b - sqrt(delta))/(2 * a);
*x2 = (-b + sqrt(delta))/(2 * a);
printf("x1 = %.6lf\nx2 = %.6lf", *x1,*x2);
}
else if (*num == 1)
{
*x1 = *x2 = (-b)/(2 * a);
printf("x1 = x2 = %.6lf", *x1);
}
else
{
printf("不好意思,您所求的方程组没有解。");
}
return 0;
}
int main()
{
/*ADT Function
{ 数据对象:
D = {a,b,c,x1,x2,num|a,b,c,x1,x2,num均为实数}
数据关系:
R = {<a,b,c,x1,x2,num> | a,b,c分别为由最高项由高到低的项的系数,
x1,x2是a,b,c所确定的方程的解,num是这个方程的解的个数}
基本运算:
Delta(b,a,c,&num):计算Δ,b,a,c分别对应一次,二次和常数项的系数,
返回delta的值num。
Accumulate(a,b,d,&res):计算方程的解,a,b,d分别是二次项华为一次项的系数,
d是Delta()函数的返回值。
}
*/
double a = 2.0,b = 6.0,c = 3.0,x1,x2;//a不可为0
int num;
double *y1 = &x1,*y2 = &x2;
int *Num = #
solution(a,b,c,y1,y2,Num);
return 0;
}