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

p.122 配列の要素に値を読み込む

・配列名は識別子なので、変数と同じネーミングルールになる
・配列の要素は変数と同じ扱いができる
・よって、配列aの先頭要素にキーボードから値を読み込むには scanf("%d", &a[0]); とする。

p.122 配列の全要素の並びを反転する

・変数aと変数bの値を交換する場合は、同じ型の作業用の変数に退避させてから代入する
 例: int tmp = a; a = b; b = tmp;
・このことを配列の要素値の交換に応用すると、配列の全要素の並びを反転することができる
・ただし、交換処理を全要素について繰返すと、元に戻ってしまうので、真ん中の要素までとすること

アレンジ演習:p.123 list0508.c

・配列の要素数7を変数numに保持しておこう(int num = 7;)
・2つのforにおける「7」「3」「6」をnumから得るようにしよう
・すると、配列の要素数を変更しても最低限の変更で対応できるようになる
※ 配列の宣言における要素数には変数は使えない(オブジェクト形式マクロ(p.124)で対処可能)

作成例

//アレンジ演習:p.121 list0508.cpp
#include <stdio.h>
int main(void)
{
    int num = 7; //要素数
    int x[7]; //配列の宣言(※ 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.123 list0508.c・改

・要素数を6にしてみよう
・numの初期値と、配列の要素数の両方を6にして動作を確認すること
・次回、学習するオブジェクト形式マクロ(p.124)で改良するのでお楽しみに。

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

p.120 配列の初期化

・変数と同様に、配列にも宣言と同時に初期値を与える初期化が可能
・書式: データ型 配列名[要素数] = {値,…};
・例: double size[4] = {1.25, 2.26, 0.31, 3.14}; //size[0]には1.25が代入される(以下同様)
・要素数を省略すると、初期値の数が自動的に用いられる
・例: double size[] = {1.25, 2.26, 0.31, 3.14}; //配列sizeの要素数は4になる
・要素数を記述して、初期値の数が足りない場合、残りは0になる
・例: double size[3] = {1.25}; //size[0]には1.25が、size[1]とsize[2]は0が代入される
・よって、全要素を0で初期化したい場合は、{0}を指定すると良い
・例: double size[3] = {0}; //size[0]、size[1]、size[2]には0が代入される
・{値,…}を宣言済の配列に代入することはできない(初期化専用)

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

・省略部分を完成しよう

作成例

//アレンジ演習:p.121 list0506.cpp
#include <stdio.h>
int main(void)
{
    int a[4] = {1868, 1912, 1926, 1989}; //明治・大正・昭和・平成元年の西暦
    int b[] = { 1, 2, 3 }; //要素数は3になる
    int c[5] = { 1, 2 }; //値が足りない要素は0になる
    int d[5] = { 0 }; //全要素が0になる
    for (int i = 0; i < 4; i++) { //配列aの添字の範囲(0~3)で繰返す
        printf("a[%d] = %d\n", i, a[i]); //添字と要素値を表示
    }
    for (int i = 0; i < 3; i++) { //配列bの添字の範囲(0~2)で繰返す
        printf("b[%d] = %d\n", i, b[i]); //添字と要素値を表示
    }
    for (int i = 0; i < 5; i++) { //配列cの添字の範囲(0~4)で繰返す
        printf("c[%d] = %d\n", i, c[i]); //添字と要素値を表示
    }
    for (int i = 0; i < 5; i++) { //配列dの添字の範囲(0~4)で繰返す
        printf("d[%d] = %d\n", i, d[i]); //添字と要素値を表示
    }
    return 0;
}

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

第5章 配列

p.116 配列

・「●の■番」という形でデータを表すのが配列で、大量の同型の同じ意味のデータをまとめて扱える
・配列の利用には宣言が必要で、宣言により要素数分の領域が確保される。
・宣言の書式: データ型 配列名[要素数]; //例:int score[100];
・「●の■番」の■にあたるのが添字で、配列名[0]から配列名[要素数-1]までになる。
・よって配列名[要素数]は存在しないので、アクセスすると実行時エラー(異常終了:処理系依存)になる

p.118 list0503.cpp

//p.118 list0503.cpp
#include <stdio.h>
int main(void)
{
    int a[5]; //int型の要素数5の配列の宣言
    for (int i = 0; i < 5; i++) { //配列の添字の範囲(0~4)で繰返す
        a[i] = i + 1; //a[0]に1、a[1]に2、…、a[4]に5を代入
    }
    for (int i = 0; i < 5; i++) { //配列の添字の範囲(0~4)で繰返す
        printf("a[%d] = %d\n", i, a[i]); //添字と要素値を表示
    }
    return 0;
}

p.119 演習5-1 ヒント

・a[0]に0、a[1]に1、…、a[4]に4を代入すれば良い

作成例

//p.119 演習5-1
#include <stdio.h>
int main(void)
{
    int a[5]; //int型の要素数5の配列の宣言
    for (int i = 0; i < 5; i++) { //配列の添字の範囲(0~4)で繰返す
        a[i] = i; //a[0]に0、a[1]に1、…、a[4]に4を代入
    }
    for (int i = 0; i < 5; i++) { //配列の添字の範囲(0~4)で繰返す
        printf("a[%d] = %d\n", i, a[i]); //添字と要素値を表示
    }
    return 0;
}

p.119 演習5-2 ヒント

・a[0]に5、a[1]に4、…、a[4]に1を代入すれば良い
・つまり、5 - i を代入すれば良い

作成例

//p.119 演習5-2
#include <stdio.h>
int main(void)
{
    int a[5]; //int型の要素数5の配列の宣言
    for (int i = 0; i < 5; i++) { //配列の添字の範囲(0~4)で繰返す
        a[i] = 5 - i; //a[0]に5、a[1]に4、…、a[4]に1を代入
    }
    for (int i = 0; i < 5; i++) { //配列の添字の範囲(0~4)で繰返す
        printf("a[%d] = %d\n", i, a[i]); //添字と要素値を表示
    }
    return 0;
}

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

p.108 キーワード

・プログラムを構成する用語であり、変数名などには使えない単語のこと
・C言語のバージョンなどによって異なるが、一部をのぞき、全て小文字
※ キーワードの一部を大文字にしたものはキーワードではないので変数名などに利用してもエラーにならないが推奨されないことが多い

p.108 識別子

・変数名などのことで、英大文字・小文字・数字と「_」が利用できる。
・ただし、先頭のみは数字不可。
※ 先頭が「_」の識別子、大文字1文字のみの識別子についてはエラーにならないが推奨されないことが多い

p.110 自由形式

・プログラムの記述には必須ルールとマナー(規則)があり、業務では規則まで守ること。
・必須ルール①:キーワードや識別子の途中の改行・空白・Tab等は不可
・必須ルール②:#defineなどの前処理指令は中の改行・空白・Tab等は不可
・必須ルール③:文字列リテラルの途中の改行・空白・Tab等は不可だが、前後に「"」を置けばOK
 例: puts("aaaaaaaaaaaaaaaa" ここで改行して次の行に "bbbbbbbbbbbbbbbbbb"); とするのは可。

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

p.104 図形の描画

・テキスト掲載のリストを参考にして、演習をクリアしよう
・まず、p.104 list0419.cppを元に、演習4-21、演習4-22にチャレンジしよう。

p.107 演習4-21

//p.107 演習4-21
#include <stdio.h>
int main(void)
{
    int height;
    puts("正方形を作ります。");
    printf("何段ですか:"); scanf("%d", &height);
    for (int i = 1; i <= height; i++) { //段数の分繰返す
        for (int j = 1; j <= height; j++) { //段数の分繰返す
            putchar('*');
        }
        putchar('\n'); //改行
    }
    return 0;
}

p.107 演習4-22

//p.107 演習4-22
#include <stdio.h>
int main(void)
{
    int p1, p2; //一辺に入力用
    puts("横長の長方形を作ります。");
    printf("一辺(その1):"); scanf("%d", &p1);
    printf("一辺(その2):"); scanf("%d", &p2);
    int height = (p1 < p2) ? p1 : p2; //小さいほうを行数にする
    int width  = (p1 > p2) ? p1 : p2; //大きいほうを列数にする
    for (int i = 1; i <= height; i++) { //行数の分繰返す
        for (int j = 1; j <= width; j++) { //列数の分繰返す
            putchar('*');
        }
        putchar('\n'); //改行
    }
    return 0;
}

【自由参加課題】p.107 演習4-23、演習4-24、演習4-25

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

p.103 多重ループにおけるbreak文の働き

・多重ループの内側でbreak文を実行すると、内側の繰返しを抜けるが外側は続行なので注意
・外側も抜けたい場合、外側にもbreak文を記述できる

p.108 list0418a.cpp(p.102 list0418.cpp・改)

//p.102 list0418a.cpp
#include <stdio.h>
int main(void)
{
    for (int i = 1; i <= 9; i++) { //1の段から9の段まで繰返す
        for (int j = 1; j <= 9; j++) { //×1から×9まで繰返す
            int seki = i * j; //【追加】積を先に求めておく
            if (seki > 40) { //【以下追加】積が40超ならば
                break; //この段の処理を終える(次の段へ)
            }
            printf("%3d", seki); //【変更】積を3桁で表示
        }
        putchar('\n'); //改行
    }
    return 0;
}

p.103 for文のループ本体でのcontinue文

・break文と同様にcontinue文もforで利用できる
・while文におけるcontinue文とは異なり、for(①;②;③){…}の③に記述する「毎回最後に行うこと」はcontinueを行っても実行される
・多重ループの場合も同様

p.104 図形の描画

・テキスト掲載のリストを参考にして、演習をクリアしよう
・まず、p.104 list0419.cppを元に、演習4-21、演習4-22にチャレンジしよう。

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

p.102 2重ループ

・繰返しの内側に繰返しを記述することで2重ループを表現できる。
・for文の2重ループによって「n回繰返す中で、各m回繰返す」ことを記述できて便利。
 例:ダンジョンの1階から100階まで、それぞれ10個の部屋があるので、中にいるモンスターの数。
※ for文では対象が1行のみの場合{}を省略できるが、特に2重ループでは省略が推奨されないことが多い。
・for文で用いるカウンタ用の変数は外側と内側で別にすること。主に、iとjが使われることが多い。

p.102 list0418.cpp

//p.102 list0418.cpp
#include <stdio.h>
int main(void)
{
    for (int i = 1; i <= 9; i++) { //1の段から9の段まで繰返す
        for (int j = 1; j <= 9; j++) { //×1から×9まで繰返す
            printf("%3d", i * j); //積を3桁で表示
        }
        putchar('\n'); //改行
    }
    return 0;
}

p.107 演習4-20 ヒント

・上見出し2行はputsで文字列として表示しても良いし、繰返しで表示しても良い
・3行目からは、内側の繰返しに入る前に横タイトルを表示する
・段数が得られるカウンタiを用いて、printf(" %d |", i); とすれば良い

作成例

//p.107 演習4-20 = p.102 list0418.cpp・改
#include <stdio.h>
int main(void)
{
    puts("   |  1  2  3  4  5  6  7  8  9"); //【追加】
    puts("---+---------------------------"); //【追加】
    for (int i = 1; i <= 9; i++) { //1の段から9の段まで繰返す
        printf(" %d |", i); //【追加】横タイトルを表示
        for (int j = 1; j <= 9; j++) { //×1から×9まで繰返す
            printf("%3d", i * j); //積を3桁で表示
        }
        putchar('\n'); //改行
    }
    return 0;
}

【自由参加課題】p.107 演習4-20・改

・putsで表示している1~9をfor文で記述しよう

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

・p.102「2重ループ」から

提出フォロー:p.101 演習4-19 ヒント【再掲載】

・まず、list4-17のforとifの省略されている{}を書き込む
・forの前で個数用の変数cntを0に初期化しておく
・if文の中でcntをインクリメント
・forの後で「約数はcnt個です。」と表示
・改行がlist4-17とは異なっているので注意

作成例

//p.101 演習4-19
#include <stdio.h>
int main(void)
{
    int n; //入力用の変数を宣言
    printf("整数値:"); scanf("%d", &n); //キーボードから整数値を入力
    int cnt = 0; //カウンタ
    for (int i = 1; i <= n; i++) { //iを1から、num以下である間、+1しながら繰返す
        if (n % i == 0) { //割り切れる?
            printf("%d\n", i); //約数なので表示して改行
            cnt++; //カウントアップ
        }
    }
    printf("約数は%d個です。\n", cnt); //約数の数を表示して改行
    return 0;
}

今週の話題

販売本数ランキング 今回トップも「ゼルダの伝説 ティアーズ オブ ザ キングダム(Switch)」GO!
XR関連の最新動向を紹介―エルザ ジャパンが「ELSA XRプライベートセミナー」開催 GO!
マイクロソフト、現在開発中のゲームはXbox One世代に対応しない方針―ついに世代交代が進むか? GO!
AIによるテストでゲームQAを効率化…AIQVE ONE、ゲーム開発者向けビジネスイベント「GTMF2023」で「Playable!」を紹介 GO!
ソニー、PS5ゲームをクラウドストリーミングでプレイ可能に。PS Plusプレミアム特典で提供へ GO!
さくら、生成AI向けのクラウドサービス提供へ 「NVIDIA H100」を2000基投入 GO!

Twitter、家賃滞納で退去を命じられる Google Cloud、AWSへの未払いに続き GO!
日経新聞、ウェビナー申込者の個人情報が丸見えに 氏名・年収など約3700人分 システムに設定ミス GO!

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

・抜けがあったので再提出です。すみません

 大歓迎します。

・授業ありがとうございました
 while文は形がわかりやすく、使っていて楽しかったです。
・たのしいです
・ありがとうございました。
・for文を使うと見やすくなりミスも減るなと思いました。
・for文についてよく知れました
・for文の仕組みを理解した。
・for文を理解することができてよかった。

 何よりです。

・繰り返し条件の > の向きなど気を付けたい。
・少しつまづいたので復習をしておこうと思います
・今日は片頭痛で休んでしまったのでいなかったところは友達に聞いてやります。
・少し詰まってしまったので復習しようと思います!
・今日の「C言語」の授業は、「while文」と「do文」無限ループプログラムや、「for文」のカウントアップのプログラムについて学びました。どれも繰り返すプログラムなので、どの文も使いこなしていきたいです。

 是非。

・今回も難しく感じました。
・久しぶりすぎてわからなかった
・難しくてほぼ写している状態。復習しないとついていけなくなりそう…。

 難度が上がっているので、しっかりと。
 再解説が必要な部分があればページ番号やソース番号、問題番号などを明示してリクエストしてください。

・ペースちょうどよかったです
・ペース大丈夫です。
・講義のペースはちょうど良かったです。

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

・なんとか出来ました。
 確認お願いします。

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

・授業ありがとうございました。
 できれば授業の最初に、その日学ぶ内容の目的を説明してから
 授業に入ってくれると助かります。

 説明しているのですが、伝わっていないようですね。
 次回からもっと強くしっかりと説明するようにします。

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

2次元配列のプログラム・最大値表示:array7

・下記の配列を用いて部屋ごとのモンスター数の最大値を表示しよう
  int[,] jimi = { {4,8,9},{6,5,3} };
・「●階●号室の●匹が最大」と表示すること

ヒント

① 最大値用の変数maxを0で初期化
② 最大要素の添字①を示す変数maxiと、添字②を示す変数maxjを宣言
③ iで階数の分だけ繰返す
 ・ jで階ごとの部屋の数だけ繰返す
   ・要素[i,j]がmax超なら、maxを更新、maxiとmaxjにiとjを格納
③ maxi + 1、maxj + 1、maxを表示

作成例

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

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

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

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

2次元配列のプログラム・表示:array6

・下記の配列を用いて部屋ごとのモンスター数として表示しよう
  int[,] jimi = { {4,8,9},{6,5,3} };
※(自由参加課題)foreachでできるか試そう

作成例

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]); //階と部屋と匹数を表示
    }
}

2次元配列のプログラム・最大値表示:array7

・下記の配列を用いて部屋ごとのモンスター数の最大値を表示しよう
  int[,] jimi = { {4,8,9},{6,5,3} };
・「●階●号室の●匹が最大」と表示すること

ヒント

① 最大値用の変数maxを0で初期化
② 最大要素の添字①を示す変数maxiと、添字②を示す変数maxjを宣言
③ iで階数の分だけ繰返す
 ・ jで階ごとの部屋の数だけ繰返す
   ・要素[i,j]がmax超なら、maxを更新、maxiとmaxjにiとjを格納
③ maxi + 1、maxj + 1、maxを表示

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

2次元配列

・添字が2つある配列で、実装や考え方が言語によって異なり、C/C++とC#では差異がある(Javaもまた差異がある)
・ちなみに、C#では単純型の2次元配列と、自由度の高いジャグ配列の2種類がある
・この講座では単純型を用いるが、C/C++とは文法が異なる。
・宣言の書式: var[,] 配列名 = new データ型[要素数①, 要素数②];
 こうすると、①×②の要素数の2次元配列になる
 例: var[,] jimi = new int[2, 3];
・利用の書式: 配列名[添字①,添字②]
 上の例の場合、jimi[0,0]、jimi[0,1]、jimi[0,2]、jimi[1,0]、jimi[1,1]、jimi[1,2]
  つまり、配列[3]が2つあるイメージ
・全要素を扱うには、forの2重ループを用いると分かりやすい
 for (int i = 0; i < 要素数①; i++) {
  for (int j = 0; j < 要素数②; j++) {
   配列名[i, j]を扱う処理
  }
 }
・初期化の書式:データ型[,] 配列名 = { {値,…}, {値,…} }; //値の数で要素数が決まる
 例:int[,] jimi = { {4,8,9},{6,5,3} };

2次元配列のプログラム・表示:array6

・下記の配列を用いて部屋ごとのモンスター数として表示しよう
  int[,] jimi = { {4,8,9},{6,5,3} };
※(自由参加課題)foreachでできるか試そう

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

配列のプログラム・整数配列の最大最小値:array5

・下記のように整数の正の数の配列nを初期化しよう
  int[] n = {4,8,9,6,5,3,1};
・最大値と最小値を表示しよう
・(できれば)最大値と最小値の添字も表示しよう
・(自由参加課題)上位3者、下位3者の値と添字を表示しよう
ヒント:int型の上限値はint.MaxValueで得られるので、これを仮の最小値とすれば良い

作成例

int[] n = {4,8,9,6,5,3,1};
int max = 0, min = int.MaxValue; //最大値用の変数maxと最小値の変数minを初期化
for (var i = 0; i < n.Length; i++) { //i = 0から要素数未満まで繰返す
    if (n[i] > max) { //要素[i]が最大値超なら
        max = n[i]; //最大値を更新
    }
    if (n[i] < min) { //要素[i]が最小値未満なら
        min = n[i]; //最小値を更新
    }
}
Console.WriteLine("最大は{0}、最小は{1}", max, min); //最大値と最小値を表示

フローチャートを描いてみよう

・繰返しの中に分岐が2連続である構造になる
・array5.zip

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

・配列の続き(合計値、2次元配列)

提出フォロー:配列のプログラム・整数配列の最大値:array4

・下記のように整数の正の数の配列nを初期化しよう
  int[] n = {4,8,9,6,5,3,1};
・最大値を表示しよう
・(できれば)最大値の添字も表示しよう
・(自由参加課題)1位、2位、3位の値と添字を表示しよう

ヒント(例):

① 最大値用の変数maxを0で初期化
② i = 0から要素数未満まで繰返す
 ・要素[i]が最大値超なら、最大値を更新
③ 最大値を表示

作成例:

int[] n = {4,8,9,6,5,3,1};
int max = 0; //最大値用の変数maxを0で初期化
for (var i = 0; i < n.Length; i++) { //i = 0から要素数未満まで繰返す
    if (n[i] > max) { //要素[i]が最大値超なら
        max = n[i]; //最大値を更新
    }
}
Console.WriteLine(max); //最大値を表示

作成例(添字も表示):

int[] n = {4,8,9,6,5,3,1};
int max = 0; //最大値用の変数maxを0で初期化
int maxi = 0; //最大値の添字
for (var i = 0; i < n.Length; i++) { //i = 0から要素数未満まで繰返す
    if (n[i] > max) { //要素[i]が最大値超なら
        max = n[i]; //最大値を更新
        maxi = i; //最大値の添字も更新
    }
}
Console.WriteLine("最大はn[{0}]の{1}", maxi, max); //添字と最大値を表示

配列のプログラム・整数配列の最大最小値:array5

・下記のように整数の正の数の配列nを初期化しよう
  int[] n = {4,8,9,6,5,3,1};
・最大値と最小値を表示しよう
・(できれば)最大値と最小値の添字も表示しよう
・(自由参加課題)上位3者、下位3者の値と添字を表示しよう
ヒント:int型の上限値はint.MaxValueで得られるので、これを仮の最小値とすれば良い

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

・最大値の表記の仕方はそうやることがわかりました。今日やったことはプログラムで何回も使うと思うので、忘れず復習します。
・何とかこなすことができました。
・配列についてよく理解できました
・配列の使い方について理解した。
・配列で数字がばらばらでも最大値と最小値が出せることが分かった。
・仕組みを理解できた
・ok
・ありがとうございました。
・できてると思います

 何よりです。

・今回は内容が難しかったので復習をしっかりしたいと思います。

 是非。

・今日のC#の授業は、「配列のプログラム」を学びました。「for」を使ったプログラムは何となく理解したが「foreach文」を使ったプログラムは、ちょっとこんがらがりそうだった。
・授業は分かりやすかったですが、難しく感じました。

 こちらも少しずつ難度が上がっているので油断せずにしっかりと。

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

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

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

p.94 for文

・while文の機能拡張バージョンで、前判定繰返し。
・while文でよく使われるパターンを1つにまとめて「●回繰返す」を一目で分かるように書ける構文
【while文】
 int カウンタ = 0;
 while(カウンタ < 回数) {
  繰返し内容 //回数の分だけ繰返される
  カウンタ++;
 }
【for文】
 for(int カウンタ = 0; カウンタ < 回数; カウンタ++;) { //回数分だけ繰返す
  繰返し内容 
 }
・カウンタの初期値や増加(減少)などは自由にできるので、回数がわかる繰返しはforで書くと良い
・for文の{}も対象が1文であれば省略できる
※ 業務ではローカルルールやチームルールに従うこと

p.98 演習4-13 仕様とヒント

・for文を用いること
・for文の前で「1からnum(入力値)1」と表示しておく
・for文の前で合計用の変数sumを0に初期化しておく
・for文でカウンタiを1から、num以下である間、インクリメントしながら繰返す
・for文の内容は「sumにiを足し込む」
・for文を終えてから「sumです。」を表示すれば良い

作成例

//p.91 演習4-13
#include <stdio.h>
int main(void)
{
    int num; //入力用の変数を宣言
    printf("nの値:");
    scanf("%d", &num); //キーボードから整数値を入力
    printf("1から%dまでの総和は", num);
    int sum = 0;
    for (int i = 1; i <= num; i++) { //iを1から、num以下である間、+1しながら繰返す
        sum += i; //sumにiを足し込む
    }
    printf("%dです。", sum);
    return 0;
}

p.91 演習4-14は割愛(自由参加課題とします)

p.91 演習4-15 ヒント

・「何cmから」を変数begin、「何cmまで」を変数end、「何cmごと」を変数eachに格納する。
・すると、for(int i = begin; i <= end; i += each) {…} となる

作成例

//p.91 演習4-15
#include <stdio.h>
int main(void)
{
    int begin, end, each; //入力用の変数(開始値、終了値、増分)を宣言
    printf("何cmから:"); scanf("%d", &begin); //キーボードから整数値を入力
    printf("何cmまで:"); scanf("%d", &end); //キーボードから整数値を入力
    printf("何cmごと:"); scanf("%d", &each); //キーボードから整数値を入力
    for (int i = begin; i <= end; i += each) { //iを開始値から、終了値以下である間、+増分しながら繰返す
        printf("%dcm  %.2fkg\n", i, (i - 100) * 0.9); //身長と標準体重(小数点以下2桁)を表示
    }
    return 0;
}

p.99 for文による一定回数の繰返し(追加事項)

・for文のカッコ内で初期化したカウンタ用の変数はforのブロック内でのみ有効
・よって、カウンタ用の変数をfor文の外でも用いたい場合は、for文の前で宣言すること
・例:
 int i; //前に宣言
  for (i = begin; i <= end; i += each) {…} //初期化せず代入にする
 printf("%dcm以上は表示しません", i); //forの繰返しを抜けた後のカウンタを利用できる

p.100 演習4-16、4-17は割愛(自由参加課題とします)

p.100 演習4-18 ヒント

・p.97 list0413.cppを元にすると良い
・for文の{}を記述する
・putchar('*');の後で、iを5で割った余りが0ならば、putchar('\n'); を実行
・for文の後で、個数が5の倍数でなければ改行すれば良い

作成例

//p.100 演習4-18
#include <stdio.h>
int main(void)
{
    int num; //入力用の変数を宣言
    printf("何個*を表示しますか:"); scanf("%d", &num); //キーボードから整数値を入力
    for (int i = 1; i <= num; i++) { //iを1から、num以下である間、+1しながら繰返す
        putchar('*');
        if (i % 5 == 0) { //5回ごとに
            putchar('\n'); //改行
        }
    }
    if (num % 5 != 0) { //回数が5の倍数でなければ
        putchar('\n'); //最後に改行していないので改行する
    }
    return 0;
}

提出:p.101 演習4-19 ヒント

・まず、list4-17のforとifの省略されている{}を書き込む
・forの前で個数用の変数cntを0に初期化しておく
・if文の中でcntをインクリメント
・forの後で「約数はcnt個です。」と表示
・改行がlist4-17とは異なっているので注意

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

p.92 break文

・switch文(p.66)におけるbreakと同様で「ブロックを抜ける」ために用いる
・ただし、繰返し構造で用いた場合は「現在のループから抜ける」意味になる
 ※後述する多重ループでは「内側のループから抜ける」となるので注意

p.92 continue文

・繰返しにおいて「今回はこれで良しとして次にいこう」という意味
・繰返しの内容の後続部分をカットできる構文(ループ脱出ではない)
・よって、繰返しの内容が複雑な場合に用いる
 ※ 内容がシンプルな場合はif文で代用できるので、利用は推奨されない
例:p.92 list0411.cppの場合、if~elseは下記のようにしたほうが分かりやすい

 if (no == -9999) {
  break;
 } else if (no <= 0) {
  continue;
 }
 sum += no;

↓

 if (no == -9999) {
  break;
 } else if (no > 0) {
  sum += no;
 }

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

p.89 do文の表記

・do文の{}も対象が1文であれば省略できるが省略しない方が良い
※ 同様に、whileやfor(後述)の{}も省略しない方が良い場合が多い
※ 業務ではローカルルールやチームルールに従うこと

p.91 演習4-9、4-10は割愛(自由参加課題とします)

p.91 演習4-11 ヒント

・入力値が格納される変数noの値はwhileの中で書きかえられてしまう。
・よって、下記のどちらかを行えば良い
 ① 変数noの値を退避しておいて用いる
 ② 変数noの値をwhileに入る前に表示しておく
・list0410.cppを見ると、whileの前のprintfで表示できるのだから②でOK

作成例

//p.91 演習4-11
#include <stdio.h>
int main(void)
{
    int no; //入力用の変数を宣言
    do {
        printf("正の整数を入力せよ:");
        scanf("%d", &no); //キーボードから整数値を入力
        if (no <= 0) {
            puts("\a正でない数を入力しないでください。");
        }
    } while (no <= 0); //入力値が0以下なら繰返す(先に進ませない!)
    printf("%dを逆から読むと", no); //【変更】
    while (no > 0) { //noが0超である間(処理により0になってしまうまで)繰返す
        printf("%d", no % 10); //10で割った余り=下1桁を表示
        no /= 10; //10分の1にする=(整数なので)下1桁を取り除く
    }
    puts("です。");
    return 0;
}

p.91 演習4-12は割愛(自由参加課題とします)

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

p.88 前置増分演算子と前置減分演算子

・インクリメントを単独で行う場合「i++」のように後ろに置く(後置)ことが多い
・インクリメント結果を用いたい(先に+1してから使いたい)場合は「++i」のように前に置く(前置)

アレンジ演習:p.88 list0409.cpp

・「整数は何個:」で1未満が入力されたら先に進まず入力を繰返すようにしよう
・つまり、ミニ演習 mini087.cppのdo文を盛り込めば良い

作成例

//p.88 list0409.cpp
#include <stdio.h>
int main(void)
{
    int num; //入力用の変数を宣言
    do {
        printf("整数は何個:");
        scanf("%d", &num); //キーボードから整数値を入力
    } while (num < 1); //入力値が1未満なら繰返す(先に進ませない!)
    int i = 0; //カウンタ
    int sum = 0; //合計
    while (i < num) { //iがnum未満である間、繰返す
        int tmp; //入力用の変数(使い捨て)
        printf("No.%d:", ++i); //+1してから表示
        scanf("%d", &tmp); //キーボードから整数値を入力
        sum += tmp; //合計に足し込む
    }
    printf("合計値:%d\n", sum); //合計を表示(改行)
    printf("平均値:%.2f\n", (double)sum / num); //合計を実数にキャストし個数で割り小数点以下2桁表示
    return 0;
}

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

p.86 文字定数

・文字の扱いは言語やOSによって異なるので注意
・C言語では文字は文字コードの整数で表す
・文字定数(文字リテラル)はシングルコーテーションで挟んで表す。例;'A'、' '
・C言語では文字定数はint型扱い

p.87 putchar関数

・文字専用の出力関数
 ※ 1文字をprintfで表示するより軽い
・改行のみを行うときに便利:putchar('\n');

p.87 do文

・while文は繰返しの前に繰返すかを判断するが「やってみなきゃわからん」場合に不便
・これを前判定繰返しという
・これに対して「やってみてから繰返すかを判断する」場合に向くのがdo文(do-while文)
・これを後判定繰返しという
・書式: do { 繰返し内容 } while(継続条件); //※末尾にセミコロンが必要
・例:
  int a;
  do { //繰返し開始
    printf("正の数:"); scanf("%d", &a);
  } while (a <= 0); //入力値が0以下なら繰返す(先に進ませない!)

※ p.87 演習4-8は割愛(自由参加課題とします)

ミニ演習 mini087.cpp

・上の例を試すプログラムを作ろう

作成例

//ミニ演習 mini087.cpp
#include <stdio.h>
int main(void)
{
    int a;
    do { //繰返し開始
        printf("正の数:"); scanf("%d", &a);
    } while (a <= 0); //入力値が0以下なら繰返す(先に進ませない!)
    return 0;
}

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

p.85 演習4-6 ヒント

・インクリメント(例:i++)の代わりに複合代入演算子を用いる(例:i += 2)と2ずつずらせる
・しかし、printfの中で「i += 2」すると表示の前に実行されてしまうので注意
・また、初期値を0にするか2にするか検討しよう

作成例

//p.84 演習4-6
#include <stdio.h>
int main(void)
{
    int no; //入力用の変数を宣言
    printf("正の整数を入力せよ:"); scanf("%d", &no); //入力案内を表示しキーボードから整数値を入力
    int i = 2;
    while (i <= no) { //iがno以下である間、繰返す
        printf("%d ", i); //整数値と空白を出力
        i += 2; //+2する
    }
    printf("\n"); //改行する
    return 0;
}

p.85 演習4-7 ヒント

・インクリメント(例:i++)の代わりに複合代入演算子を用いる(例:i *= 2)と2倍にできる
・しかし、printfの中で「i *= 2」すると表示の前に実行されてしまうので注意
・また、初期値を1にするか2にするか検討しよう

作成例

//p.84 演習4-7
#include <stdio.h>
int main(void)
{
    int no; //入力用の変数を宣言
    printf("正の整数を入力せよ:"); scanf("%d", &no); //入力案内を表示しキーボードから整数値を入力
    int i = 2;
    while (i <= no) { //iがno以下である間、繰返す
        printf("%d ", i); //整数値と空白を出力
        i *= 2; //×2する
    printf("\n"); //改行する
    return 0;
}

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

・p.85 演習4-6から

提出フォロー:p.84 演習4-4 ヒント

・1までにするにはwhileの継続条件を変えると良い
・0以下だと改行しなくするには、改行の実行を入力値が0超の時のみにすれば良い</pre>
※ p.85 演習4-5は割愛(自由参加課題とします)

作成例

//p.84 演習4-4
#include <stdio.h>
int main(void)
{
    int no; //入力用の変数を宣言
    printf("正の整数を入力せよ:"); scanf("%d", &no); //入力案内を表示しキーボードから整数値を入力
    int enter = no; //【追加】入力値を退避
    while (no >= 1) { //【変更】noが1以上である間、繰返す
        printf("%d ", no--); //整数値と空白を出力してからカウントダウン
    }
    if (enter > 0) { //【追加】入力値が0超?
        printf("\n"); //改行する
    }
    return 0;
}

今週の話題

販売本数ランキング 今回トップも「ゼルダの伝説 ティアーズ オブ ザ キングダム(Switch)」GO!
“Summer Game Fest 2023”発表まとめ。『FF7 リバース』新映像、『龍が如く7 外伝』発売日、2D『ソニック』新作、『プリンス・オブ・ペルシャ』新作などが発表 GO!
『アーマード・コア』とナルトの新作でバンナムは1兆円企業へ【ゲーム企業の決算を読む】 GO!
REALITY XR cloud、Z世代に向けた就活イベント会場をメタバース「REALITY」上に期間限定オープン―USEN-NEXTと共同で革新的リクルーティングスタイルを提供 GO!
AppleがARヘッドセット「Vision Pro」発表―価格は3,499ドルから。2024年初めに発売開始 GO!
「CEDEC+KYUSHU 2023」11月25日ハイブリット開催―6月5日より「全国公募セッション枠」の受付けも開始 GO!
G2 Studios、インターンシップに向けたf4samurai/セガ/DONUTSとの合同オンラインイベントを7月7日開催 GO!

集英社、“AIグラビア”の販売終了 「生成AIの課題について検討足りなかった」 Twitterも削除 GO!
「ストリートファイター」新作、通信が不安定な状態続く プレイヤー数は100万突破 GO!

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

・今日のC言語の授業内容は、「do文、while文」について学びました。do文はもう一度入力するのに便利で、while文は「printf(”%d ”, no);」の所の「d」の後ろを改行しないとうまく表示されないことがわかりました。

 while文とprintfにおける改行は直接の関係はありません。
 printfを複数回実行する場合に共通ですので、しっかり理解を深めてください。

・while文がさらに知れた。
・while文が結構分かりやすかった
・while文や論理否定演算子について理解した。
・4-6のカウントダウンで爆弾作れそう
・分かりやすかったです
・今日もスムーズで良かったです。
・今回はスラスラできました。

 何よりです。

・今回の授業はギリギリ追い付けたので、進むことができました。
 まだ復習をしっかりできていないので、時間を探してやってみます。
・置いてかれることなくついていけてよかったです。先週は休んでしまったので、もう一回復習したいと思います。
・使えると便利な文が多くなった分、演習4-2のような過去習ったものとの組み合わせも増えると思うので復習もしっかり取り組みます
・繰り返しの文はよく使うと思うので勉強していきたいです。

 是非。

・ありがとうございました。
 すこし進みがはやかったので理解が追いつきませんでした。
・演習4-2はうまくできず、理解力や応用力が足りないと感じた。
・今回は難しく感じました。

 少しずつ難度が上がっているので油断せずにしっかりと。

・今回の講義メモを分ける形は見やすかったので次回以降も分ける形でお願いします。

 了解です。Assistがちゃんと使えるようになるまでは、この形式で進めましょう。

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

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

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

提出:配列のプログラム・整数配列の最大値:array4

・下記のように整数の正の数の配列nを初期化しよう
  int[] n = {4,8,9,6,5,3,1};
・最大値を表示しよう
・(できれば)最大値の添字も表示しよう
・(自由参加課題)1位、2位、3位の値と添字を表示しよう

ヒント(例):

① 最大値用の変数maxを0で初期化
② i = 0から要素数未満まで繰返す
 ・要素[i]が最大値超なら、最大値を更新
③ 最大値を表示

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

配列のプログラム・添字を用いる:array3

・全要素を表示する時に、番号も表示したい
・番号は添字+1とする
実行例:
(1)リムル
(2)シオン
(3)シュナ
※ forの方が作りやすい

作成例

string[] monstname = {"リムル", "シオン", "シュナ"}; //3要素の文字列配列の初期化
for (var i = 0; i < monstname.Length; i++) { //添字0から要素数未満まで繰返す
    Console.WriteLine("({0}){1}", i + 1, monstname[i]); //添字+1と要素[i]を表示
}

別解:foreachによる力技

string[] monstname = {"リムル", "シオン", "シュナ"}; //3要素の文字列配列の初期化
int i = 1;
foreach (var w in monstname) { //添字0から要素数未満まで繰返す
    Console.WriteLine("({0}){1}", i++, w); //連番と要素を表示
}