[C++/C] 配列

### 配列の要素を出力

int main() {
    
    int test[5];

    test[0] = 80;
    test[1] = 60;
    test[2] = 22;
    test[3] = 50;
    test[4] = 75;
    
    for(int i=0; i<5; i++) {
        cout << i+1 << "番目の人の点数は" << test[i] << "です。\n";
    }

    return 0; 
}

### キーボードから入力

int main() {
    
    const int num = 5;
    int test[num];

    cout << num << "人の点数を入力してください。\n";
    for(int i=0; i<num; i++) {
        cin >> test[i];
    }
    
    for(int j=0; j<num; j++) {
        cout << j+1 << "番目の人の点数は" << test[j] << "です。\n";
    }

    return 0; 
}

### 配列の要素をソートする

int main() {
    
    const int num = 5;
    int test[num];

    cout << num << "人の点数を入力してください。\n";
    for(int i=0; i<num; i++) {
        cin >> test[i];
    }

    for(int s=0; s<num-1; s++) {
        for(int t=s+1; t<num; t++) {
            if(test[t] > test[s]){
                int tmp = test[t];
                test[t] = test[s];
                test[s] = tmp;
            }
        }
    }
    
    for(int j=0; j<num; j++) {
        cout << j+1 << "番目の人の点数は" << test[j] << "です。\n";
    }

    return 0; 
}

### 多次元配列

int main() {
    
    const int sub = 2;
    const int num = 5;

    int test[sub][num];

    test[0][0] = 80;
    test[0][1] = 60;
    test[0][2] = 22;
    test[0][3] = 50;
    test[0][4] = 75;
    test[1][0] = 90;
    test[1][1] = 55;
    test[1][2] = 68;
    test[1][3] = 72;
    test[1][4] = 58;
    
    for(int i=0; i<num; i++) {
        cout << i+1 << "番目の人の国語の点数は" << test[0][i] << "です。\n";
        cout << i+1 << "番目の人の算数の点数は" << test[1][i] << "です。\n";
    }

### 配列とポインタ
配列のアドレス
&test[0]
&test[1]

配列名を記載しただけで、先頭要素のアドレスを表す
test

int main() {
    
    int test[5] = {80, 60, 55, 22, 75};

    cout << "test[0]の値は" << test[0] << "です。\n";
    cout << "test[0]のアドレスは" << &test[0] << "です。\n";
    cout << "testの値は" << test << "です。\n";
    cout << "つまり*testの値は" << *test << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
test[0]の値は80です。
test[0]のアドレスは0xfffff9b40360です。
testの値は0xfffff9b40360です。
つまり*testの値は80です。

*testは配列の先頭要素の値となる。

### ポインタの演算

int main() {
    
    int test[5] = {80, 60, 55, 22, 75};

    cout << "test[0]の値は" << test[0] << "です。\n";
    cout << "test[0]のアドレスは" << &test[0] << "です。\n";
    cout << "testの値は" << test << "です。\n";
    cout << "test+1の値は" << test+1 << "です。\n";
    cout << "*(test+1)の値は" << *(test+1) << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
test[0]の値は80です。
test[0]のアドレスは0xffffe4e0e070です。
testの値は0xffffe4e0e070です。
test+1の値は0xffffe4e0e074です。
*(test+1)の値は60です。

[C++/C] ポインタ2

### 参照
型名& 参照名 = 変数

int main() {
    
    int a = 5;
    int& rA = a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "参照rAの値は" << rA << "です。\n";

    rA = 50;

    cout << "rAに50を代入しました。\n";
    cout << "参照rAの値は" << rA << "です。\n";
    cout << "変数aの値は" << a << "です。\n";
    
    cout << "参照rAのアドレスは" << &rA << "です。\n";
    cout << "変数aのアドレスは" << &a << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
参照rAの値は5です。
rAに50を代入しました。
参照rAの値は50です。
変数aの値は50です。
参照rAのアドレスは0xfffff784567cです。
変数aのアドレスは0xfffff784567cです。

参照rAはaと全く同じ
参照の場合は引数を変更することができる。

void swap(int& x, int& y);

int main() {
    
    int num1 = 5;
    int num2 = 10;

    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    cout << "変数num1とnum2の値を交換します。\n";

    swap(num1, num2);
    
    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    return 0; 
}

void swap(int& x, int& y){
    int tmp;

    tmp = x;
    x = y;
    y = tmp;
}

$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は10です。
変数num2の値は5です。

関数の引数にポインタ、参照を使うと、呼び出し元の実引数を変更できる

### Practice
1. x, 2.×, 3.○

void add(int* num1, int* num2, int num3);

int main() {
    
    int num1, num2, num3;

    cout << "2科目分の点数を入力してください。\n";

    cin >> num1;
    cin >> num2;

    cout << "加算する点数を入力してください。\n";

    cin >> num3;

    add(&num1, &num2, num3);
    
    cout << "科目1は" << num1 << "点となりました。\n";
    cout << "科目2は" << num2 << "点となりました。\n";

    return 0; 
}

void add(int* num1, int* num2, int num3) {
    *num1 += num3;
    *num2 += num3;
}
void add(int& num1, int& num2, int num3);

int main() {
    
    int num1, num2, num3;

    cout << "2科目分の点数を入力してください。\n";

    cin >> num1;
    cin >> num2;

    cout << "加算する点数を入力してください。\n";

    cin >> num3;

    add(num1, num2, num3);
    
    cout << "科目1は" << num1 << "点となりました。\n";
    cout << "科目2は" << num2 << "点となりました。\n";

    return 0; 
}

void add(int& num1, int& num2, int num3) {
    num1 += num3;
    num2 += num3;
}

[C++/C] ポインタ

アドレスは16進数を使ってx01000, 0x1004などで表す
メモリのアドレスは&変数名を使う

int main() {
    
    int a;
    a = 5;

    cout << "変数aの値は" << a << "です。\n";
    cout << "変数aのアドレスは" << &a << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレスは0xffffc948bd84です。

### ポインタ
アドレスを格納する特殊な変数

int main() {
    
    int a;
    int* pA;

    a = 5;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "変数aのアドレス(&a)は" << &a << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレス(&a)は0xffffe5f9f30cです。
ポインタpAの値は0xffffe5f9f30cです。

ポインタから変数の値を知るには *pAとする

int main() {
    
    int a;
    int* pA;

    a = 5;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "変数aのアドレス(&a)は" << &a << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";
    cout << "*pAの値は" << *pA << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレス(&a)は0xffffc90c856cです。
ポインタpAの値は0xffffc90c856cです。
*pAの値は5です。

### ポインタに別のアドレスを代入する

int main() {
    
    int a = 5;
    int b = 10;
    int* pA;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";
    cout << "*pAの値は" << *pA << "です。\n";

    pA = &b;
    
    cout << "変数bの値は" << b << "です。\n";
    cout << "ポインタpAの値は" << pA << "です。\n";
    cout << "*pAの値は" << *pA << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
ポインタpAの値は0xffffd6b96088です。
*pAの値は5です。
変数bの値は10です。
ポインタpAの値は0xffffd6b9608cです。
*pAの値は10です。

### ポインタを使って変数を変更する

int main() {
    
    int a = 5;
    int* pA;
    pA = &a;

    cout << "変数aの値は" << a << "です。\n";

    *pA = 50;
    
    cout << "*pAに50を代入しました。\n";
    cout << "aの値は" << a << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
*pAに50を代入しました。
aの値は50です。

なぜこのような機能があるか??

### 引数とポインタ
swapの誤ったコード

void swap(int x, int y);

int main() {
    
    int num1 = 5;
    int num2 = 10;

    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    cout << "変数num1とnum2の値を交換します。\n";

    swap(num1, num2);
    
    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    return 0; 
}

void swap(int x, int y){
    int tmp;

    tmp = x;
    x = y;
    y = tmp;
}

$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は5です。
変数num2の値は10です。

通常の値渡しでは、実引数を変更することができない。

アドレスを引数にすると、変更することができる。

void swap(int* x, int* y);

int main() {
    
    int num1 = 5;
    int num2 = 10;

    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    cout << "変数num1とnum2の値を交換します。\n";

    swap(&num1, &num2);
    
    cout << "変数num1の値は" << num1 << "です。\n";
    cout << "変数num2の値は" << num2 << "です。\n";

    return 0; 
}

void swap(int* px, int* py){
    int tmp;

    tmp = *px;
    *px = *py;
    *py = tmp;
}

$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は10です。
変数num2の値は5です。

SRM428 ThePalindrome

### Problem
John and Brus are studying string theory at the university. Brus likes palindromes very much. A palindrome is a word that reads the same forward and backward. John would like to surprise Brus by taking a String s, and appending 0 or more characters to the end of s to obtain a palindrome. He wants that palindrome to be as short as possible. Return the shortest possible length of a palindrome that John can generate.

### Answer

#include <vector>
using namespace std;

class ThePalindrome {
    public:
        int find(string s) {
            for(int i = s.size(); ; i++){
                bool flag = true;
                for(int j = 0; j < s.size(); j++) {
                    if((i - j - 1) < s.size() && s[j] != s[i - j - 1] ){
                        flag = false;
                        break;
                    }
                }
                if(flag) return i;
            }
        }
}

最初と最後の文字の比較を左から順にやっていき、一致しなければ「?」文字を追加していく。
実装方法と問題のイメージ両方必要ですな。

[C++/C] 関数2

### 関数のオーバーロード
引数の型が異なる同じ名前の関数を複数定義することを関数のオーバーロードという。

int main() {
    
    int a, b;
    double da, db;

    cout << "2つの整数を入力してください。\n";
    cin >> a >> b;

    cout << "2つの小数を入力してください。\n";
    cin >> da >> db;

    int ans1 = max(a, b);
    double ans2 = max(da, db);

    cout << "整数値の最大値は" << ans1 << "です。\n";
    cout << "小数値の最大値は" << ans2 << "です。\n";

    return 0; 
}

int max(int x, int y) {
    if (x > y)
        return x;
    else
        return y;
}

double max(double x, double y) {
    if (x > y)
        return x;
    else
        return y;
}

### 関数テンプレート
関数テンプレートの宣言は
template
関数の宣言

仮引数の型名にテンプレート引数を使う
L 型が異なるが同じ処理の場合に纏めて使用できる。

template <class T>
T maxt(T x, T y) {
    if (x > y)
        return x;
    else
        return y;
}

int main() {
    
    int a, b;
    double da, db;

    cout << "2つの整数を入力してください。\n";
    cin >> a >> b;

    cout << "2つの小数を入力してください。\n";
    cin >> da >> db;

    int ans1 = maxt(a, b);
    double ans2 = maxt(da, db);

    cout << "整数値の最大値は" << ans1 << "です。\n";
    cout << "小数値の最大値は" << ans2 << "です。\n";

    return 0; 
}

### Practice

int square(int x) {
    return x * x;
}

int main() {
    
    int x, res;
    cout << "整数を入力してください。\n";
    cin >> x;

    res = square(x);

    cout << x << "の2乗は" << res << "です。\n";

    return 0; 
}
int square(int x) {
    return x * x;
}

double square(double x) {
    return x * x;
}

int main() {
    
    int x, res;
    double bx, bres;
    cout << "整数を入力してください。\n";
    cin >> x;

    res = square(x);

    cout << x << "の2乗は" << res << "です。\n";

    cout << "小数を入力してください。\n";
    cin >> bx;

    bres = square(bx);

    cout << bx << "の2乗は" << bres << "です。\n";

    return 0; 
}

inline

inline int square(int x) { return x * x;}

inline double square(double x) { return x * x;}

関数テンプレート

template <class T>
T squaret(T x){
    return x * x;
}

int main() {
    
    int x, res;
    double bx, bres;
    cout << "整数を入力してください。\n";
    cin >> x;

    res = squaret(x);

    cout << x << "の2乗は" << res << "です。\n";

    cout << "小数を入力してください。\n";
    cin >> bx;

    bres = squaret(bx);

    cout << bx << "の2乗は" << bres << "です。\n";

    return 0; 
}

[C++/C] 関数

void buy() {
    cout << "車を買いました。\n";
}

int main() {
    
    buy();
    cout << "車をもう一台購入します。\n";
    buy();

    return 0; 
}

関数の引数

void buy(int x) {
    cout << x << "万円の車を買いました。\n";
}

int main() {
    
    buy(20);
    buy(50);

    return 0; 
}

キーボードから入力

int main() {
    
    int num;
    cout << "1台目はいくらの車を買いますか?\n";
    cin >> num;

    buy(num);

    cout << "2台目はいくらの車を買いますか?\n";
    cin >> num;

    buy(num);

    return 0; 
}

戻り値
L returnする値によって、関数をvoid buy()からint buy()に変更する

int buy(int x, int y) {
    int z;

    cout << x << "万円と" << y << "万円の車を買いました。\n";
    z = x+y;
    return z;
}

int main() {

    int num1, num2, sum;
    
    cout << "1台目はいくらの車を買いますか?\n";
    cin >> num1;


    cout << "2台目はいくらの車を買いますか?\n";
    cin >> num2;

    sum = buy(num1, num2);

    cout << "合計で" << sum << "万円です。\n";

    return 0; 
}

合計値

int main() {

    int num1, num2, ans;
    
    cout << "1番目の整数を入力してください。\n";
    cin >> num1;


    cout << "2番目の整数を入力してください。\n";
    cin >> num2;

    ans = sum(num1, num2);

    cout << "合計は" << ans << "です。\n";

    return 0; 
}

max

int max(int x, int y) {
    if (x > y)
        return x;
    else
        return y;
}

int main() {

    int num1, num2, ans;
    
    cout << "1番目の整数を入力してください。\n";
    cin >> num1;


    cout << "2番目の整数を入力してください。\n";
    cin >> num2;

    ans = max(num1, num2);

    cout << "最大値は" << ans << "です。\n";

    return 0; 
}

inline(one liner)

inline int max(int x, int y) {if (x > y) return x; else return y;}

関数プロトタイプ宣言
L mainの前で宣言すれば、後でも書ける

int max(int x, int y);

int main() {

    int num1, num2, ans;
    
    cout << "1番目の整数を入力してください。\n";
    cin >> num1;


    cout << "2番目の整数を入力してください。\n";
    cin >> num2;

    ans = max(num1, num2);

    cout << "最大値は" << ans << "です。\n";

    return 0; 
}

int max(int x, int y) {
    if (x > y)
        return x;
    else
        return y;
}

関数のデフォルト引数

void buy(int x=10);

int main() {
    
    cout << "1回目は100万円で購入します。\n";
    buy(100);


    cout << "2回目はデフォルト金額で購入します。\n";
    buy();

    return 0; 
}

void buy(int x) {
    cout << x << "万円の車を購入しました。\n";
}

[C++/C] 繰り返し処理

### for文

int main() {
    
    for(int i=1; i<=5; i++) {
        cout << i << "番目の繰り返しです。\n";
    }

    cout << "繰り返しが終わりました。\n";

    return 0; 
}

入力した合計値出力

int main() {
    
    int num;
    int sum = 0;

    cout << "幾つまでの合計を求めますか。\n";

    cin >> num;

    for(int i=1; i<=num; i++) {
        sum += i;
    }

    cout << "1から" << num << "までの合計値は" << sum << "です。\n";

    return 0; 
}

### while文

int main() {
    
    int i = 1;

    while(i <= 5) {
        cout << i << "番目の繰り返しです。\n";
        i++;
    }

    cout << "繰り返しが終わりました。\n";

    return 0; 
}

i++を忘れると無限ループになる。

int main() {
    
    int num = 1;

    while(num) {
        cout << "整数を入力してください。(0で終了)\n";
        cin >> num;
        cout << num << "が入力されました。\n";
    }

    cout << "繰り返しが終わりました。\n";

    return 0; 
}

while(num) はwhile(num != 0)と同義

do ~ while

int main() {
    
    int i = 1;

    do {
        cout << i << "番目の繰り返しです。\n";
        i++;
    }
    while(i <= 5);

    cout << "繰り返しが終わりました。\n";

    return 0; 
}

### 文のネスト

int main() {
    
    for(int i = 0; i < 5; i++) {
        for(int j=0; j<3; j++) {
            cout << "iは" << i << ":jは" << j << "\n";
        }
    }

    return 0; 
}

if文と組み合わせ

int main() {
    
    int ch = 0;
    for(int i = 0; i < 5; i++) {
        for(int j=0; j<5; j++) {
            if (ch == 0) {
                cout << '*';
                ch = 1;
            } else {
                cout << '-';
                ch = 0;
            }
        }
        cout << "\n";
    }

    return 0; 
}

break

#include <iostream>
using namespace std;

int main() {
    
    int res;
    cout << "何番目でループを中止しますか?\n";
    cin >> res;

    for(int i = 0; i < 10; i++) {
        cout << i << "番目の処理です。\n";
        if (i == res)
            break;
    }

    return 0; 
}

continue

int main() {
    
    int res;

    cout << "何番目の処理を飛ばしますか。(1~10)\n";

    cin >> res;

    for(int i =1; i <= 10; i++) {
        if(i == res)
            continue;
        cout <<  i << "番目の処理です。\n";
    }

    return 0; 
}

### Practice

#include <iostream>
using namespace std;

int main() {
    
    cout << "1~10までの偶数を出力します。\n";

    for(int i =1; i <= 10; i++) {
        if(i % 2 == 0)
            cout <<  i << "\n"; 
    }

    return 0; 
}
int main() {
    
    int num, sum;
    num = 1;
    sum = 0;
    cout << "テストの点数を入力してください。(0で終了)\n";

    while(num){
        cin >>  num;
        sum += num; 
    }

    cout << "テストの合計点は" << sum << "点です。\n";

    return 0; 
}
int main() {
    
   for(int i=1; i<6; i++) {
        for(int j=0; j<i; j++){
            cout << "*";
        }
        cout << "\n";
   }

    return 0; 
}

入れ子の場合でも、iを使用してfor文を回すことで、
for(int j=1; j<6; j++) で入れ子にすると、以下のようになってしまう。 ***** ***** ***** ***** *****

[C++/C] 条件式

### if文

int main() {
    
    int res;

    cout << "整数を入力してください。\n";

    cin >> res;

    if(res == 1)
        cout << "1が入力されました。\n";;

    cout << "処理を終了します。\n";

    return 0; 
}

if else

int main() {
    
    int res;

    cout << "整数を入力してください。\n";
    cin >> res;

    if(res == 1) {
        cout << "1が入力されました。\n";
    } else {
        cout << "1以外が入力されました。\n";
    }
    
    cout << "処理を終了します。\n";

    return 0; 
}

else if

int main() {
    
    int res;

    cout << "整数を入力してください。\n";
    cin >> res;

    if(res == 1) {
        cout << "1が入力されました。\n";
    } else if(res == 2) {
        cout << "2が入力されました。\n";
    } else {
        cout << "1か2を入力してください。\n";
    }
    
    cout << "処理を終了します。\n";

    return 0; 
}

### switch文

int main() {
    
    int res;

    cout << "整数を入力してください。\n";
    cin >> res;

    switch(res) {
        case 1:
            cout << "1が入力されました。\n";
            break;
        case 2:
            cout << "2が入力されました。\n";
            break;
        default:
            cout << "1か2を入力してください。\n";
            break;
    }

    return 0; 
}

### 複雑な条件判断

int main() {
    
    char res;

    cout << "あなたは男性ですか?\n";
    cout << "YかNを入力してください。\n";

    cin >> res;

    if (res == 'Y' || res == 'y') {
        cout << "あなたは男性ですね。\n";
    } else if (res == 'N' || res == 'n') {
        cout << "あなたは女性ですね。\n";
    } else {
        cout << "YかNを入力してください。\n";
    }

    return 0; 
}

### 条件演算子

int main() {
    
    int res;
    char ans;

    cout << "何番目のコースにしますか?\n";
    cout << "整数を入力してください。\n";

    cin >> res;

    if (res == 1)
        ans = 'A';
    else
        ans = 'B';

    cout << ans << "コースを選択しました。\n";

    return 0; 
}
int main() {
    
    int res;
    char ans;

    cout << "何番目のコースにしますか?\n";
    cout << "整数を入力してください。\n";

    cin >> res;

    ans = (res == 1) ? 'A' : 'B';

    cout << ans << "コースを選択しました。\n";

    return 0; 
}

ans = (res == 1) ? ‘A’ : ‘B’; の書き方

### practice

int main() {
    
    int num;

    cout << "整数を入力してください。\n";

    cin >> num;

    if (num % 2 == 0) {
        cout << num << "は偶数です。\n";
    } else if(num % 2 == 1) {
        cout << num << "は奇数です。\n";
    } else {
        cout << "整数を入力してください。\n";
    }

    return 0; 
}
#include <iostream>
using namespace std;

int main() {
    
    int num1, num2;

    cout << "2つの整数を入力してください。\n";

    cin >> num1;
    cin >> num2;

    if (num1 == num2) {
        cout << "2つの数は同じ値です。\n";
    } else if(num1 > num2) {
        cout << num2 << "より" << num1 << "の方が大きい値です。\n";
    } else {
        cout << num1 << "より" << num2 << "の方が大きい値です。\n";
    }

    return 0; 
}
int main() {
    
    int result;

    cout << "成績を入力してください。\n";

    cin >> result;

    switch(result){
        case 1:
            cout << "成績は1です。もっと頑張りましょう。\n";
            break;
        case 2:
            cout << "成績は2です。もう少し頑張りましょう。\n";
            break;
        case 3:
            cout << "成績は3です。さらに上を目指しましょう。\n";
            break;
        case 4:
            cout << "成績は4です。大変良くできました。\n";
            break;
        case 5:
            cout << "成績は5です。大変優秀です。\n";
            break;
        default:
            cout << "成績を入力してください。\n";
            break;
    }

    return 0; 
}

if(res % 2)は 0でなければ奇数と判断される
cin >> num1 >> num2とも書ける

bitcoinのブロック

### ブロックの構造と識別子
Block Size: 4bytes
Block Header: 80
Transaction Counter: 1~9 (ブロックに含まれているトランザクション数)
Transactions: 可変(トランザクションのリスト)

### ブロックヘッダの構造
Version: 4bytes
Previous Block Hash: 32
Merkle Root: 32
Timestamp: 4
Difficulty Target: 4
Nonce: 4

ブロックヘッダだけ保持するノードをSPV(Simplified Payment Verification)ノードという
ブルームフィルタとは、「このトランザクションを確認できるマークルパスをrequest」という要求を粗い要求に転換することで、どのトランザクションに関心があるかを特定しにくくするもの(BIP0037)

### 通常のトランザクションとcoinbaseトランザクション
通常のトランザクション
Transaction Hash: 32bytes
Output Index: 4
Unlockking Script Size: 1~9
Unlocking Script: 可変

coinbaseトランザクション
Transaction Hash: 32(他のトランザクションを参照しないため、全てのビットが「0」固定)
Output Index: 4 全てのビットが1固定
Coinbase Data Size: 1~9 (coinbase data sizeは2~100bytes)
Coinbase Data: 可変 (Extra NonceやMining Tagに使われる)
Sequence Number: 4(0x00000000)

### Segregated Witness
Segregated Witnessはトランザクションの署名をトランザクションインプットから切り離し別の領域に移す仕様で、2017年8月にアクティベートされた
サイズの大きい署名部分をトランザクションから切り離してwitnessに格納する
Lightning Netowrokとは、最初のトランザクションと最後のトランザクションのみをビットコインネットワークのブロックに記録して、その間のトランザクションはライトニングネットワーク内でのみ記録する

– SegWitのトランザクションの構造
Version no: 4bytes
Marker: 1 ★追加
Flag: 1
Input Counter: 1~9 (インプットの数)
Inputのリスト: 可変
Output Counter: 1~9 (アウトプットの数)
Outputのリスト: 可変
Script Witness: 可変 (witnessの要素の数とwitnessが設定される)
Locktime:4

### ブロックサイズの計算方法
block wight = ベースサイズ(全トランザクションのバイト数) * 3 + トータルサイズ(witnessを含むSegwit構造での全トランザクションバイト数)

P2WPKHでは
Locking Script: OP_0

[C++/C] 演算子の種類2

sizeof演算子

int main() {
    
    int a = 1;
    int b = 0;

    cout << "short int型のサイズは" << sizeof(short int) << "バイトです。\n";
    cout << "int型のサイズは" << sizeof(int) << "バイトです。\n";
    cout << "long int型のサイズは" << sizeof(long int) << "バイトです。\n";
    cout << "float型のサイズは" << sizeof(float) << "バイトです。\n";
    cout << "double型のサイズは" << sizeof(double) << "バイトです。\n";
    cout << "long double型のサイズは" << sizeof(long double) << "バイトです。\n";
    cout << "変数aのサイズは" << sizeof(a) << "バイトです。\n";
    cout << "式a+bのサイズは" << sizeof(a+b) << "バイトです。\n";
    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
short int型のサイズは2バイトです。
int型のサイズは4バイトです。
long int型のサイズは8バイトです。
float型のサイズは4バイトです。
double型のサイズは8バイトです。
long double型のサイズは16バイトです。
変数aのサイズは4バイトです。
式a+bのサイズは4バイトです。

### シフト演算子
数値を2進数で表した場合の桁を左または右に指定数だけずらす演算です。

### 型変換

int main() {
    
    int inum = 160;
    double dnum;

    cout << "身長は" << inum << "センチです。\n";
    cout << "double型の変数に代入します。\n";

    dnum = inum;

    cout << "身長は" << dnum << "センチです。\n";
    return 0; 
}
int main() {
    
    double dnum = 160.5;
    int inum;

    cout << "身長は" << dnum << "センチです。\n";
    cout << "int型の変数に代入します。\n";

    inum = dnum;

    cout << "身長は" << inum << "センチです。\n";
    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
身長は160.5センチです。
int型の変数に代入します。
身長は160センチです。

### キャスト演算子
型を変換することを明示する
dnum = (double)inum;

### 異なる型同士で演算する

int main() {
    
    int d = 2;
    const double pi = 3.14;

    cout << "直径が" << d << "センチの円の\n";
    cout << "円周は" << d*pi << "センチです。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
直径が2センチの円の
円周は6.28センチです。

double とintをかけると doubleになる。

### 同じ型同士の演算

int main() {
    
    int num1 = 5;
    int num2 = 4;
    double div;

    div = num1 / num2;

    cout << "5/4は" << div << "です。\n";

    return 0; 
}

int と intの計算のため、回答は1で出力される。(double)num1/(double)num2とキャストした場合は1.25で出力される。

### practice

int main() {
    

    cout << "0-4は" << 0-4 << "です。\n";
    cout << "3.14x2は" << 3.14*2 << "です。\n";
    cout << "5/3は" << 5/3 << "です。\n";
    cout << "30/7の余りは" << 30%7 << "です。\n";
    cout << "(7*32)/5は" << (7*32)/5 << "です。\n";

    return 0; 
}

三角形の面積

int main() {
    
    double height, base;

    cout << "三角形の高さを入力してください。\n";
    cin >> height;

    cout << "三角形の底辺を入力してください。\n";
    cin >> base;

    cout << "三角形の面積は" << height*base/2 << "です。\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
三角形の高さを入力してください。
3
三角形の底辺を入力してください。
5
三角形の面積は7.5です。

#include <iostream>
using namespace std;

int main() {
    
    int num1, num2, num3, num4, num5;

    cout << "科目1の点数を入力してください。\n";
    cin >> num1;

    cout << "科目2の点数を入力してください。\n";
    cin >> num2;

    cout << "科目3の点数を入力してください。\n";
    cin >> num3;

    cout << "科目4の点数を入力してください。\n";
    cin >> num4;

    cout << "科目5の点数を入力してください。\n";
    cin >> num5;

    cout << "5科目の合計点は" << num1+num2+num3+num3+num4+num5 << "です。\n";
    cout << "5科目の平均点は" << (num1+num2+num3+num3+num4+num5)/5 << "です。\n";

    return 0; 
}

合計値の場合は、int sum=0, num=0と宣言した上で、
cin >> num;
sum += num;とする方がスマート