南京理工大学C语言讲义第7章
* 静态局部变量:static 在函数内部定义,存储在静态存储区,与auto对应,在别的函数中不能引用。 全局静态变量:static 在函数外部定义,只限在本文件中使用,与extern对应。 当变量名相同致使作用域相重时,起作用的是最近说明的那个变量。 全局变量 静态 static 外部 extern 自动 auto 局部变量 静态 static 寄存器 register * 内部函数和外部函数 内部函数:函数只限于在本文件中调用,其它文件不能调用,用static 定义该函数。 static float fac( int n) { ...... } 外部函数:函数的默认形式,可以被其它文件调用,用extern 定义该函数。调用时,在文件中用extern 说明。 void main(void) { extern enter_string( ); char str[80]; enter_string(str); .......... } 说明外部函数 * 补充算法 方程求解 1、牛顿切线法 只有为数不多的方程有精确解,一般都是用迭代方法近似求方程的解。方程f(x)=0的实数解实际上是曲线f (x)在x轴上交点的值。 f(x) x y x0 * 1、任选一x值x1,在y1=f(x1)处做切线与x轴相交于x2处。 f(x) x y x0 f(x1) x1 x2 2、若|x2-x1|或|f(x2)|小于指定的精度,则令x1=x2,继续做1。当其满足所需的精度时,x2就是方程的近似解。 x1 x2 根据已知点求其切线的公式为: 这就是牛顿切线法。 牛顿切线法收敛快,适用性强,缺陷是必须求出方程的导数。 * 已知方程为f(x)=x*x-a时,用牛顿切线法求方程的解。给定初值x0,精度10-6,算法编程如下。 scanf("%f",&x1); /*从键盘输入x0 */ do { x0=x1; x1=x0-(x0*x0-a)/(2*x0) ; /* */ } while (fabs(x1-x0)>=1e-6) ; printf("x=%f\n",x1); 旧值算本次循环的新值 上一循环的新值成为本次循环的旧值 * void main() { float x1,x0; scanf("%f",&x1); /*从键盘输入x0 */ do { x0=x1; x1=x0-f(x0)/df(x0) ; /* */ } while (fabs(f(x1))>=1e-6) ; printf("x=%f\n",x1); } float f (float x) {return x*x*x-5*x*x+16*x-80; } float df (float x) {return 3*x*x-10*x+16; } f(x) f(x)的导数df(x) * 2、弦截法 f(x) x y x 1、在x轴上取两点x1和x2, 要确保x1与x2之间有且只有方程唯一的解。 x1 x2 f(x1) f(x2) 2、x1与x2分别与f(x)相交于y1=f(x1)、y2=f(x2)。 3、做直线通过y1、y2与x轴交于x0点。 x0 x2 x0 4、若|f(x0)|满足给定的精度,则x0即是方程的解,否则,若f(x0)*f(x1)<0,则方程的解应在x1与x0之间,令x2=x0,继续做2。同理,若f(x0)*f(x1)>0,则方程的解应在x2与x0之间,令x1=x0,继续做2 ,直至满足精度为止。 * 用弦截法求方程的根。 x3-5x2+16x-80=0 #include float f (float x) {return x*x*x-5*x*x+16*x-80; } void main(void ) { float x1,x2, x0; do { printf("Input x1, x2\n")”; scanf("%f%f",&x1,&x2); } while (f(x1)*f(x2)>0); do { x0= (x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); if (f(x0)*f(x1) >0) x1=x0; else x2=x0; }while (fabs(f(x0))>=0.0001)