C# 初級講座
Visual Studio 2005 Visual Studio 2008 Visual Studio 2010 Visual Studio 2012 Visual Studio 2013 Visual Studio 2015 Visual Studio 2017 Visual Studio 2019 Visual Studio 2022

第4回 計算機を作ってみる

2022/4/3

この記事が対象とする製品・バージョン

Visual Studio 2022 Visual Studio 2022 対象です。
Visual Studio 2019 Visual Studio 2019 対象です。
Visual Studio 2017 Visual Studio 2017 対象です。
Visual Studio 2015 Visual Studio 2015 対象です。
Visual Studio 2013 Visual Studio 2013 対象外ですが参考にはなります。
Visual Studio 2012 Visual Studio 2012 対象外ですが参考にはなります。
Visual Studio 2010 Visual Studio 2010 対象外ですが参考にはなります。
Visual Studio 2008 Visual Studio 2008 対象外ですが参考にはなります。
Visual Studio 2005 Visual Studio 2005 対象外ですが参考にはなります。
Visual Studio.NET 2003 Visual Studio.NET 2003 対象外ですが参考にはなります。
Visual Studio.NET 2002 Visual Studio.NET (2002) 対象外ですが参考にはなります。
  Visual Studio Code 対象外ですが参考にはなります。

 

目次

 

1.計算機プログラム

ユーザーが入力した2つの値を計算するプログラムを作ってみましょう。

下記の設定で新規プロジェクトを作成してください。

プロジェクトテンプレート コンソール アプリ
プロジェクト名 CalcConsole
ソリューション名 CalcConsole
フレームワーク .NET 6.0

 

そして、次の通りプログラムをして実行してください。

Console.WriteLine("計算機 バージョン 1.0");
Console.WriteLine("終了するには Ctrl + C を押してください。");

while (true) // { } で囲んだプログラムを無限に繰り返します。
{
    Console.WriteLine(); // 空の行を出力

    Console.Write("1つ目の数字: ");
    string value1 = Console.ReadLine()!;
    decimal number1 = Convert.ToDecimal(value1);

    Console.Write("2つ目の数字: ");
    string value2 = Console.ReadLine()!;
    decimal number2 = Convert.ToDecimal(value2);

    Console.Write("計算の種類(+ - * / %): ");
    string calcType = Console.ReadLine()!;

    Console.Write("結果: ");
    if (calcType == "+")
    {
        Console.WriteLine(number1 + number2);
    }
    else if (calcType == "-")
    {
        Console.WriteLine(number1 - number2);
    }
    else if (calcType == "*")
    {
        Console.WriteLine(number1 * number2);
    }
    else if (calcType == "/")
    {
        Console.WriteLine(number1 / number2);
    }
    else if (calcType == "%")
    {
        Console.WriteLine(number1 % number2);
    }
    else
    {
        Console.WriteLine("+ - * / % のどれかを入力してください。");
    }

} // while

実行して、数値と記号を入力すると結果を表示する簡易電卓になります。

 

 

2.プログラムの中身

2-1.WriteLine と Write

このプログラムは文字を出力するのに、Console.WriteLine または Console.Write (読み方:Write=ライト)を使っています。

Console.WriteLine は文字を出力して改行します。 Console.Write は文字を出力するだけで改行はしません。

 

2-2.繰り返し

このプログラムは大部分が while (true) { } で囲まれています(読み方:while=ワイル、true=トゥルー)。

while は { } で囲まれた範囲を繰り返す命令です。繰り返しのことを「ループ」と呼びます。( ) の中には、ループを継続する条件を記述できます。 true を記述すると無限にループします。

コンソールアプリは Ctrl + C を押すといつでも強制的に終了できるので、このアプリを終了する手段として利用します。

 

2-3.数字の入力

数字は1つ目のと2つ目の2回入力できます。プログラムは変数やメッセージ以外同じです。

Console.Write("1つ目の数字: ");
string value1 = Console.ReadLine()!;
decimal number1 = Convert.ToDecimal(value1);

Console.Write("2つ目の数字: ");
string value2 = Console.ReadLine()!;
decimal number2 = Convert.ToDecimal(value2);

ユーザーが入力した値を読み取るには Consoleクラスの ReadLineメソッド(読み方:ReadLine=リードライン)を利用します。

ReadLineメソッドはユーザーが何か入力するまで待機して、Enterなどが押されたタイミングで入力されたもの全体を読み取ります。読み取った結果は戻り値として返ってくるので、このプログラムではvalue1、value2にそれぞれ格納されます。

このプログラムではユーザーが数字を入力することを期待していますが、ReadLineメソッドには入力を数字に限定する機能はないのでユーザーは何でも好きな文字を入力できます。そのためvalue1、value2は文字列を表現できる string として定義する必要があります。

 

2-4.null ではない!

ReadLine() の後ろについている ! は、「値が必ず存在することにする」という目印です。

この ! がなくてもプログラムは動作しますが、コンパイラーは緑の波線で次の警告を表示します。

Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。

このエラーメッセージの「Null」(ヌル)とは値が存在しないことを意味します。今回のプログラムの使い方では必ず値が存在するので心配ないのですが、もっと違う使い方をすると値がない可能性を排除できないのでC#のコンパイラーは警告を表示するようになっています。警告があっても今回のプログラムの実行に影響はないのですが、気になるので ! をつけて「ここは必ず値が入っている」ということをコンパイラーに伝えてこの警告を消します。

なお、ユーザーが何も入力せずに Enterキーを押した場合、空の文字列、つまり長さ0の文字列を取得することになりますが、これはC#の考え方では値がある状態です。

 

2-5.文字列から数値への型変換

3行目の decimal number…の行でで取得した値を数値型に変換します。数値型に変換する理由は、文字列型と数値型とで + の機能が違いますし、- * / % などは数値型に変換しないと使用できない演算子だからです。ユーザーが ABC や あいう など数値に変換できない値を入力した場合ここでエラーになります。

 

型を変換するには Convertクラス(読み方:Convert=コンバート)のメソッドが便利です。このプログラムでは ToDecimalメソッド (読み方:ToDecimal=トゥーデシマル)を使って文字列型をdecimal型に変換しています。

他の型に変換することもできます。主だった型変換用のメソッドを表に掲載します。

変換後の型 Convertクラスのメソッド
bool Convert.ToBoolean
byte Convert.ToByte
char Convert.ToChar
DateTime Convert.ToDateTime
decimal Convert.ToDecimal
double Convert.ToDouble
int Convert.ToInt32
long Convert.ToInt64
sbyte Convert.ToSByte
short Convert.ToInt16
float Convert.ToSingle
string Convert.ToString
uint Convert.ToUInt32
ulong Convert.ToUInt64
ushort Convert.ToUInt16

 

2-6.入力された演算子の判定

最後に入力された演算子を変数 calcType に格納します。

そしてcalcTypeの内容によって計算を行います。

Console.Write("計算の種類(+ - * / %): ");
string calcType = Console.ReadLine()!;

Console.Write("結果: ");
if (calcType == "+")
{
    Console.WriteLine(number1 + number2);
}
else if (calcType == "-")
{
    Console.WriteLine(number1 - number2);
}
else if (calcType == "*")
{
    Console.WriteLine(number1 * number2);
}
else if (calcType == "/")
{
    Console.WriteLine(number1 / number2);
}
else if (calcType == "%")
{
    Console.WriteLine(number1 % number2);
}
else
{
    Console.WriteLine("+ - * / % のどれかを入力してください。");
}

+ が入力されたのか、 - が入力されたのか…の判断は if (読み方:if=イフ)を使って行います。

if は条件付きでプログラムを実行する最も普通の方法です。

単純な使い方は次の通りです。

if (条件)
{
    実行する処理
}

( ) は必ず必要です。実行する処理は何行でも書けますし、何も書かないこともできます。

実行する処理が1行だけの場合、 { } は省略することができます。

だから、今回のプログラムでは { } はいらないのですが、 私は1行の場合でも必ず { } を付けるようにしています。{ } がある場合とない場合が混在していると、プログラムを見たときにわかりにくいように思うからです。プログラムの読みやすさのことを可読性(かどくせい)と言います。どうすればプログラムが読みやすくなるかは人によって少し違うかもしれませんが、可読性を意識したプログラムをすることは重要です。

さて、上の構文に照らし合わせると、calcType が "+" のときにたし算を実行して表示するには次のようなプログラムになります。

if (calcType == "+")
{
    Console.WriteLine(number1 + number2);
}

比較を実行するには = ではなく == と記述します。妙に思えるかもしれませんが = は『代入』を実行する演算子なので、 calcType = "+" と書くと、calcType に "+" を代入するという意味になってしまいます。そうではなく、calcType が "+" と同じかどうか『比較』したいので、代入の = とは異なる == という演算子を使用します。

次の表は比較を実行する演算子の一覧です。これ以外の高度な比較を行うフレームワークの機能もあります。

演算子 (私の)読み方 意味
== イコールイコール 値が等しいか比較します。
!= びっくりイコール
(一般的にはノットイコール?)
値が等しくないか比較します。
< しょうなり 値が小さいか比較します。
> だいなり 値が大きいかヒックします。
<= しょうなりイコール 値が小さいか等しいか比較します。
>= だいなりイコール 値が大きいか等しいか比較します。

 

if に続けて else if (読み方:else=エルス)を記述すると、「そうではなく、…の場合」という条件を記述できます。

今回のプログラムは "+" だけ判断したいわけではなく、じゃあ"-"なのか、それも違ったら"*"なのか、といくつか判断したいためこの else if を利用しています。else キーワードが付くだけで使い方は if と同じです。else if はいくつでも記述できます。不要ならばひとつも書く必要はありません。

最後に if がなく、else を単独で使用しています。これは、そのどれでもない場合に実行される処理を記述できます。else は1つのif文につき、1つだけ記述できます。不要ならば省略することもできます。

以上で、if 文の全体的な構造は次のようになります。

if (条件1)
{
    実行する処理1
}
else if (条件2)
{
    実行する処理2
}
else if (条件3)
{
    実行する処理3
}
else
{
    どの条件にも合致しない場合の処理
}

 

 

 

3.練習問題

問1.コンソールアプリでユーザーからの入力を受け取る Console クラスのメソッドは何でしょうか?
WriteLine
Write
ReadLine
問2.値がないことを示しているのはどれでしょうか?
while
if
null
問3.値が必ずあることをコンパイラに伝えるには何を記述しますか?
!
?
%
問4.条件を判断するときに使うキーワードはどれでしょうか?
while
if
null
問5.処理を繰り返すときに使うキーワードはどれでしょうか?
while
if
null

 

 

 

次の回では、計算の勉強ができるアプリを作ってみます。算数や数学の練習にも活用できます。

C#初級講座講座 次の回へ