講義メモ 後半

p.89 論理演算子

・論理関係演算子、否定演算子、ビット論理演算子の総称

p.89 論理関係演算子

・2項&&演算子(別名:AND演算子):bool型とbool型を受け取り、共にtrueならtrueを返し、そうでなければ
 falseを返す。よって「●かつ■ならば」という表現に用いる
例: Console.Write((x == 1) && (y == 1)); //xが1かつyが1ならTrue、でなければFalseを表示
例: string a = ((x == 1) && (y == 1)) ? "共に1" : "共に1とは限らぬ";
・2項||演算子(別名:OR演算子):bool型とbool型を受け取り、共にfalseならfalseを返し、そうでなければtrueを返す。
 よって「●または■ならば」という表現に用いる
例: Console.Write((x == 1) || (y == 1)); //xが1またはyが1ならTrue、でなければFalseを表示
例: string a = ((x == 1) || (y == 1)) ? "1がある" : "1はない";
・よって、論理関係演算子は複数の条件をつなぐために用いることが多い

p.89 否定演算子

・単項!演算子(別名:NOT演算子):bool型を受け取り、true⇔false変換して返す。よって「●でなければ」という表現に用いる
例: Console.Write(!(x == 1)) ; //xが1ならばFalse、でなければTrueを表示
例: string a = !(x == 1) ? "1じゃない" : "1だ";
・よって、単純な条件であれば「!=」を用いる方が見やすい
例: string a = (x != 1) ? "1じゃない" : "1だ";
・主に、複雑な条件の反転やbool型を返すメソッド(後述)の結果反転などに用いる
例: string a = !(x == 1 || y == 1) ? "どちらも1じゃない" : "";
※ちなみにこれは (x != 1 && y != 1)と同じ(ド・モルガンの法則)

p.89 ビット論理演算子

・コンピュータ内ではデータは2進数で扱われ、その1桁をビットという
・例: 32ビットの場合、10進数7 ⇒ 00000000 00000000 00000000 00000111
・C#には本来、データをビット単位で扱う方法が提供されていない
・代わりに、ビット毎に操作できるビット論理演算子を用いる
・2項&演算子:左辺の整数と右辺の整数を2進数にして同じ位置のビットどうしをAND演算した結果(1と1なら1、
 でなければ0)の整数を返す
・8ビットの場合、2 & 3 ⇒ 00000010 & 00000011 = 00000010 なので 2
・0とのANDは必ず0になり、1とのANDは元のままになる。これを生かして、特定のビットを欲しい(または0にしたい)場合に
 用いる
・8ビットで2ビット目が欲しい場合、00001110 & 00000010 = 00000010 なので 2
・8ビットで2ビット目を0にしたい場合、00001110 & 11111101 = 00001100 なので 12
・2項|演算子:左辺の整数と右辺の整数を2進数にして同じ位置のビットどうしをOR演算した結果(0と0なら0、でなければ1)の整数を返す
・8ビットの場合、2 | 3 ⇒ 00000010 | 00000011 = 00000011 なので 3
・1とのORは必ず1になり、0とのORは元のままになる。これを生かして、特定のビットを欲しい(または1にしたい)場合に用いる
・8ビットで6ビット目を1にしたい場合、00001110 | 00100000 = 00101110 なので 44
・2項^演算子(排他的論理和:XOR):左辺の整数と右辺の整数を2進数にして同じ位置のビットどうしをXOR演算した結果
 (0と0、1と1なら0、でなければ1)の整数を返す
・1とのXORは反転になり、0とのXORは元のままになる。これを生かして、特定のビットを反転したい場合に用いる
・8ビットで1,2ビット目を反転したい場合、00001110 ^ 00000011 = 00001101 なので 13
・C#では上記の3演算子をbool型にも使え、1ビットの値とみなされる。
・よって、2項&&演算子の代わりに2項&演算子、2項||演算子の代わりに2項|演算子を利用できるが、
 短絡評価の機能は持たない
・短絡評価:ANDで接続されている2項は1項めがfalseだと全体がfalse確定なので2項めは評価されない。ORで接続されている
 2項は1項めがtrueだと全体がtrue確定なので2項めは評価されない。このことで効率が上がり、安全性が上がる
 例: string d = (a != 0 && 100 / a > 10) ? "OK" : "NG"; //100÷aは10超?
 ※こうすればaが0の時、短絡評価で「100 / a > 10」の評価をしないので、ゼロ除算による異常終了を回避できる

提出:ミニ演習 mini088.cs

講義メモ

・p.85「インクリメント演算子、デクリメント演算子」から

p.85 インクリメント演算子、デクリメント演算子

・単項++演算子:「変数 = 変数 + 1」を「変数++」または「++変数」と記述でき、インクリメント演算子ともいう。
・「++変数」を前置インクリメント演算子、「変数++」を後置インクリメント演算子という
・前置と後置は単独で行う場合は同じ意味だが、評価のタイミングが異なる
・前置の場合:1を足しこんで、その結果を評価とする
・後置の場合:現在の値を評価としてから、1を足しこむ
・例: int i = 10; Console.Write(++i); Console.Write(i); //11 11となる
・例: int i = 10; Console.Write(i++); Console.Write(i); //10 11となる
・C#では実数型変数にも利用可能で、1.0が加算される
・単項--演算子:「変数 = 変数 - 1」を「変数--」または「--変数」と記述でき、デクリメント演算子ともいう。動作は「++」と同様

p.87 increment02.cs

//p.87 increment02.cs
using System;
class increment02
{
    public static void Main()
    {
        double a = 1.25;
        decimal d = -12.3M;
        Console.WriteLine(++a); // a = a + 1.0 となる
        Console.WriteLine(--d); // d = d - 1M となる
    }
}

p.88 関係演算子

・値の大小関係によりbool型(p.57)の戻り値を返す演算子の総称
・2項==演算子:左辺と右辺の値が等しければtrue、でなければfalse
 ※「= =」はNG
・2項!=演算子:左辺と右辺の値が等しければfalse、でなければtrue
 ※「! =」「=!」はNG
・2項>=演算子:左辺の値が右辺の値以上ならばtrue、でなければfalse
 ※「> =」「=>」はNG
・2項<=演算子:左辺の値が右辺の値以下ならばtrue、でなければfalse
 ※「< =」「=<」はNG

アレンジ演習:p.57 bool01.cs

・bool型の変数a、bに式「10 == 8 + 2」と「1 + 3 != 4」の演算結果を初期値として与えて、動作を確認しよう

作成例

//アレンジ演習:p.57 bool01.cs
using System;
class bool01
{
    public static void Main()
    {
        bool a = (10 == 8 + 2); //bool型を返す式の評価で初期化
        bool b = (1 + 3 != 4);  //bool型を返す式の評価で初期化
        Console.WriteLine("a = {0}, b = {1}", a, b); //表示するとTrue/Falseとなる
        Console.WriteLine("aは{0}", a.GetType()); //boolの.NET型情報を表示
        Console.WriteLine("aは文字列にすると「{0}」", a.ToString()); //論理値を示す文字列を表示
        Console.WriteLine("bは文字列にすると「{0}」", b.ToString()); //論理値を示す文字列を表示
    }
}

p.88 条件演算子

・C#では唯一の3項演算子で、制御構造を演算子で実装できる
・書式: bool型の値や式① ? ①がTrueの場合の値や式 : ①がfalseの場合の値や式
・「:」の前後のどちらかだけが実行されるので「もしも●なら▲をでなければ■を」という構文になる
例: Concole.Write(a > 0 ? "正の数" : "正の数ではない");
例: int max = (a > b) ? a : b; //aとbの大きい方をmaxに代入
・つまり、値を返すif-else文を演算子で表現したもの
・一般に誤読防止の為に①をカッコで囲むことが多い

ミニ演習 mini088.cs

・コンソールから整数を2つ入力し、大きい方(2項>演算子でTrueになる方)を表示しよう

作成例

//ミニ演習 mini088.cs
using System;
class mini088
{
    public static void Main()
    {
        Console.Write("A:"); int a = int.Parse(Console.ReadLine());
        Console.Write("B:"); int b = int.Parse(Console.ReadLine());
        Console.WriteLine("大きい方は{0}", (a > b) ? a : b);
        //または
        int max = (a > b) ? a : b;
        Console.WriteLine("大きい方は{0}", max);
    }
}

今週の話題

販売本数ランキング 今回トップも「ゼルダの伝説 ティアーズ オブ ザ キングダム(Switch)」GO!
“PlayStation Showcase 2023”まとめ。PS5リモートプレイ用携帯機、『メタルギア ソリッド3』リメイク、『ドラゴンズドグマ2』『アサシンクリード ミラージュ』『FF16』新映像などが発表【PS Showcase】GO!
任天堂の業績に異変あり!Wii時代と何が変わったのか?【ゲーム企業の決算を読む】GO!
シリコンスタジオ、「Open 3D Foundation」に参画―日本市場での「Open 3D Engine」のアクセシビリティと認知度向上等に尽力 GO!
NPCとのリアルタイム音声会話を可能にする「Smart NPCs」発表!AIを利用したUnreal Engine向けプラグイン GO!
新情報配信番組、視聴者の記憶に残る内容は一番インパクトのあった1つだけ…?そんな中明かされた「Summer Game Fest 2023(6/9)の大きな発表は3つか4つ」に勝算あるか GO!

『スプラトゥーン3』で不正アプリの存在を確認―正規品になりすまし活動、思わぬ被害を受ける可能性も GO!
ドワンゴ、特許裁判でFC2に勝訴 一審から逆転勝訴となった決定打は? GO!
会員サービス「My Sony」にログインできない? Twitterで物議 ソニー「正しいパスワードでもサインインできないことある」 GO!

前回のコメント

・だんだん型の内容の整理がついて理解を深めることができました。(‘ω’)

 何よりです♪

・アレンジ演習なども過去の復習としてできたり、こんな感じのプログラムも作ることができるんだといろいろ勉強になりました。
 時間があれば、アレンジ演習もたくさんやってみたいです。

 是非。演習を多めにご提供しますね。

講義メモ 第4章 演算子

p.79 式と演算子

・「+」や「-」などの計算や操作を表す記号や単語を演算子という
・演算子の対象をオペランド(項)といい、演算子の種類によって用いる数が異なる
 例:「a + b」はオペランドが2つなので「2項+演算子」という
・式を計算して結果を得ることを「評価する」という
 例:2項+演算子の評価は加算結果になる
・代入の「=」も演算子であり、代入式は「2項=演算子」になっている
・2項=演算子の評価は代入値になる
 例: c = 3 + 4 とすると「3 + 4」の評価である7がcに代入され、評価は7
・演算子は基本的に左から評価されるが、「2項=演算子」のように右から評価するものもある

p.80 expression01 解説

// p.80 expression01 解説
using System;
class expression01 {
    public static void Main() {
        int a = 0;
        Console.WriteLine("a = {0}", a);
        //代入式を指定するとその評価(値)を表示できる(代入では代入値)
        Console.WriteLine("(a = 7)の値は{0}", a = 7); //7となる
    }
}

p.81 算術演算子

・2項+演算子:2項が共に数値型であれば加算結果を返す。どちらかでも文字列ならば連結結果を返す
・2項-演算子:2項が共に数値型であれば左辺から右辺を引いた結果を返す。
・2項*演算子:2項が共に数値型であれば左辺と右辺の積を返す。
・2項/演算子:2項が共に整数型であれば左辺を右辺で割った商の整数部を返す(小数点以下切り捨て)。どちらかでも実数型ならば商を返す。
 ※ 右辺の値が0だと実行時エラー、右辺が「0」だと文法エラーになる
 ※ 右辺が0.0だと∞、-0.0だと-∞になる。

p.81 add01.cs

//p.81 add01.cs
using System;
class add01
{
    public static void Main()
    {
        Console.WriteLine(3 + 6); //加算されて9
        Console.WriteLine(3.0 + 6); //加算されて9.0だが表示は「9」
        Console.WriteLine("3.5" + 6); //連結されて"3.56"だが表示は「3.56」
        Console.WriteLine(3.5 + "6"); //連結されて"3.56"だが表示は「3.56」
        Console.WriteLine(); //改行のみ
        Console.WriteLine("(3.0 + 6)の型は{0}", 
            (3.0 + 6).GetType()); //double + int なので加算されて System.Double
        Console.WriteLine("文字列3.5 + intの6の型は{0}",
            ("3.5" + 6).GetType()); //string + int なので連結されて System.String
        Console.WriteLine("doubleの3.5 + 文字列6の型は{0}",
            (3.5 + "6").GetType()); //double + string なので連結されて System.String
    }
}

p.83 division01.cs

//p.83 division01.cs
using System;
class division01
{
    public static void Main()
    {
        Console.WriteLine("10 / 3 = {0}", 10 / 3); // int÷intなのでintで小数点以下切り捨て
        Console.WriteLine("(10 / 3)の型は{0}",
            (10 / 3).GetType()); // intなのでSystem.Int32
        Console.WriteLine("10 / 3.0 = {0}", 10 / 3.0); // int÷doubleなのでdouble
        Console.WriteLine("(10 / 3.0)の型は{0}",
            (10 / 3.0).GetType()); // doubleなのでSystem.Double
    }
}

p.84 剰余演算子

・2項%演算子:2項が共に数値型であれば左辺を右辺で割った余りを返す
 例: 1 % 0.3 ⇒ 0.1
・なお、負の数の場合、C#のルールにしたがって計算されるので注意
 ⇒ 双方を正の数にして剰余を得てから、左辺の符号を付けている
  Console.WriteLine(" 10 % -3 = {0}",  10 % -3); // 10÷-3=-3余り 1となる
  Console.WriteLine("-10 %  3 = {0}", -10 %  3); //-10÷ 3=-3余り-1となる
  Console.WriteLine("-10 % -3 = {0}", -10 % -3); //-10÷-3= 3余り-1となる
・補足:負の数の剰余算を推奨しない場合もある

p.84 mod01.cs

//p.84 mod01.cs
using System;
class mod01
{
    public static void Main()
    {
        Console.WriteLine("10 % 3 = {0}", 10 % 3); //int % int なので結果もint
        Console.WriteLine("13.53 % 2 = {0}", 13.53 % 2); //double % int なので結果はdouble
        Console.WriteLine("13.53 % 2.5 = {0}", 13.53 % 2.5); //double % double なので結果もdouble
    }
}

提出:アレンジ演習:p.84 mod01.cs

・負の数を含む剰余算を追加して試そう

作成例

//アレンジ演習:p.84 mod01.cs
using System;
class mod01
{
    public static void Main()
    {
        Console.WriteLine("10 % 3 = {0}", 10 % 3); //int % int なので結果もint
        Console.WriteLine("13.53 % 2 = {0}", 13.53 % 2); //double % int なので結果はdouble
        Console.WriteLine("13.53 % 2.5 = {0}", 13.53 % 2.5); //double % double なので結果もdouble
        Console.WriteLine("10 % -3 = {0}", 10 % -3); //10÷-3=-3余り1となるので注意
        Console.WriteLine("-10 % 3 = {0}", -10 % 3); //-10÷3=-3余り-1となるので注意
        Console.WriteLine("-10 % -3 = {0}", -10 % -3); //-10÷-3=3余り-1となるので注意
    }
}

講義メモ

・p.64「スコープ」から再開します

p.64 スコープ

・「視野」「対象範囲」のことで、C#などでは変数などの有効範囲
・Mainメソッドなどの{~}をブロックという
・ブロックの中で宣言された変数はブロック内のみで有効
・ブロックの中にブロックが作れる(入れ子構造)ので、外側のブロックの中で宣言された変数は内側のブロックでも有効
・なお、C/C++ではスコープが異なれば、同じ名前の変数を定義できるが、C#では禁止。
・ブロックはプログラマの都合でいくつでも作れるが、目的が明確ではないブロックは読みやすさを損なうので推奨されない
・悪い例 ⇒ p.64 scope01.cs

p.65 型変換

・p.45のParseのように、文字列⇒数値の変換を行うメソッドがある
・これに対して、値型どうしの変換を行うことをキャストという
・書式: (型)式や値
・例: int a = (int)4.14; double d = (double)3, ave = (a + 3) / (double)2;
・実数値を整数型にキャストすると、小数点以下は切り捨てになる
・範囲の狭い型の変数に、範囲の広い型の変数を代入するにはキャストする
・例: long g = 5; int a = (int)g;

p.66【補足】

・5行目の「b = (byte)2;」は「b = (byte)a;」の誤り
・プログラムcast01.csは実行しても何も表示しない

アレンジ演習:p.66 cast01.cs

・aとbの値を表示する処理を追加しよう

作成例

//アレンジ演習:p.66 cast01.cs
using System;
class cast01
{
    public static void Main()
    {
        long a = 2;
        byte b;
        b = (byte)a;
        Console.WriteLine("a = {0}, b = {0}", a, b); //【追加】
    }
}

p.66 列挙型

・一連の整数に名前を付けたもの
・整数による情報をグループ化したり、名前をつけて識別する場合に用いる
・定義書式例: enum 列挙名 { 列挙子, … }
 例: enum janken { goo, choki, paa };
・列挙子の表す整数の規定値は0,1,2,…だが、指定することもできる
・定義書式例: enum 列挙名 { 列挙子 = 値, … }
 例: enum janken { goo = 7, choki = 8, paa = 9 };
・なお、列挙子は自動的に+1されるので、間隔が1なら省略できる
 例: enum janken { goo = 7, choki, paa };
・列挙を用いることで、マジックナンバー(説明のない数値リテラル)対策にもなる。
 整数限定のconstの上位バージョンでもある
・なお、列挙型も型なので、列挙子を表示や代入に用いる場合、int型などにキャストすること
 例: enum janken { goo, choki, paa }; int myhand = (int)janken.goo;

p.68 enum01.cs

//p.68 enum01.cs
using System;
class enum01
{
    enum MyMonth //列挙の定義(※Mainメソッドの外側で行う)
    {
        Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 
    };
    public static void Main()
    {
        Console.WriteLine("Aprは{0}月", (int)MyMonth.Apr); //【追加】
        Console.WriteLine("Mayは{0}月", (int)MyMonth.May); //【追加】
    }
}

※ p.69 3.14は割愛または後日フォローとします

p.73 文字列型

・値型に属する型は大きさが固定なので、変数名が格納データを指す
・対して、文字列は0文字以上の文字の並びなので、大きさが決まらない
・その為、文字列型は参照型に含まれる
・参照型はクラスとして定義され、文字列の場合、stringクラスが実装を担う
・この為「string」は文字列型の型名としても利用可能
・クラスにはデータと共にデータを用いる処理を記述できる。それがメソッド、プロパティなど
・Stringクラスのメソッド、プロパティなどは「string型変数名.メソッド名」「string型変数名.プロパティ名」で呼び出せる
・StringクラスにはLengthプロパティが定義されており、これを用いると文字数が得られる
・Sring型変数名[整数]とすると、文字列の中の1文字を取り出せる。先頭を0とした番号を引数に与えると良い
 ※ これは後述する配列の仕掛け
・StringクラスにはCopyメソッドがあり、これを用いると文字列をコピーできる
・また、指定した文字が何文字目(先頭が0)にあるかを返すIndexOf('文字')メソッドや、指定した文字列が何文字目から始まるかを返すこともできるIndexOf("文字列")メソッドもある
 ※ これは後述するオーバーロードの仕掛け

p.73 string01.cs

//p.73 string01.cs
using System;
class string01
{
    public static void Main()
    {
        string str = "今日はよい天気です";
        string mystr;
        char c;
        // Lengthプロパティで文字列の長さを調べる
        Console.WriteLine("strは長さ{0}です", str.Length);
        //文字型変数cに文字列strの5番目の文字を代入
        c = str[4];
        Console.WriteLine("文字列の5番目の文字は「{0}」です", c);
        //文字列strをmystrにコピー
        mystr = String.Copy(str);
        Console.WriteLine("mystr = {0}", mystr);
        //文字列の検索
        int n = str.IndexOf('は');
        Console.WriteLine("文字列に'は'が出てくるのは{0}番目の文字", n + 1);
        n = str.IndexOf("よい");
        Console.WriteLine("文字列に「よい」が出てくるのは{0}文字目から", n + 1);
    }
}

※ p.75 3.16は割愛または後日フォローとします

p.78 練習問題1 ヒント

・1年間の秒数は日数×24時間×60分×60秒

作成例

//p.78 練習問題1
using System;
class ex0301
{
    public static void Main()
    {
        Console.WriteLine("1年は{0:#,#}秒です", 365 * 24 * 60 * 60);
    }
}

p.78 練習問題2 ヒント

・Math.PIはC#が提供してくれる定数で、円周率が格納されている
・円の面積は「円周率×半径×半径」
・半径は実数(double型)で入力すると良い

作成例

//p.78 練習問題2
using System;
class ex0302
{
    public static void Main()
    {
        Console.Write("半径:");
        double r = double.Parse(Console.ReadLine());
        Console.WriteLine("面積は{0}です", Math.PI * r * r);
    }
}

今週の話題

販売本数ランキング 今回トップは「ゼルダの伝説 ティアーズ オブ ザ キングダム(Switch)」GO!
プレイステーション ショウケースが5月25日午前5時より配信。PSスタジオの新作やPS5やPS VR2用タイトルに焦点【PS Showcase】GO!
2023年3月期ソニーのゲーム事業は大幅な増収減益、その理由は?【ゲーム企業の決算を読む】 GO!
コーエーテクモの売上・営業利益過去最高、『零 ~月蝕の仮面~』の収益貢献大きく【ゲーム企業の決算を読む】GO!
GeForce RTX 4060シリーズが正式発表!最新家庭用ゲーム機の2倍の性能を持つGPUが299ドルから GO!
PS5の円形コントローラー、正式名称「Access コントローラー」に GO!

ヒューマンアカデミー「e-Sportsカレッジ」、韓国強豪eスポーツチーム「T1」所属「moment」コーチを特別講師に招聘 GO!

コナミが『ウマ娘』を巡りサイゲームスを訴訟。40億円の損害賠償とゲームの配信差し止めなどを請求 GO!
「Game*Spark」が記事内ネットワーク広告を廃止へ 「挟み込まれる広告ウザすぎて」 サイトUIを改善 GO!
ゲームプレイ映像の「メーカーガイドライン違反」配信で…ゲーム動画配信者が摘発―全国で初の逮捕か GO!

前回のコメント

・今日やったdecimalの元利合計を求めるプログラムを作ったときは計算が色々入って(  ゚д゚ )と、なりましたが
 こういうプログラムもササッと作れるようになりたいと思いました。

 応援します♪

・これまで型がたくさん出てきましたが、まだあやふやな部分もあるので復習もしつつそれぞれの特徴なども覚えていきたいです。

 是非♪