質問編集履歴

2

出力結果を書きました。

2016/07/24 10:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -10,6 +10,72 @@
10
10
 
11
11
 
12
12
 
13
+ ```
14
+
15
+ 1
16
+
17
+ Side : 224.210646
18
+
19
+ Area : 2072.541918
20
+
21
+ 2
22
+
23
+ Side : 200.143520
24
+
25
+ Area : 1352.474029
26
+
27
+ 3
28
+
29
+ Side : 186.673849
30
+
31
+ Area : 1447.508549
32
+
33
+ 4
34
+
35
+ Side : 240.090907
36
+
37
+ Area : 1719.078096
38
+
39
+ 5
40
+
41
+ Side : 142.866303
42
+
43
+ Area : 967.710959
44
+
45
+ 6
46
+
47
+ Side : 164.552194
48
+
49
+ Area : 935.697066
50
+
51
+ 7
52
+
53
+ Side : 95.511362
54
+
55
+ Area : 172.333253
56
+
57
+ 8
58
+
59
+ Side : 224.741866
60
+
61
+ Area : 1657.931090
62
+
63
+ 9
64
+
65
+ Side : 185.111045
66
+
67
+ Area : 1389.912227
68
+
69
+ 10
70
+
71
+ Side : 143.538119
72
+
73
+ Area : 446.386604
74
+
75
+ ```
76
+
77
+
78
+
13
79
  ###発生している問題・エラーメッセージ
14
80
 
15
81
  Segmentation fault: 11が表示されます。

1

コードをポインタを用いないものに変更しました。

2016/07/24 10:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,12 @@
4
4
 
5
5
 
6
6
 
7
+ [追記]
8
+
9
+ A[SIZE]をポインタを用いないものに変更しましたがどのソートを実行してもソートされません。
10
+
11
+
12
+
7
13
  ###発生している問題・エラーメッセージ
8
14
 
9
15
  Segmentation fault: 11が表示されます。
@@ -56,13 +62,13 @@
56
62
 
57
63
 
58
64
 
59
- triangle_t *A[SIZE];
65
+ triangle_t A[SIZE];
60
66
 
61
67
 
62
68
 
63
69
  //A[]の初期化
64
70
 
65
- void init_triangle()
71
+ void init_triangle(triangle_t t[], int n)
66
72
 
67
73
  {
68
74
 
@@ -70,15 +76,15 @@
70
76
 
71
77
 
72
78
 
73
- for (i = 0; i < SIZE; i++) {
79
+ for (i = 0; i < n; i++) {
74
80
 
75
81
  for (j = 0; j < 3; j++) {
76
82
 
77
- A[i]->p[j].x = 0;
83
+ t[i].p[j].x = 0;
78
-
84
+
79
- A[i]->p[j].y = 0;
85
+ t[i].p[j].y = 0;
80
-
86
+
81
- A[i]->p[j].z = 0;
87
+ t[i].p[j].z = 0;
82
88
 
83
89
  }
84
90
 
@@ -90,7 +96,7 @@
90
96
 
91
97
  //三角形の辺の和, 面積を出力
92
98
 
93
- void print_triangle(triangle_t *t)
99
+ void print_triangle(triangle_t t)
94
100
 
95
101
  {
96
102
 
@@ -100,13 +106,11 @@
100
106
 
101
107
 
102
108
 
103
- if (t != NULL) {
104
-
105
- s[0] = sqrt(pow((double)(t->p[1].x - t->p[0].x), 2) + pow((double)(t->p[1].y - t->p[0].y), 2) + pow((double)(t->p[1].z - t->p[0].z), 2));
109
+ s[0] = sqrt(pow((double)(t.p[1].x - t.p[0].x), 2) + pow((double)(t.p[1].y - t.p[0].y), 2) + pow((double)(t.p[1].z - t.p[0].z), 2));
106
-
110
+
107
- s[1] = sqrt(pow((double)(t->p[2].x - t->p[1].x), 2) + pow((double)(t->p[2].y - t->p[1].y), 2) + pow((double)(t->p[2].z - t->p[1].z), 2));
111
+ s[1] = sqrt(pow((double)(t.p[2].x - t.p[1].x), 2) + pow((double)(t.p[2].y - t.p[1].y), 2) + pow((double)(t.p[2].z - t.p[1].z), 2));
108
-
112
+
109
- s[2] = sqrt(pow((double)(t->p[0].x - t->p[2].x), 2) + pow((double)(t->p[0].y - t->p[2].y), 2) + pow((double)(t->p[0].z - t->p[2].z), 2));
113
+ s[2] = sqrt(pow((double)(t.p[0].x - t.p[2].x), 2) + pow((double)(t.p[0].y - t.p[2].y), 2) + pow((double)(t.p[0].z - t.p[2].z), 2));
110
114
 
111
115
  ss = s[0] + s[1] + s[2];
112
116
 
@@ -124,15 +128,13 @@
124
128
 
125
129
  printf("Area : %f\n", a);
126
130
 
127
- }
128
-
129
131
  }
130
132
 
131
133
 
132
134
 
133
135
  //三角形生成
134
136
 
135
- triangle_t *create_triangle()
137
+ triangle_t create_triangle()
136
138
 
137
139
  {
138
140
 
@@ -140,7 +142,7 @@
140
142
 
141
143
  double s[3]; //各辺の長さ
142
144
 
143
- triangle_t tr, *ptr; //三角形
145
+ triangle_t tr; //三角形
144
146
 
145
147
  int i;
146
148
 
@@ -186,17 +188,29 @@
186
188
 
187
189
  }
188
190
 
189
- ptr = &tr;
190
-
191
191
  //printf(" x y z\n");
192
192
 
193
- //for (i = 0; i < 3; i++) printf("%d %6d %6d %6d\n", i + 1, ptr->p[i].x, ptr->p[i].y, ptr->p[i].z);
193
+ //for (i = 0; i < 3; i++) printf("%d %6d %6d %6d\n", i + 1, ptr.p[i].x, ptr.p[i].y, ptr.p[i].z);
194
-
194
+
195
- return ptr;
195
+ return tr;
196
-
196
+
197
- }
197
+ }
198
+
198
-
199
+ else {
200
+
201
+ for (i = 0; i < 3; i++) {
202
+
203
+ tr.p[i].x = x[i];
204
+
205
+ tr.p[i].y = y[i];
206
+
207
+ tr.p[i].z = z[i];
208
+
209
+ }
210
+
199
- else return NULL;
211
+ return tr;
212
+
213
+ }
200
214
 
201
215
  }
202
216
 
@@ -204,7 +218,7 @@
204
218
 
205
219
  //三角形の面積(等しければ3辺の和)を比較し前者が小さければ負, 後者が小さければ正を返す
206
220
 
207
- int cmp_triangle(triangle_t *t1, triangle_t *t2)
221
+ int cmp_triangle(triangle_t t1, triangle_t t2)
208
222
 
209
223
  {
210
224
 
@@ -216,21 +230,21 @@
216
230
 
217
231
 
218
232
 
219
- s1[0] = sqrt(pow((double)(t1->p[1].x - t1->p[0].x), 2) + pow((double)(t1->p[1].y - t1->p[0].y), 2) + pow((double)(t1->p[1].z - t1->p[0].z), 2));
233
+ s1[0] = sqrt(pow((double)(t1.p[1].x - t1.p[0].x), 2) + pow((double)(t1.p[1].y - t1.p[0].y), 2) + pow((double)(t1.p[1].z - t1.p[0].z), 2));
220
-
234
+
221
- s1[1] = sqrt(pow((double)(t1->p[2].x - t1->p[1].x), 2) + pow((double)(t1->p[2].y - t1->p[1].y), 2) + pow((double)(t1->p[2].z - t1->p[1].z), 2));
235
+ s1[1] = sqrt(pow((double)(t1.p[2].x - t1.p[1].x), 2) + pow((double)(t1.p[2].y - t1.p[1].y), 2) + pow((double)(t1.p[2].z - t1.p[1].z), 2));
222
-
236
+
223
- s1[2] = sqrt(pow((double)(t1->p[0].x - t1->p[2].x), 2) + pow((double)(t1->p[0].y - t1->p[2].y), 2) + pow((double)(t1->p[0].z - t1->p[2].z), 2));
237
+ s1[2] = sqrt(pow((double)(t1.p[0].x - t1.p[2].x), 2) + pow((double)(t1.p[0].y - t1.p[2].y), 2) + pow((double)(t1.p[0].z - t1.p[2].z), 2));
224
238
 
225
239
  ss1 = (s1[0] + s1[1] + s1[2]) / 2;
226
240
 
227
241
 
228
242
 
229
- s2[0] = sqrt(pow((double)(t2->p[1].x - t2->p[0].x), 2) + pow((double)(t2->p[1].y - t2->p[0].y), 2) + pow((double)(t2->p[1].z - t2->p[0].z), 2));
243
+ s2[0] = sqrt(pow((double)(t2.p[1].x - t2.p[0].x), 2) + pow((double)(t2.p[1].y - t2.p[0].y), 2) + pow((double)(t2.p[1].z - t2.p[0].z), 2));
230
-
244
+
231
- s2[1] = sqrt(pow((double)(t2->p[2].x - t2->p[1].x), 2) + pow((double)(t2->p[2].y - t2->p[1].y), 2) + pow((double)(t2->p[2].z - t2->p[1].z), 2));
245
+ s2[1] = sqrt(pow((double)(t2.p[2].x - t2.p[1].x), 2) + pow((double)(t2.p[2].y - t2.p[1].y), 2) + pow((double)(t2.p[2].z - t2.p[1].z), 2));
232
-
246
+
233
- s2[2] = sqrt(pow((double)(t2->p[0].x - t2->p[2].x), 2) + pow((double)(t2->p[0].y - t2->p[2].y), 2) + pow((double)(t2->p[0].z - t2->p[2].z), 2));
247
+ s2[2] = sqrt(pow((double)(t2.p[0].x - t2.p[2].x), 2) + pow((double)(t2.p[0].y - t2.p[2].y), 2) + pow((double)(t2.p[0].z - t2.p[2].z), 2));
234
248
 
235
249
  ss2 = (s2[0] + s2[1] + s2[2]) / 2;
236
250
 
@@ -242,7 +256,7 @@
242
256
 
243
257
 
244
258
 
245
- //printf("The latter's side = %f\n", sqrt(ss2 * (ss2 - s2[0]) * (ss2 - s2[1]) * (ss2 - s2[2])));
259
+ //printf("The latter's side = %f\n", sqrt(ss2 (ss2 - s2[0]) (ss2 - s2[1]) (ss2 - s2[2])));
246
260
 
247
261
 
248
262
 
@@ -278,7 +292,7 @@
278
292
 
279
293
  //cmp_triangleの結果を文字で出力するバージョン
280
294
 
281
- void print_cmp_triangle(triangle_t *t1, triangle_t *t2)
295
+ void print_cmp_triangle(triangle_t t1, triangle_t t2)
282
296
 
283
297
  {
284
298
 
@@ -322,7 +336,7 @@
322
336
 
323
337
  //バブルソート
324
338
 
325
- void bubble_sort()
339
+ void bubble_sort(triangle_t t[], int n)
326
340
 
327
341
  {
328
342
 
@@ -330,11 +344,11 @@
330
344
 
331
345
 
332
346
 
333
- for (i = 0; i < SIZE; i++)
347
+ for (i = 0; i < n; i++)
334
-
348
+
335
- for (j = SIZE - 1; j > i; j--)
349
+ for (j = n - 1; j > i; j--)
336
-
350
+
337
- if (cmp_triangle(A[j - 1], A[j]) > 0) swap(A[j - 1], A[j]);
351
+ if (cmp_triangle(t[j - 1], t[j]) > 0) swap(&t[j - 1], &t[j]);
338
352
 
339
353
  }
340
354
 
@@ -344,21 +358,21 @@
344
358
 
345
359
  //G:ギャップ列
346
360
 
347
- void shell_sort()
361
+ void shell_sort(triangle_t t[], int n)
348
-
362
+
349
- {
363
+ {
350
-
364
+
351
- int i, j, k;
365
+ int i, j, k = 0;
352
366
 
353
367
  int K;
354
368
 
355
- int G[SIZE];
369
+ int G[n];
356
370
 
357
371
 
358
372
 
359
373
  //G[k] = 2^(k+1)-1 : Hibbardの方法
360
374
 
361
- for (i = 0; G[i] < SIZE; i++) G[i] = (pow(2, k + 1)) - 1;
375
+ for (i = 0; G[i] < n; i++) G[i] = (pow(2, k + 1)) - 1;
362
376
 
363
377
  K = i - 1;
364
378
 
@@ -366,21 +380,21 @@
366
380
 
367
381
  for (k = K; k >= 0; k--) {
368
382
 
369
- for (i = G[k]; i < SIZE; i++) {
383
+ for (i = G[k]; i < n; i++) {
370
-
384
+
371
- triangle_t *tmp = A[i];
385
+ triangle_t tmp = t[i];
372
386
 
373
387
  j = i - G[k];
374
388
 
375
- while (j >= 0 && cmp_triangle(tmp, A[j]) < 0) {
389
+ while (j >= 0 && cmp_triangle(tmp, t[j]) < 0) {
376
-
390
+
377
- A[j + G[k]] = A[j];
391
+ t[j + G[k]] = t[j];
378
392
 
379
393
  j -= G[k];
380
394
 
381
395
  }
382
396
 
383
- A[j + G[k]] = tmp;
397
+ t[j + G[k]] = tmp;
384
398
 
385
399
  }
386
400
 
@@ -392,11 +406,11 @@
392
406
 
393
407
  //クイックソートにおける分割処理
394
408
 
395
- int partition(pivot, left, right)
409
+ int partition(triangle_t t[], int pivot, int left, int right)
396
-
410
+
397
- {
411
+ {
398
-
412
+
399
- A[right] = A[pivot];
413
+ t[right] = t[pivot];
400
414
 
401
415
  int l = left;
402
416
 
@@ -406,11 +420,11 @@
406
420
 
407
421
  while (1) {
408
422
 
409
- while (A[l] < A[right]) l++;
423
+ while (cmp_triangle(t[l], t[right]) < 0) l++;
410
-
424
+
411
- while (l <= r && A[r] >= A[right]) r--;
425
+ while (l <= r && cmp_triangle(t[r], t[right]) >= 0) r--;
412
-
426
+
413
- if (l < r) swap(A[l], A[r]);
427
+ if (l < r) swap(&t[l], &t[r]);
414
428
 
415
429
  else break;
416
430
 
@@ -418,7 +432,7 @@
418
432
 
419
433
 
420
434
 
421
- swap(A[l], A[right]);
435
+ swap(&t[l], &t[right]);
422
436
 
423
437
  return l;
424
438
 
@@ -428,13 +442,13 @@
428
442
 
429
443
  //左端, 中央, 右端のうち真ん中の値の要素のインデックスを出力する
430
444
 
431
- int middle_value()
445
+ int middle_value(triangle_t t[], int n)
432
-
446
+
433
- {
447
+ {
434
-
448
+
435
- triangle_t *B[3] = {A[0], A[SIZE / 2], A[SIZE - 1]};
449
+ triangle_t B[3] = {t[0], t[n / 2], t[n - 1]};
436
-
450
+
437
- triangle_t *max = B[0], *min = B[0], *mid;
451
+ triangle_t max = B[0], min = B[0], mid;
438
452
 
439
453
  int i;
440
454
 
@@ -464,11 +478,11 @@
464
478
 
465
479
 
466
480
 
467
- if (cmp_triangle(mid, A[0]) == 0) return 0;
481
+ if (cmp_triangle(mid, t[0]) == 0) return 0;
468
-
482
+
469
- else if (cmp_triangle(mid, A[SIZE / 2])) return SIZE / 2;
483
+ else if (cmp_triangle(mid, t[n / 2])) return n / 2;
470
-
484
+
471
- else if (cmp_triangle(mid, A[SIZE - 1])) return SIZE - 1;
485
+ else if (cmp_triangle(mid, t[n - 1])) return n - 1;
472
486
 
473
487
  else return -1;
474
488
 
@@ -478,17 +492,17 @@
478
492
 
479
493
  //クイックソート
480
494
 
481
- void quick_sort(left, right)
495
+ void quick_sort(triangle_t t[], int left, int right, int n)
482
496
 
483
497
  {
484
498
 
485
499
  if (left < right) {
486
500
 
487
- int pivot = middle_value();
501
+ int pivot = middle_value(t, n);
488
-
489
-
490
-
502
+
503
+
504
+
491
- int p = partition(pivot, left, right); //分割処理
505
+ int p = partition(t, pivot, left, right); //分割処理
492
506
 
493
507
  //A[pivot]未満のデータをA[left],...,A[p-1]に集める
494
508
 
@@ -498,9 +512,9 @@
498
512
 
499
513
 
500
514
 
501
- quick_sort(left, p - 1);
515
+ quick_sort(t, left, p - 1, n);
502
-
516
+
503
- quick_sort(p + 1, right);
517
+ quick_sort(t, p + 1, right, n);
504
518
 
505
519
  }
506
520
 
@@ -518,7 +532,9 @@
518
532
 
519
533
  //ソートテスト
520
534
 
521
- triangle_t *T[TEST_NUM];
535
+ triangle_t T[TEST_NUM];
536
+
537
+ //init_triangle(T, TEST_NUM);
522
538
 
523
539
  srand((unsigned)time(NULL));
524
540
 
@@ -526,11 +542,11 @@
526
542
 
527
543
 
528
544
 
529
- bubble_sort();
530
-
531
- //shell_sort();
532
-
533
- //quick_sort(0, SIZE - 1);
545
+ //bubble_sort(T, TEST_NUM);
546
+
547
+ shell_sort(T, TEST_NUM);
548
+
549
+ //quick_sort(T, 0, TEST_NUM - 1, TEST_NUM);
534
550
 
535
551
 
536
552
 
@@ -544,30 +560,6 @@
544
560
 
545
561
 
546
562
 
547
- /*
548
-
549
- triangle_t *tr1, *tr2;
550
-
551
- int cmp;
552
-
553
-
554
-
555
- tr1 = create_triangle();
556
-
557
- tr2 = create_triangle();
558
-
559
-
560
-
561
- print_cmp_triangle(tr1, tr2);
562
-
563
-
564
-
565
- //for (i = 0; i < 3; i++) printf("%d %6d %6d %6d\n", i + 1, tr->p[i].x, tr->p[i].y, tr->p[i].z);
566
-
567
- */
568
-
569
-
570
-
571
563
  return 0;
572
564
 
573
565
  }