高斯列主无消去法解线性方程组
#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();}
  }
}

解决方案 »

  1.   

    我自己改了 不会用函数
    但提示 溢出
    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
      

  2.   

    既然你的数组已经定义大小了icount就不该任意赋值
    而求你的程序耦合度也太高了
      

  3.   

    vb是高度非线性的,它的流程设计必须非常小心,你在一个button_click过程中就做了所有的事也太
    你可以按你源程序的结构写几个子过程,例如
    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不是很简单,除了图形界面外,它的设计模式是在然人头痛,结果最后只好只用它来做界面
      

  4.   

    x(icount) = b(icount, icount + 1) / b(icount, icount)(提示 溢出)->
     x(icount) = b(icount, icount + 1) 
     x(icount) = x(icount) / b(icount, icount)
      

  5.   

    Private Sub Command3_Click() '2
    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