?? gauss.cpp
字號:
/*
機輔要求:
一.線性直流電阻電路
二.無受控源
三.每一復合支路均含有電阻元件
機輔步驟:
一.編寫輸入電路信息的C程序input();
二.編寫節點電壓方程(增廣系數矩陣)equation();
三.求解(高斯消元法)gs();
四.求元件及支路信息,驗證節點電壓的正確性function();
五.形成輸出文件(系數增廣矩陣、獨立節點電壓、支路的電壓電流和功率、元件的電壓電流和功率)output();
程序框架:
main()
{
input();
equation();
gs();
function();
output();
}
*/
// GAUSS例程
#include <stdio.h>
#define EPS 0.0001
int n;
float a[20][21];
void input()
{int i,j;
char datfile[11];
FILE *fp1;
clrscr();
printf("\t輸入數據文件名: ");
scanf("%s",datfile);
if((fp1=fopen(datfile,"r+"))==NULL)
{printf("\t數據文件 %s 不存在按任意鍵返回...",datfile);
getch();
exit(0);
}
fscanf(fp1,"%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
fscanf(fp1,"%f",&a[i][j]);
fclose(fp1);
}
float x[20];
void gauss()
{int i,j,k;
for(k=1;k<=n-1;k++)
{
if(a[k][k]>=0)
for(i=k+1;i<=n;i++)
{
if(a[i][k]>0)
for(j=k;j<=n+1;j++)
a[k][j]+=a[i][j];
if(a[i][k]<0)
for(j=k;j<=n+1;j++)
a[k][j]-=a[i][j];
}
else
for(i=k+1;i<=n;i++)
{
if(a[i][k]>0)
for(j=k;j<=n+1;j++)
a[k][j]-=a[i][j];
if(a[i][k]<0)
for(j=k;j<=n+1;j++)
a[k][j]+=a[i][j];
}
}
if(fabs(a[k][k])<EPS)
goto end;
for(i=k+1;i<=n;i++)
for(j=n+1;j>=k;j--)
{a[i][j]=a[i][j]-a[k][j]*a[i][k]/a[k][k];}
for(k=n;k>=2;k--)
for(i=1;i<=k-1;i++)
{a[i][n+1]-=a[k][n+1]*a[i][k]/a[k][k];a[i][k]=0;}
for(k=1;k<=n;k++)
{a[k][n+1]=a[k][n+1]/a[k][k];x[k]=a[k][n+1];}
end:;
}
void output()
{int i;
char keyfile[11],z;
FILE *fp2;
printf("\t 輸入結果文件名:");
scanf("%s",keyfile);
if((fp2=fopen(keyfile,"w+"))!=NULL)
{printf("\t 數據文件 %s 已經存在,是否覆蓋(Y/N)?",keyfile);
z=getch();
if(z=='n'||z=='N')
exit(0);
}
for(i=1;i<=n;i++)
fprintf(fp2,"\t%8.4f\n",x[i]);
fclose(fp2);
}
void main()
{input();
gauss();
output();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -