はじめてのC++【7日目】

#はじめに
今日はAtCoderのABCコンテストをやってみました。
1/4を正解できたので嬉しかったです。しかし、解説と見比べると私の書き方がとても汚かったのでいま反省しています。
感想としては、なにもないところから自分で考えてコーディングができるのでかなり良い練習になるのではないかと思います。これから毎週やっていこうと思います。
##AtCoderのABCコンテストの振り返り
###Favorite Sound
WAが２つでてきてこの問題は正解できませんでした

```A.cpp
#include <iostream>
int main()
{
  //A,B,Cは正の値なのでunsigned intを使用した。（解答見てたらいらなかったぽい）
  unsigned int A;
  unsigned int B;
  unsigned int C;
  int count = 0;

  std::cin >> A;
  std::cin >> B;
  std::cin >> C;
//ここから下が汚い計算だった
  if(B / A >= 1)
  {
  for(int i = 0; i < B; i += A )
    {
      count++;
      if(count == C)break;
    }
  }
  return 0;
}

```

公式サイトの解答例

```ans_A.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B, C;
cin >> A >> B >> C;
int ans = min(B / A, C);
cout << ans << endl;
}
```
ほんとうにコンパクトで良く書かれていますね。すごいと思いました。
振り返り
cinをつなげてかけること忘れてました(汗)
```std::min(int x ,int y)```で xとyの小さい方の値を返す

###K-th Common Divisor
なんとか正解できて嬉しい

```B.cpp
#include <iostream>

int main()
{
  int ARRAY_SIZE = 100;
  int A;
  int B;
  int K;
  int a[ARRAY_SIZE];
  int b[ARRAY_SIZE];
  int k[ARRAY_SIZE];

  std::cin >> A;
  std::cin >> B;
  std::cin >> K;
  int acount = 0;
  int bcount = 0;
  int kcount = 0;
//Aの約数を大きい順に配列a[]に格納
//昨日のコメントで動的配列を使えって言われましたが、いまいち使い方がわからず普通の配列を使用した（あとで確認する）
  for(int i = A; i > 0; --i)
  {
    if(A % i == 0)
    {
      a[acount] = i;
      acount++;
    }
  }
//Bの約数を大きい順に配列b[]に格納
  for(int i = B; i > 0; --i)
  {
    if(B % i == 0)
    {
      b[bcount] = i;
      bcount++;
    }
  }
//Aの約数とBの約数が同じ場合に配列kに格納する。
  for(int i = 0; i < acount; i++)
  {
    for(int j = 0; j < bcount; j++)
    {
      if(a[i] == b[j])
      {
        k[kcount] = a[i];
        kcount++;
        if(kcount == K - 1)break;//K番目が来たら終了
      }
    }
  }

  std::cout<< k[K - 1] << std::endl;



  return 0;
}

```
公式サイトの解答例

```ans_B.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B, K;
cin >> A >> B >> K;
 for (int i = min(A, B); i >= 1; --i) //小さい方の数だけfor文を回す
 {
   if (A % i == 0 && B % i == 0)//二人同時に割れたら
   { 
     --K;//Kをマイナス
     if (K == 0)//Kがゼロまで来たら目標の番号まで数えたとわかる
     {
        cout << i << endl; return 0;
     }
   }
}
assert(false); }//NULL対策かな

```
やはり行も少なくすごい綺麗ですね。見習いたいです。
しかし、変数宣言やusing namespace等は省略せずにしっかり書くことがチーム開発で大切になっていると聞いたので、そこらへんは丁寧に書いていこうと思います。

##ロベールのC++
それではやっていこうと思います。
###05-06　列挙体
・enum型名 { 名前 [= 値], 名前 [= 値], 名前 [= 値], ....}
・列挙体変数は列挙体型の値しか代入できない。
・列挙子は整数定数として利用できる
・列挙師の値は初期化しなければ（前の値＋１）になる
・一番始めの列挙子の値は初期化しなければ0
・列挙体変数の値の保証は自分で責任を持つこと
決まり事が多いですね。
責任は自分でもてとか書いてるし。。。

```cpp
#include <iostream>

enum CompareResult
{
  CR_LESS_THAN = 0, //より小さい,同じ、より大きい
  CR_EQUAL_TO =1,
  CR_GREATER_THAN //←ここにコンマつけたらだめ！
                  //C+11からコンマつけても大丈夫になった
};

CompareResult Compare(int a, int b)
{
  if(a < b)
  {
    return CR_LESS_THAN;
  }else if(a > b)
  {
    return CR_GREATER_THAN;
  }else{
    return CR_EQUAL_TO;
  }
}

bool Compare()
{
  int a;
  int b;

  std::cout << "数字を　２ つにゅうりょくしてください > " <<std::flush;
  std::cin >> a >> b;

  if(a == -1)
  {
    return false;
  }

  switch(Compare(a, b))
  {
    case CR_LESS_THAN:
    std::cout<<"前者より後者のほうが小さい" << std::endl;
    break;

    case CR_EQUAL_TO:
    std::cout<<"両者おなじ" << std::endl;
    break;

    case CR_GREATER_THAN:
    std::cout<<"前者は後者よりおおきい" << std::endl;
    break;
  }
  return true;
}

int main()
{
  while(Compare())
  {}
}
```
#終わりに
疲れた
眠い　
おやすみ