質問編集履歴

2

気う悪違反であると知ったため元の質問に戻しました。

2021/01/30 03:57

投稿

asitahare111
asitahare111

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1 +1,177 @@
1
+ ### 前提・実現したいこと
2
+
3
+ ガウスの消去法により連立方程式の解を求める。
4
+
5
+ c言語でガウスの消去法を実装しようと以下のようなコードを作成したのですが、すべての値をscanfで読み取ったあとにsegmentation faultが出てしまいうまくどうさしません。どこを直せば正常に機能するのか教えていただきたいです。
6
+
7
+ ### 該当のソースコード
8
+
9
+ #include <stdio.h>
10
+
11
+ #include <stdlib.h>
12
+
13
+ void PrintAb(double *A, double *b, int n)
14
+
15
+ {
16
+
17
+ int i, j;
18
+
19
+ double *ai;
20
+
21
+ printf("A,b=\n");
22
+
23
+ for(i = 0;i < n; i++)
24
+
25
+ {
26
+
27
+ for(j = 0;j < n; j++)
28
+
29
+ {
30
+
31
+ printf("%6.1f\t", *(ai+j));
32
+
33
+ }
34
+
35
+ printf("|%6.1f\t", b[i]);
36
+
37
+ ai += n;
38
+
39
+ }
40
+
1
- prjbcktidtxfseaasrdtvhvhjfyufyu
41
+ printf("\n");
42
+
43
+ }
44
+
45
+ int main(void)
46
+
47
+ {
48
+
49
+ int i, j, k, N;
50
+
51
+ double r;
52
+
53
+ double *ai, *ak;
54
+
55
+ double *A, *b;
56
+
57
+ printf("N=");
58
+
59
+ scanf("%d", &N);
60
+
61
+ A = (double *) malloc(N*N*sizeof(double));
62
+
63
+ if(A == NULL)
64
+
65
+ {
66
+
67
+ printf("Can't allocate memory.\n");
68
+
69
+ exit(1);
70
+
71
+ }
72
+
73
+ b = (double *) malloc(N*sizeof(double));
74
+
75
+ if(b == NULL)
76
+
77
+ {
78
+
79
+ printf("Can't allocate memory.\n");
80
+
81
+ exit(1);
82
+
83
+ }
84
+
85
+ ai = A;
86
+
87
+ for(i = 0;i < N; i++)
88
+
89
+ {
90
+
91
+ for(j = 0;j < N; j++)
92
+
93
+ {
94
+
95
+ printf("A[%d][%d] = ", i , j);
96
+
97
+ scanf("%lf", ai+j);
98
+
99
+ }
100
+
101
+ ai += N;
102
+
103
+ }
104
+
105
+ for(i = 0; i < N; i++)
106
+
107
+ {
108
+
109
+ printf("b[%d] = ", i );
110
+
111
+ scanf("%lf", b+i);
112
+
113
+ }
114
+
115
+ PrintAb(A, b, N);
116
+
117
+ ai = A;
118
+
119
+ ak = A;
120
+
121
+ for(k = 0;k < N-1;k++)
122
+
123
+ {
124
+
125
+ for(i = k+1; i < N; i++)
126
+
127
+ {
128
+
129
+ r = *(ai+i*N+k) / *(ak+k);
130
+
131
+ for(j = k;j < N; j++)
132
+
133
+ {
134
+
135
+ *(ai+i*N+j) -= *(ak+j) * r;
136
+
137
+ }
138
+
139
+ b[i] -= b[k] * r;
140
+
141
+ }
142
+
143
+ PrintAb(A, b, N);
144
+
145
+ ak += N;
146
+
147
+ }
148
+
149
+ ai = ak;
150
+
151
+ for(i = N-1;i >= 0; i--)
152
+
153
+ {
154
+
155
+ for(j = i+1;j < N; j++)
156
+
157
+ {
158
+
159
+ b[i] -= *(ai+j) * b[j];
160
+
161
+ }
162
+
163
+ b[i] /= *(ai+i);
164
+
165
+ PrintAb(A, b, N);
166
+
167
+ ai -= N;
168
+
169
+ }
170
+
171
+ return 0;
172
+
173
+ }
174
+
175
+ ### 補足情報(FW/ツールのバージョンなど)
176
+
177
+ ここにより詳細な情報を記載してください。

1

hjcgkcghkckcghjkcdtstx

2021/01/30 03:57

投稿

asitahare111
asitahare111

スコア1

test CHANGED
@@ -1 +1 @@
1
- C言語を用いたガウスの消去法の実装
1
+ aajjhjvhct
test CHANGED
@@ -1,197 +1 @@
1
- ### 前提・実現したいこと
2
-
3
- ガウスの消去法により連立方程式の解を求める。
4
-
5
- c言語でガウスの消去法を実装しようと以下のようなコードを作成したのですが、すべての値をscanfで読み取ったあとにsegmentation faultが出てしまいうまくどうさしません。どこを直せば正常に機能するのか教えていただきたいです。
6
-
7
- ### 該当のソースコード
8
-
9
- #include <stdio.h>
10
-
11
- #include <stdlib.h>
12
-
13
-
14
-
15
- void PrintAb(double *A, double *b, int n)
16
-
17
- {
18
-
19
- int i, j;
20
-
21
- double *ai;
22
-
23
- printf("A,b=\n");
24
-
25
- for(i = 0;i < n; i++)
26
-
27
- {
28
-
29
- for(j = 0;j < n; j++)
30
-
31
- {
32
-
33
- printf("%6.1f\t", *(ai+j));
34
-
35
- }
36
-
37
- printf("|%6.1f\t", b[i]);
38
-
39
- ai += n;
40
-
41
- }
42
-
43
- printf("\n");
1
+ prjbcktidtxfseaasrdtvhvhjfyufyu
44
-
45
- }
46
-
47
-
48
-
49
- int main(void)
50
-
51
- {
52
-
53
- int i, j, k, N;
54
-
55
- double r;
56
-
57
- double *ai, *ak;
58
-
59
- double *A, *b;
60
-
61
-
62
-
63
- printf("N=");
64
-
65
- scanf("%d", &N);
66
-
67
-
68
-
69
- A = (double *) malloc(N*N*sizeof(double));
70
-
71
- if(A == NULL)
72
-
73
- {
74
-
75
- printf("Can't allocate memory.\n");
76
-
77
- exit(1);
78
-
79
- }
80
-
81
-
82
-
83
- b = (double *) malloc(N*sizeof(double));
84
-
85
- if(b == NULL)
86
-
87
- {
88
-
89
- printf("Can't allocate memory.\n");
90
-
91
- exit(1);
92
-
93
- }
94
-
95
-
96
-
97
- ai = A;
98
-
99
- for(i = 0;i < N; i++)
100
-
101
- {
102
-
103
- for(j = 0;j < N; j++)
104
-
105
- {
106
-
107
- printf("A[%d][%d] = ", i , j);
108
-
109
- scanf("%lf", ai+j);
110
-
111
- }
112
-
113
- ai += N;
114
-
115
- }
116
-
117
-
118
-
119
- for(i = 0; i < N; i++)
120
-
121
- {
122
-
123
- printf("b[%d] = ", i );
124
-
125
- scanf("%lf", b+i);
126
-
127
- }
128
-
129
- PrintAb(A, b, N);
130
-
131
-
132
-
133
- ai = A;
134
-
135
- ak = A;
136
-
137
- for(k = 0;k < N-1;k++)
138
-
139
- {
140
-
141
- for(i = k+1; i < N; i++)
142
-
143
- {
144
-
145
- r = *(ai+i*N+k) / *(ak+k);
146
-
147
- for(j = k;j < N; j++)
148
-
149
- {
150
-
151
- *(ai+i*N+j) -= *(ak+j) * r;
152
-
153
- }
154
-
155
- b[i] -= b[k] * r;
156
-
157
- }
158
-
159
- PrintAb(A, b, N);
160
-
161
- ak += N;
162
-
163
- }
164
-
165
-
166
-
167
- ai = ak;
168
-
169
- for(i = N-1;i >= 0; i--)
170
-
171
- {
172
-
173
- for(j = i+1;j < N; j++)
174
-
175
- {
176
-
177
- b[i] -= *(ai+j) * b[j];
178
-
179
- }
180
-
181
- b[i] /= *(ai+i);
182
-
183
- PrintAb(A, b, N);
184
-
185
- ai -= N;
186
-
187
- }
188
-
189
- return 0;
190
-
191
- }
192
-
193
- ### 補足情報(FW/ツールのバージョンなど)
194
-
195
-
196
-
197
- ここにより詳細な情報を記載してください。