掃出法で連立一次方程式の解を求めるプログラムを作ってみたのですが、ポインタと浮動小数点のエラーが出てしまい、実行できません。どこが間違っているのかさえ分からず困っています。訂正箇所を教えてください。宜しくお願い致します。
#include<stdio.h>
#include<math.h>
#include <float.h>
#define N 3
#define EPSILON 1.0E-5
#define TRUE 1
#define FALSE 0
void sweep(int *flag);
void swap(float *wk1,float *wk2);
float a[N][N]={{ 2, 6, 3},
{-1, 5,-2},
{-2,-1, 6}};
float x[N],b[N]={6,3,14};
int flag;
void main()
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%10.4f",a[i][j]);
printf("%10.4f\n",b[i]);
}
flag=TRUE;
sweep(&flag);
if(flag==TRUE)
{
printf("連立方程式の解\n");
for(i=0;i=N;i++)
printf("x[%d]=%10.4f\n",i+1,x[i]);
}
else
printf("解なし\n");
}
void swap(float *wk1,float *wk2)
{
float w;
w=*wk1;
*wk1=*wk2;
*wk2=w;
}
void sweep(int *flag)
{
int i,j,k,ik;
float ak,aik;
for(k=0;k<N;k++)
{
ak=a[k][k];
if(fabs(ak)<=EPSILON)
{
ik=k+1;
while((ik<N)&&(fabs(a[ik][k])<EPSILON))
ik++;
if(ik<N)
{
for(j=k;j<N;j++)
swap(&a[k][j],&a[ik][j]);
swap(b[k],b[ik]);
ak=a[k][k];
}
else
{
printf("ピボットが零です\n");
*flag=FALSE;
goto end;
}
}
for(j=k;j<N;j++)
a[k][j]=a[k][j]/ak;
b[k]=b[k]/ak;
for(i=0;i<N;i++)
{
if(i!=k)
{
aik=a[i][k];
for(j=k;j<N;j++)
a[k][j]=a[i][j]-aik*a[k][j];
b[i]=b[i]-aik*b[k];
}
}
for(k=0;k<N;k++)
x[k]=b[k];
end:;
}
}
No.2ベストアンサー
- 回答日時:
とりあえず動くようにしました。
-- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< --
#include<stdio.h>
#include<math.h>
#include <float.h>
#define N 3
#define EPSILON 1.0E-5
#define TRUE 1
#define FALSE 0
void sweep(int *flag);
void swap(float *wk1, float *wk2);
float a[N][N] = { {2, 6, 3},
{-1, 5, -2},
{-2, -1, 6}
};
float x[N], b[N] = { 6, 3, 14 };
int flag;
int
main(void)
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%10.4f", a[i][j]);
printf("%10.4f\n", b[i]);
}
flag = TRUE;
sweep(&flag);
if (flag == TRUE) {
printf("連立方程式の解\n");
for (i = 0; i < N; i++)
printf("x[%d]=%10.4f\n", i + 1, x[i]);
}
else
printf("解なし\n");
return 0;
}
void
swap(float *wk1, float *wk2)
{
float w;
w = *wk1;
*wk2 = w;
}
void
sweep(int *flag)
{
int i, j, k, ik;
float ak, aik;
for (k = 0; k < N; k++) {
ak = a[k][k];
if (fabs(ak) <= EPSILON) {
ik = k + 1;
while ((ik < N) && (fabs(a[ik][k]) < EPSILON))
ik++;
if (ik < N) {
for (j = k; j < N; j++)
swap(&a[k][j], &a[ik][j]);
swap(&b[k], &b[ik]);
ak = a[k][k];
}
else {
printf("ピボットが零です\n");
*flag = FALSE;
goto end;
}
}
for (j = k; j < N; j++)
a[k][j] = a[k][j] / ak;
b[k] = b[k] / ak;
for (i = 0; i < N; i++) {
if (i != k) {
aik = a[i][k];
for (j = k; j < N; j++)
a[k][j] = a[i][j] - aik * a[k][j];
b[i] = b[i] - aik * b[k];
}
}
for (k = 0; k < N; k++)
x[k] = b[k];
end:;
}
}
この回答への補足
回答してくださったのを参考にプログラムを書き換え、実行できたのですが、出力された解が間違っています。どのようにすれば正しい解にたどりつけるのでしょうか?
補足日時:2007/06/04 12:15No.3
- 回答日時:
> w = *wk1;
> *wk2 = w;
この2行の間に、
*wk1 = *wk2;
の行が必要だと思います。
No.1
- 回答日時:
環境が書かれていないのでよく分かりませんが...
> どこが間違っているのかさえ分からず困っています。訂正箇所を教えてください。
コンパイルエラーになるので、そのときに行番号が示されると思います。それとも、そんなエラーレポートもできないようなコンパイラを使っているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での、年複利の計算方法...
-
C言語の勉強しています。すみま...
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
プログラム(C言語)
-
コーディング
-
【C言語教えてください】sin波...
-
C言語 プログラミング
-
switch分のケースを範囲数?に...
-
台形の面積を求めるプログラム
-
ブラックジャック
-
三角形の判別
-
10進数を2進数に変換するには・...
-
覆面算 C
-
改行について 1行に何個かづ...
-
困ってます!Cプログラミングに...
-
srand(time(NULL))の使い方
-
パスカルの三角形についてのCプ...
-
printfの変換仕様について
-
LU分解法のピボッティングにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
strcmp
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
cshの文字列操作(0埋め)
-
4の倍数を論理演算で表す。。
-
C言語 プログラミング
-
8人分のテストの点数を入力し、...
-
%P と %X の違い
-
C言語での、年複利の計算方法...
-
printf( " %2d", p * q );
-
hit&bolwのプログラミングがで...
-
scanfに文字が入力されたときに...
-
error C2143: 構文エラー : ';'...
-
printfの出力内の文字をdefine...
-
テキストカーソル位置の取得
-
unsigned int型について
おすすめ情報