第1个回答 2012-03-01
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define N 3 /* 3个未知数,3个方程组 */
float **p = NULL;
float b[N * (N + 1)] ={2,1,1,28,
5,2,2,66,
10,5,4,137};
/* 3元方程组的数据, 自己可以随意修改数值, 还可以修改N 和浮点数组实现任意多阶方程组求解*/
float ** build_array(int r, int c)
{
int i = 0;
float *p1 = malloc(r * c * sizeof(float));
float **p2 = malloc( r * sizeof(float *));
for(i = 0; i < r; i++)
{
p2[i] = &p1[i * c];
}
return p2;
}
void free_room(float **p)
{
free(*p);
free(p);
}
void init(int row, int cul)
{
int i, j;
int cnt = 0;
for(i = 0; i < row; i++)
{
for(j = 0; j < cul; j++)
{
p[i][j] = b[cnt++];
}
}
}
void gs(float **p, int row, int cul) /* 高斯消元法*/
{
int i = 0;
int j = 0;
float tmp1,tmp2;
for(i = 0; i < row; i++)
{
tmp1 = p[i][i];
for(j = 0; j < cul; j++)
{
p[i][j] /= tmp1;
}
int k;
for(k = i + 1; k < row; k++)
{
tmp2 = p[k][i];
for(j = 0; j < cul; j++)
{
p[k][j] -= tmp2 * p[i][j];
}
}
}
}
void qiujie(int hang)
{
float y[hang];
int m = 0;
float tmp3;
int z = 0;
for(m = hang-1; m >= 0; m--)
{
tmp3 = 0;
for(z = hang-1; z > m; z--)
{
tmp3 += p[m][z] * y[z];
}
printf("y[%d] = %f\n", m, y[m] = (p[m][hang] - tmp3));
}
}
int main(void)
{
int m = 0;
int x = 0;
p = build_array(N, N+1);
init(N, N+1);
gs(p, N, N+1);
for(m = 0; m < N; m++)
{
for(x = 0; x < N + 1; x++)
{
printf(" %2f ", p[m][x]);
}
printf("\n");
}
qiujie(N);
free_room(p);
}