昨天小武同學來讓我幫他寫一個程序,是關於Gauss消去法的,之前很少寫這種跟數學有關的程序,所以決定試一試,這裡我想展示一種編程的方法,以前我在不知道如何有效的編寫程序時,就自己琢磨了一套方法,時間久了,我在網上看到過關於驅動測試編程的時候,就有一種“蓦然回首,那人卻在燈火闌珊處”的感覺,所以現在不要學習什麼設計模式之類的,自己一步一步寫,你會更好的理解。
首先Gauss消去法的過程,就是利用初等行變換將原來不容易求解的方程組轉化為容易求解的方程組,也就是化為所謂的三角陣,信計的同學不會不知道吧。
一開始我先整理了一下大概的思路,在解決問題時先理清思路就等於解決了一大半的問題,:
1, 主程序時要從第一行開始,對剩下的每一行做初等變換,使除第一行外,所有行的第一個元素都變成0,之後是第二行。。。。這樣就變成了一個三角陣。
所以我覺得大概的主循環是這樣的:
for(int i = 0;i!=ROW-1;i++)//這層循環用來“產生”每一個要作為主元的行。
{
for(int j = i+1;j!=ROW;j++)//對主元後的每一行做初等變換
//…………….做一些事情
}
2, 我覺得要寫一個print函數;打印這個矩陣,不僅僅是方便顯示結果,也可以在寫程序的時候,方便的顯示自己的錯誤 ,
3,用兩個宏來定義矩陣的行與列ROW,LIST
4, 用一個二維矩陣來存儲這個矩陣,並用float類型
5,在大一筆算的時候,我們還要把這個三角陣在向上做一次運算,這樣就可以直接算出x們的值,不過現在可以用一個for循環回帶出x們的值了。
現在開始寫程序,,,,,,,
[cpp]
#include <stdio.h>
#define ROW 4
#define LIST 5
float a[ROW][LIST] = {{1,1,0,-4,1},{-1,1,1,3,-2},{1,3,5,-4,-4},{0,1,2,-1,-2}};
/*寫一個打印函數用來測試數組元素*/
void print();
int main()
{
print();/*先測試一下,我們的數組元素是否正確*/
/*開始消去*/
for(int i = 0;i!=ROW-1;i++)
{
for(int j = i+1;j!=ROW;j++)
{
float p = a[j][i]/a[i][i];
for(int k =0;k!=LIST;k++)
{
a[j][k] = a[j][k]-p*a[i][k];
}
}
}
print();
/*開始回代*/
float x[ROW]={0,0,0,0};
for(int w = ROW-1;w>=0;w--)
{/*
x[w] = (a[w][LIST-1]-(a[w][0]*x[0]+a[w][1]*x[1]+a[w][2]*x[2]+a[w][3]*x[3]))/a[w][w];
*/
float temp = a[w][LIST-1];
for(int c = 0;c!=LIST-1;c++)
temp =temp-a[w][c]*x[c];
x[w]=temp/a[w][w];
printf("x%d=%-8.4f\n",w+1,x[w]);
}
return 0;
}
void print()
{
for(int i = 0;i!=ROW;i++)
{
for(int j = 0;j!=LIST;j++)
printf("%-8.4f",a[i][j]);
printf("\n");
}
printf("-----------------------\n");
}
需要說明的是,我在寫會回帶的時候先寫了一個這樣的“硬編碼”。
x[w] = (a[w][LIST-1]-(a[w][0]*x[0]+a[w][1]*x[1]+a[w][2]*x[2]+a[w][3]*x[3]))/a[w][w];
因為這樣能先知道自己的思路是不是對的。。對了之後,把程序改成
float temp = a[w][LIST-1];
for(int c = 0;c!=LIST-1;c++)
temp =temp-a[w][c]*x[c];
x[w]=temp/a[w][w];
大功告成!!!!
摘自 霸氣的小草