c,c++備忘録

[c,c++備忘録2](https://qiita.com/jajaja/items/b32d172e1e07005ea3f7)

##目次
int型のままxorの計算2020/6/11
小数点以下の桁数を任意の数表示する2020/6/3(2020/11/20更新)
A1*A2(A1<=1e18,A2<=1e18 条件)が1e18を超えないかチェックする方法(2020/6/1)
引数がlong longの天井関数や床関数は自分で作らないといけない　2020/11/4更新
大きすぎる配列確保での実行時エラー　2020/5/21更新
find関数　2020/5/20更新
floatとdoubleの余り2020/5/17更新
四捨五入2020/5/17更新
cos2020/5/17更新
小数第7位以降の表示2020/5/17更新
配列の初期化
cinの入力をファイルから
continue文
stringとcharの比較
バグ(メモリリーク等)を検出するツール(valgrind)
配列比較は変数同士でないといけない
降順sort
重複要素削除

##int型のままxorの計算

```cpp
long long A = 3;
long long B = 2;

cout << (A ^ B) << endl;

int C = 31;
int D = 31;
int E = 30;

cout << (C ^ D) << endl;
cout << (C ^ E) << endl;
```
の出力は

```
1
0
1
```
となるように`()`で囲むことによってxor計算を行える。
これを知るまではbitsetに変換していた、、、、

##小数点以下の桁数を任意の数表示する

```cpp
#include <iomanip>
double D;
//Dに何かしらの処理
cout << std::fixed << std::setprecision(15) << D << endl;
```
小数第15位まで表示
`std::fixed`がないと整数部分の桁数も含まれる。
例えばDの整数部分が34だった時は、小数第13位までしか表示されない
参考
[c++ 浮動小数点数 表示方法](https://qiita.com/ryu136/items/1cbeb860d4a2f056358a)
[【C++】小数点の桁数を指定する方法と注意点【cout／iostream】
](https://marycore.jp/prog/cpp/stream-format-float/)

(2020/11/20更新)
出力フォーマットをいじれば良いことに気付きました、、、
(eだと指数表記にできるらしい)

```cpp
  long double k = 0.01234567;
  double l = 0.01234567;
  printf("%.3Lf\n", k);
  printf("%.3Le\n", k);
  printf("%.3f\n", l);
  printf("%.3e\n", l);
```

[4.3. float，double，long double型変数](http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide16.html)


##A1*A2(A1<=1e18,A2<=1e18 条件)が1e18を超えないかチェックする方法(2020/6/1)
要するにAtcoderの5/31のB問題みたいなやつ
直接やるとlong longが大体1e19までしか対応してないのでオーバーフローするからできない。
解決策はこう

```cpp
//A_1,A_2は1e18以下の数
//A_1*A_2が1e18を超えないか確かめたい 
if(A_1 <= 1e18/A_2)
```
1e18/A_2の部分は切り捨て計算になるから、評価したいA_1*A_2<=1e18とは少し異なるが実装した評価式が評価したい式の十分条件になっていることからこの実装で良い


##~~引数がlong longの天井関数や床関数は自分で作らないといけない~~引数に除算をとるceil関数、floor関数
~~ceil関数やfloor関数は引数にlong long型をとることを想定していない~~
[cpprefjp - C++日本語リファレンス](https://cpprefjp.github.io/reference/cmath/ceil.html)
~~だから挙動がおかしくなる~~

```cpp

const long long INF = 1LL << 60;
long long test = INF;
cout << "床関数" << endl;
cout << floor(test / 5) << endl;
cout << (test / 5) << endl;
cout << "天床関数" << endl;
cout << ceil(test / 5) << endl;
cout << ((test + 4) / 5) << endl;
```

~~の結果は~~

```cpp

床関数
2.30584e+17
230584300921369395
天床関数
2.30584e+17
230584300921369396

```
~~自分の環境ではこうなった。~~
~~だから、long longの値に天井関数や床関数を実装しようと思ったら自分で実装する。~~
(2020/11/4追記)
頭が悪すぎて、切り下げだからこうなっていると分かってなかったみたいです。
ここで書きたいことは、除算を引数にとるceil関数やfloor関数の使い方。
例えばceil関数を使う時の話をします。
`i`で割る際は分子に`i - 1`を足してあげるとceil関数を使うことができます。


##配列のサイズが大きすぎることによる実行時エラー
例えば

```cpp

struct{
    int time;
    int x;
    int y;
}t[10001];
```
無理だろうなと思って書いたら無理だった。
パソコンによって限界サイズが違うらしい。
[C言語 配列の要素数をある数以上にしようとするとエラーが出る](https://teratail.com/questions/15198)


##find関数
```cpp
#include <string>
const std::string s("hello,world. welcome to C++ world.");
const std::string find_word("world");
std::string::size_type pos = s.find(find_word);
```
"world"という文字列を文字列sの先頭から検索する。
見つかった場合は整数であるsize_type型が返される。
見つかった場合その文字列のある位置。
今回だったら`6`。
見つからなかったら`std::string::npos`が返される
[参照](https://cpprefjp.github.io/reference/string/basic_string/find.html)

##小数第7位以降の表示<a id="anchor12"></a>
```cpp
double ans;
//ansの処理
cout << ans << endl;
```
これだと小数第6位までしか表示されなかった。

```cpp
printf("%.32lf", ans);
```

こうすれば32位まで表示できる

##cos<a id="anchor11"></a>
cos関数の引数はrad
度数じゃない

##四捨五入<a id="anchor10"></a>
floatを使う
例:


```cpp

round(3.154 * 100) / 100//出力3.15
```


参照:https://programming-place.net/ppp/contents/cpp/rev_res/math000.html

##float/double型の余りを求める
<a id="anchor9"></a>
float/double型は`%`で余りを出すことができない

```cpp

#include <math.h>
fmod(5,2)//出力1
```
で解決
参照:https://marycore.jp/prog/c-lang/modulo-floating-point-number/

##配列の初期化
<a id="anchor1"></a>

```cpp
int arr[5] = {};
```
(参照1)

```cpp
int n;
cin >> n;
int arr[n] = {};
```
のような動的配列の定義時に初期化をすることはできない。

##cinの入力をファイルからに変更する
<a id="anchor2"></a>
(参照2)
以下を追加する

```cpp
#include <fstream>
↑↑↑↑↑↑↑ 編集リクエストの内容
ifstream ifs("ファイル名");
cin.rdbuf(ifs.rdbuf());
```

##continue文
<a id="anchor3"></a>
(参照3)

```cpp
for (int i = 0; i < 5; i++) {
    if (i == 3) {
      cout << "とばす" << endl;
      continue; // i == 3 のとき これより後の処理をとばす
    }
     cout << "iは3以外" << endl;
}
```

##stringとcharの比較、連結
<a id="anchor4"></a>
(参照:4)
・比較

```cpp

string str = "a";
char c = 'a';
bool b = str == c; // できない
```
・連結


```cpp
string str = "Hello";
 char c = str.at(0);
  cout << str + c << endl; // HelloH
```


##バグ(メモリリーク等)を検出するツール
<a id="anchor5"></a>
[valgrindの使い方]
(https://qiita.com/hana_shin/items/a90b31c4f742c9cb8019)

##配列比較は変数同士でないといけない
<a id="anchor6"></a>
(参照:5)

```cpp
vector<int> vec1 = { 1, 2, 3 };
```
↓これはコンパイルエラーになる

```cpp
  if (vec1 == { 1, 2, 3 }) {
    cout << "NG" << endl;
  }
```

##配列の降順sort
<a id="anchor7"></a>

```cpp

sort(v.begin(),v.end(),greater <int>());
```

##配列の重複要素を削除する(昇順になっている状態で)
<a id="anchor8"></a>

```cpp

vector <int> v(N);
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
```
(参照:6)


##参照
1:[【C言語入門】配列の使い方まとめ(初期化、代入、宣言、コピー)]
(https://www.sejuku.net/blog/24359)

2:[cinでテキストファイルから読み込み]
(https://qiita.com/_meki/items/559ff91f3e695de5600f)

3:[L - 1.11.for文・break・continue]
(https://atcoder.jp/contests/apg4b/tasks/APG4b_l)

4:[M - 1.12.文字列と文字]
(https://atcoder.jp/contests/apg4b/tasks/APG4b_m)

5:[N - 1.13.配列]
(https://atcoder.jp/contests/apg4b/tasks/APG4b_n)

6:[STLのvectorから同一要素を削除]
(https://minus9d.hatenablog.com/entry/20120623/1340457351)