用高斯列主无消去法解线性方程组
带C运行成功原代码 我改VB的时候不会用函数就成了下面的样子了(出错提示类型不匹配(程序中有标注)) 如果大哥们方便就全按C帮小弟改一下吧
VB
rivate Sub Command3_Click()
Dim icount As Integer, i As Long, j As Long, k As Long, p As Long, flag As Integer
Dim sum As Single
Dim a() As Single, l() As Single, x() As Single, ark As Integer '定义数组
ReDim a(10, 11), l(10, 10), x(10)
p = 100
icount = CInt(Text1.Text)k = 0 '初始化
For i = 1 To icount
For j = 1 To icount + 1
a(i, j) = CSng(Text2(k).Text)
a(i, j) = p * a(i, j)
k = k + 1
Next j
Next i
For k = 1 To icount - 1
ark = Abs(a(1, k)) For i = k To icount '比校系数大小的函数
If Abs(a(i)(k)) > ark Then'出错提示类型不匹配
ark = Abs(a(i)(k))
flag = i
Else
End If
Next i
If ark = 0 Then '判断方程是否为线性方程,即是否合法
Magbox "此方程组不合法"
Else
End If
If flag = k Then
Else
For i = 1 To icount + 1 '交换行
a(0)(i) = a(flag)(i)
Next i
For i = 1 To icount + 1
a(flag)(i) = a(k)(i)
Next i
For i = 1 To icount + 1
a(k)(i) = a(0)(i)
Next i
For i = k + 1 To icount
For j = k + 1 To icount + 1
a(i)(j) = a(i)(j) - a(k)(j) * a(i)(k) / a(k)(k)
Next j
Next i
End If
Next k
x(icount) = a(icount)(icount + 1) / a(icount)(icount)
For k = icount - 1 To 1
sum = 0
For j = k + 1 To icount
sum = sum + a(k)(j) * x(j)
Next j
x(k) = (a(k)(icount + 1) - sum) / a(k)(k)
k = k - 1
Next k
For i = 1 To icountText3 = Text3 & "X" & CStr(i) & "=" & Format(x(i), "0.00000") & " "
End Sub
C
#include<math.h>
#include<stdio.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0dfloat 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();}
}
}
带C运行成功原代码 我改VB的时候不会用函数就成了下面的样子了(出错提示类型不匹配(程序中有标注)) 如果大哥们方便就全按C帮小弟改一下吧
VB
rivate Sub Command3_Click()
Dim icount As Integer, i As Long, j As Long, k As Long, p As Long, flag As Integer
Dim sum As Single
Dim a() As Single, l() As Single, x() As Single, ark As Integer '定义数组
ReDim a(10, 11), l(10, 10), x(10)
p = 100
icount = CInt(Text1.Text)k = 0 '初始化
For i = 1 To icount
For j = 1 To icount + 1
a(i, j) = CSng(Text2(k).Text)
a(i, j) = p * a(i, j)
k = k + 1
Next j
Next i
For k = 1 To icount - 1
ark = Abs(a(1, k)) For i = k To icount '比校系数大小的函数
If Abs(a(i)(k)) > ark Then'出错提示类型不匹配
ark = Abs(a(i)(k))
flag = i
Else
End If
Next i
If ark = 0 Then '判断方程是否为线性方程,即是否合法
Magbox "此方程组不合法"
Else
End If
If flag = k Then
Else
For i = 1 To icount + 1 '交换行
a(0)(i) = a(flag)(i)
Next i
For i = 1 To icount + 1
a(flag)(i) = a(k)(i)
Next i
For i = 1 To icount + 1
a(k)(i) = a(0)(i)
Next i
For i = k + 1 To icount
For j = k + 1 To icount + 1
a(i)(j) = a(i)(j) - a(k)(j) * a(i)(k) / a(k)(k)
Next j
Next i
End If
Next k
x(icount) = a(icount)(icount + 1) / a(icount)(icount)
For k = icount - 1 To 1
sum = 0
For j = k + 1 To icount
sum = sum + a(k)(j) * x(j)
Next j
x(k) = (a(k)(icount + 1) - sum) / a(k)(k)
k = k - 1
Next k
For i = 1 To icountText3 = Text3 & "X" & CStr(i) & "=" & Format(x(i), "0.00000") & " "
End Sub
C
#include<math.h>
#include<stdio.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0dfloat 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();}
}
}
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
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
这段可能有问题,因为如果icount=10那么k就可能达到10×11=110。难道你的text2控件数组有100多个??!!
Dim icount As Integer, i As Long, j As Long, k As Integer, p As Long, flag As Integer
Dim sum As Single, sum1 As Single
Dim b(10, 11) As Single, x(10) As Single, ark As Single, aa As Single '定义数组'ReDim b(10, 11), x(10)
p = 100
flag = 1
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
'Text3.Text = flag
' If ark = 0 Then '判断方程是否为线性方程,即是否合法
' MsgBox "此方程组不合法"
'Else
If flag = 0 Then
Else
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
'Text3.Text = b(2, 1)
For i = k + 1 To icount
aa = b(i, k) / b(k, k)
For j = 1 To icount + 1
b(i, j) = b(i, j) - b(k, j) * aa
Next j
Next i
'End If
End If
Next k
'Text3.Text = b(2, 1)
x(icount) = b(icount, icount + 1) / b(icount, icount)
'Text3.Text = x(icount)
'sum = 1 For k = icount - 1 To 1 Step -1
sum = 0
For j = k + 1 To icount
sum = sum + x(j) * (b(k, j))
Next j
'Text3.Text = sum
x(k) = (b(k, icount + 1) - sum) / b(k, k)
Next k
For i = 1 To icountText3 = Text3 & "X" & CStr(i) & "=" & Format(x(i), "0.00000") & " "
Next i
End Sub