質問編集履歴

3

ソースコード修正

2023/02/02 18:34

投稿

shunko
shunko

スコア2

test CHANGED
File without changes
test CHANGED
@@ -157,7 +157,7 @@
157
157
 
158
158
  fgets(youso, N, fp); //1行のみ読み取り
159
159
  sscanf(youso, "%lf %lf %lf", &zahyou[i][0],&zahyou[i][1],&zahyou[i][2]);
160
- fprintf(outputfile,"%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]);
160
+ //fprintf(outputfile,"%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]);
161
161
 
162
162
  }
163
163
 

2

文章の修正

2023/02/02 18:20

投稿

shunko
shunko

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
  4列目の値が5列目の値と同じになってしまいます。
5
5
 
6
6
  読み込むファイル(in.dat)該当箇所のみ
7
- データが大きすぎて最初のほうしか貼ることが出来ませんでしたが、このままでもプログラムは動くと思います。
7
+ 数字1万行ほど羅列されているので、大きすぎて最初のほうしか貼ることが出来ませんでしたが、このままでもプログラムは動くと思います。
8
8
  ```
9
9
  4846 15677 0 0 1.000E+03
10
10
  23 34 35 36 70 73 72 56
@@ -233,7 +233,7 @@
233
233
  }
234
234
  ```
235
235
 
236
- ### 実行結果(該当箇所のみ
236
+ ### 実行結果(該当箇所一部抜粋
237
237
  ```
238
238
  23 34 35 70 70 73 72 56
239
239
  66 61 64 33 33 46 40 44

1

ソースコードなど修正しました。丸々コピペしただけなので、読みにくかったら申し訳ありません。

2023/02/02 18:15

投稿

shunko
shunko

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,19 +4,79 @@
4
4
  4列目の値が5列目の値と同じになってしまいます。
5
5
 
6
6
  読み込むファイル(in.dat)該当箇所のみ
7
+ データが大きすぎて最初のほうしか貼ることが出来ませんでしたが、このままでもプログラムは動くと思います。
7
- ```
8
+ ```
9
+ 4846 15677 0 0 1.000E+03
8
-   23 34 35 36 70 73 72 56
10
+ 23 34 35 36 70 73 72 56
9
11
  66 61 64 58 33 46 40 44
10
12
  58 56 72 73 73 78 58 60
11
13
  75 53 65 60 64 78 66 58
12
- //省略
14
+ 19 8 1283 20 25 18 17 19
13
-
15
+ 78 64 66 62 68 46 75 60
14
-
16
+ 76 61 60 75 19 20 1283 14
17
+ 66 76 62 75 15 9 20 1283
18
+ 15 4 9 1283 23 32 36 24
19
+ 34 23 21 32 62 78 74 76
20
+ 76 66 78 58 73 78 71 58
21
+ 14 26 16 25 13 2 1 3
22
+ 21 23 24 32 61 76 60 58
23
+ 64 71 72 56 65 61 75 60
24
+ 26 16 25 27 39 50 49 37
25
+ 17 19 1283 14 8 18 6 7
26
+ 56 64 71 57 13 12 11 1
27
+ 42 25 30 29 34 23 35 22
28
+ 20 15 1283 14 6 17 18 1283
29
+ 68 76 60 75 8 18 19 1283
30
+ 40 37 33 49 17 19 18 1283
31
+ 37 39 27 33 25 18 30 29
32
+ 30 19 25 31 28 37 27 33
33
+ 77 62 57 78 42 25 29 37
34
+ 41 50 37 49 28 25 16 27
35
+ 76 66 58 61 14 26 15 16
36
+ 70 56 71 57 43 64 47 48
37
+ 36 47 35 48 58 56 64 72
38
+ 35 34 47 36 21 23 13 24
39
+ 72 56 71 70 64 78 71 57
40
+ 38 50 39 37 4 1283 14 5
41
+ 62 78 76 66 57 70 77 71
42
+ 77 62 78 74 14 26 20 15
43
+ 71 64 72 58 54 46 68 40
44
+ 8 18 7 19 42 37 41 50
45
+ 34 23 32 36 64 78 58 71
46
+ 68 44 49 40 62 64 57 78
47
+ 31 37 42 38 25 18 19 30
48
+ 48 64 56 43 76 74 62 75
49
+ 48 47 43 36 9 8 20 1283
50
+ 60 46 44 68 60 53 46 75
51
+ 40 37 28 33 33 39 44 49
52
+ 33 44 40 49 17 19 14 25
53
+ 15 4 1283 14 4 6 1283 5
54
+ 2 12 13 1 39 37 49 33
55
+ 42 25 37 31 72 73 71 58
56
+ 42 25 31 30 76 78 60 58
57
+ 41 37 42 29 23 34 21 22
58
+ 57 64 43 56 46 68 40 44
59
+ 78 68 76 60 39 37 27 38
60
+ 66 61 76 75 78 57 77 71
61
+ 28 25 27 37 25 18 29 17
62
+ 37 50 42 38 30 41 42 29
63
+ 1283 17 14 5 8 18 1283 6
64
+ 6 17 1283 5 78 71 69 73
65
+ 11 10 13 1 3 13 10 1
66
+ 11 23 12 22 24 23 13 12
67
+ 19 14 25 20 20 14 25 26
68
+ 31 25 1338 19 31 37 1338 25
69
+ 31 19 1338 20 31 20 1338 26
15
- ```
70
+ ```
16
-
71
+
17
- ### 該当のソースコード(該当箇所と思われるところのみ載せています)
72
+ ### 該当のソースコード
18
73
 
19
74
  ```c
75
+ #include <stdio.h>
76
+ #include <stdlib.h>
77
+
78
+ #define N 256 //1行の最大文字数(1バイト)
79
+
20
80
  int main(void) {
21
81
 
22
82
  FILE *fp; // FILE型構造体
@@ -26,12 +86,47 @@
26
86
  float a3;
27
87
  int f1,f2,f3,f4,f5,f6,f7,f8;
28
88
 
89
+ //結果をファイルに出力
90
+ FILE *outputfile; // 出力ストリーム
91
+ outputfile = fopen("in_p.dat", "w"); // ファイルを書き込み用にオープン(開く)
92
+ if (outputfile == NULL) { // オープンに失敗した場合
93
+ printf("cannot open\n"); // エラーメッセージを出して
94
+ exit(1); // 異常終了
95
+ }
96
+
97
+ fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。
98
+ if(fp == NULL) {
99
+ printf("%s file not open!\n", fname);
100
+ return -1;
101
+ }
102
+
103
+ //1行目の読み取り
104
+ fgets(youso, N, fp); //1行のみ読み取り
105
+ sscanf(youso, "%d %d %d %d %f", &x,&y,&a1,&a2,&a3); //なぜか最後の数値だけfloat型でないとちゃんと出力されない
106
+ fprintf(outputfile,"%d %d %d %d %0.f\n", x,y,a1,a2,a3); //表示
107
+ //printf("%s", youso);
108
+
109
+ //要素の読み取り
110
+ int setten[y-1][3]; //各要素が使う節点番号を格納する配列;setten[0]には要素番号1の要素が使う節点を格納
111
+ //要素数が偶数か奇数かによって場合分け
29
- if (y%2==1){ //数の時
112
+ if (y%2==0){ //数の時
30
113
  for(int i=0;i<y/2;i++){ //要素数/2の回数だけ行単位で読み取る
31
114
  fgets(youso, N, fp); //1行のみ読み取り
32
115
  int s = 2*i;
33
116
  int t = 2*i+1;
34
-
117
+ //配列に格納
118
+ sscanf(youso, "%d %d %d %d %d %d %d %d", &setten[s][0],&setten[s][1],&setten[s][2],&setten[s][3],&setten[t][0],&setten[t][1],&setten[t][2],&setten[t][3]);
119
+ //表示
120
+ fprintf(outputfile,"%d %d %d %d %d %d %d %d\n", setten[s][0],setten[s][1],setten[s][2],setten[s][3],setten[t][0],setten[t][1],setten[t][2],setten[t][3]);
121
+ }
122
+ }
123
+ if (y%2==1){ //奇数の時
124
+ for(int i=0;i<y/2;i++){ //要素数/2の回数だけ行単位で読み取る
125
+ fgets(youso, N, fp); //1行のみ読み取り
126
+ int s = 2*i;
127
+ int t = 2*i+1;
128
+
129
+ /*
35
130
  sscanf(youso, "%d %d %d %d %d %d %d %d", &f1,&f2,&f3,&f4,&f5,&f6,&f7,&f8);
36
131
 
37
132
  int tmp1[] = {f1, f2, f3, f4};
@@ -45,6 +140,97 @@
45
140
 
46
141
  printf("%d %d %d %d %d %d %d %d\n", setten[s][0],setten[s][1],setten[s][2],setten[s][3],setten[t][0],setten[t][1],setten[t][2],setten[t][3]);
47
142
 
143
+ */
144
+
145
+ sscanf(youso, "%d %d %d %d %d %d %d %d", &setten[s][0],&setten[s][1],&setten[s][2],&setten[s][3],&setten[t][0],&setten[t][1],&setten[t][2],&setten[t][3]);
146
+ //fprintf(outputfile,"%d %d %d %d %d %d %d %d\n", setten[s][0],setten[s][1],setten[s][2],setten[s][3],setten[t][0],setten[t][1],setten[t][2],setten[t][3]);
147
+ }
148
+ //残った最後の一行
149
+ fgets(youso, N, fp);
150
+ sscanf(youso, "%d %d %d %d", &setten[y-1][0],&setten[y-1][1],&setten[y-1][2],&setten[y-1][3]);
151
+ fprintf(outputfile,"%d %d %d %d\n", setten[y-1][0],setten[y-1][1],setten[y-1][2],setten[y-1][3]);
152
+ }
153
+
154
+ //節点座標の読み取り
155
+ double zahyou[x][2]; //節点のx,y,z座標を格納する配列
156
+ for(int i=0;i<x;i++){ //節点数の回数だけ行単位で読み取る
157
+
158
+ fgets(youso, N, fp); //1行のみ読み取り
159
+ sscanf(youso, "%lf %lf %lf", &zahyou[i][0],&zahyou[i][1],&zahyou[i][2]);
160
+ fprintf(outputfile,"%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]);
161
+
162
+ }
163
+
164
+ //printf("%f %f %f\n", zahyou[0][0],zahyou[0][1],zahyou[0][2]);
165
+
166
+ for(int i=0;i<x;i++){
167
+ //fprintf(outputfile,"%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]);
168
+ }
169
+
170
+
171
+ //使われていない節点の座標を表す行を削除したい
172
+
173
+ //新しい配列において使われている節点の節点番号に該当する箇所に1を格納
174
+ //使われていない節点の節点番号に該当する配列には0を格納
175
+
176
+ int bangou[x-1]; //新しい配列
177
+ int s=0;
178
+ int i,j;
179
+ //使われている節点の節点番号に該当する箇所に1を格納
180
+ for (i=0;i<y;i++){
181
+ for (j=0;j<3;j++){
182
+ s = setten[i][j];
183
+ bangou[s-1]=1;
184
+ }
185
+ }
186
+ //使われていない節点の節点番号に該当する配列には0を格納
187
+ for (i=0;i<x;i++){
188
+ if (bangou[i]!=1){
189
+ bangou[i]=0;
190
+ }
191
+ }
192
+ /*
193
+ //表示
194
+ for (i=0;i<x;i++){
195
+ printf("%d\n", bangou[i]);
196
+ }
197
+ */
198
+ /*
199
+ //使われていない節点の座標を格納した配列に0を格納
200
+ for (i=0;i<x;i++){
201
+ if (bangou[i]==0){
202
+ zahyou[i][0] = 0;
203
+ zahyou[i][1] = 0;
204
+ zahyou[i][2] = 0;
205
+ }
206
+ //printf("%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]); //表示
207
+
208
+ }
209
+
210
+ */
211
+
212
+ /*
213
+ //使われていない節点の座標が書かれた行を削除して表示
214
+ for (i=0;i<x;i++){
215
+ if (zahyou[i][0]!=0&&zahyou[i][1]!=0&&zahyou[i][2]!=0){
216
+ printf("%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]);
217
+ }
218
+ }
219
+ */
220
+
221
+
222
+ for (i=0;i<x;i++){
223
+ if (bangou[i]==1){
224
+ fprintf(outputfile,"%f %f %f\n", zahyou[i][0],zahyou[i][1],zahyou[i][2]);
225
+ }
226
+ }
227
+
228
+
229
+ fclose(fp); // ファイルを閉じる
230
+
231
+ fclose(outputfile); // ファイルをクローズ(閉じる)
232
+ return 0;
233
+ }
48
234
  ```
49
235
 
50
236
  ### 実行結果(該当箇所のみ)