⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.cpp

📁 高斯列主元消元法解n元一次方程组和简易流程图
💻 CPP
字号:
/*采用高斯列主元消元法,编译环境visual C++ 2008*/
#include<stdio.h>
#include<cstdlib>
#include<math.h>
FILE *fp;

void read(float *p,int n);
void save(float *p,int n);

void main()
{
	if((fp=fopen("a.txt","r"))==NULL)
	{
		puts("打开出错");
		exit(0);
	}
	
	int i,j,N,imax,k;
	float **a,*ans,temp;

	fscanf(fp,"%d",&N);
	a=new float *[N];//分配空间
	if(a==NULL) exit(0);
	ans=new float [N];
	if(ans==NULL) exit(0);
	for(i=0; i<N;i ++)
	{
		a[i]=new float[N+1];
		if(a[i]==NULL) exit(0);
		read(a[i], N+1);//读取一行数据
	}
	fclose(fp);

	puts("读取的N*(N+1)矩阵为:");
	for(i=0; i<N; i++)//输出读取的矩阵
	{
		for(j=0; j<N+1;  j++)
		{
			printf("%g ",a[i][j]);
		}
		putchar(10);
	}

	for(i = 0;i< N; i++)
	{
		for(imax=k=i; k<N; k++)//找出列主元
		{ 
			if(fabs(a[imax][i])<fabs(a[k][i])) imax=k;
		}

		if(fabs(a[imax][i])<1e-5) //判断有没有解 
		{
			puts("无解或有多个解"); 
			exit(0);
		}
		if(i==N-1) break;

		if(i!=imax)//交换i行和imax行
		{
			for(int k=i; k<=N; k++)
			{
				temp=a[i][k];
				a[i][k]=a[imax][k];
				a[imax][k]=temp;
			}
		}

		for(int j=i+1; j<N; j++)//消元
		{
			temp=a[j][i]/a[i][i]; 
			for(int k=i+1; k<N+1; k++)
			{
				a[j][k]-=a[i][k]*temp;
			}
		}
	}

	ans[N-1] = a[N - 1][N]/a[N - 1][N - 1];
	for(i = N - 2; i >= 0; i--)//回代
	{
		for (int j = i + 1; j < N; j++)
			a[i][N]-= a[i][j] * ans[j];
		ans[i]=a[i][N]/a[i][i];
	}

	puts("结果保留三位小数");
	for(i = 0; i < N; i++)//输出解
	{	
		printf("X%d = %.3f\n", i + 1, ans[i]);
	}
	save(ans, N);

	for(i=0;i<N;i++)//释放空间
	{
		delete [] a[i];
		a[i]=NULL;
	}
	delete [] a,ans;
	a=NULL;
}

void read(float *p, int n)
{
	for(int i=0;i<n;i++)
	{
		fscanf(fp, "%f", p + i);
	}
}

void save(float *p, int n)
{
	if((fp=fopen("a.txt","a+"))==NULL)
	{
		puts("打开出错");
		exit(0);
	}
	fprintf(fp,"结果保留三位小数\n");
	for(int i= 0; i<n; i++)
	{
		fprintf(fp,"X%d = %.3f\n", i + 1, *(p+ i));
	}
	fclose(fp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -