[C++/C] 引数と配列2

double avg(int t[]);

int main() {
    
    int test[5];

    cout << "5人のテストの点数を入力してください。\n";
    for(int i=0; i<5; i++){
        cin >> test[i];
    }
    double ans = avg(test);
    cout << "5人の平均点は" << ans << "点です。\n";

    return 0; 
}

double avg(int t[]){
    double sum = 0;

    for(int i=0; i<5; i++){
        sum += t[i];
    }
    return sum/5;
}

ポインタを引数で渡すように良く書かれる

double avg(int* pT);

int main() {
    
    int test[5];

    cout << "5人のテストの点数を入力してください。\n";
    for(int i=0; i<5; i++){
        cin >> test[i];
    }
    double ans = avg(test);
    cout << "5人の平均点は" << ans << "点です。\n";

    return 0; 
}

double avg(int* pT){
    double sum = 0;

    for(int i=0; i<5; i++){
        sum += *(pT+i);
    }
    return sum/5;
}

$ g++ -o sample sample.cpp && ./sample
5人のテストの点数を入力してください。
33
12
14
12
11
5人の平均点は16.4点です。

### 文字列と配列
文字列は配列だけでなく、ポインタでも扱える

int main() {
    
    char str[] = "Hello";

    cout  << str << "\n";

    return 0; 
}
int main() {
    
    char* str = "Hello";

    cout  << str << "\n";

    return 0; 
}

$ g++ -o sample sample.cpp && ./sample
sample.cpp: In function ‘int main()’:
sample.cpp:6:17: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
6 | char* str = “Hello”;
| ^~~~~~~
Hello

int main() {
    
    char str[] = "Hello";

    cout  << "Hello\n";

    for(int i=0; str[i]!='\0'; i++){
        cout << str[i] << '*';
    }
    cout  << "\n";

    return 0; 
}

c++の文字列は必ず\0で終わる

### 文字列の標準ライブラリ

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    
    char str[100];

    cout  << "文字列(英数字)を入力してください。\n";

    cin >> str;

    cout  << "文字列の長さは" << strlen(str) << "です。\n";

    return 0; 
}

strcatで文字列を連結する。strcpyは代入格納

int main() {
    
    char str0[20];
    char str1[10];
    char str2[10];

    strcpy(str1, "Hello");
    strcpy(str2, "Goodbye");
    strcpy(str0, str1);
    strcat(str0, str2);

    cout  << "配列str1は" << str1 << "です。\n";
    cout  << "配列str2は" << str2 << "です。\n";
    cout  << "配列str0は" << str0 << "です。\n";

    return 0; 
}

### practice

int max(int x[]){
    int maxnum = 0;
    for(int i=0; i<5; i++) {
        if(x[i] > maxnum) {
            maxnum = x[i];
        }
    }
    return maxnum;
}

int main() {
    
    int result[5];

    cout  << "テストの点数を入力してください。\n";

    for(int i=0; i<5; i++) {
        cin >> result[i];
    }

    int num = max(result);
    cout  << "テストの最高点は" << num << "点です。\n";

    return 0; 
}
int length(char* str){
    int i = 0;
    while(str[i]){
        i++;
    }
    return i;
}

int main() {
    
    char str[10];
    cout  << "文字列を入力してください。\n";

    cin >> str;
    int len = length(str);

    cout  << "文字列の長さは" << len << "です。\n";

    return 0; 
}

maxは最初から x[0]と宣言してしまった方が効率的

int max(int x[]){
    int m = x[0];
    for(int i=0; i<5; i++){
        
    }
}
int count(char str[], char ch){
    int n = 0;
    for(int i=0; i < strlen(str); i++){
        if(str[i] == ch){
            n++;
        }
    }
    return n;
}

int main() {
    
    char str[10];
    char ch;

    cout  << "文字列を入力してください。\n";

    cin >> str;

    cout  << "文字列から探す文字を入力してください。\n";
    cin >> ch;

    int n = count(str, ch);

    cout  << str << "の中に" << ch << "は" << n << "個です。\n";

    return 0; 
}

[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