回答編集履歴

2

引用部分を変更

2017/12/11 08:24

投稿

LLman
LLman

スコア5592

test CHANGED
@@ -1,203 +1,207 @@
1
+ > コード読み解き方法
2
+
3
+
4
+
5
+ 複雑だから分かりにくい。
6
+
7
+ **分けると分かりやすい**。
8
+
9
+ だから、**分かるまで分解**します。
10
+
11
+
12
+
13
+ **C言語は関数が基本的な単位**ですので、
14
+
15
+ ひとつの関数だけを見てみましょう。
16
+
17
+
18
+
19
+ ```c
20
+
21
+ int isPrime(int n)
22
+
23
+ ```
24
+
25
+
26
+
27
+ まず、**関数名**が「**Prime**」だから、**素数**を求める関数だと分かります。
28
+
29
+
30
+
31
+ ```c
32
+
33
+ int isPrime(int n)
34
+
35
+ {
36
+
37
+ return 0;
38
+
39
+ return 1;
40
+
41
+ return 0;
42
+
43
+ return 0;
44
+
45
+ return 1;
46
+
47
+ }
48
+
49
+ ```
50
+
51
+
52
+
53
+ 次に、**Return文**だけ見ると、**返り値**は0か1の二択だと分かります。
54
+
55
+ **引数**がintで、返り値が0か1の関数。
56
+
57
+
58
+
59
+ ```c
60
+
61
+ int isPrime(int n)
62
+
63
+ {
64
+
65
+ if(n<= 1)
66
+
67
+ if(n == 2)
68
+
69
+ if(n%2 == 0)
70
+
71
+ if(n % i == 0)
72
+
73
+ }
74
+
75
+ ```
76
+
77
+
78
+
79
+ そして、**IF文**だけ見ると、引数nに応じて**分岐**している。
80
+
81
+ 正の整数か、2かどうか、剰余が0かによって分岐しています。
82
+
83
+
84
+
85
+ ```c
86
+
87
+ int isPrime(int n)
88
+
89
+ {
90
+
91
+ if(n<= 1)
92
+
93
+ return 0;
94
+
95
+ if(n == 2)
96
+
97
+ return 1;
98
+
99
+ if(n%2 == 0)
100
+
101
+ return 0;
102
+
103
+ }
104
+
105
+ ```
106
+
107
+
108
+
109
+ 前半の方が後半よりやさしいので、前半だけ見てみます。
110
+
111
+
112
+
113
+ 負数やゼロだと0を返す。
114
+
115
+ 引数nが2だと返り値1を返している。
116
+
117
+ 偶数だと0を返す。
118
+
119
+ だから、素数だと1で、素数でないと0を返すと分かります。
120
+
121
+
122
+
123
+ ```c
124
+
125
+ int limit = (int)sqrt((double)n);
126
+
127
+ for(int i = 3; i <= limit; i=i+2)
128
+
129
+ ```
130
+
131
+
132
+
133
+ 後半、一番ゴチャゴチャして難しいところなので、
134
+
135
+ 一行をさらに分けて考えます。
136
+
137
+
138
+
139
+ ```c
140
+
141
+ limit = ;
142
+
143
+ for(; i <= limit;)
144
+
145
+ ```
146
+
147
+
148
+
149
+ 「limit」は**For文**の上限値だと分かります。
150
+
151
+
152
+
153
+ ```c
154
+
155
+ sqrt()
156
+
157
+ ```
158
+
159
+
160
+
161
+ 「sqrt」は平方根を求める関数です。
162
+
163
+ だから、For文では、3からnの平方根まで、2ずつ増やして回している。
164
+
165
+ そういう**ループ**構造が分かります。
166
+
167
+
168
+
169
+ 関数の中は、**IFの分岐とForのループが基本構造**です。
170
+
171
+ それらが複雑な場合、**フローチャート**で**図解**するのも有効です。
172
+
173
+
174
+
175
+ なぜ、平方根を使っているのかは、
176
+
177
+ 「素数 平方根」で**検索**して、
178
+
179
+ 今回の**仕様**である数学の知識を得ると分かります。
180
+
181
+
182
+
183
+ そしてまた、上から**逐次**で一行ずつ読むと、
184
+
185
+ 初見の時より、かなり分かりやすくなっていると思います。
186
+
187
+
188
+
189
+ 今回はmain関数にすでに書いてありますが、
190
+
191
+ **テスト**を書いて動作を確認するのも大事です。
192
+
193
+
194
+
195
+
196
+
197
+ ---
198
+
199
+
200
+
1
201
  > 早めにコードを理解する方法
2
202
 
3
203
 
4
204
 
5
- 複雑だから分かりにくい。
6
-
7
- **分けると分かりやすい**。
8
-
9
- だから、**分かるまで分解**します。
10
-
11
-
12
-
13
- **C言語は関数が基本的な単位**ですので、
14
-
15
- ひとつの関数だけを見てみましょう。
16
-
17
-
18
-
19
- ```c
20
-
21
- int isPrime(int n)
22
-
23
- ```
24
-
25
-
26
-
27
- まず、**関数名**が「**Prime**」だから、**素数**を求める関数だと分かります。
28
-
29
-
30
-
31
- ```c
32
-
33
- int isPrime(int n)
34
-
35
- {
36
-
37
- return 0;
38
-
39
- return 1;
40
-
41
- return 0;
42
-
43
- return 0;
44
-
45
- return 1;
46
-
47
- }
48
-
49
- ```
50
-
51
-
52
-
53
- 次に、**Return文**だけ見ると、**返り値**は0か1の二択だと分かります。
54
-
55
- **引数**がintで、返り値が0か1の関数。
56
-
57
-
58
-
59
- ```c
60
-
61
- int isPrime(int n)
62
-
63
- {
64
-
65
- if(n<= 1)
66
-
67
- if(n == 2)
68
-
69
- if(n%2 == 0)
70
-
71
- if(n % i == 0)
72
-
73
- }
74
-
75
- ```
76
-
77
-
78
-
79
- そして、**IF文**だけ見ると、引数nに応じて**分岐**している。
80
-
81
- 正の整数か、2かどうか、剰余が0かによって分岐しています。
82
-
83
-
84
-
85
- ```c
86
-
87
- int isPrime(int n)
88
-
89
- {
90
-
91
- if(n<= 1)
92
-
93
- return 0;
94
-
95
- if(n == 2)
96
-
97
- return 1;
98
-
99
- if(n%2 == 0)
100
-
101
- return 0;
102
-
103
- }
104
-
105
- ```
106
-
107
-
108
-
109
- 前半の方が後半よりやさしいので、前半だけ見てみます。
110
-
111
-
112
-
113
- 負数やゼロだと0を返す。
114
-
115
- 引数nが2だと返り値1を返している。
116
-
117
- 偶数だと0を返す。
118
-
119
- だから、素数だと1で、素数でないと0を返すと分かります。
120
-
121
-
122
-
123
- ```c
124
-
125
- int limit = (int)sqrt((double)n);
126
-
127
- for(int i = 3; i <= limit; i=i+2)
128
-
129
- ```
130
-
131
-
132
-
133
- 後半、一番ゴチャゴチャして難しいところなので、
134
-
135
- 一行をさらに分けて考えます。
136
-
137
-
138
-
139
- ```c
140
-
141
- limit = ;
142
-
143
- for(; i <= limit;)
144
-
145
- ```
146
-
147
-
148
-
149
- 「limit」は**For文**の上限値だと分かります。
150
-
151
-
152
-
153
- ```c
154
-
155
- sqrt()
156
-
157
- ```
158
-
159
-
160
-
161
- 「sqrt」は平方根を求める関数です。
162
-
163
- だから、For文では、3からnの平方根まで、2ずつ増やして回している。
164
-
165
- そういう**ループ**構造が分かります。
166
-
167
-
168
-
169
- 関数の中は、**IFの分岐とForのループが基本構造**です。
170
-
171
- それらが複雑な場合、**フローチャート**で**図解**するのも有効です。
172
-
173
-
174
-
175
- なぜ、平方根を使っているのかは、
176
-
177
- 「素数 平方根」で**検索**して、
178
-
179
- 今回の**仕様**である数学の知識を得ると分かります。
180
-
181
-
182
-
183
- そしてまた、上から**逐次**で一行ずつ読むと、
184
-
185
- 初見の時より、かなり分かりやすくなっていると思います。
186
-
187
-
188
-
189
- 今回はmain関数にすでに書いてありますが、
190
-
191
- **テスト**を書いて動作を確認するのも大事です。
192
-
193
-
194
-
195
-
196
-
197
- ---
198
-
199
-
200
-
201
205
  「毎回こんなことやってたら遅いでしょ」と思うかもしれません。
202
206
 
203
207
 

1

テストの話を追加

2017/12/11 08:24

投稿

LLman
LLman

スコア5592

test CHANGED
@@ -186,6 +186,12 @@
186
186
 
187
187
 
188
188
 
189
+ 今回はmain関数にすでに書いてありますが、
190
+
191
+ **テスト**を書いて動作を確認するのも大事です。
192
+
193
+
194
+
189
195
 
190
196
 
191
197
  ---