高斯列主无消去法解线性方程组
#include<math.h>
#include<stdio.h>
#define NUMBER 20float A[NUMBER][NUMBER+1] ,ark;
int flag,n;
exchange(int r,int k);
float max(int k);
message();main()
{
float x[NUMBER]; /*此数组用于存放方程解*/
int r,k,i,j;
char celect;
clrscr();
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.解方程组请按Enter.");
printf("\n\n2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n 输入方程组的维数:n=");
scanf("%d",&n);
printf(" \n\n现在输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/ for(j=1;j<=n+1;j++) /*将刚才输入的数存入数组*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();
}exchange(int r,int k) /*交换行的矩函数*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}float max(int k) /*比校系数大小的函数*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}message() /*实现菜单选择的函数*/
{
printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的输入!");message();}
}
}
#include<math.h>
#include<stdio.h>
#define NUMBER 20float A[NUMBER][NUMBER+1] ,ark;
int flag,n;
exchange(int r,int k);
float max(int k);
message();main()
{
float x[NUMBER]; /*此数组用于存放方程解*/
int r,k,i,j;
char celect;
clrscr();
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.解方程组请按Enter.");
printf("\n\n2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n 输入方程组的维数:n=");
scanf("%d",&n);
printf(" \n\n现在输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/ for(j=1;j<=n+1;j++) /*将刚才输入的数存入数组*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();
}exchange(int r,int k) /*交换行的矩函数*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}float max(int k) /*比校系数大小的函数*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}message() /*实现菜单选择的函数*/
{
printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的输入!");message();}
}
}
解决方案 »
- VB的列表框控件中的columns属性
- 一个xml 格式的问题???各位大侠帮帮忙 急
- 如何用一条语句将SQL里的表按要求引入ACCESS里
- vb6如何声明在vc6中带有指针的结构体??
- ●●●●如何控制 outlook 发送邮件界面不出现,立刻兑现50分,手头没有多少分了●●●●
- 一个好问题,快来看
- 求 大虾 帮做下 这个题
- 怎么样才是程序员的最高境界?无招胜有招?
- MSFlexGrid显示数据,我希望当双击某一行时,能够捕捉是那一行,然后调用另外一个窗体显示出来.因为是我新人,所以凡是回答问题的大哥,我都给分.
- 菜鸟提问:为什么在编译的时候会弹出这个窗口?
- mousePointer
- 每个查询后内存为什么增加?
但提示 溢出
Private Sub Command3_Click() '2
Dim icount As Integer, i As Long, j As Long, k As Integer, p As Long, flag As Integer
Dim sum As Single
Dim b(10, 11) As Single, x(10) As Single, ark As Single '定义数组
'ReDim b(10, 11), x(10)
p = 100
icount = CInt(Text1.Text)k = 0 '初始化
For i = 1 To icount
For j = 1 To icount + 1
b(i, j) = CSng(Text2(k).Text)
b(i, j) = p * b(i, j)
k = k + 1
Next j
Next i
For k = 1 To icount - 1
ark = 0 For i = k To icount '比校系数大小的函数
If Abs(b(i, k)) > ark Then
ark = Abs(b(i, k))
flag = i
Else
End If
Next i
If ark = 0 Then '判断方程是否为线性方程,即是否合法
MsgBox "此方程组不合法"
Else
If Not flag = k Then
For i = 1 To icount + 1 '交换行
b(0, i) = b(flag, i)
Next i
For i = 1 To icount + 1
b(flag, i) = b(k, i)
Next i
For i = 1 To icount + 1
b(k, i) = b(0, i)
Next i
For i = k + 1 To icount
For j = k + 1 To icount + 1
b(i, j) = b(i, j) - ((b(k, j) * b(i, k)) / b(k, k))
Next j
Next i
End If
End If
Next k
x(icount) = b(icount, icount + 1) / b(icount, icount)(提示 溢出) For k = icount - 1 To 1
sum = 0
For j = k + 1 To icount
sum = sum + b(k, j) * x(j)
Next j
x(k) = (b(k, icount + 1) - sum) / b(k, k)
k = k - 1
Next k
For i = 1 To icountText3 = Text3 & "X" & CStr(i) & "=" & Format(x(i), "0.00000") & " "
Next i
End Sub
而求你的程序耦合度也太高了
你可以按你源程序的结构写几个子过程,例如
sub exchange(r as integer,k as integer) /*交换行的矩函数*/
dim i as integer
for i=1 to n+1
A(0,i)=A(r,i)
next i
for i=1 to n+1
A(r,i)=A(k,i)
next i
for i=1 to n+1
A(k,i)=A(0,i)
next i
end sub
我感觉vb不是很简单,除了图形界面外,它的设计模式是在然人头痛,结果最后只好只用它来做界面
x(icount) = b(icount, icount + 1)
x(icount) = x(icount) / b(icount, icount)
Dim a() As Double, b() As Double, n As Integer, i As Integer, j As Integer, f As Integer
n = CInt(Text1.Text)
ReDim a(n, n) As Double, b(n) As Double
f = 1
i = 1
j = 1
For k = 0 To (n * (n + 1) - 1)
If k Mod (n + 1) = n Then b(f) = CSng(Text2(k).Text)
f = f + 1
i = i + 1
j = 1
Else
a(i, j) = CSng(Text2(k).Text)
j = j + 1
End IfNext k
'Text3.Text = a(3, 3)
Solve a(), b()
For i = 1 To nText3 = Text3 & "X" & CStr(i) & "=" & Format(b(i), "0.00000") & " "
Next i
End Sub
Private Sub Solve(a() As Double, b() As Double)
'Gaussian elimination method, coded by www.dayi.net btef (please let this line remain)
Dim ii As Integer, i As Integer, j As Integer, n As Integer
Dim d1 As Double
Dim maxV As Double, maxI As Integern = UBound(b)For ii = 1 To n - 1
maxV = Abs(a(ii, ii))
maxI = ii
For i = ii To n
If Abs(a(i, ii)) > maxV Then
maxV = Abs(a(i, ii))
maxI = i 'row with max element
End If
Next i
If ii <> maxI Then 'exchange rows
d1 = b(maxI)
b(maxI) = b(ii)
b(ii) = d1
For j = ii To n
d1 = a(maxI, j)
a(maxI, j) = a(ii, j)
a(ii, j) = d1
Next j
End IfFor i = ii + 1 To n 'elemination
d1 = a(i, ii) / a(ii, ii)
For j = ii + 1 To n
a(i, j) = a(i, j) - a(ii, j) * d1
Next j
b(i) = b(i) - b(ii) * d1
Next i
Next iib(n) = b(n) / a(n, n) 'back substitution
For i = n - 1 To 1 Step -1
d1 = 0#
For j = i + 1 To n
d1 = d1 + a(i, j) * b(j)
Next j
b(i) = (b(i) - d1) / a(i, i)
Next iEnd Sub