大学を合格してから始めるwindowsでプログラミング  2日目

どうもこんにちは、昨日書いた記事がいきなり100以上のいいねが付いてきてかなりびっくりしているしゃーまんです。最初の投稿というわけで書くのにも結構時間がかかって、苦労しましたが、好感触のようで何よりです。

というわけで今日からバリバリ書いていこうかなと思います。

昨日の記事はこちらです。

[大学を合格してから始めるwindowsでプログラミング 1日目](https://qiita.com/oinori_man/items/29bdcc16acf186aa96a6)

### 本日のメニュー（原文ママ）
- power shellに慣れる
- 簡単なプログラムを書いてみる
- コンパイルして動かす

ということになりそうです。それではやっていこうかなと思います。

### その前にMSYS2を導入する
昨日の記事にSSWさんやmattnさんやspiegelさんなどいろいろな方がコメントをつけていただきました。どうやら私が昨日入れたMinGWはとても古いソフトで、今これを使うというのは微妙ということでした。

調べてみると、MSYS2というのはターミナルエミュレーターというもので、私が使っているpower shellよりも数段使いやすいそうです。

それ以外にもコマンドだけでソフトを入れることができたり、シェルというものをいじることができるそうです。

大学ではそれなりに最新のものを使用するでしょうし、ターミナルが主らしいので、MSYS2を導入することにしました。

[MSYS2公式ページ](http://www.msys2.org/)から64bit 版をダウンロードしてきます。(msys2-x86_64~ とかいうやつ)

ダウンロードしてexeファイルを起動、インストールしました。

あとは公式ページのインストールガイド的なものを見ながら設定しました。

最初からインストールされているのはどうやら古いパッケージなようで、これで最新のものにアップデートされます。

`pacman -Syu`

するとこんな画面になって、アップデートされていきます。

![pacmaninsta.jpg](https://qiita-image-store.s3.amazonaws.com/0/242495/ee31af97-4e47-31d3-4983-053b0f2cab29.jpeg)

終わった後はMSYS2を再起動して、再び

`packman -Sy`

でアップデートします。

アップデートが終わったらとりあえずはMSYS2の設定は終わり。

すべてが最新だとこんな感じになるはず。（僕の環境ではこうなりました）

![packman.jpg](https://qiita-image-store.s3.amazonaws.com/0/242495/67877453-75bb-f2db-55eb-3e7afc0058d4.jpeg)

ここから改めてC言語の環境設定をしていきます。

参考にさせていただいたのはこちらです。

http://text.baldanders.info/remark/2016/03/gcc-msys2-1/

MSYS2にいろいろなソフトを入れるためのpacmanというパッケージマネージャーが必要みたいでした。pacmanというのは調べてみたところ、linuxというOSのパッケージマネージャーみたいでした。

![pacman command.jpg](https://qiita-image-store.s3.amazonaws.com/0/242495/53507687-f704-2e6e-2a3e-3d66d083c012.jpeg)

参考にさせていただいたサイト様からpacmanのコマンドを拝借いたしました。

これを使って環境構築していきます。

最初にgitというものを入れました。gitについても全然わからなかったので色々調べました。

どうやらgitというのはプログラムなどを管理するツールの一つらしい。ただただプログラムを置いておくだけでもいいけれど、もっとすごいのはこれをバージョンで管理できるということ。

一人でプログラムを書いているとき、バグが出て、直しているときに結局訳が分からずごっちゃになってしまいました。そういう時にこのgitが便利、gitは今までの状態を記録しているので、以前にプログラムを書いた状態に戻すことができるみたいです。

また、これ以外にもほかの人と一緒にプログラムを書くのに便利だそうで。**ブランチ**という概念があり、二人がAとBというプログラムを書いて、実際にgitの上でプログラムを結合することもできるそうで、プログラミングをする人必携のものらしいです。

[githubのアカウント](https://github.com/oinoriprayman)も作りました。

### gccのインストール
どうやらC言語のコンパイラはgccというみたいだったのでこういう感じにしました。やっていることは先ほど参考にさせていただいた方のページです。

`pacman -S base-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain`

でgccのインストールが開始されます。終わったら動作確認をしました。

MinGWの32bit版、64bit版を立ち上げて `gcc -v` を打ち込みます。

画像のような文字が帰ってくればいいらしいです。

![terminalgcc.jpg](https://qiita-image-store.s3.amazonaws.com/0/242495/120366d8-a8cf-68e3-5df4-d711853872eb.jpeg)

## コマンドに慣れる

どうやらプログラミングは、マウスで色々動かすというよりも、MSYS2のようなソフトにコマンドを打ち込んでやっていくらしい、マウスでファイルを操作するのには慣れていたけれど、コマンドとなるとめちゃくちゃわからなかった。とりあえず調べた中で日常的に使用するのはこんなものらしい。

- mkdir フォルダを作成するコマンド
- cd フォルダを移動するコマンド
- cp フォルダやファイルをコピーするコマンド
- mv ファイルやフォルダを移動するコマンド
- pwd 現在いるフォルダまでの階層を表示してくれるコマンド

とりあえずここら辺を調べました。多分これをいじればなんとかなると思いました。

### 絶対パスと相対パス
パソコンの中のファイルは、おおもとのフォルダ（ディレクトリともいう）から、派生してファイルが保存されているみたいです。

Aというファイルまでのフォルダの道的なものをパス(Path)と言うそうで、これを指定する方法に**相対パス** と **絶対パス**というものがあります。

絶対パス ... 絶対パスは一番大元のフォルダからのパス
相対パス ... 相対パスは現在いるフォルダから目当てのフォルダまでのパス

みたいです。例えば、`cd`の場合は
`cd root\A\B\C\ `
とすればCまで移動できます。これは絶対パス、おおもとの`root`から移動しました。

相対パスの時は例えば、CというフォルダにいるときにBに移動したい、けど`cd root\A\B`と書くのもめんどくさいので

`cd ..\`

で一つ上のフォルダに行けるみたいです。

今日一番難しかった概念がここだった気がします。

とりあえず、プログラミングをしていくフォルダを

```mkdir C-gengo```

として作ってみました。この中で僕はプログラミングをしていこうと思います。

# プログラミング
初めてのプログラミング、どうやらこの界隈は`Hello World`と表示させるのが通例のようです。調べてみましたがこんな感じなようです。

```hello.c
#include<stdio.h>
int main(){
    printf("Hello World");
    return 0;
}
```

僕が生まれて初めて書いたプログラムです。atomで書きました。

![c-hello.jpg](https://qiita-image-store.s3.amazonaws.com/0/242495/fc27bd8f-2ab9-b930-c26a-b8a3f54560d3.jpeg)

コンパイルするためには、MSYSで開ける場所にファイルを置いていなければいけないらしく、保存する場所がとても分かりづらかったです。とりあえず保存できました。

動作を確認します。

### 動作確認

コンパイルをします。コンパイルは

```
gcc コンパイルしたいファイル
```

でコンパイルができます。

そうすると `a.exe`というファイルが生成されます。これは`実行ファイル`と言われ、これが実際のプログラムみたいです。これを実行するには`./a.exe`とすれば動いてくれました！！！

![helowa.jpg](https://qiita-image-store.s3.amazonaws.com/0/242495/58741ee8-3402-b30e-c725-c48cd7bcd31d.jpeg)

生まれて初めてのプログラムが動きました。めちゃくちゃうれしい。

けど、なぜこうなって動いたかが分からなかったので、このhello worldのファイルを読み解いていこうと思いました。

### コードについて調べる

```hello.c
#include<stdio.h>
int main(){
    printf("Hello World");
    return 0;
}
```
- #include <stdio.h>

まず、`#include<stdio.h>`という行です。これはどうやら、プログラミングに必要な道具が入っているセットみたいなものらしいです。

ヘッダファイルというところに、プログラミング中に使用できる関数？が詰まっていて、この中に入っている関数を使用できます。

どうやら`printf`という文字を表示させるのに必要な関数は `stdio`という中に入ってるようです。

- int main

プログラミング言語というのは、上から順にプログラムが実行するらしく、このmainというものは一番最初に動く関数。ここで主にプログラムが動くようです。

- printf

C言語で文字を表示させる関数、

```
printf("表示させたい文字");
```

で文字が表示されるらしい、文字の後ろに `\n`をつけると、自動的に改行がされます。(改行文字というらしい)

- return 0

関数というものはよくある二次関数

$$y = x^2 + 3x + 5$$

みたいに、一つの数字を入れたらもう一つの答えが返ってきます。

C言語の関数も同じように一つの入力で一つの出力が返されます。

mainはどうやら出力だけがあるそうで、何もないときは0が出てくるそうです。

というわけで、このプログラムだけでも、いろいろなものを知ることができました。

### 今日のまとめ
MSYSはめっちゃ使いやすい。 powershellというものを最初は使っていたのですが、めちゃくちゃ難しかったです。しかしこれはpacmanというもので色々なソフトを簡単に入れられるようで、余計な設定も少ない感じがします。

今日はプログラムをバリバリやろうとしていましたが、MSYSの設定にてこずったせいで、hello worldだけで終わってしまいました。

明日からはもうちょっと踏み込んでいこうと思います。

あと、大学に行って行列が必要だと先生に言われた~~脅された~~ので、ぼちぼち行列などもやろうかなーとも思っています。

本日もここまで読んでくださり、どうもありがとうございました。