10
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

c,c++備忘録

Last updated at Posted at 2020-05-17

c,c++備忘録2

##目次
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の計算

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に変換していた、、、、

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

#include <iomanip>
double D;
//Dに何かしらの処理
cout << std::fixed << std::setprecision(15) << D << endl;

小数第15位まで表示
std::fixedがないと整数部分の桁数も含まれる。
例えばDの整数部分が34だった時は、小数第13位までしか表示されない
参考
c++ 浮動小数点数 表示方法
【C++】小数点の桁数を指定する方法と注意点【cout/iostream】

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

  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型変数

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

//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++日本語リファレンス
だから挙動がおかしくなる


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;

の結果は


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

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

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


struct{
    int time;
    int x;
    int y;
}t[10001];

無理だろうなと思って書いたら無理だった。
パソコンによって限界サイズが違うらしい。
C言語 配列の要素数をある数以上にしようとするとエラーが出る

##find関数

#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が返される
参照

##小数第7位以降の表示

double ans;
//ansの処理
cout << ans << endl;

これだと小数第6位までしか表示されなかった。

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

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

##cos
cos関数の引数はrad
度数じゃない

##四捨五入
floatを使う
例:


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

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

##float/double型の余りを求める

float/double型は%で余りを出すことができない


#include <math.h>
fmod(5,2)//出力1

で解決
参照:https://marycore.jp/prog/c-lang/modulo-floating-point-number/

##配列の初期化

int arr[5] = {};

(参照1)

int n;
cin >> n;
int arr[n] = {};

のような動的配列の定義時に初期化をすることはできない。

##cinの入力をファイルからに変更する

(参照2)
以下を追加する

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

##continue文

(参照3)

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

##stringとcharの比較、連結

(参照:4)
・比較


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

・連結

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

##バグ(メモリリーク等)を検出するツール

[valgrindの使い方]
(https://qiita.com/hana_shin/items/a90b31c4f742c9cb8019)

##配列比較は変数同士でないといけない

(参照:5)

vector<int> vec1 = { 1, 2, 3 };

↓これはコンパイルエラーになる

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

##配列の降順sort


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

##配列の重複要素を削除する(昇順になっている状態で)


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)

10
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?