zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言解线性方程的四种方法

C语言方法 四种
2023-06-13 09:15:12 时间
发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归。经过半天的调试,仍找不出纠正的方法。因为并不是算法的问题,而是因为自己对编译器处理浮点函数的方法不是很理解。明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对。不过如果没有浮点型的话,这个程序应该算不错了。

复制代码代码如下:

#include<stdio.h>
#include<math.h>
#include<mem.h>
#defineNUM100
voidprint(void)    /*使用说明*/
     {clrscr();
       printf("\n\n\n\n\n\t\t\t\tIntroduction\n");
       printf("\t*--------------------------------------------------------------*\n");
       printf("\t*   Thisprogramwasdesignforcomputelinearequations.      *\n");
       printf("\t*   Thewayofuseitisverysimple.                          *\n");
       printf("\t*   First:Inputthenumberoftheequation;(Input0toexit)*\n");
       printf("\t*   Second:Inputthecoefficientofeveryeqution;            *\n");
       printf("\t*   Third:Inputtheconstantofeveryeqution;               *\n");
       printf("\t*   Last:Chosethewayyouwantusetosolvetheequtions;*\n");
       printf("\t*   That"sall,inputanykeytorunit...                  *\n");
       printf("\t*-------------------------By__TJX------------------------------*\n");
       getch();}

voidchose(void)   /*选择计算方法*/
   {clrscr();
      fflush(stdin);
       printf("\n\n\n\n\n\t\t**********Introduction**********\n");
                 printf("\t\t*Chosetheway,please.       *\n");
                 printf("\t\t*a:Gausseliminant.        *\n");
                 printf("\t\t*b:Gauss_ydeliminant.     *\n");
         printf("\t\t*c:Iterativeway.          *\n");
                 printf("\t\t*d:Cramerway.             *\n");
                 printf("\t\t*e:exit.                   *\n");              
                 printf("\t\t*************By__TJX************\n");
                 printf("\t\tPleasechoosenumber:\n");}

voidinput(double**a1,doubleb1[],intnum)   /*数据输入*/
    {inti,j,t;
      double*p;
      charde1,de2;
do{
    printf("Pleaseinputarraya[%d][%d]:\n",num,num);
    printf("Warn:Thefirstnumberofthearraymustn"tcontainzero!\n");
   for(i=1;i<=num;i++)
     {printf("Pleaseinputarraya[%d][]:\n",i);
      for(j=1;j<=num;j++)
      {t=0;
        if(i==1&&j==1)
         {do{
          if(t==0){scanf("%lf",&a1[i][j]);t++;}
           else{printf("Theinputisinvalid,pleaseinputagain:\n");scanf("%f",&a1[i][j]);}
          }while(a1[i][j]==0);}
        elsescanf("%lf",&a1[i][j]);}}
     printf("\nPleasecheckthevalueofarraya[%d][%d],pressYtoinputagain.\n",num,num);
     do{
        de1=getch();
        }while(de1!="y"&&de1!="Y"&&de1!="n"&&de1!="N");
   }while(de1=="y"||de1=="Y");
   do{
      printf("Pleaseinputarrayb[%d]:\n",num);
      p=b1+1;
      for(i=1;i<=num;i++)
       scanf("%lf",p++);
      printf("\nPleasecheckthevalueofarrayb[%d],pressYtoinputagain.\n",num);
       do{
        de2=getch();
        }while(de2!="y"&&de2!="Y"&&de2!="n"&&de2!="N");
   }while(de2=="y"||de2=="Y");}

 
intmax(double*t1,doublex1[],intn)   /*迭代子函数*/
    {inti,temp=0;
          for(i=1;i<=n;i++)
         if(fabs(x1[i]-t1[i])>1e-2){temp=1;break;}
    /*printf("   %d   ",temp);*/
         returntemp;
    }

intddcompute(double**a1,doubleb1[],doublex1[],intn)/*迭代法计算*/
     {double*t;
      inti,j,k=0;
      doublesum1=0.0,sum2=0.0;
      t=(double*)malloc(n*sizeof(double));
      printf("\nPleaseInputTheInitialValueofx:\n");
        for(i=1;i<=n;i++)
        scanf("%lf",&x1[i]);
       do{k++;
        for(i=1;i<=n;i++)
            t[i]=x1[i];
          for(i=1;i<=n;i++)
           {sum1=0.0;sum2=0.0;
           for(j=1;j<=i-1;j++)sum1=sum1+a1[i][j]*x1[j];/*printf("sum1=%0.4f",sum1);*/

              for(j=i+1;j<=n;j++)sum2=sum2+a1[i][j]*t[j];/*printf("sum2=%0.4f",sum2);}*/
          if(a1[i][i]==0||fabs(sum1)>1e+12||fabs(sum2)>1e+12)
         {printf("\nWarning:Theseequtionscan"tbesolvebythisway!\nPressanyKeytocontinue...");
         getch();
                  free(t);
         return0;}
           x1[i]=(b1[i]-sum1-sum2)/a1[i][i];}
    }while(max(t,x1,n));
    /*for(i=1;i<=n;i++)
               {if(i%3==0)printf("\n");
         printf("   %.4f   ",x1[i]);}*/
    free(t);
          return1;}

intgscompute(double**a1,doubleb1[],doublex1[],intn)/*高斯消元法计算*/
    {inti,j,k;
     doublem,sum;
     for(k=1;k<=n-1;k++)
     for(i=k+1;i<=n;i++)
    {if(a1[k][k]==0){printf("\nTheseequtionscan"tbesolveisthisway.\nPressanyKeytocontinue...");
         getch();
                  return0;}
        if((m=0-a1[i][k]/a1[k][k])==0){i++;continue;}
    else{for(j=k+1;j<=n;j++)
           a1[i][j]=a1[i][j]+a1[k][j]*m;
    b1[i]=b1[i]+b1[k]*m;}}
/*yixiajisuanxzhi*/
   x1[n]=b1[n]/a1[n][n];
   for(i=n-1;i>=1;i--)
    {sum=0.0;
    for(j=n;j>=i+1;j--)
    sum=sum+a1[i][j]*x1[j];
     x1[i]=(b1[i]-sum)/a1[i][i];}
     return1;   }

intgs_ydcompute(double**a1,doubleb1[],doublex1[],intn)/*高斯_约当法计算*/
    {inti,j,k;
     doublem,sum;
     for(k=1;k<=n;k++)
        {i=1;
          while(i<=n)
           {if(a1[k][k]==0){printf("\nTheseequtionscan"tbesolveisthisway.\nPressanyKeytocontinue...");
         getch();                   return0;}
               if(i!=k)
                 {if((m=0-a1[i][k]/a1[k][k])==0){i++;continue;}
                else{for(j=k+1;j<=n;j++)
                       a1[i][j]=a1[i][j]+a1[k][j]*m;
                       b1[i]=b1[i]+b1[k]*m;}
                   i++;}
                elsei++;   }}
/*yixiajisuanxzhi*/   
   for(i=n;i>=1;i--)
    x1[i]=b1[i]/a1[i][i];
    return1;}

 
doublecomputed(double**a,inth,intl,int*c1,intn)/*计算系数行列式D值*/
      {inti,j,p=1;
   doublesum=0.0;
       if(h==n)
              sum=1.0;
       else{
              i=++h;
              c1[l]=0;
              for(j=1;j<=n;j++)
                 if(c1[j])
                   if(a[i][j]==0)p++;
                   else{sum=sum+a[i][j]*computed(a,i,j,c1,n)*pow(-1,1+p);p++;}                c1[l]=1;}
      returnsum;}
voidncompute(double**a,doubleb[],doublex[],intn,int*c,doubleh)     /*克莱姆法计算*/
     {inti,j;
      doublet[NUM];
       for(j=1;j<=n;j++)
        {for(i=1;i<=n;i++)
            {t[i]=a[i][j];a[i][j]=b[i];}
    x[j]=computed(a,0,0,c,n)/h;
          for(i=1;i<=n;i++)
             a[i][j]=t[i];}
        }

main()
{doublex[NUM];
doubleb[NUM];
inti,j=2,n=0;
int*c;
doublehe;
charm,decision;
double**a;
a=(double**)malloc(NUM*sizeof(double*));
for(i=0;i<NUM;i++)
a[i]=(double*)malloc(NUM*sizeof(double));
   print();
do{
   clrscr();
   do{
      if(n>=NUM)printf("nistoolarge,pleaseinputagain:\n");
      else
         printf("Pleaseinputthetotalnumberoftheequationsn(n<NUM):\n");
         scanf("%d",&n);
      }while(n>NUM);
   if(n==0){for(i=1;i<NUM;i++)free(a[i]);
                 free(a);exit(1);}
   input(a,b,n);
   c=(int*)malloc((n+1)*sizeof(int));
   memset(c,1,(n+1)*sizeof(int));
   he=computed(a,0,0,c,n);
      if(fabs(he)>1e-4)   
        {
         Other:   chose();
         do{
            m=getche();
           }while(m!="a"&&m!="b"&&m!="A"&&m!="B"&&m!="c"&&m!="C"&&m!="d"&&m!="D"&&m!="e"&&m!="E");
         switch(m)
          {case"a":;
          case"A":j=gscompute(a,b,x,n);    break;
          case"b":;
          case"B":j=gs_ydcompute(a,b,x,n);break;
          case"c":;
          case"C":j=ddcompute(a,b,x,n);    break;
          case"d":;
          case"D":j=1;ncompute(a,b,x,n,c,he);break;
          case"e":;
          case"E":j=2;break;
             default:j=2;break;
          }
         if(j==1)
           {   clrscr();
               printf("\n\n\n\n");
               printf("    D=%.4f\n",he);
               for(i=1;i<=n;i++)
                 {if(i%5==0)printf("\n");
                   printf("   %.4f   ",x[i]);}
           }
         elseif(j==0)   
           {printf("\nTheseequtionscan"tbesolveisthisway.\nPleasechosetheotherway.");gotoOther;}
         else{for(i=1;i<NUM;i++)free(a[i]);
         free(a);
         free(c);
         exit(1);}
        }
      elseprintf("\n\n\tD=%.4f\nThislinearequationshasn"taccurateanswer!",he);
      printf("\nDoyouwanttocontinue?(Y/N)\n");
      do{
          decision=getchar();}while(decision!="y"&&decision!="Y"&&decision!="n"&&decision!="N");
        }while(decision=="y"||decision=="Y");
for(i=1;i<NUM;i++)free(a[i]);
free(a);
free(c);}