アルゴリズムⅠ・講義メモ1

・検索とソートのまとめ
※ 7/24は前期ラストで時間内課題作成(フローチャートとプログラム)テーマは「ソート」

ソート:プログラムにしよう(再掲載)

・配列の値は初期化で与えてOK
 例:int[] val = {80,20,10,40,50,60}; //元の1次元配列
・ソート結果の表示を追加すること

int[] val = {80,20,10,40,50,60}; //元の配列
for(int i = 0; i < val.Length - 1; i++) { //カウンタiで要素数-1回繰返す
    for(int j = 0; j < val.Length - 1; j++) { //カウンタjで要素数-1回繰返す 
        if(val[j] > val[j + 1]) { //隣と降順になっていたら
            var temp = val[j]; //退避してから
            val[j] = val[j + 1]; //交換する
            val[j + 1] = temp;
        }
    }
}
foreach (int i in val) { //配列の全要素について繰返す
    Console.WriteLine(i);
}

提出フォロー:ソート:アルゴリズムを改良しよう

・このアルゴリズムでは「すでに整列されている(に近い)」状態からでも同じ時間がかかってしまう。
・それは途中で「もう交換しなくてもよい」状態になっても終わらないから
・よって、フラグを作って、カウントjの繰返し開始前にオフ(交換してない)としておこう
・そして、交換したらフラグをオンにしよう
・で、カウントjの繰返しが終わった時、フラグがオフのままなら出来上がっているのでbreakで抜けよう

作成例

int[] val = {80,20,10,40,50,60}; //元の配列
for(int i = 0; i < val.Length - 1; i++) { //カウンタiで要素数-1回繰返す
    bool f = false; //【追加】交換フラグをオフに
    for(int j = 0; j < val.Length - 1; j++) { //カウンタjで要素数-1回繰返す 
        if(val[j] > val[j + 1]) { //隣と降順になっていたら
            var temp = val[j]; //退避してから
            val[j] = val[j + 1]; //交換する
            val[j + 1] = temp;
            f = true; //【追加】交換フラグをオンに
        }
    }
    if(!f) { //【以下追加】交換フラグがオフ?
        break; //今回1度も交換していない=整列済になっているので終わる
    }
}
foreach (int i in val) { //配列の全要素について繰返す
    Console.WriteLine(i);
}

アルゴリズムⅠ・前回のコメント

・来週テストなので頑張ります。

 ごめんなさい。前期最終回は7/24(月)です。テストではなく時間内課題作成です。
 なお、来週、再来週の月曜日は講義はありません。

・6/26 アルゴリズムⅠ
 欠席分の提出
・遅れてしまいすみません。
 先週の提出課題です
 よろしくお願いします
・コードに間違いがありました。再提出します。

 歓迎します。

・ソートの意味と基礎のバブルソートについて理解した。
 問題ないです。
・今回は難しかったですがついていけました。
・便利。よくゲームのアイテムにソートがあるから身近に感じる。

 何よりです。

・難しいけど頑張ります
・少し頭が回らなくて疲れました。
・授業に追いつけるようになったのでこれからも頑張ります。
・今日のC#の授業は、「線形探索の続き」について学びました。これまでいろいろなプログラムを行ってきたので復習して頭の中に入れておきたいです。
・理解できたが復習をしっかりしておこうと思いました。

 応援します。

・ペース早いが早いよう気がしました
・講義のペースはちょうど良かったです。
・ペース丁度良かったです!
・講義のペースはちょうど良かったです。

 了解です。リアクション感謝します。

・出来たので送ります。
 確認の程よろしくお願いします。
・少し変えたのでもう一度出します。
 確認お願いします。

 了解です。後ほど拝見します。
 ⇒ 拝見しました。結果は正しいです。
 ただ「for (int i = 0; i <= 4; i++){」と「for (int j = 0; j <= 4; j++){」は分かりづらいですね。Lengthを使うことを勧めます。

プログラミング言語Ⅰ・講義メモ5

p.152 値を返さない関数

・関数は値を返さなくても良い
・その場合は、戻り値型を「void」(無)とすること

p.152 list0607.cpp

//p.152 list0607.cpp 左下直角の直角二等辺三角形を表示(関数版)
#include <stdio.h>
//--- 記号文字'*'をn個連続して表示 ---//
void put_stars(int n) //returnする必要がないので、戻り値型をvoidにする
{
    while (n-- > 0)
        putchar('*');
}
int main(void)
{
    int len;
    printf("左下直角二等辺三角形を作ります。\n");
    printf("短辺:");
    scanf("%d", &len);
    for (int i = 1; i <= len; i++) {
        put_stars(i); //戻り値がないので呼び出すだけ
        putchar('\n');
    }
    return 0;
}

p.152 関数の汎用性

・list0607.cppのput_stars関数は「*」を表示することに特化しているが、表示したい文字も引数で渡すようにすれば、
 同じ意味で表示したい文字だけ違う場合にも使える
・これを関数の汎用性といい、可読性や保守性を損なわない場合は、汎用性を高くすると良い

p.153 list0608.cpp

//p.153 list0608.cpp 右下直角の直角二等辺三角形を表示(関数版)
#include <stdio.h>
//--- 文字chをn個連続して表示 ---//
void put_chars(int ch, int n)
{
    while (n-- > 0)  // nが0超である間、デクリメントしながら繰返す(値渡しなのでOK)
        putchar(ch);
}
int main(void)
{
    int len;
    printf("右下直角二等辺三角形を作ります。\n");
    printf("短辺:");
    scanf("%d", &len);
    for (int i = 1; i <= len; i++) {
        put_chars(' ', len - i); //空白を(len - i)個表示する
        put_chars('*', i); //「*」をi個表示する
        putchar('\n');
    }
    return 0;
}

自由参加課題:値を返さない関数

・p.107 演習4-21から4-24までを関数put_charsを用いるようにして書き換えよう

p.153 演習6-6 ヒント

・警報を鳴らすには、putchar('\a') を用いると良い

作成例

//p.153 演習6-6
#include <stdio.h>
//--- 警告をn個連続 ---//
void alert(int n)
{
    while (n-- > 0)  // nが0超である間、デクリメントしながら繰返す(値渡しなのでOK)
        putchar('\a');
}
int main(void)
{
    alert(3); //警告を3個連続
    return 0;
}

p.154 引数を受け取らない関数

・main関数のように、引数を受け取らない関数は引数にvoidを指定すると良い
・呼び出しにおいてはvoidを指定せず、引数は空にすること

提出:p.153 演習6-6(※次回はフォローなしで進みます)

プログラミング言語Ⅰ・講義メモ4

p.149 演習6-4 作成例

//p.149 演習6-4 ex0603.cpp 整数の4乗値を求める
#include <stdio.h>
//--- nの2乗値を返す ---//
int sqr(int n)
{
    return n * n;
}
//--- nの4乗値を返す ---//
int pow4(int n)
{
    return sqr(n) * sqr(n);
}
int main(void)
{
    int x;
    printf("整数:");   scanf("%d", &x);
    printf("4乗は%dです。\n", pow4(x));
    return 0;
}

p.150 値渡し

・関数の引数として変数を指定できる
・この時、変数名と引数名が違っても良い(違うことが望ましい)
・というのも、C言語の基本は値渡しであり、変数の値が引数にコピーされるから
・よって、関数の内部で引数を変数のように用いて、値を変更しても良い
・コピーなので、引数の値を変更しても、呼び出し側の変数とは無関係だから

p.150 list0606.cpp

//p.150 list0606.cpp べき乗を求める(その2)
#include <stdio.h>
//--- xのn乗を返す ---//
double power(double x, int n)
{
    double tmp = 1.0;
    while (n-- > 0) { // 引数nの値をデクリメントしているが、コピーなので悪影響はない
        tmp *= x;    // tmpにxを掛ける
    }
    return tmp;
}
int main(void)
{
    double a;
    int b;
    printf("aのb乗を求めます。\n");
    printf("実数a:");   scanf("%lf", &a);
    printf("整数b:");   scanf("%d", &b);
    printf("%.2fの%d乗は%.2fです。\n", a, b, power(a, b)); //bの値が関数内で引数nにコピーされている
    return 0;
}

p.151(引数における暗黙の型変換)

・関数の呼び出しにおける引数(実引数)と、関数で定義している引数(仮引数)の型は一致させるのが基本。
・しかし、自動的に型を変換できる場合は、型が違っても良い
・これを引数における暗黙の型変換という
・例: double sqrt(double x) { return x * x; } に対して、sqrt(5)と整数を与えると、
 暗黙の型変換により sqrt(5.0) となるのでOK
・例: sqrt("ABC")と文字列を与えると、型変換できないのでエラー

p.151 演習6-5 ヒント

・関数の中で、for/while文による繰返しを行えば良い

作成例 その1

//p.151 演習6-5
#include <stdio.h>
//--- 1からnまでの全整数の和を返す ---//
int sumup(int n)
{
    int sum = 0; //合計値
    for (int i = 1; i <= n; i++) { // nまで繰返す
        sum += i; // 合計値に足し込む
    }
    return sum;
}
int main(void)
{
    int x;
    printf("整数:");   scanf("%d", &x);
    printf("1から%dまでの全整数の和は%d\n", x, sumup(x));
    return 0;
}

作成例 その2

//p.151 演習6-5
#include <stdio.h>
//--- 1からnまでの全整数の和を返す ---//
int sumup(int n)
{
    int sum = n; //合計値
    while (n-- > 0) { // nが0超である間、デクリメントしながら繰返す(値渡しなのでOK)
        sum += n; // 合計値に足し込む
    }
    return sum;
}
int main(void)
{
    int x;
    printf("整数:");   scanf("%d", &x);
    printf("1から%dまでの全整数の和は%d\n", x, sumup(x));
    return 0;
}

プログラミング言語Ⅰ・講義メモ3

p.148 関数の返却値を引数として関数に渡す

・関数に渡す引数として式を記述できる
 例: max2(10 + 30, 40 * 2);
・また、関数の呼び出しも式の一種で、評価は返却値(戻り値)になる
 例: max2(1, 2)の戻り値は2であり、この式の評価も2になる
・よって、関数の返却値を引数として関数に渡すことができる
 例: printf("%d", max2(1, 2));
・自作の関数においても同様
 例: max2(max2(10, 20), 30) ⇒ max(20, 30) ⇒ 30

p.148 list0603.cpp

//p.148 list0603.cpp 二つの整数の2乗値の差を求める
#include <stdio.h>
//--- nの2乗値を返す ---//
int sqr(int n)
{
    return n * n;
}
//--- aとbの差を返す ---//
int diff(int a, int b)
{
    return a > b ? a - b : b - a;        // 大きいほうから小さいほうを引く
}
int main(void)
{
    int x, y;
    puts("二つの整数を入力せよ。");
    printf("整数x:");   scanf("%d", &x);
    printf("整数y:");   scanf("%d", &y);
    printf("xの2乗とyの2乗の差は%dです。\n", diff(sqr(x), sqr(y))); //diff関数にsqr関数の戻り値を渡す
    return 0;
}

p.148 演習6-3

//p.148 演習6-3 ex0603.cpp 整数の3乗値を求める
#include <stdio.h>
//--- nの3乗値を返す ---//
int cube(int n)
{
    return n * n * n;
}
int main(void)
{
    int x;
    printf("整数:");   scanf("%d", &x);
    printf("3乗は%dです。\n", cube(x));
    return 0;
}

p.149 自作の関数を呼び出す関数

・基本的に関数は単機能にすると使い勝手が良い場合が多い
・そして、関数から関数を呼び出すようにすることで、記述の重複を避け、ミスの防止が可能になる
・例えば、list0603のsqrをdiffを1つの関数sqrdiffにすることも可能だが、別々にしておけば、再利用しやすい

p.149 list06004.cpp

//p.149 list06004.cpp 四つの整数の最大値を求める
#include <stdio.h>
//--- 大きいほうの値を返す(mainでは使われていない) ---//
int max2(int a, int b)
{
    return a > b ? a : b;
}
//--- 四つの整数の最大値を返す ---//
int max4(int a, int b, int c, int d)
{
    return max2(max2(a, b), max2(c, d)); //aとbの大きいほうと、cとdの大きい方を得て、大きい方を返す
}
int main(void)
{
    int n1, n2, n3, n4;
    puts("四つの整数を入力せよ。");
    printf("整数n1:");   scanf("%d", &n1);
    printf("整数n2:");   scanf("%d", &n2);
    printf("整数n3:");   scanf("%d", &n3);
    printf("整数n4:");   scanf("%d", &n4);
    printf("最も大きい値は%dです。\n", max4(n1, n2, n3, n4));
    return 0;
}

p.149 演習6-4 作成例

//p.149 演習6-4 ex0603.cpp 整数の4乗値を求める
#include <stdio.h>
//--- nの2乗値を返す ---//
int sqr(int n)
{
    return n * n;
}
//--- nの4乗値を返す ---//
int pow4(int n)
{
    return sqr(n) * sqr(n);
}
int main(void)
{
    int x;
    printf("整数:");   scanf("%d", &x);
    printf("4乗は%dです。\n", pow4(x));
    return 0;
}

プログラミング言語Ⅰ・講義メモ2

p.146 retuen文と返却値

・関数は0または1個の情報を返すことができる。これが返却値/戻り値で、return文に指定する
・return文には値や式を記述できるので、単純な関数ではreturn文で記述できる場合もある

アレンジ演習:p.147 演習6-1 ex0601.cpp

・関数min2の内容をreturn文のみにしよう
・ヒント:[C] p.146 list0601c.c

作成例

//アレンジ演習:p.147 演習6-1 二つの整数の小さいほうの値を求める
#include <stdio.h>
//--- 小さいほうの値を返す ---//
int min2(int a, int b) //戻り値型はint、引数がint×2
{
    return (a < b) ? a : b; //aがb未満ならaの値を、でなければbの値を返す
}
int main(void)
{
    int n1, n2;
    puts("二つの整数を入力せよ。");
    printf("整数1:");   scanf("%d", &n1);
    printf("整数2:");   scanf("%d", &n2);
    printf("小さいほうの値は%dです。\n", min2(n1, n2)); //関数に2変数の値を渡して最小値を表示
    return 0;
}

p.147 list0602.cpp

//p.147 list0602.cpp 三つの整数の最大値を求める
#include <stdio.h>
//--- 三つの整数の最大値を返す ---//
int max3(int a, int b, int c)
{
    int max = a; //仮に引数aの値が最大だとする
    if (b > max) max = b; //引数bの値が最大値超なら最大値を更新
    if (c > max) max = c; //引数cの値が最大値超なら最大値を更新
    return max; //最大値を返す
}
int main(void)
{
    int a, b, c;
    puts("三つの整数を入力せよ。");
    printf("整数a:");      scanf("%d", &a);
    printf("整数b:");      scanf("%d", &b);
    printf("整数c:");      scanf("%d", &c);
    printf("最大値は%dです。\n", max3(a, b, c)); //関数の戻り値をそのまま表示(※変数名と引数名が同じだが別物)
    return 0;
}

p.147 演習6-2 ex0602.cpp ヒント

・VC++の置換機能を用いてmax⇒min、大きい⇒小さい、最大⇒最小 などの変更をもれなく行うこと
・不等号を反転することも忘れずに

作成例

//p.147 list0602.cpp 三つの整数の最小値を求める
#include <stdio.h>
//--- 三つの整数の最小値を返す ---//
int min3(int a, int b, int c)
{
    int min = a; //仮に引数aの値が最小だとする
    if (b < min) min = b; //引数bの値が最小値未満なら最小値を更新
    if (c < min) min = c; //引数cの値が最小値未満なら最小値を更新
    return min; //最小値を返す
}
int main(void)
{
    int a, b, c;
    puts("三つの整数を入力せよ。");
    printf("整数a:");      scanf("%d", &a);
    printf("整数b:");      scanf("%d", &b);
    printf("整数c:");      scanf("%d", &c);
    printf("最小値は%dです。\n", min3(a, b, c)); //関数の戻り値をそのまま表示(※変数名と引数名が同じだが別物)
    return 0;
}

プログラミング言語Ⅰ・講義メモ1

・p.144「関数呼出し」から

p.143 関数定義(再掲載)

・プログラマが自前の関数を追加したい場合、main関数とは別に記述する
・定義書式: 返却値型 関数名(仮引数並び){内容}
・C言語の関数は「データを0個以上与えると、なにかを行って、データを0または1個返す」
・この、返す値の型が「返却値型」になる
・また、関数が受け取る0個以上の値を示すのが「仮引数並び」になる
・例えば、整数2値の和を整数で返す関数addであれば:
 int add(int a, int b) { retrn a + b; }
・この例のaとbを仮引数といい、関数側で受け取るために適当な名前をつけて用いる
・複雑で複数回呼ばれる処理であれば、関数にするメリットが大きい。

p.144 関数呼出し

・定義済の関数は「関数名(引数,…)」で呼び出す=利用することができる
・この時、引数名を意識する必要はなく、型と引数の数が合っていれば良い
・例えば、整数2値の和を整数で返す関数addであれば:
 int add(int a, int b) { retrn a + b; }
 ⇒ add(1, 2); とか、 int x = 5; add(x, 6); などと呼び出せる。

p.144 list0601.cpp

//p.144 list0601.cpp 二つの整数の大きいほうの値を求める
#include <stdio.h>
//--- 大きいほうの値を返す ---//
int max2(int a, int b) //戻り値型はint、引数がint×2
{
    if (a > b) //aの値の方が大きければ
        return a; //aの値を返す
    else //でなければ
        return b; //bの値を返す
}
int main(void)
{
    int n1, n2;
    puts("二つの整数を入力せよ。");
    printf("整数1:");   scanf("%d", &n1);
    printf("整数2:");   scanf("%d", &n2);
    printf("大きいほうの値は%dです。\n", max2(n1, n2)); //関数に2変数の値を渡して戻り値を表示
    return 0;
}

アレンジ演習:p.144 list0601.cpp

・関数max2(n1, n2)の戻り値をいったんint型の変数mで受け取ってから表示しよう

作成例

//アレンジ演習:p.144 list0601.cpp 二つの整数の大きいほうの値を求める
#include <stdio.h>
//--- 大きいほうの値を返す ---//
int max2(int a, int b) //戻り値型はint、引数がint×2
{
    if (a > b) //aの値の方が大きければ
        return a; //aの値を返す
    else //でなければ
        return b; //bの値を返す
}
int main(void)
{
    int n1, n2;
    puts("二つの整数を入力せよ。");
    printf("整数1:");   scanf("%d", &n1);
    printf("整数2:");   scanf("%d", &n2);
    int m = max2(n1, n2); //関数に2変数の値を渡して戻り値(最大値)を得る
    printf("大きいほうの値は%dです。\n", m); //最大値を表示
    return 0;
}

p.147 演習6-1 ex0601.cpp ヒント

・VC++の置換機能を用いてmax⇒min、大きい⇒小さい、最大⇒最小 などの変更をもれなく行うこと

作成例

//p.147 演習6-1 二つの整数の小さいほうの値を求める
#include <stdio.h>
//--- 小さいほうの値を返す ---//
int min2(int a, int b) //戻り値型はint、引数がint×2
{
    if (a < b) //aの値の方が小さければ
        return a; //aの値を返す
    else //でなければ
        return b; //bの値を返す
}
int main(void)
{
    int n1, n2;
    puts("二つの整数を入力せよ。");
    printf("整数1:");   scanf("%d", &n1);
    printf("整数2:");   scanf("%d", &n2);
    int m = min2(n1, n2); //関数に2変数の値を渡して戻り値(最小値)を得る
    printf("小さいほうの値は%dです。\n", m); //最小値を表示
    return 0;
}

今週の話題

販売本数ランキング 今回トップは「ファイナルファンタジーXVI(PS5)」GO!
『プロセカ』『ソニック』人気のセガサミー…好決算は手放しで喜べる内容なのか?【ゲーム企業の決算を読む】GO!
『CoD』はチーターに「幻覚」を見せる―不正ツール利用者は存在しないプレイヤーと戦うことに GO!
「GTMF東京」の注目セッションを紹介…4年ぶり開催のゲーム開発者向けイベント【GTMF2023】GO!
【IVS2023京都】過去最大1万人が来場するベンチャーの祭典が開幕、オープニングでは岸田首相からのメッセージも GO!
CRI・ミドルウェアとヤマハ、協業を発表―ゲームの立体音響普及のため「CRI ADX」に「Sound xR」標準搭載を目指す GO!
Unity、AIマーケットプレイスを新規立ち上げ―Unity公認ソリューションからサードパーティまで、ゲーム開発をサポートするツールを提供 GO!

「学習元が不明なAI生成コンテンツは販売を許可しない」PCゲーム最大手Steam、AI生成作品販売に警戒色見せる―開発者報告 GO!

参考:「メタバース」を活用したサービスの展示会 GO!

プログラミング言語Ⅰ・前回のコメント

・6/26 プログラミング言語Ⅰ
 欠席分の提出
・list0515のままアレンジしたのでこれを提出します。

 歓迎します。

・ペースに追いつくことができました。
・ありがとうございました。
・今回の授業は何回も止まりながらでしたが少しずつ追い付けるようになりました。

 何よりです。

・多次元配列は使い方がたくさんあると思うのでよく復習しておきます。
・最初の方はついていけたけど徐々においてかれてしまったので復習します。
・わからないことが度々あったので復習しようと思いました

 是非。

・配列苦手
・値渡しが難しかった
・今回も難しく感じました
・今日のC言語の授業は、「多次元配列」について学びました。打つプログラムが多くなってきて複雑に見えて難しく感じました。
・マクロや多次元配列によってレベルが上がって大変だった。

 解説のリクエストは早めに&具体的にどうぞ。

・ペース大丈夫です。
・丁度よかったです
・仕方がないですけど、進むのが早いです
 ついていけないです
・丁度いいペースでした
・講義のペースはちょうど良かったです。
・ペース丁度良かったです!
・今日もスムーズで良かったです

 了解です。リアクション感謝します。

・なんとか出来ました。
 確認のほどよろしくお願いいたします。

 拝見しました。きちんとできていますね。

アルゴリズムⅠ・講義メモ4

ソート:アルゴリズムを改良しよう

・このアルゴリズムでは「すでに整列されている(に近い)」状態からでも同じ時間がかかってしまう。
・それは途中で「もう交換しなくてもよい」状態になっても終わらないから
・よって、フラグを作って、カウントjの繰返し開始前にオフ(交換してない)としておこう
・そして、交換したらフラグをオンにしよう
・で、カウントjの繰返しが終わった時、フラグがオフのままなら出来上がっているのでbreakで抜けよう

提出:プログラム:ソート:アルゴリズムを改良しよう(未完成でもOK)

アルゴリズムⅠ・講義メモ3(新)

ソート

・整列のことで小⇒大を「昇順」、大⇒小を「降順」という。
・良く用いられる手法で、データ数、CPUなどの負荷、データの傾向などによって複数の方式から最適なものを選ぶのが基本
・今回はその基礎になるバブルソートを用いる
・バブルソートは交換ソートともいい、仕組みが単純で件数が少ないと速い。
・イメージは「並んだ箱の隣どうしの順序をなおすことを繰返すといつかはできる」
・実際は昇順で末尾に最小値がある場合に最も手間がかかる=要素数-1回の交換が必要。
・よって2重ループで実装できる(後で改良するが)

① 以下をカウンタiで0から要素数-2まで繰返す(つまり要素数-1回繰返す)
 ・以下をカウンタjで0から要素数-2まで繰返す(つまり要素数-1回繰返す)
  ・要素[j]>要素[j + 1]ならば交換する

ソート:フローチャートを描こう

http://ha233.rundog.org/wp-content/uploads/2023/06/sort.zip

ソート:プログラムにしよう

・配列の値は初期化で与えてOK
 例:int[] val = {80,20,10,40,50,60}; //元の1次元配列
・ソート結果の表示を追加すること

作成例

int[] val = {80,20,10,40,50,60}; //元の配列
for(int i = 0; i < val.Length - 1; i++) { //カウンタiで要素数-1回繰返す
    for(int j = 0; j < val.Length - 1; j++) { //カウンタjで要素数-1回繰返す 
        if(val[j] > val[j + 1]) { //隣と降順になっていたら
            var temp = val[j]; //退避してから
            val[j] = val[j + 1]; //交換する
            val[j + 1] = temp;
        }
    }
}
foreach (int i in val) { //配列の全要素について繰返す
    Console.WriteLine(i);
}

アルゴリズムⅠ・講義メモ2

線形探索:2次元配列からの検索にしよう

・int[,] val = {{10,20,30},{40,50,60}}; //元の2次元配列
・見つけたら添字,添字を表示しよう

作成例

int[,] val = { {10,20,30 },{40,50,60 } }; //元の2次元配列
Console.Write("検索値:");
var goal = int.Parse(Console.ReadLine());; //検索値
int i = 0, j = 0;
bool f = false; //完了フラグをオフにしておく
for(; i < 2; i++) {
    for(j = 0; j < 3; j++) {
        if(val[i, j] == goal) {
            Console.WriteLine("[{0}][{1}]にある", i, j); //先頭が1番目だとする
            f = true; //完了フラグオン
            break; //内側のループを抜ける
        }
    }
    if(f) { //完了フラグがオンなら
        break; //外側のループも抜ける
    }
}
if (!f) { //完了フラグがオフのままになっていたら
    Console.WriteLine("見つからない");
}

アルゴリズムⅠ・講義メモ1

・線形探索の続き、ソート

線形探索:プログラムにしよう

int[] val = {10,20,30,40,50,60}; //元の1次元配列
var goal = 20; //検索値
var cnt = 0; //カウンタを0にする
//カウンタが要素数未満の間繰返す
while(cnt < val.Length) { 
    if(val[cnt] == goal) {
        Console.WriteLine("{0}番目にある", cnt + 1); //先頭が1番目だとする
    }
    cnt++;
}
if (cnt == val.Length) { //カウンタが要素数になっていたら
    Console.WriteLine("探索完了");
}

線形探索:プログラムを改良しよう

・このプログラムは検索値が配列に存在しない場合の対処がないので追加しよう
・1つ見つかれば良いので、「●番目にある」と表示したら繰返しを抜けよう
・すると、見つけた場合は「カウンタが要素数になる」ことはない
・よって、「カウンタが要素数になる」場合は「見つからない」と表示しよう
・合わせて、検索値をコンソールから入力するようにしよう
 int goal = int.Parse(Console.ReadLine());

アルゴリズムⅠ・前回のコメント

・出来たので出します

 出されたので歓迎します。

・1次元配列の2次元変換と線分探索について理解した。
 問題ないです。
・ありがとうございました。
・フローチャートの作り方を覚えてきました。
・ある程度理解できました
・線形探索がどのように行われているかよくわかりました

 何よりです。

・マジで難しい

 探索のアルゴリズムは基本的なアルゴリズムの一つです。しっかり、使いこなしてください。

・C#は少しづつ慣れてきているので復習を続けます。

 是非。

・C++よりもC#のほうがゲーム制作に向いているのでは?と思いました。

 単純には比較できません。
 ゲームの内容、実行環境・ターゲットなどによってケースバイケースです。

・早いと思いました
・ペースはちょうどいい
・ペース早いような気がしましたが少しは理解できました。
・丁度よかったです
・今日のC#の授業は、「1次元配列例の2次元変換」を学びました。前回のプログラムを使い、2次元に変換し格納先を追加する方法を学びました。授業の速さはちょうどよかったです。
・講義のペースはちょうど良かったです。
・ペースちょうどよかったです
・授業のスピードがとてもよくおいてかれることなくついていけました。
・ペース丁度良かったです
・丁度いいペースでした
・ペースちょうどよかったです!!

 了解です。リアクション感謝します。

プログラミング言語Ⅰ・講義メモ5

第6章 関数

p.142 関数とは

・本来は数学用語で「データを0個以上与えると、なにかを行って、データを0個以上返す」仕掛け。
・「0個以上」なので、なにも与えなくてもOKで、何も返さなくてもOK
・ここまで作成してきたmainも関数で、なにも与える必要はなく(void)、「return 0;」でデータを1個返している
・また、printf、scanf、putchar、putsなどもC言語が提供する関数であり、ライブラリ関数ともいう。
・なお、プログラマが自由に関数を作成できる
・このことにより、プログラムにおける記述の重複を避け、部品化や再利用が可能になる。
 ※ C#/Javaなどのオブジェクト指向言語では関数の上位概念である「メソッド」を用いる。

p.143 関数定義

・プログラマが自前の関数を追加したい場合、main関数とは別に記述する
・定義書式: 返却値型 関数名(仮引数並び){内容}
・C言語の関数は「データを0個以上与えると、なにかを行って、データを0または1個返す」
・この、返す値の型が「返却値型」になる
・また、関数が受け取る0個以上の値を示すのが「仮引数並び」になる
・例えば、整数2値の和を整数で返す関数addであれば:
 int add(int a, int b) { retrn a + b; }
・この例のaとbを仮引数といい、関数側で受け取るために適当な名前をつけて用いる
・複雑で複数回呼ばれる処理であれば、関数にするメリットが大きい。

提出:p.135 演習5-12 (※次回はフォローなしで先に進みます)

プログラミング言語Ⅰ・講義メモ4

p.132 多次元配列

・C言語では配列を要素とする配列が多次元配列
・2次元配列の場合、縦横に箱が並んだイメージになり、要素が1次元配列。
・2次元配列の宣言書式: 型 配列名[要素数①][要素数②] //要素数①×要素数②になる
 例: 小学校6学年で各3クラスの児童数の配列: int num[6][3];
・2次元配列の要素へのアクセスには、配列名[添字①][添字②]となる。どちらも0からなので注意。
 例: 2次元配列 int a[3][2]の要素は a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]の6個
・この順番に値を並べて初期化も可能。この時、{}を2重にしてグルーピングすると見やすい
 例: int a[3][2] = {{10, 11}, {20, 21}, {30, 31}};

p.135 演習5-10、5-11

・自由参加課題とします。行列の積の公式はWeb検索などで調べてみよう。

p.135 演習5-12 ヒント

・p.134 list0515.cppのアレンジ演習になっている
・2次元配列tensu1[4][3]とtensu2[4][3]をくっつけて3次元配列tensu[2][4][3]にすれば良い
  int tensu[2][4][3] = {
    {{91,63,78},{67,72,46},{89,34,53},{32,54,34}},
    {{97,67,82},{73,43,42},{97,56,21},{85,46,35}}
  }
・すると、1回目の点数はtensu[0][i][j]で、2回目の点数はtensu[1][i][j]で得られる。
・これで合計点を求めよう
・それから、点数の表示を3重ループにしよう
  for (int k = 0; k < 2; k++) {
    printf("%d回目の点数\n", k);
    for (int i = 0; i < 4; i++) {
      for (int j = 0; j < 3; j++) {
        printf("%4d, tensu[k][i][j]);
      }
      putchar('\n');
    }
  }

作成例

//p.135 演習5-12
#include <stdio.h>
int main(void)
{
    int tensu[2][4][3] = { //3次元配列(2回分の4人の3科目の点数)
      {{91,63,78},{67,72,46},{89,34,53},{32,54,34}},
      {{97,67,82},{73,43,46},{97,56,21},{85,46,35}}
    };
    int sum[4][3]; //2次元配列(4人の3科目の合計点数)
    //2回分の点数の合計を求める
    for (int i = 0; i < 4; i++) { //4人の
        for (int j = 0; j < 3; j++) { //3科目の
            sum[i][j] = tensu[0][i][j] + tensu[1][i][j]; //2回分の和
        }
    }
    //2回分の点数を表示
    for (int k = 0; k < 2; k++) { //2回分の
        printf("%d回目の点数\n", k);
        for (int i = 0; i < 4; i++) { //4人の
            for (int j = 0; j < 3; j++) { //3科目の
                printf("%4d", tensu[k][i][j]);
            }
            putchar('\n'); //3科目表示したら改行
        }
    }
    //合計を表示
    puts("合計点");
    for (int i = 0; i < 4; i++) { //4人の
        for (int j = 0; j < 3; j++) { //3科目の
            printf("%4d", sum[i][j]);
        }
        putchar('\n'); //3科目表示したら改行
    }
    return 0;
}

プログラミング言語Ⅰ・講義メモ3

p.128 配列の要素数

・C/C++/C#/Javaの配列は(基本的に)宣言において指定した要素数を変更できない
・よって、C言語の場合「多めに取っておく」のが基本
・ただし、メモリの消費量の増大に注意

p.128 list0512.cpp & p.129 演習5-7&5-8

・自由参加課題とします

p.129 演習5-6 ヒント

①データ数の上限を大き目にとっておく(例:128)
②データ数の上限を要素数とする配列を定義
③データ数を入力し、その数の回数だけカウンタiを用いて下記を繰返す
 ・カウンタ+1と「番:」を表示(改行しない)
 ・配列[i]にコンソールから入力
④「{」を表示(改行しない)
⑤データ数の回数-1だけカウンタiを用いて下記を繰返す(つまり最後の要素の1個前まで)
 ・配列[i]と「,」を表示(改行しない)
⑥配列[データ数-1](つまり最後の要素)と「}」を表示して改行

作成例

//p.129 演習5-6
#include <stdio.h>
#define NUMBER 128 //要素数
int main(void)
{
    int x[NUMBER]; //配列の宣言(※ x[num]とはできない)
    int num; //データ数
    printf("データ数:"); scanf("%d", &num);
    for (int i = 0; i < num; i++) { //データ数だけ繰返す
        printf("%d番:", i + 1); //添字を表示
        scanf("%d", &x[i]); //要素x[i]に読み込む
    }
    putchar('{'); //「{」を表示
    for (int i = 0; i < num - 1; i++) { //データ数-1だけ繰返す
        printf("%d, ", x[i]);
    }
    printf("%d}\n", x[num - 1]); //最後の値と「}」を表示
    return 0;
}

p.130 演習5-9 ヒント

・list0513.cppのアレンジ演習になっている
・ついでに、2つの配列の要素数をマクロNUMBERで与えるようにしよう
・そして「b[i] = a[i];」を「b[i] = a[NUMBER - i - 1];」とすれば良い

作成例

//p.129 演習5-9
#include <stdio.h>
#define NUMBER 5 //要素数
int main(void)
{
    int a[NUMBER]; //コピー元の配列の宣言
    int b[NUMBER]; //コピー先の配列の宣言
    for (int i = 0; i < NUMBER; i++) { //要素数だけ繰返す
        printf("a[%d]:", i); //添字を表示
        scanf("%d", &a[i]); //コピー元の配列の要素に読み込む
    }
    for (int i = 0; i < NUMBER; i++) { //要素数だけ繰返す
        b[i] = a[NUMBER - i - 1]; //逆順に代入
    }
    puts("   a   b");
    puts("---------");
    for (int i = 0; i < NUMBER; i++) { //要素数だけ繰返す
       printf("%4d%4d\n", a[i], b[i]);
    }
    return 0;
}

アレンジ演習:p.131 list0514.cpp

・配列aの全要素のうちa[0]以上である要素の値のみを配列bに代入するようにしよう
・ついでに、2つの配列の要素数をマクロNUMBERで与えるようにしよう
・また、繰返しとその内部の「{}」を省略しないようにしよう

作成例

//アレンジ演習 p.131 list0514.cpp
#include <stdio.h>
#define NUMBER 5 //要素数
int main(void)
{
    int a[NUMBER]; //コピー元の配列の宣言
    int b[NUMBER]; //コピー先の配列の宣言
    for (int i = 0; i < NUMBER; i++) { //要素数だけ繰返す
        printf("a[%d] : ", i); //添字を表示
        scanf("%d", &a[i]); //コピー元の配列の要素に読み込む
    }
    int counter = 0; //コピーした要素数(カウンタ)
    for (int i = 0; i < NUMBER; i++) { //要素数だけ繰返す
        if (a[i] >= a[0]) { //先頭要素値以上?
            b[counter++] = a[i]; //コピーしてからカウントアップ
        }
    }
    for (int i = 0; i < counter; i++) { //コピーした要素数だけ繰返す
        printf("b[%d] = %d\n", i, b[i]);
    }
    return 0;
}

プログラミング言語Ⅰ・講義メモ2

p.126 代入式の評価

・2項=演算子(代入演算子)は他の多くの演算子とは異なり右から左に評価される
・また、評価値は代入値になる
・このことを活かして、多変数への同時代入ができる。
例: a = b = c = 5; //「c = 5」の評価の5をbに代入し「b = 5」の評価の5をaに代入
 ※実質的には a = (b = (c = 5)) と実行される
・この仕掛けは初期化には使えないので注意(例:int a = b = 0; //エラーになる)

アレンジ演習:p.126 list0511.cpp

・学生の人数を4人にしよう(マクロ以外は書き換えないこと)

作成例

//アレンジ演習:p.121 list0511.cpp
#include <stdio.h>
#define NUMBER 4 //学生の人数
int main(void)
{
    int tensu[NUMBER]; //配列の宣言(要素数はマクロで得る)
    int max, min; //最大値、最小値
    printf("%d人の点数を入力せよ。\n", NUMBER); //表示する値をマクロで得る
    for (int i = 0; i < NUMBER; i++) { //繰返しの回数をマクロで得る
        printf("%2d番:", i + 1); //添字+1を表示
        scanf("%d", &tensu[i]); //要素tensu[i]に読み込む
    }
    min = max = tensu[0]; //仮に先頭の値が最小値&最大値だとする
    for (int i = 1; i < NUMBER; i++) { //先頭の次の要素以降について繰返す
        if (tensu[i] > max) max = tensu[i]; //最大値超なら最大値更新
        if (tensu[i] < min) min = tensu[i]; //最小値未満超なら最小値更新
    }
    printf("最高点:%d\n", max);
    printf("最低点:%d\n", min);
    return 0;
}

自由参加課題:アレンジ演習:p.126 list0511.cpp

・最高点、最低点が何番目のデータかも表示しよう
・同点の場合は全て表示すること
例:
4人の点数を入力せよ。
 1番:100
 2番:50
 3番:100
 4番:50
最高点:100 1番 3番
最低点:50 2番 4番

p.127 演習5-4

・提出フォロー:アレンジ演習:p.123 list0508.c・改 を用いると良い

作成例

//p.127 演習5-4
#include <stdio.h>
#define NUMBER 7 //要素数
int main(void)
{
    int x[NUMBER]; //配列の宣言(※ x[num]とはできない)
    for (int i = 0; i < NUMBER; i++) { //配列aの添字の範囲で繰返す
        printf("x[%d]:", i); //添字を表示
        scanf("%d", &x[i]); //要素x[i]に読み込む
    }
    for (int i = 0; i < NUMBER / 2; i++) { //配列aの添字の範囲の前半について繰返す
        int t = x[i]; //要素x[i]の値を退避
        x[i] = x[NUMBER - 1 - i]; //要素x[i]の反対側の要素の値を代入
        x[NUMBER - 1 - i] = t; //反対側の要素に退避してあった値を代入
    }
    puts("反転しました。");
    for (int i = 0; i < NUMBER; i++) { //配列aの添字の範囲で繰返す
        printf("x[%d] = %d\n", i, x[i]); //添字と値を表示
    }
    return 0;
}

p.127 演習5-5

・どうなるかを想定してから、それを試すプログラムを作成しよう

作成例

//p.127 演習5-5
#include <stdio.h>
int main(void)
{
    double a;
    int b;
    a = b = 1.5; //「b = 1.5」の評価である1をaに代入する
    printf("a = %f、b = %d\n", a, b); //「a = 1.000000、b = 1」
    return 0;
}

プログラミング言語Ⅰ・講義メモ

・p.124「オブジェクト形式マクロ」から

提出フォロー:アレンジ演習:p.123 list0508.c・改

・要素数を6にしてみよう
・numの初期値と、配列の要素数の両方を6にして動作を確認すること

作成例

//アレンジ演習:p.121 list0508.cpp
#include <stdio.h>
int main(void)
{
    int num = 6; //要素数
    int x[6]; //配列の宣言(※ x[num]とはできない)
    for (int i = 0; i < num; i++) { //配列aの添字の範囲(0~num未満)で繰返す
        printf("x[%d]:", i); //添字を表示
        scanf("%d", &x[i]); //要素x[i]に読み込む
    }
    for (int i = 0; i < num / 2; i++) { //配列aの添字の範囲の前半について繰返す
        int t = x[i]; //要素x[i]の値を退避
        x[i] = x[num - 1 - i]; //要素x[i]の反対側の要素の値を代入
        x[num - 1 - i] = t; //反対側の要素に退避してあった値を代入
    }
    puts("反転しました。");
    for (int i = 0; i < num; i++) { //配列aの添字の範囲(0~num未満)で繰返す
        printf("x[%d] = %d\n", i, x[i]); //添字と値を表示
    }
    return 0;
}

p.124 オブジェクト形式マクロ

・プログラムをビルド(コンパイル&リンク)直前に編集(置換)してくれる機能
・これにより、プログラム中で複数回もちいるリテラルを一括管理できる
・「変化に強いプログラム」に貢献する仕掛け
・書式: #define マクロ名 値
 ※ 途中改行不可。セミコロン不要(付けると値の一部とみなされる)
・この考え方を「定数」といい各プログラム言語でそれぞれの形で実装されている。
・これによりプログラム中に意味がわかりづらいリテラル(マジックナンバー)が散見されるのを防止できる
 例: int a = price * 0.1, b = newprice * (1 + 0.1);
 ⇒ 「#define TAX 0.1」とすれば、int a = price * TAX, b = newprice * (1 + TAX);

アレンジ演習:p.121 list0510.cpp

・学生の人数を8人にしよう(マクロ以外は書き換えないこと)

作成例

//アレンジ演習:p.121 list0510.cpp
#include <stdio.h>
#define NUMBER 8 //学生の人数
int main(void)
{
    int tensu[NUMBER]; //配列の宣言(要素数はマクロで得る)
    int sum = 0; //合計
    printf("%d人の点数を入力せよ。\n", NUMBER); //表示する値をマクロで得る
    for (int i = 0; i < NUMBER; i++) { //繰返しの回数をマクロで得る
        printf("%2d番:", i + 1); //添字+1を表示
        scanf("%d", &tensu[i]); //要素tensu[i]に読み込む
        sum += tensu[i]; //合計に足し込む
    }
    printf("合計点:%5d\n", sum); //合計を表示
    printf("平均点:%5.1f\n", (double)sum / NUMBER); //件数をマクロで得る
    return 0;
}

今週の話題

販売本数ランキング 今回トップも「ゼルダの伝説 ティアーズ オブ ザ キングダム(Switch)」GO!
減収減益のスクウェア・エニックス、次なる成長戦略はM&A?【ゲーム企業の決算を読む】GO!
Diarkis、ゲーム開発者向け「GTMF 2023」にて出展・登壇―ミドルウェア「Diarkis」を紹介 GO!
3Dスキャン活用や『Roblox』企業事例など紹介ーnewtrace、「第3回XR総合展 夏」に出展 GO!
NVIDIAがUnreal Engine 5.2向けの「NVIDIA DLSS 3」プラグインをリリース GO!

NovelAI、“リークモデル”に「法的措置を取る可能性」 SNSで方針明かす GO!
「ブルアカ」緊急メンテ32時間で終了、一部データは巻き戻し……詫び石4320個など“ヤケクソ補てん”話題 GO!

プログラミング言語Ⅰ・前回のコメント

・配列は分かりやすく覚えやすいと思いました。
・配列の反転が代入でできていることがわかりました。
・分かりやすかったです
・前回までよりもfor文の理解度が高まってきました。

 何よりです。

・一部しか理解できず難しく感じました
・配列文の構文がやや難しく、わかりにくく感じました。
・5章の配列自体は簡単で行数が多いというところが面倒なところです。

 配列は慣れないとややこやしく、しかも、言語によって実装や文法が異なるので厄介ですね。
 まあ、つまりはプログラマの腕の見せ所なので、気合で使いこなしてください。

・次回は遅刻しません
・配列は添字やfor文でのカウント、printfでの表示などで変数を多く使うため、混合しないように気を付けたい。
 問題ないです。
・難しいが、なんか面白い。
・難しいなと思うものが多かったのでよく復習しておきます。

 是非。

・反転を使ってどんなゲームが作れますか?

 配列の反転は小技の一つです。
 多くのゲームのプログラミングにおいて使うかもしれませんね。

・これであっていると思います。
 確認をお願いします。

 拝見しました。しっかりできています。

・今日のC言語の内容は、「配列」について学びました。実行例で打ち込んだ数字をそのまま表示したり反転させたりするプログラムを打ち込みました。授業の速さはちょうどよかったっです。
・ペース可能ならもう少し早いと嬉しいです
・丁度いいペースでした
・授業のスピードに追い付けていけました。
・ペースちょうどよかったです
・講義のペースはちょうど良かったです。
・ペースちょうどよかったです!!
・今日もスムーズで良かったです。
・ペース大丈夫です。
・ペース丁度良かったです!
・ペースはもう少し早くても大丈夫です

 了解です。リアクション感謝します。

アルゴリズムⅠ・講義メモ3(新)

線形探索

・ライナーサーチ、リニアサーチともいう最も単純なアルゴリズムの一つ
・まず、単純なパターンを作ってみよう
① カウンタを0にする
② カウンタが要素数未満である間繰返す
 ・要素[カウンタ]が検索値と一致したら「カウンタ番目にある」と表示
 ・カウンタに1加算
③ カウンタが要素数と一致していたら「探索完了」と表示

フローチャートを作ろう liner1.xml

・http://ha233.rundog.org/wp-content/uploads/2023/06/liner1.zip

提出:プログラムにしよう

int[] val = {10,20,30,40,50,60}; //元の1次元配列
var goal = 20; //検索値
var cnt = 0; //カウンタを0にする
//カウンタが要素数未満の間繰返す
while(cnt < val.Length) { 
    if(val[cnt] == goal) {
        Console.WriteLine("{0}番目にある", cnt + 1); //先頭が1番目だとする
    }
    cnt++;
}
if (cnt == val.Length) { //カウンタが要素数になっていたら
    Console.WriteLine("探索完了");
}
※改良すべき問題点が含まれています。次回フォローします。

アルゴリズムⅠ・講義メモ2(新)

1次元配列の2次元変換

・1次元配列[x]に格納されているデータを2次元配列[a,b]にコピーしたい
例: int[] val = {1,2,3,4,5,6} を int[,] val2 = {{1,2,3},{4,5,6}} としたい
・2種類の方法がある
 ① forの2重ループの中で、1次元配列の要素を1個ずつ格納していく
 ② 1次元配列の添字÷bの数を添字aにして、1次元配列の添字÷bの数の余りを添字bにする

1次元配列の2次元変換:方法① arraycopy1

・int[] val = {10,20,30,40,50,60} を int[2,3] val2に格納しよう
・forの2重ループの中で、1次元配列の要素を1個ずつ格納していこう
・格納が終わったら、全件の表示も行うこと

元にすると便利なソース(array6)

int[,] jimi = { {4,8,9},{6,5,3} }; //部屋ごとのモンスター数
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        Console.WriteLine("{0}階{1}号室に{2}匹", i + 1, j + 1, jimi[i,j]); //階と部屋と匹数を表示
    }
}

作成例

int[] val = {10,20,30,40,50,60}; //元の1次元配列
int[,] val2 = new int[2, 3];; //格納先の2次元配列
int idx = 0; //1次元配列の添字用
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        val2[i,j] = val[idx]; //2次元配列の要素に1次元配列[idx]を格納
        idx++; //次の要素へ
    }
}
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        Console.WriteLine("{0}階{1}号室に{2}匹", i + 1, j + 1, val2[i,j]); //階と部屋と匹数を表示
    }
}

1次元配列の2次元変換:方法② arraycopy2

・int[] val = {10,20,30,40,50,60} を int[2,3] val2に格納しよう
・1次元配列の添字÷3の数を添字aにして、1次元配列の添字÷3の数の余りを添字bにする
・これを1次元配列の全要素について繰返せば良い(格納のforループは1重でOK)
・格納が終わったら、全件の表示も行うこと
・つまり:
 val[0] ⇒ val2[0 / 3, 0 % 3] なので val2[0, 0]へ
 val[1] ⇒ val2[1 / 3, 1 % 3] なので val2[0, 1]へ
 val[2] ⇒ val2[2 / 3, 2 % 3] なので val2[0, 2]へ
 val[3] ⇒ val2[3 / 3, 3 % 3] なので val2[1, 0]へ
 val[4] ⇒ val2[4 / 3, 4 % 3] なので val2[1, 1]へ
 val[5] ⇒ val2[5 / 3, 5 % 3] なので val2[1, 2]へ

作成例

int[] val = {10,20,30,40,50,60}; //元の1次元配列
int[,] val2 = new int[2, 3];; //格納先の2次元配列
for (var i = 0; i < 6; i++) { //1次元配列の要素数だけ繰返す
    val2[i / 3, i % 3] = val[i]; //2次元配列の要素に1次元配列[i]を格納
}
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        Console.WriteLine("{0}階{1}号室に{2}匹", i + 1, j + 1, val2[i,j]); //階と部屋と匹数を表示
    }
}

アルゴリズムⅠ・講義メモ

・1次元配列の2次元変換。線形探索

提出フォロー:2次元配列のプログラム・整数配列の最小値:array8

・下記の配列を用いて部屋ごとのモンスター数の最小値を表示しよう
  int[,] jimi = { {4,8,9},{6,5,3} };
・「●階●号室の●匹が最小」と表示すること
※(自由参加課題)TOP3を表示しよう
ヒント:int型の上限値はint.MaxValueで得られるので、これを仮の最小値とすれば良い

作成例

int[,] jimi = { {4,8,9},{6,5,3} }; //部屋ごとのモンスター数
int min = int.MaxValue, mini = 0, minj = 0; //最小値、最小要素の添字①、②
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        if (jimi[i, j] < min) { //要素[i,j]が最小値未満なら
            min = jimi[i, j]; //最小値を更新
            mini = i; //最小要素の添字①も更新
            minj = j; //最小要素の添字②も更新
        }
    }
}
Console.WriteLine("{0}階{1}号室の{2}匹が最小", mini + 1, minj + 1, min); //階と部屋と匹数を表示

1次元配列の2次元変換

・1次元配列[x]に格納されているデータを2次元配列[a,b]にコピーしたい
例: int[] val = {1,2,3,4,5,6} を int[,] val2 = {{1,2,3},{4,5,6}} としたい
・2種類の方法がある
 ① forの2重ループの中で、1次元配列の要素を1個ずつ格納していく
 ② 1次元配列の添字÷bの数を添字aにして、1次元配列の添字÷bの数の余りを添字bにする

1次元配列の2次元変換:方法① arraycopy1

・int[] val = {10,20,30,40,50,60} を int[2,3] val2に格納しよう
・格納が終わったら、全件の表示も行うこと

アルゴリズムⅠ・前回のコメント

・少し直したので出し直しました。
・名前つけ忘れたかもなのでもう一度送ります
・最大値を求めるプログラムの所と一緒に書いたのでこれを提出します。

 歓迎します。何度でもOK。

・最後間に合わなかったけど、やり方はわかりました。
・元ができていると応用も意外とできました。
・授業ありがとうございました。
 部分的にはC#のほうがわかりやすかったり、C++のほうが記述しやすかったりします。
・あっているかは分かりませんが出来ました。
・tanosii
・ありがとうございました
・int.MaxValueを知ることができてよかった

 何よりです。

・少しずつ難しくなってますね。頑張ります
・内容が難しくなってきたので復習をしていきたいです。

 是非。応援します。

・今日の「C#」の授業は、「2次元配列プログラム」を行いました。階、部屋の番号、敵の数を最小で出すプログラムは、少し難しくてうまく出力できているか自信がないです。
・二次元配列の仕組みはぱっと見だと分かりづらかった。
 宣言の書き方なども覚えるのが大変。
・くそ
・難しい!
・難しく感じました。

 難度が上がっているので、しっかりと。
 再解説が必要な部分があればリクエストしてください(「全部」は却下。ソースファイル名等を明示すること)。

・丁度いいペースでした
・授業のペースはちょうどいいです。
・講義のペースはちょうど良かったです。
・ペースちょうどよかったです
・ペース大丈夫です。
・ペース丁度良かったです!

 了解です。リアクション感謝します。