プログラミング初心者がはじめて競技プログラミングに挑戦した話

## 競プロやりたい！

競技どころかプログラムを全く書いたことのない人の助けになればと思います。

競技プログラミングをやりたいと思っていたが、**プログラミングができないし、数学もよくわかんないし**どうすればいいの！？

筆者について簡単に説明するとプログラミング？Python？C言語？そんなのあったねというレベルです。**ソースコードを見たことはありますが当然書けません。**

まとめるとこんな感じです。
- プログラミングまぢむり
- PCでgoogle検索、簡単な操作はできる
- タッチタイピングが一応できる

    パソコン使い慣れてる人の中では遅いけどあんまりPCに慣れてない人より速いくらいの速度で打てます。（タイプミス多め）


何はともあれ行動しないことには始まらないのでまず、C言語でプログラムをつくっていこうと思い立ちました。

**この記事は素人がなんとか頑張って環境構築して競プロの過去問にコードを提出できたよという記事なので、もし間違いや誤解を招く表現があればコメントいただければ修正したいと思います。**

競技プログラミングに限っていえばC言語、C++なんかはおすすめらしいのですが環境構築の面倒さ、プログラム素人の知識のなさを考慮すると環境構築が難しくて挫折しそうになりました。
~~Webサイト上で動作させることもできるらしい。~~
※競技プログラミングの解説はC++で書かれていることが多いようです。

ネットでなにかよさそうな教材がないか探したところ[**苦しんで覚えるC言語**](https://9cguide.appspot.com/index.html)というサイトがあったためそちらを読んでみると分量はそこまで多くなく問題も用意してあり、プログラミングの知識は小学生とトントンという僕でも学習することができました。

C言語が初学者には向かないという話も調べていたらでてきますが、1、2時間読めばとりあえずこの程度の文は書けるようになりました。僕はあくまで素人として言いますがC言語とC++は互換性があり基本的にC言語をC++に移行しても実行できるようです。

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

画面に`Hello World`を出力するより、**C言語を実行できる環境を用意するほうがはるかに時間がかかった**。コンパイラなるものをなかなか使えずに数時間、いや数日かかった。

詳しい友人や先生に聞けるならもっとはやくできるかもしれない。 

rubyという言語も多少調べてみましたが、コードを書くのがとても簡単です。**3文字で書けました**。
コンパイラいらずのpythonとかrubyの方が環境構築は簡単そうですが、実行速度を考えるとC言語やC++という言語のほうが競技プログラミングには向いているらしいです。
```ruby
p 1
```

## C言語環境構築

C言語の環境構築についても少し書いていこうと思います。

競プロどころか、C言語のコードを実行可能な状態にしてくれるコンパイラがインストールできないという事態に陥りましたが、なんとかインストールできました。

簡単に説明すると以下の手順でできます。
1. MinGWをインストール
1. VSCodeをインストール
1. 環境変数を設定する

基本的には以下のサイトを見ながら環境を構築しました。
[2021年版 C言語/C++ 入門者のための環境構築 (Windows編)](https://lyncs.hateblo.jp/entry/2018/03/11/032127)

MinGW（ミン・ジー・ダブリュー）なるソフトウェアをダウンロードしようと思って https://osdn.net/projects/mingw/ にとんでもどこにあるのかわけがわからなくて**よくわかんない状態**に陥ったので[別のサイト](https://sourceforge.net/projects/mingw/)からダウンロードしてインストールを行いました。
※64bit版もあるらしいのですが当方ではどちらを使うべきか判断できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/3e6e1c16-b5c0-169d-034c-7cfbd234c4b2.png)

とりあえず-beseとg++にチェックを入れてインストール完了。
VSCodeと調べてマイクロソフトのサイトでインストールすればコードも書けるようになります。

VSCodeが使えないという人はデスクトップ画面で右クリックして新規作成>>テキストドキュメントを作成し名前を拡張子の.txtを含めてsample.cとかc.cとかに変更します。

そのファイルをVSCodeを起動した画面にドラッグアンドドロップすれば開いてコードを書くことができます。もしかしたらファイルソフト>>表示の設定から拡張子を表示しておかないとできないかもしれません。

次に**パソコンの設定から環境変数>>Path>>C:\MinGW\binを追加**してOKを押して終了します。Cドライブ直下以外にインストールした場合はPathの場所が変わるかと思います。~~（多分）~~

最終的にVSCodeでコードを書いて実行することができました。

**なにか難しいところがあればコメントしていただければ答えられる範囲で回答したいと思います。**

MinGWがインストールでき、Pathを設定することができればコマンドプロンプト、VSCodeのターミナルなどでコンパイル、実行することができるようになります。

    PS C:\lang>  gcc -o Samplec c.c
    PS C:\lang> ./Samplec
    Hello Hey!

c.cというファイルをつくったら`gcc c.c`でコンパイルしてa.exeという実行可能ファイルが生成されると思います。

`gcc -o Samplec c.c`というコマンドはc.cをコンパイルした実行ファイルにSamplecという名前をつけることができます。つまりSamplec.exeが生成されます。

また、`./Samplec`のように`./`のあとに実行ファイル名を記述すると実行することができます。

```c:c.c
#include <stdio.h>
int main(void){
    printf("Hello Hey!\n\n");
    return 0;
}
```

僕が記述したc.cは`printf("Hello Hey!\n\n");`という命令が書かれているので`Hello Hey!`が出力されます。

**VSCodeの初期設定であるUTF-8をコマンドプロンプトで実行すると文字化けすることもあるのでターミナル上で`chcp 65001`を実行するとUTF-8が文字化けせずに実行できました。**
※VSCodeのエンコードをShift JISに変えるという方法もあるらしいです。
[文字化けに関してはこちらを参照](https://kumipuro.tech/vscode_garbled_text/)

他にもかなり高機能なVisual Studio 2022であればMinGWなどをインストールせずにそのソフトだけでコンパイルして実行することもできます。これはこれでド素人には扱いづらい。
※コンパイルして実行するだけなら慣れればできると思います。

あとはVSCodeの拡張機能にC/C++、Code Runnerをいれて、MinGWもインストールできていればCode RunnerでC言語を実行することもできるらしいです。

※Pathは設定しないといけないかもしれません
※Code Runnerで入力ができるようにするにはCode Runnerの拡張機能の設定のRun In Terminalにチェックを入れないといけない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/367ec782-186b-cafe-74ce-87808a53e717.png)

### どうしても環境構築ができない方へ

素人の僕が調べてやってみたことですので、もっとよいやり方があるかもしれません。

周りに聞ける人もいなくて困っているという方はオンライン上でコードを書いて実行できるサービスを使うか、VisualStudioのデバッグなしで開始を使うというような方法もあります。
[paiza : オンラインでコードが書けるサイト例](https://paiza.io/ja)

> @fujitanozomu(藤田 望)
2023-10-23 21:30
Wandbox等Web上で実行できる環境はローカルでの環境構築も要らずお手軽であり、コードと実行結果を同時に公開する方法としても優れていると思います。
https://wandbox.org/permlink/EWJCHu74AICIjDb3
https://wandbox.org/permlink/YRtL9h14VLKThm3U
https://wandbox.org/permlink/ErstY6uWiglkGDgs

VisualStudio 2022の使い方を軽く説明すると

1. VisualStudioSetup.exeを起動>>C++によるデスクトップ開発をクリックし、インストール。
※インストール後でもVisualStudioSetup.exeからPython開発などをインストールできるようです。
1. VSが起動したら新しいプロジェクトの作成>>Windowsデスクトップウィザードを選択>>プロジェクト名、保存場所を指定して、ソリューションとプロジェクトを同じディレクトリに配置するをオン>>作成
1. コンソールアプリケーション(.exe)を選択>>空のプロジェクトにチェック>>OK
1. 右の方にあるソースファイルを右クリック>>追加>>C++ファイルを選択、ファイル名を指定して追加をクリックするとソースコードが新たにつくられる
1. 上のデバッグメニューのデバックなしで開始を選択するとコンパイルして実行してくれる。

※閉じたら.slnを開けばソリューション等が開けます。

また、以下の設定が必要になる場合もあるらしい。
※VisualStudioの上のツールバーのプロジェクト>>プロパティ>>構成プロパティ>>C/C++>>全般>>SDLチェックでいいえ(/sdl)を選択しOK（デフォルトははいが設定されている）

## いざ競プロ！
環境構築の話が長くなりましたが、あとはAtCoderに登録して問題を解くだけです。

AtCoderにメアドなどが登録できたら[**ここ**](https://atcoder.jp/contests/abc145/tasks/abc145_a)にアクセスして問題を解いていきます。

>整数 r が与えられます。
半径 r の円の面積が半径 1 の円の面積の何倍になるかを求めてください。
なお答えは制約の下では必ず整数になることが示せます。

円の面積の公式は半径の2乗*円周率なので半径が1のときは面積がpi、2のときは4pi、20のときは400piになります。つまりaという整数が入力されればaの2乗倍が答えになります。

どのように書いて提出すればよいかよくわかりませんでしたが、入力のために整数型の変数を用意して入力を2乗して出力するコードを書けば正解することができました。

~~scanfの&を忘れたりして2回ミスしていますけどね。~~

以下のコードはC、C++どちらで提出しても正解のようです。

```c:C言語
#include <stdio.h>
int main(void)
{
    int a;
    scanf("%d",&a);
    printf("%d",a*a);
    return 0;
}
```

できた！歓喜の叫び！！！
ACと表示されれば正解のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582228/492133ed-b1bd-e43c-b643-4cb1d17d5b0b.png)

ひとまずここまでとします。
またなにか書きたいと思います。
ありがとうございました。

## 参考URL

VSCodeとCodeRunnerによる環境構築に関しては僕はやっていませんが、参考になるかもしれないのでURLを貼っておきます。

[Visual Studio Code （VS Code）による C 言語プログラミング開発環境の構築（Windows 版）](http://imgprolab.sys.fit.ac.jp/~yama/CProI/lec/VScode_CodeRunner_Install.pdf)

[VSCodeにてショートカットキーでコードを実行しよう！ Code Runnerの初期設定の方法について](https://zenn.dev/kainari/articles/3b7f1ea1f211fe)

[Visual Studio CodeでC言語プログラミングを始める（Windows編）](https://dianxnao.com/visual-studio-code%E3%81%A7c%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E5%A7%8B%E3%82%81%E3%82%8B%EF%BC%88windows%E7%B7%A8%EF%BC%89/)

初めてQiitaを使ったので書き方を調べながら書きました。

https://qiita.com/h0iga3shi13/items/ff82ab230328f77a418a

https://qiita.com/Qiita/items/c686397e4a0f4f11683d