アルファベットの小文字と大文字を条件分岐で判定する方法

# 読んで欲しい人
・解き方を思い出せない未来の私
・詳しい方。（アドバイスください！）
# 注意
・[Atcoder](https://atcoder.jp/home) のabc [A - αlphabet](https://atcoder.jp/contests/abc171/tasks/abc171_a) のネタバレが嫌な人
# ACしたコード1
```C
#include <stdio.h>

int	main(void)
{

	char a;

	scanf("%c",&a);
	// printf("%c\n",a);

	if(a >= 'a' && a <= 'z'){
		printf("a\n");
	} else {
		printf("A\n");
	}

	return (0);
}
```
# 実行結果
```C
//与えられる値（テスト1）
B
//テスト1の実行結果
A

//与えられる値（テスト2）
a
//テスト2の実行結果
a
```
# 解説してみる
[手順1]
問題文で 英大文字か英小文字のいずれか 1 文字 が入力されると記載があるので
1文字を格納するデータ型の char型をaという変数に入れます。
[char型についての参考記事](https://www.sejuku.net/blog/25592)

[手順2]
標準入力から入力される値を受け取りたいのでscanf関数を使います。
(今回は1文字を標準入力から受け取りたいので変換指定子を%cに指定します。)
[scanfについての参考記事](http://rainbow.pc.uec.ac.jp/edu/program/b1/Ex2-1b.htm)
[scanfの公式ドキュメント](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/scanf.3.html)

[手順3]
scanf関数が標準入力から1文字受けてれているか確認する為にprintデバックして
aの変数が標準入力から受け取れているか確認します。
[printデバックの参考記事](https://yu-nix.com/archives/c-debug/#:~:text=%E5%A4%89%E6%95%B0%E3%81%AE%E5%80%A4%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF,%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E5%90%91%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

[手順4]
条件分岐を使って、
変数aの1文字の値が小文字のアルファベットの範囲かどうかを書きます。
[Atcoder](https://atcoder.jp/home) のabc [A - αlphabet](https://atcoder.jp/contests/abc168/tasks/abc168_a)の求められていることが、
与えられる α(アルファ)が英大文字なら A、英小文字なら a を出力するという問題なので
私は、与えられる α(アルファ)を変数aにしているので
変数aが小文字のアルファベットであればa
そうでなければ、Aを出力するという条件分岐になっています。
[アルファベットの小文字かどうかを判定する参考記事](https://webkaru.net/clang/alphabet-number/)

# 調べたこと && 質問
```C
if(a >= 'a' && a <= 'z')
```
アスキーコードを使ってアルファベットの範囲を区別していると思うんですけど、
アスキーコードでアルファベットを判定できる理由や仕組みを理解していません。
理解できそうな記事を見つけられなかったのでどなたか教えてください。
[アスキーコードの参考記事](https://dianxnao.com/c%E8%A8%80%E8%AA%9E%EF%BC%9Aascii%E3%82%B3%E3%83%BC%E3%83%89%E8%A1%A8/)

【理解していること】
↑のコードで 
'a'→ 97 'z' → 122 アルファベットに対応している数字にしても小文字判定ができること。

# ACしたコード2
ACしたけど、文字型ってメモリ書かなくていいんだっけ？って思ったので
```C
char a;
```
↑ここを
```C
char a[2];
```
↑配列にして書くバージョンを書いてみました。
```C
#include <stdio.h>

int	main(void)
{

	char a[2];

	scanf("%s",a);
	// printf("%s\n",a);

	if(a[0] >= 'a' && a[0] <= 'z'){
		printf("a\n");
	} else {
		printf("A\n");
	}
	return (0);
}
```
# 実行結果(ACしたコード1と同じ結果)
```C
//与えられる値（テスト1）
B
//テスト1の実行結果
A

//与えられる値（テスト2）
a
//テスト2の実行結果
a
```
# ACしたコード2の解説をしてみる　
char a[2];で配列にすると
1文字 + 終端文字になるので添え字で判定したい文字を指定するという
ちょっと遠回りなやり方になると思いました。
# ACしたコード2で理解したこと && 質問
C言語の特徴として
文字列の文字の終わりを終端文字で判定しているので配列を使う時は、
終端文字分のメモリも確保しなければならない。
入力される値は一文字だけど私が配列にしたから一文字 + 終端文字を
scanf関数が受け取ってくれて添え字を使って判定してくれた。
（という理解で合ってるかな？）
# いろんなACコード
[ACしたコード1と似てるコード](https://atcoder.jp/contests/abc171/submissions/37410665)
[ACしたコード2と似てるコード](https://atcoder.jp/contests/abc171/submissions/37215122)
[引き算してるコード](https://atcoder.jp/contests/abc171/submissions/36508969)
[理解しようとしているコード](https://atcoder.jp/contests/abc171/submissions/36508969)

# 参考にした記事まとめ
・[char型についての参考記事](https://www.sejuku.net/blog/25592)
・[scanfについての参考記事](http://rainbow.pc.uec.ac.jp/edu/program/b1/Ex2-1b.htm)
・[scanfの公式ドキュメント](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/scanf.3.html)
・[printデバックの参考記事](https://yu-nix.com/archives/c-debug/#:~:text=%E5%A4%89%E6%95%B0%E3%81%AE%E5%80%A4%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF,%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E5%90%91%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
・[アルファベットの小文字かどうかを判定する参考記事](https://webkaru.net/clang/alphabet-number/)
・[アスキーコードの参考記事](https://dianxnao.com/c%E8%A8%80%E8%AA%9E%EF%BC%9Aascii%E3%82%B3%E3%83%BC%E3%83%89%E8%A1%A8/)