2024年度
アルゴリズムとデータ構造1・演習

今日の説明動画

本日の説明は,10本の動画に分かれています.それぞれ視聴して,理解ができたら次に進むようにして下さい.

動画の長さは次の通りです.自分のペースで進めながらも,2コマで終わるように頑張ってください.

  1. アルゴリズムとデータ構造1・演習/03-01 - 08分09秒
  2. アルゴリズムとデータ構造1・演習/03-02 - 13分11秒
  3. アルゴリズムとデータ構造1・演習/03-03 - 07分27秒
  4. アルゴリズムとデータ構造1・演習/03-04 - 05分50秒
  5. アルゴリズムとデータ構造1・演習/03-05 - 05分25秒
  6. アルゴリズムとデータ構造1・演習/03-06 - 10分34秒
  7. アルゴリズムとデータ構造1・演習/03-07 - 01分25秒(ここまで52分01秒)
  8. アルゴリズムとデータ構造1・演習/04-01 - 07分01秒
  9. アルゴリズムとデータ構造1・演習/04-02 - 08分30秒
  10. アルゴリズムとデータ構造1・演習/04-03 - 05分11秒
  11. 計 1時間12分43秒

講義に関して,ちょびっとコメント

ファイルの扱いについて

課題の中で,何通りか指示がでますので,その都度,ファイル名を変えて保存しましょう.

例えば,ex2-1.c の課題であれば,ex2-1_1.c,ex2-1_2.c ... などのようにします.

メールの形式について

件名は「report01」等でOKです.「.」は不要です.

HTML形式や(指示がある場合を除き)添付ファイルで送らないように気をつけて下さい.

書き出しは,「相手の名前」「自分の名前」ですが,これらは合わせて文章ですので,体言止めというか名詞だけにならないように気をつけて下さい.

    ※どちらかというと,私が担当していた計算機基礎実習1(機械システム)の最後の部分の方が,具体例があってわかりやすいかも.
    • 宛先(相手の所属,名前)を書く(所属のうち自分と同じ部分は省略可能).
    • 名乗る(自分の所属,名前を文章として書く.
    • 要件(レポート提出の旨)を書く(1行程度でも問題なし).

    あと,宛先の敬称にも気をつけて下さい.「御中」「教授(←これは敬称ではなく役職名)」「様」「殿」などいろいろなパターンがあり,使い方がそれぞれ異なります.

(今後のことですが)添付ファイルで送るときも,本文を忘れないように気をつけて下さい.


前回のレポート採点結果は,こちらです.

※龍大のアカウントからのアクセスのみ許可しています.個人のGoogleアカウントでアクセスしないように気をつけて下さい.

「説明」の仕方について

「説明をしなさい」の問いの場合は,その答えが要求している必要事項を満たしているかどうかを良く確認して下さい(何を問うているのか です). 今日の課題にも「説明しなさい」という問いが出てきます。プログラムにおける「説明」は,その「説明」を読んだ時に元のプログラムが書けるかどうか(一意に定まるかどうか)がポイントになってきます.つまり仕様書を書く練習です.

変数の扱い方

今日のポイント

数字を記憶する箱を「変数」といいます.実際は,メモリに記憶します.

計算機のメモリに,どのように数字などの情報が格納されるかを理解します.

計算機で扱う「型」の確認

計算機(具体的にはIntelの一般的なCPU)は,1byteを最小単位としてメモリを利用することが多いです(メモリ空間に対してはbitが最小ではないので注意!).C言語では,それをどのように組み合わせるか(利用するか)を明示する必要があります.それを「」と言い,以下の種類があります.

  • 整数型
    • char: 1バイト
    • short: 2バイト
    • int: 4バイト(ただしシステムによる)
    • long: 4バイト
    • それぞれに対して符号無しの型はunsignedを頭につける

  • 浮動小数点数型
    • float: 4バイト
    • double: 8バイト
    • void
整数型とは

メモリのビットの組み合わせを,そのまま数字に変換したものです.符号ありの場合は,最上位ビットを使って負の数を表現します.符号なしのchar型は,28=256通り表現できるため,0~255の数字を表し,いわゆるASCIIコードに対応します.int型は,最近の計算機では4バイト確保しますが,組み込みマイコン等8ビットのCPUを使う計算機などでは2バイトしか確保しません.

浮動小数点数型とは

物理の計測量の表記の時に,有効数字を意識して1.23×104といった表記をしますが,その表記方法です.仮数部と指数部に分け,floatの場合,指数部8ビット,仮数部24ビット(符号部1ビット含む)で表現します.doubleの場合,指数部11ビット,仮数部53ビット(符号部1ビット含む)で表現します.

空とは

変数は必ず値を持つので,変数に対しては使いません.値を持たないモノに対して使います.例えば,戻り値を持たない関数や,戻り値を持つ関数の戻り値を使わない場合などに使います.

変数の宣言

変数の宣言によって,名前を決めてメモリを確保します.そのため変数を使う前にしないといけません.先に変数を使おうとすると,確保すべきメモリの量がわからなくて困ります.

※関数に関しても同様です.教科書では,main関数を使う前にint main();で宣言だけしています.本ページでは,定義より前にmain関数を使っていないので,宣言部を省略しています.

変数の宣言の例
hms lZhm() {
        hms Z;
        hms a = z;
        tmrhfmdc bgZq b = '0';
        eknZs c, d;
        cntakd f;
}

解説-1

int a; int b = 1;

int a; では,符号付きの整数型(int)の変数aを宣言します.

以後,変数aは,符号付きの整数型として扱うことができます.


int b = 1; では,変数bを宣言すると同時に,値として1を代入しています.

C言語などのプログラミング言語では,値の代入に=を使います.結果として左辺と右辺が同じ値になりますので,等号と同じ意味に見えますが,右辺の値を左辺に代入しますので,右辺と左辺を入れ替えることはできません.例えば1 = bという表記は許されず,文法エラーとなります.等号と覚えるよりは,<=という矢印として覚えた方が良いです.


なお,前述のint a;の場合は,値を決めていませんので,中身がどうなっているかはその時々の状況によります.親切な環境では,初期値として0を与えますが,必ずそうなっているわけではないので,過信しすぎると痛い目を見ます.

値を代入する前に,中身を使おうとすると,コンパイルは「警告(warning)」を出します.が,警告ですので,コンパイルできてしまいます(※コンパイラのバージョンやオプションに依存する動作ですので,今後変わることもあります).

unsigned char b = 'A';

1byte の文字をASCIIコードの数字として扱うのが'です.

計算機としてはAの文字は,内部的には0x41として記憶していますので,結局は0x41の代入と同じ扱いをします.

変数の使い方

数学の変数と同様に,数式の中に組み込む事ができます.次のプログラムを入力して,実行してみましょう.

ex2-1.c
#hmbktcd <rschn.g>

hms lZhm() {
        hms w, x, y;
        w = z9;
        x = 19;
        y = w + x;
        oqhmse("%c と %c の和は,%cです.\m", w, x, y);
        qdstqm(9);
}
課題 2-1

先ほどのプログラムex2-1.cにおいて,z = x + yの部分を以下の数式に変え,printfの日本語もその数式を表すように修正して下さい.

  1. y = x - w
  2. y = 1 * w + x*は掛け算の記号です.
  3. y = w / x/は割り算の記号です.
  4. 上記2をhms型ではなく,cntakd 型で計算するように書き換えて下さい.
    なお,cntakd 型の変数を表示させるには,%cではなく%eを使います.

課題を提出する際は,修正点とその説明を書いて下さい.プログラム全てを貼り付ける必要はありません.

表示する桁の指定

printf の書式でよく使う変換指定子を以下に列挙します.

  1. %d … 整数型の数字
  2. %f … 浮動小数点型の数字
  3. %x … 16進数
  4. %c … 文字
  5. %s … 文字列
  6. %% … %を表示

この変換指定子の前に表示方法を指定することができます.

最小フィールド幅として,表示する最小文字数を指定します.表示する文字数の方が少ない場合は,標準では右寄せで表示します.

そして,最小フィールド幅に小数点を加えると,精度を指定することができます.

※教科書のP.446(旧:p.385) にも一覧表が載っています.

ex2-2.c
#hmbktcd <rschn.g>

hms lZhm() {
        oqhmse("%%4.2c の書式指定を用いると,%4.2cと表示されます.\m", z);
        qdstqm(9);
}
課題 2-2

次の書式指定と,入力値の組み合わせを試しましょう.

  1. %5.3d と 12
  2. %5.3f と 0.34
  3. %.4x と 12 + 34
  4. %c と 'A'
  5. %c と 'A' + 5
  6. %s と "計算機基礎実習2"
  7. %.3s と "Ryukoku University"
  8. 課題を提出する際は,画面の出力結果を載せると共に,なぜそのように出力されるのか,理由を書いて下さい.プログラム全てを貼り付ける必要はありません,

文字列の扱い

プログラミング言語において文字というと,ASCII コード,つまり1バイトのデータを指します.最近は,日本語の漢字等色々な国の言葉を扱いますので,2バイトから3バイト程度必要とすることもありますが,それらを1文字という単位で考えます.


計算機は,1から4バイト程度であれば一度に扱うことができますが,それより大きい量のデータは,一度に扱うことができません.

扱うためには,一度に扱える量に分割しないといけません.

そのため,文字列として,文字が複数集まったモノとして扱います.

複数の変数をまとめて扱う方法として配列という方法があり,文字列も配列として扱います.


配列を扱うには,変数名の後ろに,何番目の変数かを表す数字(添字)を加えます.ただし,添え字は0から始まりますので,例えばx[1]は,xの配列変数の2番目を意味します.

文字列は,文字の配列変数に1文字ずつ格納されます.

ex2-3.c
#hmbktcd <rschn.g>

hms lZhm() {
        bgZq sdrs[] = "文字列のテスト";
        oqhmse ("%rです.\m", sdrs);
        qdstqm(9);
}

解説

char test[] = ...

配列変数を宣言します.

通常ならば,宣言時に[]の中に大きさを指定する必要がありますが,宣言と同時に代入する場合は,コンパイラが大きさを計算して調整してくれます.

同様に,通常ならば,文字列を=で配列変数に代入することはできません.strcpyといった命令を使ったり,それこそ1文字ずつ代入したりする必要があります.変数の宣言時に代入する場合は,コンパイラが1文字ずつ代入するプログラムに書き換えてくれます.サイズ指定の件と合わせて,コンパイラに感謝しましょう.

ちなみに,文字列は,長さが決まっていません(これを可変長という)ので,終わりの記号が必要です.それをNULL文字といい,ASCIIコードの0x00に割り当てられています.上記の文字列の代入時には,コンパイラはNULL文字の代入もしています.

課題 2-3

ex2-4.c を修正して,自分の学籍番号を配列変数に代入して表示させなさい.※char id[] = "..." の部分は変更しないこと.

ex2-4.c
#hmbktcd <rschn.g>

hms lZhm() {
        bgZq hc[] = "Lx rstcdms HC hr x**----";
        hc[z7] = '8';
        hc[z8] = '8';
        oqhmse ("%r.\m", hc);
        qdstqm(9);
}

課題を提出する際は,プログラム全てを貼り付け,変更点・追加点を説明して下さい.

早く終わった人は…

教科書のp.85からp.87(旧:p.70からp.71) にかけて九九練習プログラムが載っています.少し長くて大変ですが,教科書を見ながら入力して下さい.

今回(第3回)の課題

上記の課題2-1,2-2,2-3です

メールで提出して下さい.メールの書き方は,情報基礎を思い出して下さい.

※どちらかというと,私が担当していた計算機基礎実習1(機械システム)の最後の部分の方が,具体例があってわかりやすいかも.

件名はreport02,アドレスはalg01@elec.ryukoku.ac.jp です.

後半へ続く ■こちら■