回答編集履歴

3

追記2

2021/10/09 06:51

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -361,3 +361,93 @@
361
361
 
362
362
 
363
363
  後は基礎が出来ていれば、ちょっと工夫するだけでイケるはずです。
364
+
365
+
366
+
367
+ ----
368
+
369
+
370
+
371
+ [追記2]
372
+
373
+
374
+
375
+ コメントにて『もしかして型がよくわかっていない可能性がある』とご指摘を受けたので、追記します。
376
+
377
+ ~~(本来は ggれ(略) と言いたいですが。基礎中の基礎なので)~~
378
+
379
+
380
+
381
+ ※ 私は趣味&独学なので綺麗な説明はできませんが、書いておきます。
382
+
383
+
384
+
385
+ C言語の変数には**型というもの**があります。
386
+
387
+
388
+
389
+ これは変数についての説明みたいなものですね。
390
+
391
+
392
+
393
+ [参考文献](https://marycore.jp/prog/c-lang/data-type-ranges-and-bit-byte-sizes/)にあるように、型によって範囲が違います。
394
+
395
+
396
+
397
+ 環境によって違いますが、64bit版だと
398
+
399
+
400
+
401
+ ```
402
+
403
+ int : -2147483648 〜 2147483647
404
+
405
+ long: -9223372036854775808 〜 9223372036854775807
406
+
407
+ ```
408
+
409
+
410
+
411
+ となっています。
412
+
413
+
414
+
415
+ たとえば 6147483648 のようなデータを代入しようとすると、int型だと範囲を大きく超えてしまいます。
416
+
417
+ 本当か? と思うのなら、数直線を書いていみるとわかるはずです。
418
+
419
+
420
+
421
+ ではどうするか、intより大きいデータを扱える型を使うのです。
422
+
423
+
424
+
425
+ int a = "2147483647" …ではなく、long a = "2147483647" と言う風に。
426
+
427
+
428
+
429
+ 数直線を意識するとわかるはずです。
430
+
431
+ この対象にしている範囲を定義しているのが型です。
432
+
433
+
434
+
435
+ intはここからここまで、unsigned intはここからここまで。と言う風に。
436
+
437
+
438
+
439
+ char型は中身は整数です。
440
+
441
+ 参考: [Shift-JISの表](http://charset.7jp.net/sjis.html)
442
+
443
+
444
+
445
+ printf関数とかが表示するときに文字にしているだけのようです。
446
+
447
+
448
+
449
+ そして、配列はその変数が連なったイメージです。(上で挙げたURL先にあるような感じ)
450
+
451
+
452
+
453
+ 後は上(本回答や追記1等)を読み返してください。

2

基礎 → C言語の文法

2021/10/09 06:51

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -1,4 +1,4 @@
1
- まず**基礎からやりましょう**。話になりません。足し算すらわからない人に微積分なんて無理です。
1
+ まず**C言語の文法からやりましょう**。話になりません。足し算すらわからない人に微積分なんて無理です。
2
2
 
3
3
 
4
4
 

1

追記1

2021/10/09 02:03

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -149,3 +149,215 @@
149
149
  後は(3)の部分をどのように実装するかを同じように分解したりして考える。
150
150
 
151
151
  (4)も同様に。
152
+
153
+
154
+
155
+ --------------
156
+
157
+
158
+
159
+ [追記1]
160
+
161
+
162
+
163
+ > 具体的には、6桁の数字を配列として受け取って、その前の4バイトと後ろの2バイトに分けて、整数としてことができません。int a = array[4]{ }; int b = array[2]としても、元の配列から数字を取ってきてくれません。こういう場合は、どのように考えるのでしょうか?特に後ろ2バイトなどは表現の使用がないと思いました。
164
+
165
+
166
+
167
+ とりあえず、文字列とはなんでしょうか。そこから考える必要があります。
168
+
169
+ そう、「char型配列」ですね。
170
+
171
+
172
+
173
+ では、配列とはなんでしょうか。
174
+
175
+ イメージ的には[ここ](https://eng-entrance.com/java-array-whatis)のような感じでしょうか。
176
+
177
+
178
+
179
+ では文字列とはなんでしょうか。そう**char型**配列ですね。
180
+
181
+
182
+
183
+ char型は内部では整数のようですが、「文字」用です。
184
+
185
+
186
+
187
+ "Hello" だと、{ 'H', 'e', 'l', 'l', 'o' } という状態です。
188
+
189
+
190
+
191
+ 今回の 配列 a も たとえば 200102 であれば、{ '2', '0', '0', '1', '0', '2' } です。
192
+
193
+
194
+
195
+ で、もし現実世界で 200102 という文字がホワイトボードに書かれていて、定義は上記のように
196
+
197
+ [西暦][月] の並びでなっていると分かっているとしたら、どのように読みますか?
198
+
199
+
200
+
201
+ 私なら 先頭の'2' から 4文字目(= '1' ) までを一つとして、"2001"を西暦とします。
202
+
203
+ 残り、つまり 6文字 - 4文字 = 2文字、この2文字は「月」と考えます。
204
+
205
+
206
+
207
+ つまり、一文字目 '2' をホワイトボードの余白に書く。
208
+
209
+
210
+
211
+ ```
212
+
213
+ 全体: 200102
214
+
215
+ 西暦: ---
216
+
217
+ 月 : ---
218
+
219
+ ```
220
+
221
+
222
+
223
+ ↓ ↓ ↓ ↓ ↓  ↓
224
+
225
+
226
+
227
+ ```
228
+
229
+ 全体: *00102
230
+
231
+ 西暦: 2
232
+
233
+ 月 : ---
234
+
235
+ ```
236
+
237
+
238
+
239
+ 全体の一文字目はチェック済みってことで"*"とかで伏せる。(伏せなくてもいいけどわかりやすくするために)
240
+
241
+
242
+
243
+ で、2文字目もやる。
244
+
245
+
246
+
247
+ ```
248
+
249
+ 全体: **0102
250
+
251
+ 西暦: 20
252
+
253
+ 月 : ---
254
+
255
+ ```
256
+
257
+
258
+
259
+ 3文字目も。
260
+
261
+
262
+
263
+ ```
264
+
265
+ 全体: ***102
266
+
267
+ 西暦: 200
268
+
269
+ 月 : ---
270
+
271
+ ```
272
+
273
+
274
+
275
+ 4文字目も。
276
+
277
+
278
+
279
+ ```
280
+
281
+ 全体: ****02
282
+
283
+ 西暦: 2001
284
+
285
+ 月 : ---
286
+
287
+ ```
288
+
289
+
290
+
291
+ で5文字目も…とやりたいところですが、西暦は4桁なので西暦はここまで。
292
+
293
+ 後は月と見なす。
294
+
295
+
296
+
297
+ ```
298
+
299
+ 全体: ******
300
+
301
+ 西暦: 2001
302
+
303
+ 月 : 02
304
+
305
+ ```
306
+
307
+
308
+
309
+ 一応、5文字目や6文字目に相当する部分も4文字目みたいに考える。
310
+
311
+
312
+
313
+ これで、「西暦」と「月」がそれぞれ**文字列として**取得できました。
314
+
315
+
316
+
317
+ よーく見てください。ホワイトボードでは、「余白に、別の文字として書いて」います。
318
+
319
+ C言語とかなら「**別の配列として**」いる感じですね。
320
+
321
+
322
+
323
+ char strYear[5];
324
+
325
+ char strMonth[3];
326
+
327
+ とかみたいにして。
328
+
329
+
330
+
331
+ ただし、文字列なので 桁数 + 1 ( 終端を表すデータ分を末尾に追加 ) します。
332
+
333
+
334
+
335
+ for文とかで先端( 0番目 ) から 4桁分 strYearに書き込む。最後に終端を表すデータ( "\n" かな? )を追加しておく。
336
+
337
+
338
+
339
+ 5桁目からはstrMonthに入れる。最後まで。そしてstrYearと同様に末尾に\n を追加。
340
+
341
+
342
+
343
+ これで取り出せるはずです。
344
+
345
+
346
+
347
+ 後は整数にするのですが、'2' は常に 2 とは限りません。
348
+
349
+ ヒント: [ShiftJISの場合](http://charset.7jp.net/sjis.html)
350
+
351
+
352
+
353
+ なので工夫する必要があります。
354
+
355
+ ですが今回はchar型配列です。(どちらも4桁か2桁)
356
+
357
+
358
+
359
+ なので文字列を整数に変換する関数等を使えばいいです。(それについては「C言語 文字列 整数 変換」とかで検索してください)
360
+
361
+
362
+
363
+ 後は基礎が出来ていれば、ちょっと工夫するだけでイケるはずです。