📄 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 + -