teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

update

2021/01/20 08:05

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,6 +3,141 @@
3
3
  節点のx座標、y座標、z座標に重複があった場合に重複をなくして出力し、節点番号(下にファイルのフォーマットがあります。)を更新して出力しなければならないのですが、どのようなコードで書けばいいのかわかりません。
4
4
  ファイルのフォーマットとそれぞれのファイルの内容も載せておきます。
5
5
  質問2回目です。質問等が伝わりにくかったらごめんなさい。お願いします。
6
+ ### 該当のソースコード
7
+ ```C
8
+ #include <stdio.h>
9
+ #include <stdlib.h> //exit関数を用いるために必要
10
+
11
+ int main()
12
+ {
13
+ //readfは読み込むファイル,writefは書き込むファイル
14
+ FILE *readf_in1, *readf_in2, *writef_in;
15
+
16
+ char in1[] = "in.dat1";
17
+ char in2[] = "in.dat2";
18
+
19
+ int point1[1024][16];//配列の数は適当です。
20
+ int point2[1024][16];
21
+ float fpoint1[1024][4];
22
+ float fpoint2[1024][4];
23
+ double epoint1[1024][3];
24
+ double epoint2[1024][3];
25
+ double ecomb2[1024][3];
26
+
27
+ //読み込むファイルをopen
28
+ readf_in1 = fopen(in1,"r");
29
+ if(readf_in1 == NULL){//エラー処理
30
+ printf("error in.dat1\n");
31
+ exit(1); //強制終了
32
+ }
33
+ else{
34
+ printf("read in.dat1\n");
35
+ }
36
+ //読み込むファイルをopen
37
+ readf_in2 = fopen(in2,"r");
38
+ if(readf_in2 == NULL){//エラー処理
39
+ fclose(readf_in1);
40
+ printf("error in.dat2\n");
41
+ exit(1); //強制終了
42
+ }
43
+ else{
44
+ printf("read in.dat2\n");
45
+ }
46
+
47
+ //書き込むファイルをopen
48
+ writef_in = fopen("in.dat", "w");
49
+ if(writef_in == NULL){//エラー処理
50
+ fclose(readf_in1);
51
+ fclose(readf_in2);
52
+ printf("error in.dat\n");
53
+ exit(1); //強制終了
54
+ }
55
+ else{
56
+ printf("write in.dat\n");
57
+ }
58
+
59
+ for(int i = 0; i < 4; i++) {//配列に保存
60
+ fscanf(readf_in1,"%d", &(point1[0][i]));
61
+ }
62
+ for(int i = 0; i < 4; i++) {//配列に保存
63
+ fscanf(readf_in2,"%d", &(point2[0][i]));
64
+ }
65
+ for(int i = 0; i < 1; i++) {//配列に保存
66
+ fscanf(readf_in1,"%E", &(fpoint1[0][i]));
67
+ }
68
+ for(int i = 0; i < 1; i++) {//配列に保存
69
+ fscanf(readf_in2,"%E", &(fpoint2[0][i]));
70
+ }
71
+ for(int i = 1; i < point1[0][1]+1; i++){//配列に保存
72
+ for(int j = 0; j < 4; j++){
73
+ fscanf(readf_in1,"%d",
74
+ &(point1[i][j]),
75
+ &(point1[i][j+1]),
76
+ &(point1[i][j+2]),
77
+ &(point1[i][j+3])
78
+ );
79
+ }
80
+ }
81
+ for(int i = 1; i < point2[0][1]+1; i++){//配列に保存
82
+ for(int j = 0; j < 4; j++){
83
+ fscanf(readf_in2,"%d",
84
+ &(point2[i][j]),
85
+ &(point2[i][j+1]),
86
+ &(point2[i][j+2]),
87
+ &(point2[i][j+3])
88
+ );
89
+ }
90
+ }
91
+ for(int i = 1; i < point1[0][0]+1; i++){//配列に保存
92
+ for(int j = 0; j < 3; j++){
93
+ fscanf(readf_in1,"%lf", //lfは倍精度実数で読み取る
94
+ &(epoint1[i][j]),
95
+ &(epoint1[i][j+1]),
96
+ &(epoint1[i][j+2])
97
+ );
98
+ }
99
+ }
100
+ for(int i = 1; i < point2[0][0]+1; i++){//配列に保存
101
+ for(int j = 0; j < 3; j++){
102
+ fscanf(readf_in2,"%lf", //lfは倍精度実数で読み取る
103
+ &(epoint2[i][j]),
104
+ &(epoint2[i][j+1]),
105
+ &(epoint2[i][j+2])
106
+ );
107
+ }
108
+ }
109
+
110
+ /* -- ここからわかりません -- */
111
+ int k = 0;
112
+ for(int i = 0; i < point2[0][0]; i++){
113
+ for(int j =0; j < point1[0][0]; j++){
114
+ if(epoint1[i][0] == epoint2[j][0] && epoint1[i][1] == epoint2[j][1] && epoint1[i][3] == epoint2[j][3] ){
115
+ printf("match\n");
116
+ }
117
+ else{
118
+ k = k + 1;
119
+ ecomb2[k][0] = epoint2[j][0];
120
+ ecomb2[k][1] = epoint2[j][1];
121
+ ecomb2[k][2] = epoint2[j][2];
122
+ }
123
+ }
124
+ }
125
+
126
+ fprintf(writef_in,"%8d\n", k);//確認用
127
+ for(int i = 0; i < k; i++){
128
+ fprintf(writef_in,"%24.13E%24.13E%24.13E\n",
129
+ ecomb2[i][0], ecomb2[i][1], ecomb2[i][2]
130
+ );
131
+ }
132
+ /* -- ここまでわかりません -- */
133
+
134
+ //ファイルをclose
135
+ fclose(readf_in1);
136
+ fclose(readf_in2);
137
+ fclose(writef_in);
138
+ }
139
+ ```
140
+
6
141
  ### ファイルのフォーマット
7
142
  ```dat
8
143
   節点数  要素数 0 0 1.000E+03

5

delete

2021/01/20 08:05

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,140 +3,6 @@
3
3
  節点のx座標、y座標、z座標に重複があった場合に重複をなくして出力し、節点番号(下にファイルのフォーマットがあります。)を更新して出力しなければならないのですが、どのようなコードで書けばいいのかわかりません。
4
4
  ファイルのフォーマットとそれぞれのファイルの内容も載せておきます。
5
5
  質問2回目です。質問等が伝わりにくかったらごめんなさい。お願いします。
6
- ### 該当のソースコード
7
- ```C
8
- #include <stdio.h>
9
- #include <stdlib.h> //exit関数を用いるために必要
10
-
11
- int main()
12
- {
13
- //readfは読み込むファイル,writefは書き込むファイル
14
- FILE *readf_in1, *readf_in2, *writef_in;
15
-
16
- char in1[] = "in.dat1";
17
- char in2[] = "in.dat2";
18
-
19
- int point1[1024][16];//配列の数は適当です。
20
- int point2[1024][16];
21
- float fpoint1[1024][4];
22
- float fpoint2[1024][4];
23
- double epoint1[1024][3];
24
- double epoint2[1024][3];
25
- double ecomb2[1024][3];
26
-
27
- //読み込むファイルをopen
28
- readf_in1 = fopen(in1,"r");
29
- if(readf_in1 == NULL){//エラー処理
30
- printf("error in.dat1\n");
31
- exit(1); //強制終了
32
- }
33
- else{
34
- printf("read in.dat1\n");
35
- }
36
- //読み込むファイルをopen
37
- readf_in2 = fopen(in2,"r");
38
- if(readf_in2 == NULL){//エラー処理
39
- fclose(readf_in1);
40
- printf("error in.dat2\n");
41
- exit(1); //強制終了
42
- }
43
- else{
44
- printf("read in.dat2\n");
45
- }
46
-
47
- //書き込むファイルをopen
48
- writef_in = fopen("in.dat", "w");
49
- if(writef_in == NULL){//エラー処理
50
- fclose(readf_in1);
51
- fclose(readf_in2);
52
- printf("error in.dat\n");
53
- exit(1); //強制終了
54
- }
55
- else{
56
- printf("write in.dat\n");
57
- }
58
-
59
- for(int i = 0; i < 4; i++) {//配列に保存
60
- fscanf(readf_in1,"%d", &(point1[0][i]));
61
- }
62
- for(int i = 0; i < 4; i++) {//配列に保存
63
- fscanf(readf_in2,"%d", &(point2[0][i]));
64
- }
65
- for(int i = 0; i < 1; i++) {//配列に保存
66
- fscanf(readf_in1,"%E", &(fpoint1[0][i]));
67
- }
68
- for(int i = 0; i < 1; i++) {//配列に保存
69
- fscanf(readf_in2,"%E", &(fpoint2[0][i]));
70
- }
71
- for(int i = 1; i < point1[0][1]+1; i++){//配列に保存
72
- for(int j = 0; j < 4; j++){
73
- fscanf(readf_in1,"%d",
74
- &(point1[i][j]),
75
- &(point1[i][j+1]),
76
- &(point1[i][j+2]),
77
- &(point1[i][j+3])
78
- );
79
- }
80
- }
81
- for(int i = 1; i < point2[0][1]+1; i++){//配列に保存
82
- for(int j = 0; j < 4; j++){
83
- fscanf(readf_in2,"%d",
84
- &(point2[i][j]),
85
- &(point2[i][j+1]),
86
- &(point2[i][j+2]),
87
- &(point2[i][j+3])
88
- );
89
- }
90
- }
91
- for(int i = 1; i < point1[0][0]+1; i++){//配列に保存
92
- for(int j = 0; j < 3; j++){
93
- fscanf(readf_in1,"%lf", //lfは倍精度実数で読み取る
94
- &(epoint1[i][j]),
95
- &(epoint1[i][j+1]),
96
- &(epoint1[i][j+2])
97
- );
98
- }
99
- }
100
- for(int i = 1; i < point2[0][0]+1; i++){//配列に保存
101
- for(int j = 0; j < 3; j++){
102
- fscanf(readf_in2,"%lf", //lfは倍精度実数で読み取る
103
- &(epoint2[i][j]),
104
- &(epoint2[i][j+1]),
105
- &(epoint2[i][j+2])
106
- );
107
- }
108
- }
109
-
110
- /* -- ここからわかりません -- */
111
- int k = 0;
112
- for(int i = 0; i < point2[0][0]; i++){
113
- for(int j =0; j < point1[0][0]; j++){
114
- if(epoint1[i][0] == epoint2[j][0] && epoint1[i][1] == epoint2[j][1] && epoint1[i][3] == epoint2[j][3] ){
115
- printf("match\n");
116
- }
117
- else{
118
- k = k + 1;
119
- ecomb2[k][0] = epoint2[j][0];
120
- ecomb2[k][1] = epoint2[j][1];
121
- ecomb2[k][2] = epoint2[j][2];
122
- }
123
- }
124
- }
125
-
126
- fprintf(writef_in,"%8d\n", k);//確認用
127
- for(int i = 0; i < k; i++){
128
- fprintf(writef_in,"%24.13E%24.13E%24.13E\n",
129
- ecomb2[i][0], ecomb2[i][1], ecomb2[i][2]
130
- );
131
- }
132
- /* -- ここまでわかりません -- */
133
-
134
- //ファイルをclose
135
- fclose(readf_in1);
136
- fclose(readf_in2);
137
- fclose(writef_in);
138
- }
139
- ```
140
6
  ### ファイルのフォーマット
141
7
  ```dat
142
8
   節点数  要素数 0 0 1.000E+03

4

in.datの修正

2021/01/20 07:53

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -185,17 +185,21 @@
185
185
  ```
186
186
  ###### in.dat(出力ファイル)
187
187
  ```dat
188
- 9 5 0 0 1.000E+03
188
+ 12 8 0 0 1.000E+03
189
- 1 2 3 4 5 6 7 8
189
+ 1 2 3 4 5 6 1 2
190
- 9 1 2 3 4 5 6 7
190
+ 3 4 5 6 7 3 5 8
191
+ 9 6 10 11 12 7 3 5
191
- 8 9 1 2
192
+ 8 9 6 10 11 12 7 3
192
- 21 21 21
193
+ 11 11 11
194
+ 12 12 12
193
195
  13 13 13
196
+ 14 14 14
194
197
  15 15 15
198
+ 16 16 16
199
+ 21 21 21
195
200
  22 22 22
196
201
  23 23 23
197
202
  24 24 24
198
- 16 16 16
199
203
  25 25 25
200
204
  26 26 26
201
205
  ```

3

コードの修正

2021/01/16 13:41

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -11,7 +11,7 @@
11
11
  int main()
12
12
  {
13
13
  //readfは読み込むファイル,writefは書き込むファイル
14
- FILE *readf_in1, *readf_in2, *writef_in, *writef_sin;
14
+ FILE *readf_in1, *readf_in2, *writef_in;
15
15
 
16
16
  char in1[] = "in.dat1";
17
17
  char in2[] = "in.dat2";
@@ -49,8 +49,6 @@
49
49
  if(writef_in == NULL){//エラー処理
50
50
  fclose(readf_in1);
51
51
  fclose(readf_in2);
52
- fclose(readf_sin1);
53
- fclose(readf_sin2);
54
52
  printf("error in.dat\n");
55
53
  exit(1); //強制終了
56
54
  }

2

サンプルファイルの追加

2021/01/16 10:10

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -157,37 +157,47 @@
157
157
  .
158
158
  節点18のx座標  節点18のy座標  節点18のz座標
159
159
  ```
160
- ### in.dat1(入力ファイル)
160
+ ###### in.dat1(入力ファイル)
161
161
  ```dat
162
- 18 24 0 0 1.000E+03
162
+ 6 3 0 0 1.000E+03
163
- 1 4 3 10 10 4 3 12
163
+ 1 2 3 4 5 6 1 2
164
+ 3 4 5 6
165
+ 11 11 11
166
+ 12 12 12
167
+ 13 13 13
168
+ 14 14 14
169
+ 15 15 15
170
+ 16 16 16
171
+ ```
172
+ ###### in.dat2(入力ファイル)
173
+ ```dat
174
+ 9 5 0 0 1.000E+03
175
+ 1 2 3 4 5 6 7 8
164
- 10 4 12 13 4 8 9 13
176
+ 9 1 2 3 4 5 6 7
177
+ 8 9 1 2
178
+ 21 21 21
165
- 13 8 9 17 13 17 9 18
179
+ 13 13 13
166
- 6 8 4 15 15 8 4 13
180
+ 15 15 15
181
+ 22 22 22
182
+ 23 23 23
183
+ 24 24 24
184
+ 16 16 16
185
+ 25 25 25
186
+ 26 26 26
187
+ ```
188
+ ###### in.dat(出力ファイル)
189
+ ```dat
190
+ 9 5 0 0 1.000E+03
167
- 15 8 13 17 3 4 5 12
191
+ 1 2 3 4 5 6 7 8
168
- 12 4 5 13 12 13 5 14
169
- 2 6 4 11 11 6 4 15
170
- 11 15 4 13 1 2 4 10
192
+ 9 1 2 3 4 5 6 7
193
+ 8 9 1 2
171
- 10 2 4 11 10 11 4 13
194
+ 21 21 21
172
- 4 7 5 13 13 7 5 14
173
- 13 7 14 16 4 9 7 13
195
+ 13 13 13
196
+ 15 15 15
197
+ 22 22 22
198
+ 23 23 23
199
+ 24 24 24
174
- 13 9 7 16 13 9 16 18
200
+ 16 16 16
175
- -1.234500000000E+01 -1.234500000000E+01 0.000000000000E+00
176
- 0.000000000000E+00 -1.234500000000E+01 0.000000000000E+00
177
- -1.234500000000E+01 0.000000000000E+00 0.000000000000E+00
178
- 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00
179
- -1.234500000000E+01 1.234500000000E+01 0.000000000000E+00
180
- 1.234500000000E+01 -1.234500000000E+01 0.000000000000E+00
181
- 0.000000000000E+00 1.234500000000E+01 0.000000000000E+00
182
- 1.234500000000E+01 0.000000000000E+00 0.000000000000E+00
183
- 1.234500000000E+01 1.234500000000E+01 0.000000000000E+00
184
- -1.234500000000E+01 -1.234500000000E+01 1.234500000000E+01
185
- 0.000000000000E+00 -1.234500000000E+01 1.234500000000E+01
186
- -1.234500000000E+01 0.000000000000E+00 1.234500000000E+01
187
- 0.000000000000E+00 0.000000000000E+00 1.234500000000E+01
188
- -1.234500000000E+01 1.234500000000E+01 1.234500000000E+01
189
- 1.234500000000E+01 -1.234500000000E+01 1.234500000000E+01
190
- 0.000000000000E+00 1.234500000000E+01 1.234500000000E+01
191
- 1.234500000000E+01 0.000000000000E+00 1.234500000000E+01
192
- 1.234500000000E+01 1.234500000000E+01 1.234500000000E+01
201
+ 25 25 25
193
- ```in.dat2は文字数の関係で載せられませんでした。
202
+ 26 26 26
203
+ ```

1

誤字

2021/01/16 09:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -18,11 +18,11 @@
18
18
 
19
19
  int point1[1024][16];//配列の数は適当です。
20
20
  int point2[1024][16];
21
- float fpoint1[1024][16];
21
+ float fpoint1[1024][4];
22
- float fpoint2[1024][16];
22
+ float fpoint2[1024][4];
23
- double epoint1[1024][16];
23
+ double epoint1[1024][3];
24
- double epoint2[1024][16];
24
+ double epoint2[1024][3];
25
- double ecomb2[1024][16];
25
+ double ecomb2[1024][3];
26
26
 
27
27
  //読み込むファイルをopen
28
28
  readf_in1 = fopen(in1,"r");