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

回答編集履歴

8

改良

2016/11/14 23:21

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,5 +1,37 @@
1
1
  for文とポインタのみで作成してみました。
2
+ 改良してみました。minidxが使えませんでしたが。。。
3
+ ```c
4
+ #include <stdio.h>
5
+ #define N 5
2
6
 
7
+ int main()
8
+ {
9
+ double arr[N];
10
+ double tmp;
11
+ double *p,*q,*minidx;
12
+ printf("Please input %d double numbers\n", N);
13
+
14
+ for (p=arr; p - arr < N; p++ ){
15
+ scanf("%lf",p);
16
+
17
+ for (q=arr; p - q > 0; q++){
18
+ if (*p < *q){
19
+ tmp = *q;
20
+ *q = *p;
21
+ *p = tmp;
22
+ }
23
+ }
24
+ }
25
+
26
+ printf("Sorted data\n");
27
+ p=arr;
28
+ for (p=arr; p - arr < N; p++ ){
29
+ printf("%f\n", *p);
30
+ }
31
+ return 0;
32
+ }
33
+ ```
34
+
3
35
  ```c
4
36
  #include <stdio.h>
5
37
  #define N 5

7

追加

2016/11/14 23:21

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -87,6 +87,25 @@
87
87
  つたない説明ですので、ご質問にてカバーさせていただきます。
88
88
 
89
89
  付録
90
+ ```c
91
+ /* バブルソートを行う */
92
+ int BubSort(int x[ ], int n)
93
+ {
94
+ int i, j, temp;
95
+
96
+ for (i = 0; i < n - 1; i++) {
97
+ for (j = n - 1; j > i; j--) {
98
+ if (x[j - 1] > x[j]) { /* 前の要素の方が大きかったら */
99
+ temp = x[j]; /* 交換する */
100
+ x[j] = x[j - 1];
101
+ x[j - 1]= temp;
102
+ }
103
+ }
104
+ /* ソートの途中経過を表示 */
105
+ ShowData(x, NUM_DATA);
106
+ }
107
+ }
108
+ ```
90
109
  ```C
91
110
  int main(void) {
92
111
  double arr[5];

6

追加

2016/11/13 23:49

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
File without changes

5

追加

2016/11/13 23:41

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -86,6 +86,18 @@
86
86
 
87
87
  つたない説明ですので、ご質問にてカバーさせていただきます。
88
88
 
89
+ 付録
90
+ ```C
91
+ int main(void) {
92
+ double arr[5];
93
+ double *p,*q;
94
+ p=arr;
95
+ q=&arr[4];
96
+ printf("Pointer q-p:%d",q - p );
97
+ return 0;
98
+ }
99
+ ```
89
100
 
90
101
 
91
102
 
103
+

4

追加

2016/11/13 23:41

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -33,4 +33,59 @@
33
33
  }
34
34
  return 0;
35
35
  }
36
- ```
36
+ ```
37
+ ---
38
+ ポインターのみで作成すると言う事は、多分ポインターの課題だと思い作成しました。
39
+
40
+ ```c
41
+ for (p=arr; p - arr < N - 1; p++){
42
+ for (q = arr + N - 1; q > p; q--) {
43
+ minidx=q-1;
44
+ if (*minidx > *q){
45
+ tmp = *q;
46
+ *q = *minidx;
47
+ *minidx = tmp;
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ > double arr[N];
54
+ double tmp;
55
+ double *p,*q,*minidx;
56
+
57
+
58
+ arrは、doubleの配列です、この場合doubleが5個並んで存在している事になります。
59
+ 同様に他のポインター(*p,*q,*minidx)もdoubleで定義しています。
60
+ 意味はp,q,minidxは、ダブルの値を持つアドレスを示すポインターです。
61
+ > for (p=arr; p - arr < N - 1; p++){
62
+
63
+ p=arr;
64
+ &arr[0](アドレス)がforの最初、p=arr;で配列arrの先頭アドレスを p にセットします。
65
+
66
+ p++
67
+ 先にp++の説明ですが、ポインターをインクレメント(+1)すると次のdouble分の長さの分のアドレスがセットされます。p++するとarr[1]を指す事になります。これで配列arr[0],[1]...と順番に差します。
68
+
69
+ 例として char *c = "abcd"; とした場合ポインターcは'a'のアドレスを指します。
70
+ c++すると'b'が指せますし、或いは*(c+1)とも表現できます。
71
+
72
+ p - arr < N - 1;
73
+ pはfor分の中でarrの配列を0,1,2,3と順番に差していき、最終の4になったら終了させたいので
74
+ pのアドレスが配列[3]を指したら抜けて為にp - arr < 4 と指定しています。
75
+ 中はバブルソートなので4個までで終了です。(この辺は大丈夫と思いますが)
76
+
77
+ p - arr
78
+ ポインターを引き算だとアドレスの差が答えでは?と思いますが、ポインターの引き算は
79
+ p++;と同様な0,1,2,3,4のアドレスの差でなくポインターの差が得られます。
80
+
81
+ > for (q = arr + N - 1; q > p; q--) {
82
+
83
+ 昇順で並べると言う事なので極一般的バブルソートロジックを採用しています。(ググルとでます)
84
+ 多くのサンプルは配列[i]で表現していますが、これをポインターに置き換えただけです。
85
+ 今回は少ない回数で行う方法ですので、他の方法でも可能です。
86
+
87
+ つたない説明ですので、ご質問にてカバーさせていただきます。
88
+
89
+
90
+
91
+

3

訂正

2016/11/13 23:31

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -15,9 +15,10 @@
15
15
  scanf("%lf",p);
16
16
  }
17
17
 
18
- for (q=arr; q - arr < N - 1; q++){
18
+ for (p=arr; p - arr < N - 1; p++){
19
- for (minidx = q + 1; minidx - q < N; minidx++){
19
+ for (q = arr + N - 1; q > p; q--) {
20
+ minidx=q-1;
20
- if(*q < *minidx){
21
+ if (*minidx > *q){
21
22
  tmp = *q;
22
23
  *q = *minidx;
23
24
  *minidx = tmp;

2

訂正

2016/11/12 05:17

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -16,7 +16,6 @@
16
16
  }
17
17
 
18
18
  for (q=arr; q - arr < N - 1; q++){
19
- minidx = q;
20
19
  for (minidx = q + 1; minidx - q < N; minidx++){
21
20
  if(*q < *minidx){
22
21
  tmp = *q;

1

訂正

2016/11/12 04:32

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  int main()
8
8
  {
9
- double arr[N+1];
9
+ double arr[N];
10
10
  double tmp;
11
11
  double *p,*q,*minidx;
12
12
  printf("Please input %d double numbers\n", N);