C初学者がC++を学習するまでの軌跡

#はじめに
今回は自分自身の経験をもとに、
**プログラミング初心者**がどのようにして**C**を学び、なぜ**C++**を学び始めたのかお話しします。

自分自身、他の方がどのようにして**プログラミング**を習得したのかとても気になります。

特に**C++経験者**がどのようにして学んだのか興味があるので、
良ければコメントで気軽に教えてくださると幸いです。

これから**プログラミング**を学ぶ方や、初心者の方に**プログラミング**を教えるときに
**"どのようにして学習するか(させるか)"**、役に立てたら幸いです。

どの程度の経験値を積んだか確認しやすくするため、
yumetodoさんの記事、["C++erを簡易的にレベル分けすることで初心者詐欺を減らそうという試み"](https://qiita.com/yumetodo/items/a843bd542106215bbc84)
を元にレベル分けをしていきたいと思います。

#2017年5月 (0か月目)
### 【C初心者】Lv.1

>###**やったこと**
>
>**基本:**  処理の順序
>**基本:**  main関数
>**基本:**  保存、コンパイル、実行
>**基本:**  コメント
>**演算子:**  算術演算子(+ - * / %)
>**演算子:**  インクリメント/デクリメント演算子(++ --)
>**演算子:**  代入演算子(=, 算術演算子の加算代入含む += -= * = /= %=)
>**演算子:**  演算子の優先順位
>**変数:**  変数名、宣言、格納、初期化
>**変数:**  変数型(int float double)
>**制御文:**  if文、else文
>**演算子:**  関係演算子(== != > < >= <=)
>**演算子:**  論理演算子(&& ||)
>**制御文:**  for文、while文
>**プリプロセッサ:**  include、define
>**関数:**  printf、scanf
>**関数:**  自作関数
>**特殊文字:**  エスケープシーケンス(\○)
>**配列:**  宣言、格納、初期化
>**標準ライブラリ:**  stdio.h
>**外部のライブラリ:**  DXライブラリ(Dxlib.h)
>**その他:**  フローチャート
>**その他:**  Gnuplot
>
>※この上記の項目を何か月も復習して繰り返して身につけました。

初めてC言語でプログラミングを書いてコンパイルしました。

###**何もしないプログラム**
```c:sample.c

int main()
{
  return 0;
}

```
これじゃあよくわかりませんね。
何も表示されません。

###**文字を表示するプログラム**
```c:sample.c
#include <stdio.h>

int main()
{
  printf("Hello World!!");
  return 0;
}

```
このコードを実行すると**Hello World!!**と出力されると思います。
実行できなかったら何か間違っていますね。ほら**print**になってる……(みたいなことやってました)
**studio.h**になってたり、英語が超苦手な人だと**mein**になってたり。

###**大小を比較するプログラム**
```c:sample.c
#include <stdio.h>

int main()
{
  int a=1;
  int b=2;

  if(a>b){
    printf("bよりaが大きい");
  }
  else if(a<b){
    printf("aよりbが大きい");
  }
  else{
    printf("aとbは同じ");
  }
  return 0;
}

```
**"if"**、**"for"**、**"while"**……**"制御文です。"**有名ですよね。初めて学びました。

**"if"**は**"もし～だったら○○する"**という意味ですよね。
**"for"**と**"while"**は同じ処理を何回も繰り返す。
そんな感じに覚えていきました。

**"int"**、**"float"**、**"double"**……**"変数ですね。"**

**"int"**が整数を入れられる型、**"float"**と**"double"**が実数(小数点まで計算できる)を入れられる型ですね。
この時は**"float"**と**"double"**の違いが全くわかりませんでした。
※**double**のほうが精度が良いとは聞いていましたね。

###**足し算する自作関数のプログラム**
```c:sample.c
#include <stdio.h>

int add(int a,int b);

int main()
{
  int a=1;
  int b=2;

  printf("a+b=%d",a+b);
  printf("a+b=%d",add(a,b));

  return 0;
}

int add(int a,int b)
{
  return a+b;
}

```

**"関数"**
このころは自作関数と標準ライブラリにある関数が、ほぼ同じようなものであるとは思っていませんでした。
足し算をする**自作関数"add"**を作りました。

関数を作るのが楽しかったです。

**"#define"**をやりました。
これ便利！

#2017年6月 (1か月目)
### 【C初心者】Lv.5

>###**やったこと**
>
>**演算子:**  キャスト演算子
>**配列:**  多次元配列
>**変数:**  変数型(short long)
>**制御文:**  break文
>**関数:**  再起関数
>**関数:**  乱数
>**標準ライブラリ:**  time.h
>**標準ライブラリ:**  math.h
>**ソート:**  バブルソート、クイックソート

**"break文"**を学びました。
このときは重要性を感じませんでしたが、今ではバリバリ使っていますね。

**"再起関数"**をやりました。**"フィボナッチ数列"**とかですね。
全然わかりませんでした。難しすぎました。

[**"バブルソート"**と**"クイックソート"**](https://qiita.com/Gaccho/items/0994d7a207061c9ecbc8)をやりました。
ソートって面白いですね。

バブルソートは何とか理解しましたが、クイックソートは難しかったです。

![sort2.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/ef4feffe-d323-c101-cf06-6c1c9eff0cf7.gif)
[バブルソートとクイックソートを可視化して比較する](https://qiita.com/Gaccho/items/0994d7a207061c9ecbc8)



**"偏差値を求めるプログラム"**書きました。
これのおかげでかなり力がついたと思います。

#2017年7月 (2か月目)
### 【C初心者】Lv.9

>###**やったこと**
>
>**制御文:**  switch文(case break)
>**Git:**  GitBucket

**"GitBucket"**に触れてみました。
Gitがよくわからなかったので、このときはなぜ役に立つのかわかりませんでした。

**"Switch文"**を学ぶ。
なんだか他の制御文とは違い、ややこしくて嫌いでした。
今では友達です。変数の条件数値が具体的に決まっているときにとても使えます。

**"構造体"**に触れてみる。
これは完全にゲーム関連から学んだものです。
プレイヤーの情報をわかりやすくまとめるのだとか。
この時はあまりわかりませんでした。

#2017年8月 (3か月目)
### 【C初心者】Lv.15

>###**やったこと**
>
>**変数:**  変数型(char)
>**演算子:**  論理演算子(!)
>**変数:**  unsigned修飾子
>**関数:**  ポインタ渡し
>**Git:**  Visual Studio Online
>**構造体**  構造体

**"関数へのポインタ渡し"**をやりました。
最初は全くわかりませんでしたが、様々な種類の関数を作っていく中で覚えました。
このころの**"ポインタ"**の認識はポインタ渡しで使うだけのものかと思っていました。

**"char型"**に触れてみました。

**"Visual Studio Online"**というGitを使い始めました。
共同開発に憧れていたんですよね。
複数人で開発して、何度もエラーを吐いて大変だったことは今でも覚えています。

#2017年9月 (4か月目)
### 【C初心者】Lv.19

>###**やったこと**
>
>**変数:**  sizeof
>**変数:**  変数型(char)
>**文字:**  文字
>**文字:**  文字コード
>**文字:**  文字列
>**数値:**  16進法
>**ポインタ:**  ポインタ
>**標準ライブラリ:**  stdlib.h、string.h
>**その他:**  バイナリ

**"文字列"**をやりました。
難しい！

**"ポインタ"**をやりました！
んんん、難しい！

ポインタの奥深さを初めて知りました。

#2017年10月 (5か月目)
### 【C初心者】Lv.23

>###**やったこと**
>
>**関数:**  ファイル出入力
>**演算子:**  シフト演算子(>> <<)

**"ファイル出入力"**をやりました。
**"fopen"**とか**"fclose"**とか。

**"ビット演算"**を触れました。
このときやったのが**"ビットシフト"**、**"<<"**と**">>"**ですね。

#2017年11月 (6か月目)
### 【C初心者】Lv.27

>###**やったこと**
>
>**演算子:**  ビット演算子(& | ^ ~)
>**関数:**  LinkedList
>**その他:**  アプリ開発
>**C++標準ライブラリ:**  iostream、string

**"ビット演算"**をやりました。
**"&"**、**"|"**、**"^"**、**"~"**
特に２のn乗の余りを求めるために**"&"**がとても使えます。

**"LinkedList"**をやりました。(12月も)
個人的にはかなり難しいと感じました。
**"C++ の vector"**の仕組みがちょっとわかった気がしました。

**※追記：**この記事を書いた2017年12月の時点ではこのように書いていますが、
**"LinkedList"**の原理は**std::vector**ではなく**std::list**(単方向なら**std::forward_list**)ですね。

###**"C++"**を学び始めました。
きっかけは、いつも使っていたDXライブラリがC++なのに、
C言語のプログラムしか書いていないと感じたからですね。

それと、アプリ開発でもC++の知識があったら活かせると思ったからです。

そこで、ある程度C言語の知識が身についたと感じたので、
C++にも挑戦してみようと思いました。

###**文字を表示するプログラム (C言語の書き方)**
```c:sample.c

#include <stdio.h>

int main(){

    printf("Hello World!!");

    return 0;
}

```

###**文字を表示するプログラム (C++の書き方)**
```cpp:sample.cpp

#include <iostream>

int main(){

    std::cout << "Hello World!!" << std::endl;

    return 0;
}

```

いきなり**"std::"**というわけのわからないものが出て困惑してC++をあきらめそうになりましたが、
後にそんな難しいものではないと知り(?)、立ち直りました。

書き方が特殊に感じたので、初めは警戒していました。

#2017年12月 (7か月目)
### 【C++初学者】Lv.30

>###**やったこと**
>
>**Git:**  GitHub
>**その他:**  Qiita投稿
>**C++標準ライブラリ:**  vector、chrono、limits
>**C++:**  クラス、参照渡し

**"初のQiita投稿"**……ここで初めてQiitaに記事を投稿してみました。
初心者の方にも、ぜひQiitaに記事投稿をおすすめします。

記事にしてみると、自分自身の知識も整理されて新しい発見にも繋がりますね。

また、Qiitaで**yumetodo**さんにコメントをいただき、標準ライブラリのなかの使ったことのないものを知る(使う)機会となりました。

只今、クラスを勉強中です。

#2018年1月 (8か月目)
### 【C++初学者】Lv.33

>###**やったこと**
>
>**C++標準ライブラリ:**  c〇〇, stdint.h, array
>**C++:**  namespace, using, private, public

#2018年2月 (9か月目)
### 【C++初学者】Lv.36

>###**やったこと**
>
>**C++:**  template, ..., constexpr(変数), const

#2018年3月 (10か月目)
### 【C++入門者】Lv.40

>###**やったこと**
>
>**C++標準ライブラリ:**  uchar, codecvt, list, string_view
>**C++:**  char16_t, char32_t

#2018年5月 (12か月目)
### 【C++入門者】Lv.46

>###**やったこと**
>
>**その他:**  /openmp, /sqlite

#2018年6月 (13か月目)
### 【C++初心者】Lv.50

>###**やったこと**
>
>**C++標準ライブラリ:**  memory
>**C++:**  unique_ptr, constexpr(クラス関数)
>**その他:**  画像処理, ニューラルネットワーク

#2018年8月 (15か月目)
### 【C++初心者】Lv.54

>###**やったこと**
>
>**やった内容(Qiita記事):**
>**[RPGツ◯ールをツクール👾](https://qiita.com/Gaccho/items/b958963144eb9abbb048)**

RPGメイキングツールを作ることに夢中になっていました。

#2018年9月 (16か月目)
### 【C++初心者】Lv.57

>###**やったこと**
>
>**boostライブラリ:**  asio, multiprecision
>**その他:**  boost, MPIR
>**やった内容(Qiita記事):**
>**[メルセンヌ素数1, ](https://qiita.com/Gaccho/items/d3ba144c64e7021e5e90)[メルセンヌ素数2, ](https://qiita.com/Gaccho/items/7d6ad6909a5064d3e301)[整数型一覧, ](https://qiita.com/Gaccho/items/940830a7b6a131b25969)[配列クラス, ](https://qiita.com/Gaccho/items/e936de237676120aa8a0)[マヤ数字, ](https://qiita.com/Gaccho/items/631b4dd0982a3eadabea)[世界自動生成, ](https://qiita.com/Gaccho/items/e498a4e28aa8cbbb8404)[Brainf*ck, ](https://qiita.com/Gaccho/items/dc2cd92422fe8d69b6e5)[迷路自動生成, ](https://qiita.com/Gaccho/items/784c6d7d0532bc12e26f)[Boost導入方法, ](https://qiita.com/Gaccho/items/7e78911d2c8093baf200)[std::cout実装](https://qiita.com/Gaccho/items/496ad51cbce15fd75abc)**

9月は今まで学んだことの総まとめとして様々な記事をQiitaに投稿しました。

#2018年10月 (17か月目)
### 【C++初心者】Lv.57(伸びてない……)

最近(2018/10/30)は色彩学の勉強に時間を費やしているためあまり手をつけていません……。
しかし、QiitaにC++関連の記事を書いています。

>###**やったこと**
>
>**やった内容(Qiita記事):**
>**[【Visual Studio 2017】MPIR(GMP)導入方法【多倍長整数ライブラリ】](https://qiita.com/Gaccho/items/92b7fbf279d3ca6227fe), [ニュートン法で平方根を求める](https://qiita.com/Gaccho/items/b079526d8db1a7bf28b0)**

#2018年12月 (19か月目)
### 【C++初心者】Lv.64

>###**やったこと**
>自作ライブラリ:[**DungeonTemplateLibrary**](https://github.com/Kasugaccho/DungeonTemplateLibrary)
>**やった内容(Qiita記事):**
>**[楽にDxLibを使うためのテンプレ](https://qiita.com/Gaccho/items/b6f4a959c9a1d38c914d), [ネイピア数の実装](https://qiita.com/Gaccho/items/493c7780f43fe42032f1), [お手軽 乱数実装](https://qiita.com/Gaccho/items/dc312fb5a056505f0a9f), [【Visual Studio 2017】openFrameworks導入方法](https://qiita.com/Gaccho/items/f193d1c350b45b93f663), [育成ゲームを作ったはなし](https://qiita.com/Gaccho/items/92996120fdc8f77a471e), [👾RPGメイキングツール👾](https://qiita.com/Gaccho/items/b958963144eb9abbb048), [シクシク素数列 - C++編](https://qiita.com/Gaccho/items/5490332672c0ac0deab6), [C言語とC++の同時比較リファレンス](https://qiita.com/Gaccho/items/fd8db5c393c48ef2a61c), [[DTL]ローグライク自動生成(ローグライク穴掘り法)💀](https://qiita.com/Gaccho/items/253cb6af577ec11e79cf), [RPG制作ソフト👾や地形生成のまとめ](https://qiita.com/Gaccho/items/7a430ae86a2e01583181), [「アルゴリズムこうしん」のアルゴリズムを作成する](https://qiita.com/Gaccho/items/019325f8b2030afec6d4), [平成の次の元号を99.9999%当てる最も簡単な方法](https://qiita.com/Gaccho/items/f7d30a958ec271de0e2d), [Siv3Dで使えるダンジョン生成ライブラリの紹介(ローグライク/ワールドマップ/迷路)](https://qiita.com/Gaccho/items/69239eb18e9d7d416b6f), [[DTL]地形生成(ボロノイ図法)🌏](https://qiita.com/Gaccho/items/08710de2c57da912b822), [[DTL]地形生成(チャンク&中点変位法)🌽](https://qiita.com/Gaccho/items/2840450460fa6e00a56c), [昔から大好きな地形生成について語る。](https://qiita.com/Gaccho/items/e6d79b02a0ab1d340724), [シクシク素数列 - C言語編](https://qiita.com/Gaccho/items/8f17db48faa39046f665)**

この当時はとにかく記事を書きまくりました。(執筆現在は2019/03/16)

#2019年1月 (20か月目)
### 【C++初心者】Lv.66

>###**やったこと**
>
>**やった内容(Qiita記事):**
>**[[DTL]洞窟の自動生成(ローグライク穴掘り法)💀](https://qiita.com/Gaccho/items/ca6fe4065cb242f7af1e)**

#2019年2月 (21か月目)
### 【C++初心者】Lv.70

>###**やったこと**
>
>**やった内容(Qiita記事):**
>**[【Visual Studio 2019 Preview】C++のコードを実行する方法【C++開発環境構築・導入方法】](https://qiita.com/Gaccho/items/f748f59784ff68d7a474), [【Visual Studio 2017】 他人のGitHubリポジトリへプッシュする方法](https://qiita.com/Gaccho/items/6034d97370a6e8e27a94), [[DTL]地形生成(セルオートマトン法)🌏](https://qiita.com/Gaccho/items/d460aba1384634f0b6dc), [[DTL]バイオーム生成(セルオートマトン法)🌏](https://qiita.com/Gaccho/items/e29f98a32ba9f920346d)**

#さいごに

2017年12月現在、C言語を学び始めてからそろそろ8か月が経とうとしています。

また、そろそろC++を学び始めてから1か月が経ちますが、
2018年の前期までにはある程度C++の知識をつけていきたいと思います。

まだプログラミングを経験したことがない人でも、じっくりやれば必ずできるようになります。
参考になれば幸いです。

最後までお読みいただきありがとうございました。
「いいね！」していただけると、とても励みになります。

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

ソースコードは自由に使用してください。