C++ with Windows API講習/整数と実数

概要

プログラムを書くのですから、数値の計算もしておきましょう。

重要語

組み込み型

C++言語の基礎となる型

ユーザー定義型

組み込み型以外の型

算術演算

四則演算と剰余算

キャスト

組み込み型同士の型変換

必要語

今回の必要語はありません。

型の種類

今回から型が増え始めるので、型の種類について整理しておきます。

組み込み型

C++言語の基礎となる型を、組み込み型といいます。
組み込み型は、ライブラリを読み込まなくても使うことができます。
基本型と呼ばれることもあります。
本講習では、主にint型、double型、bool型を使います。
なお、型という言葉で組み込み型のみを表す場合もありますが、本講習にはありません。

ユーザー定義型

組み込み型以外の型を、ユーザー定義型といいます。
ライブラリによって定義される型などが含まれます。
std::wstring型はユーザー定義型です。

文字列への変換

整数から文字列への変換を行ってみましょう。
文字列への変換
#include <Windows.h>
//std::wstring, std::to_wstring()を定義しているライブラリ
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //整数2020を文字列に変換して表示
    MessageBoxW(NULL, std::to_wstring(2020).c_str(), L"MessageBoxW1", MB_OK);

    //整数16.7を文字列に変換して表示
    MessageBoxW(NULL, std::to_wstring(16.7).c_str(), L"MessageBoxW2", MB_OK);

    return 0;
}

整数と実数

整数は、半角数字でそのまま書きます。
小数は、小数点.をつけて書きます。
小数点以下しかない場合でも、整数部に0を書いてください。
つまり、.5ではなく、0.5と書いてください。

文字列への変換

数値をstd::wstring型に変換するには、std::to_wstring関数を使います。
c_str関数とは違い、std::to_wstring(変換する数値)のように引数を書きます。

算術演算

算術演算とは、四則演算と剰余算の5種類の演算のことです。
まずは例を見てみましょう。
整数の算術演算
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //加算,足し算
    MessageBoxW(NULL, std::to_wstring(2 + 3).c_str(), L"2+3=", MB_OK);

    //減算,引き算
    MessageBoxW(NULL, std::to_wstring(9 - 2).c_str(), L"9-2=", MB_OK);

    //乗算,掛け算
    MessageBoxW(NULL, std::to_wstring(51 * 7).c_str(), L"51*7=", MB_OK);

    //除算,割り算
    MessageBoxW(NULL, std::to_wstring(12 / 4).c_str(), L"12/4=", MB_OK);

    //剰余算,余り算
    MessageBoxW(NULL, std::to_wstring(23 % 3).c_str(), L"23%3=", MB_OK);

    return 0;
}

剰余算

四則演算にはなじみがあるでしょうが、剰余算は聞いたことがないかもしれません。
これは、割り算をした時の余りを求める計算です。
いくつか計算をして確かめるとよいでしょう。

記号

+-は数学と同じ記号です。
しかし、×や÷は使われず、*/が使われます。
×や÷はASCIIに含まれず、昔は表示できないコンピュータもあったためです。

負数と丸め

負数は、数字の前に-をつけることで表わせます。
それでは、次の例を実行してみましょう。
負数と丸め
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //負数の足し算
    MessageBoxW(NULL, std::to_wstring(-2 + 3).c_str(), L"-2+3=", MB_OK);

    //負数の引き算
    MessageBoxW(NULL, std::to_wstring(9 - -2).c_str(), L"9-(-2)=", MB_OK);

    //負数の掛け算
    MessageBoxW(NULL, std::to_wstring(51 * -7).c_str(), L"51*(-7)=", MB_OK);

    //正数の丸め
    MessageBoxW(NULL, std::to_wstring(13 / 5).c_str(), L"13/5=", MB_OK);

    //負数の丸め
    MessageBoxW(NULL, std::to_wstring(-20 / 7).c_str(), L"-20/7=", MB_OK);

    return 0;
}

0への丸め

この例のうち、最後の2つの式では、答えが整数になりません。
整数と整数の計算をして、結果が整数でない場合、0に向かって切り捨てられます。
このことを、0への丸めといいます。

実数の計算

実数でも整数と同じように算術演算できますが、結果の丸めは起こりません。
実数の計算
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //実数の加算
    MessageBoxW(NULL, std::to_wstring(1.2 + 3.4).c_str(), L"1.2+3.4=", MB_OK);

    //実数の乗算
    MessageBoxW(NULL, std::to_wstring(1.125 * -0.8).c_str(), L"1.125*(-0.8)=", MB_OK);

    //実数の除算
    MessageBoxW(NULL, std::to_wstring(1.0 / 3.0).c_str(), L"1.0/3.0=", MB_OK);

    return 0;
}

型の異なる値の計算

実数と整数のように、型の異なる値でも、数値ならば算術演算できます。
ただし、表わせる範囲の狭い型の値が、広い型の値に変換され、計算されます。
整数のint型と実数のdouble型では、後者の方が広い範囲を表せます。
そこで、double型の値同士のように計算されるのです。
この変換は自動で行われるので、暗黙の型変換と呼ばれます。
ただし、この変換は組み込み型にしか適用されません。
型の異なる値の計算
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int){
     //整数と実数
    MessageBoxW(NULL, std::to_wstring(1.5 + 4).c_str(), L"1.5+4=", MB_OK);
    
    //順番は逆でもよい
    MessageBoxW(NULL, std::to_wstring(7 * 1.7).c_str(), L"7*1.7=", MB_OK);
    
    //丸めは起こらない
    MessageBoxW(NULL, std::to_wstring(1.0 / 3).c_str(), L"1.0/3=", MB_OK);
    
    return 0;
}

キャスト

暗黙の型変換と違い、明示的に型を変換することをキャストといいます。
これには、(変換先型名)変換する値という構文を使います。
暗黙の型変換と同じく、キャストも組み込み型にしか適用できません。
例えば、std::wstring型の値を変換したり、他の型から変換することはできません。
キャスト
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int){
     //実数への変換
    MessageBoxW(NULL, std::to_wstring((double)50).c_str(), L"実数への変換", MB_OK);
    
    //整数への変換
    MessageBoxW(NULL, std::to_wstring((int)6.2).c_str(), L"整数への変換", MB_OK);
    
    //丸め回避
    MessageBoxW(NULL, std::to_wstring(2/(double)7).c_str(), L"2/7.0=", MB_OK);
    
    return 0;
}

数値の変数

前章では文字列の変数を用意しました。
同じように、int型やdouble型の変数を使ってみましょう。
変数も、数字と同じように、算術演算やキャストして使うことができます。
なお、変数の値をキャストしても、変数そのものの型や値は変わりません。
数値の変数
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int){
    //整数型変数の宣言と初期化
    int a = -1452;
    //値の表示
    MessageBoxW(NULL, std::to_wstring(a).c_str(), L"a=", MB_OK);
    
    //代入
    a = 90;
    //加算
    MessageBoxW(NULL, std::to_wstring(a + 30).c_str(), L"a+30=", MB_OK);
    
    //実数型変数の宣言と初期化
    double b = 20.6;
    //暗黙の型変換1
    MessageBoxW(NULL, std::to_wstring(b + 5).c_str(), L"b+5=", MB_OK);
    
    //キャスト
    MessageBoxW(NULL, std::to_wstring((int)b).c_str(), L"キャスト", MB_OK);
    
    //暗黙の型変換2
    a = b * 4;
    MessageBoxW(NULL, std::to_wstring(a).c_str(), L"a=", MB_OK);
    
    return 0;
}

練習問題

円周率を3.14として、double型変数piに代入してください。
また、円の半径を10として、int型変数rに代入してください。
そして、この円の円周と面積を求めてください。
最後に、「半径rの数値の円の円周の長さは長さ、面積は面積です。」のように、繋げて表示してください。
解答の一部
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //この後に連結すること
    std::wstring text="半径";
    
    
    return 0;
}
解答
練習問題解答
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //この後に連結すること
    std::wstring text = L"半径";
    double pi = 3.14;
    int r = 10;
    
    text = text + std::to_wstring(r);
    text = text + L"の円の円周の長さは" + std::to_wstring(2 * r * pi) + L"、";
    text = text + L"面積は" + std::to_wstring(r * r * pi) + L"です。";
    
    MessageBoxW(NULL, text.c_str(), L"円周と面積", MB_OK);
    
    return 0;
}