论文部分内容阅读
摘要:在中学数学教学内容中,应用一元二次方程求根公式计算一元二次方程的根和应用高斯主元素消去法计算线性方程组的解是一部分具有机械计算性的程式化的单元,这使得很适合用C语言编写其计算程序。按照结构化思路设计编写C程序的二个实例。
关键词:C语言;结构化;计算程序
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31611-03
Compiling two General Computer Programs in C Language
LIU Xiao-mang
(Jiangxi College of Applied Technology,Ganzhou 341000,China)
Abstract:In the middle school's mathematics curriculum,the calculating of the solution of a quadratic equation with two unknowns with its formula and the calculating of the solution of linear equation with Goss's eliminating the major elements solution are two units which involves mechanical formula computation. They are suitable for compiling computer programs in C Language. Here are two examples of compiling C program with the perspective of construction.
Key words:C Language; construction;computing sequence
在中学数学教学内容中,应用一元二次方程求根公式计算一元二次方程的根和应用高斯主元素消去法计算线性方程组的解是一部分具有机械计算性的程式化的单元,这使得很适合用C语言编写其计算程序. 下面即二个实例.
1 用求根公式解一元二次方程的程序
从代数学中知道,应用一元二次方程求根公式计算一般一元二次方程ax2+bx+c=0根的全过程和一元二次方程根的可能情况如下:
观察判断a和b是否为零.
如果a=b=0,那么方程为0x2+0x+0=0,无穷多解,或0x2+0x+c=0(c≠0),无解;
如果a=0,b≠0,那么方程为0x2+bx+c=0,x=-c/b;
如果a≠0,那么方程为
ax2+0x+0=0, ax2+0x+c=0, ax2+bx+0=0, ax2+bx+c=0
之一,可统一为
(1)若d=b2-4ac<0,则有一对共轭复根
(2)若d=b2-4ac=0,则有重根
(3)若d=b2-4ac>0,则有一对相异实根
简要显示题目和有关信息;设置变量h作为解一元二次方程次数的计数器(亦即题号);由键盘输入一元二次方程的二次项系数、一次项系数和常数项;用一组标记值0 0 0控制解题完毕.
C程序
#include"math.h"
main()
{int h;
double a,b,c,d,r,s;
printf("\n");printf("\n");
printf("用求根公式解一元二次方程:");
printf("\n");
h=0;
loop:h=h+1;
printf("\n");printf("\n");
printf("%d.%14ca b c=?%c",h,'','');
scanf("%lf%lf%lf",&a,&b,&c);
printf("\n");
if(a==0.0&&b==0.0&&c==0.0)printf("%16c完毕.",'');
else{printf("%10c解方程%4.2fx*x",'',a);
if(b<0.0)printf("%4.2fx",b);
else printf ("+%4.2fx",b);
if(c<0.0)printf("%4.2f=0.00",c);
else printf("+%4.2f=0.00",c);
printf("\n");printf("\n");
if(a==0.0&&b==0.0)printf("%16c无解",'');
else if(a==0.0)printf("%16cx=%f",'',-c/b);
else{d=b*b-4*a*c,r=-b/(2.0*a),s=sqrt(fabs(d))/(2.0*a);
if(d<0.0&&s<0.0)
printf("%16cx1=%4.2f%4.2fi%16cx2=%4.2f+%4.2fi",'',r,s,'',r,fabs(s));
if(d<0.0&&s>=0.0)
printf("%16cx1=%4.2f+%4.2fi%16cx2=%4.2f-%4.2fi",'',r,s,'',r,s);
if(d==0.0)printf("%16cx1=x2=%4.2f",'',r);
if(d>0.0)printf("%16cx1=%4.2f%16cx2=%4.2f",'',r+s,'',r-s);}goto loop;}}
运行显示
用求根公式解一元二次方程:
(1)a b c=? 1 2 1
解方程1.00x*x+2.00x+1.00=0.00
x1=x2=-1.00
(2)a b c=? 1 1 0
解方程1.00x*x+1.00x+0.00=0.00
x1=0.00x2=-1.00
(3)a b c=? 1 2 -3
解方程1.00x*x+2.00x-3.00=0.00
x1=1.00x2=-3.00
(4)a b c=? 4 -4 2
解方程4.00x*x-4.00x+2.00=0.00
x1=0.50+0.50ix2=0.50-0.50i
(5)a b c=? 0 0 2
解方程0.00x*x+0.00x+2.00=0.00
无解
(6)a b c=? 0 0 0
完毕.
2 用高斯主元素消去法解线性方程组的程序
设线性方程组写成
其中Ai,k为非奇异实矩阵.
解线性方程组的高斯主元素消去法如下:
首先在系数矩阵中找出模最大的元素(主元素),将其所在行与第一行互换,并将其所在列的其它元素消去. 继而对从第二行开始的n-1 行矩阵重复上述变换,直至第n行. 最后, 再将结果次序适当排列即得线性方程组的解.
例如,给出一线性方程组:
这里,选择的主元素必须不等于零,否则方程组系数矩阵对应的行列式D=0,方程组无解或有无穷多解,不予讨论.
上面方法步骤总结归纳成为下面计算算法:
读入方程组系数和常数项.
(1)显示方程组;
(2)设置变量i为消元次数计数器,1=>i;
*找增广矩阵左下角n-i+1行n列矩阵的主元素,主元素=>t,主元素所在行、列序号=>p、q. 交换i行(主行)与p行(主元素所在行),将主元素所在列其它元素化为0. i+1=>i,若i≤n,则转*;
(3)去系数并显示方程组的解.
根据高斯主元素消去法的计算算法,可以在其C程序中划分出显示、消元和求解三个功能函数,按照结构化思路设计编写C程序.
简要显示题目和有关信息;设置变量h 作为解线性方程组次数的计数器(亦即题号);由键盘输入线性方程组的未知数个数、系数和常数项;用一个标记值0控制解题完毕.
C程序
#include"math.h"
main()
{void xs(double b[7][8],int n);
void xy(double b[7][8],int l[7],int n,double u[1]);
void qj(double b[7][8],int l[7],int n);
int h,n,i,j,m[7];
double a[7][8],t[1];
printf("\n");printf("\n");
printf("用高斯主元素消去法解线性方程组:");
printf("\n");printf("\n");
h=0;
loop:h=h+1;
printf("%d.%18c线性方程组的未知数个数 n=?%c",h,'','');
scanf("%d",&n);
printf("\n");
if(n==0)printf("%20c完毕.",'');
else{printf("%20c线性方程组的系数和常数项=?%c",'','');
printf("\n");printf("\n");
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
printf("\n");
xs(a,n);
for(i=1;i<=n;i++)m[i]=0;
t[0]=0.0;
xy(a,m,n,t);
printf("%12c|",'');
printf("\n");printf("\n");
xs(a,n);
if(t[0]==0.0)printf("%20c主元素=0\n\n",'');
else qj(a,m,n);
goto loop;}}
void xs(double b[7][8],int n)
{int i,j;
for(i=1;i<=n;i++)
{printf("%4.2fx1",b[i][1]);
for(j=2;j<=n;j++)
if(b[i][j]<0.0)printf("%4.2fx%d",b[i][j],j);
else printf("+%4.2fx%d",b[i][j],j);
printf("=%4.2f",b[i][j]);
printf("\n");printf("\n");}}
void xy(double b[7][8],int l[7],int n,double u[1])
{int i,j,k,p,q;
double c,r;
for(i=1;i<=n;i++)
{p=i,q=1,u[0]=b[i][1];
for(j=i;j<=n;j++)
for(k=1;k<=n;k++)
if(fabs(b[j][k])>fabs(u[0]))u[0]=b[j][k],p=j,q=k;
if(u[0]!=0.0){for(k=1;k<=n+1;k++)c=b[i][k],b[i][k]=b[p][k],b[p][k]=c;
for(j=1;j<=n;j++)if((j!=i)&&(b[j][q]!=0.0)) {r=b[j][q]/b[i][q];for(k=1;k<=n+1;k++)b[j][k]=b[j][k]-b[i][k]*r;}}l[i]=q;}}
void qj(double b[7][8],int l[7],int n)
{int i,j;
double s[7];
for(i=1;i<=n;i++)j=l[i],s[j]=b[i][n+1]/b[i][j];
for(j=1;j<=n;j++)if(s[j]<0.0)printf("%21c%d=%f\n\n",'x',j,s[j]);
else printf("%21c%d=+%f\n\n",'x',j,s[j]);}
运行显示
用高斯主元素消去法解线性方程组:
(1)线性方程组的未知数个数 n=? 3
线性方程组的系数和常数项=?
1 2 2 5 2 6 5 22 1 -2 -3 -1
1.00x1+2.00x2+2.00x3=5.00
2.00x1+6.00x2+5.00x3=22.00
1.00x1-2.00x2-3.00x3=-1.00
|
-0.00x1+6.00x2+0.00x3=54.00
1.67x1+0.00x2+0.00x3=-1.67
0.00x1+0.00x2+0.60x3=-3.60
x1=-1.00000
x2=+9.000000
x3=-6.000000
(2)线性方程组的未知数个数 n=? 2
线性方程组的系数和常数项=?
1 2 3 1 2 4
1.00x1+2.00x2=3.00
1.00x1+2.00x2=4.00
|
1.00x1+2.00x2=3.00
0.00x1+0.00x2=1.00
主元素=0
(3)线性方程组的未知数个数 n=? 0
完毕.
除上面用C语言编写的二个通用计算程序外,在中学数学教学内容中还有一些计算算法可以用C语言编写其计算程序,限于篇幅,这里就不赘述了。
参考文献:
[1]谭浩强.C程序设计.第2版.北京:清华大学出版社,1999.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:C语言;结构化;计算程序
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31611-03
Compiling two General Computer Programs in C Language
LIU Xiao-mang
(Jiangxi College of Applied Technology,Ganzhou 341000,China)
Abstract:In the middle school's mathematics curriculum,the calculating of the solution of a quadratic equation with two unknowns with its formula and the calculating of the solution of linear equation with Goss's eliminating the major elements solution are two units which involves mechanical formula computation. They are suitable for compiling computer programs in C Language. Here are two examples of compiling C program with the perspective of construction.
Key words:C Language; construction;computing sequence
在中学数学教学内容中,应用一元二次方程求根公式计算一元二次方程的根和应用高斯主元素消去法计算线性方程组的解是一部分具有机械计算性的程式化的单元,这使得很适合用C语言编写其计算程序. 下面即二个实例.
1 用求根公式解一元二次方程的程序
从代数学中知道,应用一元二次方程求根公式计算一般一元二次方程ax2+bx+c=0根的全过程和一元二次方程根的可能情况如下:
观察判断a和b是否为零.
如果a=b=0,那么方程为0x2+0x+0=0,无穷多解,或0x2+0x+c=0(c≠0),无解;
如果a=0,b≠0,那么方程为0x2+bx+c=0,x=-c/b;
如果a≠0,那么方程为
ax2+0x+0=0, ax2+0x+c=0, ax2+bx+0=0, ax2+bx+c=0
之一,可统一为
(1)若d=b2-4ac<0,则有一对共轭复根
(2)若d=b2-4ac=0,则有重根
(3)若d=b2-4ac>0,则有一对相异实根
简要显示题目和有关信息;设置变量h作为解一元二次方程次数的计数器(亦即题号);由键盘输入一元二次方程的二次项系数、一次项系数和常数项;用一组标记值0 0 0控制解题完毕.
C程序
#include"math.h"
main()
{int h;
double a,b,c,d,r,s;
printf("\n");printf("\n");
printf("用求根公式解一元二次方程:");
printf("\n");
h=0;
loop:h=h+1;
printf("\n");printf("\n");
printf("%d.%14ca b c=?%c",h,'','');
scanf("%lf%lf%lf",&a,&b,&c);
printf("\n");
if(a==0.0&&b==0.0&&c==0.0)printf("%16c完毕.",'');
else{printf("%10c解方程%4.2fx*x",'',a);
if(b<0.0)printf("%4.2fx",b);
else printf ("+%4.2fx",b);
if(c<0.0)printf("%4.2f=0.00",c);
else printf("+%4.2f=0.00",c);
printf("\n");printf("\n");
if(a==0.0&&b==0.0)printf("%16c无解",'');
else if(a==0.0)printf("%16cx=%f",'',-c/b);
else{d=b*b-4*a*c,r=-b/(2.0*a),s=sqrt(fabs(d))/(2.0*a);
if(d<0.0&&s<0.0)
printf("%16cx1=%4.2f%4.2fi%16cx2=%4.2f+%4.2fi",'',r,s,'',r,fabs(s));
if(d<0.0&&s>=0.0)
printf("%16cx1=%4.2f+%4.2fi%16cx2=%4.2f-%4.2fi",'',r,s,'',r,s);
if(d==0.0)printf("%16cx1=x2=%4.2f",'',r);
if(d>0.0)printf("%16cx1=%4.2f%16cx2=%4.2f",'',r+s,'',r-s);}goto loop;}}
运行显示
用求根公式解一元二次方程:
(1)a b c=? 1 2 1
解方程1.00x*x+2.00x+1.00=0.00
x1=x2=-1.00
(2)a b c=? 1 1 0
解方程1.00x*x+1.00x+0.00=0.00
x1=0.00x2=-1.00
(3)a b c=? 1 2 -3
解方程1.00x*x+2.00x-3.00=0.00
x1=1.00x2=-3.00
(4)a b c=? 4 -4 2
解方程4.00x*x-4.00x+2.00=0.00
x1=0.50+0.50ix2=0.50-0.50i
(5)a b c=? 0 0 2
解方程0.00x*x+0.00x+2.00=0.00
无解
(6)a b c=? 0 0 0
完毕.
2 用高斯主元素消去法解线性方程组的程序
设线性方程组写成
其中Ai,k为非奇异实矩阵.
解线性方程组的高斯主元素消去法如下:
首先在系数矩阵中找出模最大的元素(主元素),将其所在行与第一行互换,并将其所在列的其它元素消去. 继而对从第二行开始的n-1 行矩阵重复上述变换,直至第n行. 最后, 再将结果次序适当排列即得线性方程组的解.
例如,给出一线性方程组:
这里,选择的主元素必须不等于零,否则方程组系数矩阵对应的行列式D=0,方程组无解或有无穷多解,不予讨论.
上面方法步骤总结归纳成为下面计算算法:
读入方程组系数和常数项.
(1)显示方程组;
(2)设置变量i为消元次数计数器,1=>i;
*找增广矩阵左下角n-i+1行n列矩阵的主元素,主元素=>t,主元素所在行、列序号=>p、q. 交换i行(主行)与p行(主元素所在行),将主元素所在列其它元素化为0. i+1=>i,若i≤n,则转*;
(3)去系数并显示方程组的解.
根据高斯主元素消去法的计算算法,可以在其C程序中划分出显示、消元和求解三个功能函数,按照结构化思路设计编写C程序.
简要显示题目和有关信息;设置变量h 作为解线性方程组次数的计数器(亦即题号);由键盘输入线性方程组的未知数个数、系数和常数项;用一个标记值0控制解题完毕.
C程序
#include"math.h"
main()
{void xs(double b[7][8],int n);
void xy(double b[7][8],int l[7],int n,double u[1]);
void qj(double b[7][8],int l[7],int n);
int h,n,i,j,m[7];
double a[7][8],t[1];
printf("\n");printf("\n");
printf("用高斯主元素消去法解线性方程组:");
printf("\n");printf("\n");
h=0;
loop:h=h+1;
printf("%d.%18c线性方程组的未知数个数 n=?%c",h,'','');
scanf("%d",&n);
printf("\n");
if(n==0)printf("%20c完毕.",'');
else{printf("%20c线性方程组的系数和常数项=?%c",'','');
printf("\n");printf("\n");
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
printf("\n");
xs(a,n);
for(i=1;i<=n;i++)m[i]=0;
t[0]=0.0;
xy(a,m,n,t);
printf("%12c|",'');
printf("\n");printf("\n");
xs(a,n);
if(t[0]==0.0)printf("%20c主元素=0\n\n",'');
else qj(a,m,n);
goto loop;}}
void xs(double b[7][8],int n)
{int i,j;
for(i=1;i<=n;i++)
{printf("%4.2fx1",b[i][1]);
for(j=2;j<=n;j++)
if(b[i][j]<0.0)printf("%4.2fx%d",b[i][j],j);
else printf("+%4.2fx%d",b[i][j],j);
printf("=%4.2f",b[i][j]);
printf("\n");printf("\n");}}
void xy(double b[7][8],int l[7],int n,double u[1])
{int i,j,k,p,q;
double c,r;
for(i=1;i<=n;i++)
{p=i,q=1,u[0]=b[i][1];
for(j=i;j<=n;j++)
for(k=1;k<=n;k++)
if(fabs(b[j][k])>fabs(u[0]))u[0]=b[j][k],p=j,q=k;
if(u[0]!=0.0){for(k=1;k<=n+1;k++)c=b[i][k],b[i][k]=b[p][k],b[p][k]=c;
for(j=1;j<=n;j++)if((j!=i)&&(b[j][q]!=0.0)) {r=b[j][q]/b[i][q];for(k=1;k<=n+1;k++)b[j][k]=b[j][k]-b[i][k]*r;}}l[i]=q;}}
void qj(double b[7][8],int l[7],int n)
{int i,j;
double s[7];
for(i=1;i<=n;i++)j=l[i],s[j]=b[i][n+1]/b[i][j];
for(j=1;j<=n;j++)if(s[j]<0.0)printf("%21c%d=%f\n\n",'x',j,s[j]);
else printf("%21c%d=+%f\n\n",'x',j,s[j]);}
运行显示
用高斯主元素消去法解线性方程组:
(1)线性方程组的未知数个数 n=? 3
线性方程组的系数和常数项=?
1 2 2 5 2 6 5 22 1 -2 -3 -1
1.00x1+2.00x2+2.00x3=5.00
2.00x1+6.00x2+5.00x3=22.00
1.00x1-2.00x2-3.00x3=-1.00
|
-0.00x1+6.00x2+0.00x3=54.00
1.67x1+0.00x2+0.00x3=-1.67
0.00x1+0.00x2+0.60x3=-3.60
x1=-1.00000
x2=+9.000000
x3=-6.000000
(2)线性方程组的未知数个数 n=? 2
线性方程组的系数和常数项=?
1 2 3 1 2 4
1.00x1+2.00x2=3.00
1.00x1+2.00x2=4.00
|
1.00x1+2.00x2=3.00
0.00x1+0.00x2=1.00
主元素=0
(3)线性方程组的未知数个数 n=? 0
完毕.
除上面用C语言编写的二个通用计算程序外,在中学数学教学内容中还有一些计算算法可以用C语言编写其计算程序,限于篇幅,这里就不赘述了。
参考文献:
[1]谭浩强.C程序设计.第2版.北京:清华大学出版社,1999.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。