不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

paizaラーニング『C言語入門編8: 構造体を理解しよう (全9回) 』を受講してみた

2021-02-06 23:24:24 | paiza

『C言語入門編8: 構造体を理解しよう (全9回) 』


メモ

#01:構造体について学習しよう

  • 構造体とは
    構造体は、変数をひとまとまりにしたもの
    ・配列と違って、データ型が異なる変数も一緒にまとめることができる
    ・構造体の持つそれぞれの変数は「メンバ」と呼ばれる
  • 構造体を使用するメリット
    • 関連のあるデータをまとめることができる
      コードの見通しがよくなり、無関係な値を変更してしまうリスクを減らすことができる
    • 一度宣言した構造体は何度でも利用できる
      構造体のメンバを宣言しなおす必要がない。
      そのため、効率よくコードを作成できる。
  • オブジェクト指向言語の「クラス」との違い
    • Java や C# などのオブジェクト指向言語には「クラス」がある。
      ⇔ C 言語には、クラスの機能がない。
    • C 言語の構造体は、クラスの機能を限定したものと考えることもできるが、大きな違いとして、
      クラスでは「メソッド」というオブジェクトの操作を記述できるが、
      C 言語の構造体ではメソッドを記述できない。

#02:構造体を作成しよう

  • 構造体を宣言する

    struct 構造体タグ {
     メンバ 1;
     メンバ 2;
     ...
    };
    • 最後の ; (セミコロン) を忘れてしまうことが多いので注意

#03:構造体を扱うときに便利な機能を使ってみよう

  • 構造体のメンバに strcpy を使う
    構造体のメンバが文字列のときは、 strcpy を使ってコピーできる。
  • typedef を使うとデータ型に名前をつけることができる。

    typedef データ型 新しい名前;
  • 構造体宣言で typedef を使う

    typedef struct {
     char name[20];
     int hp;
     int power;
    } Player;

#04:構造体を使った関数をつくろう

  • 構造体を引数で受け取る関数
    構造体から宣言した変数は、通常の変数と同じように、関数の引数で渡すことができる。
    • ※ 関数の引数で構造体を渡す場合、値のコピーが渡されまので、構造体のサイズが大きいと (構造体のメンバにある配列が大きいなど) コピーに時間がかかってしまう。
      → そのようなときに、構造体へのポインタを渡す方法が推奨される
  • 構造体を作成して返す関数
    構造体は、直接代入ができるデータ型なので、関数の戻り値にすることができる。
    一方で配列は、値を直接代入できず、関数の戻り値にすることができない。

#06:構造体とポインタ

  • アロー演算子
    • 構造体へのポインタを使ってメンバを書き換えるには、次のように記述する
       (*p).hp = 200;
    • これは、「アロー演算子」を使って以下のように書くことができます。
       p->hp = 200;

#07:構造体でつくる連結リストを理解しよう

  • 連結リスト
    連結リストは、「ノード」と呼ばれる各要素をつなげてできたデータ構造
    • 配列と違ってインデックスが定められておらず、
      データの追加や順番の変更が簡単にできるのが特徴。
    • 連結リストでは、要素数も自由に変更できる。
  • 連結リストの実装方法
    連結リストのノードは、構造体とポインタを使って実装することが多い。
    • 構造体は、異なる型の値を保持できるため、ノードの実装に適している

      struct node {
       int num; // 整数値データ
       struct node *next; // 次のノードへのポインタ
      };
  • 連結リストの種類
    • 単方向リスト
      次のノードにしか移動できない連結リスト
    • 双方向リスト
      前のノードと次のノードに移動できる連結リスト
    • 線形リスト
      ノードが直線状に並ぶ連結リスト
    • 循環リスト
      最後のノードが最初のノードにつながっている連結リスト

#08:連結リストを実装しよう (1)

  • 構造体のメンバに、自身の構造体へのポインタを持つ構造体は「自己参照構造体」と呼ばれる。
    struct node {
     int num;
     struct node *next; // 自身の構造体へのポインタ
    };

認定証

連結リストってどこかでやった気もするけど、
本レッスンのおかげで理解が深まったと思う。


学習ステータス

まだ昇格しないっ!?
ずっと若手のままか😁 

paizaラーニング『C言語入門編7:関数を理解しよう (全8回) 』を受講してみた

2021-02-06 22:41:55 | paiza

『C言語入門編7:関数を理解しよう (全8回) 』


メモ

#03:引数と戻り値を理解しよう

  • プロトタイプ宣言
    関数の定義は、原則として main 関数の上に書く必要がある。
    main 関数の下に関数定義を書きたい場合には、プロトタイプ宣言を記述する必要がある。

#04:スコープを理解しよう

  • ローカル変数 (局所変数)
    スコープが関数の中に限られている変数は「ローカル変数 (局所変数)」と呼ばれる。関数の中で宣言した変数はローカル変数。
    ローカル変数は、その関数の中でだけ使うことができる。他の関数からは直接アクセスできない。
  • グローバル変数 (大域変数)
    関数の外側で宣言された変数は「グローバル変数 (大域変数)」と呼ばれる。
    グローバル変数は、複数の関数から直接アクセスできる。
  • グローバル変数を使う上での注意点
    ・プログラムのどこで値を書き換えているのかがわかりにくくなる
    ・間違えて値を書き換えてしまう
    ・グローバル変数と同じ変数名の、ローカル変数を宣言することができ、これが意図しない動作を引き起こす原因になることがある

#06:swap関数をつくろう

  • 関数に値を渡す (値渡し)
    関数を呼び出すとき、引数に変数を指定すると、値のコピーが渡される。
    関数に引数として値を渡す方法は「値渡し (pass by value)」と呼ばれる。
    • 値渡しでは、引数として渡した変数そのものの値を書き換えることができない。
  • 関数にポインタを渡す (ポインタ渡し)
    関数に引数としてポインタを渡す方法は、値渡しに対して、「ポインタ渡し (pass by pointer)」と呼ばれることがある。
    • swap 関数などの変数そのものの値を書き換える関数は、ポインタ渡しによって実現できる。

#07:関数の引数で配列を受け取ろう

  • 引数で受け取った配列を書き換えられる理由
    • a 変数を渡しただけで配列の要素を書き換えられた理由は、a 変数が「配列の先頭の要素のポインタ」に読み替えられるため。

認定証



学習ステータス

ここでも昇格はなかったな。



paizaラーニング『C言語入門編6: 多次元配列を理解しよう (全9回)』を受講してみた

2021-02-06 21:46:17 | paiza

『C言語入門編6: 多次元配列を理解しよう (全9回)』


メモ

#05:ドット絵を表示させよう

  • 条件演算子 (三項演算子)
    (条件式) ? (式1) : (式2)
    • 条件式が成立するとき、式1 の値が返される
    • そうでないときは、式2 の値が返される

#08:2次元配列で地図をつくろう - その2

  • 論理演算子 (OR, AND)
    OR 演算子は「||」、AND 演算子は「&&」
    • OR 演算子は 2 つの条件のどちらかが成り立つとき「真」
    • AND 演算子は 2 つの条件の両方が成り立つとき「真」

#09:標準入力から2次元配列のデータを読み込もう

  • 2 次元配列のように使える領域 (n × m の領域) は次のように確保できる

    int **enemy_image;
    enemy_image = malloc(sizeof(int *) * n);
    for (int i = 0; i < n; i++) {
     enemy_image[i] = malloc(sizeof(int) * m);
    }
  • free で領域を開放する

    for (int i = 0; i < n; i++) {
     free(enemy_image[i]);
    }
    free(enemy_image);
  • scanf
    scanf に変換指定子の「%s」や「%d」を使うと、標準入力から空白文字で区切られたデータを 1 つずつ読み込むことができる。
    • ※ scanf は便利な関数ですが、以下のような問題点が指摘されています。
      ・「%d」を使ったとき: 数値以外が入力されると、そのデータは読み込まれず、標準入力のストリーム上に残ってしまう。
      ・「%s」を使ったとき: 用意した配列よりも長い文字列が入力されると、配列の領域を超えてデータが書き込まれてしまう。

      このような問題点を回避するため、 fgets と sscanf の使用が推奨される場合があります。
※ そうだった!fgetsよりもscanfの方が馴染みある。でも、問題があるんだな。納得!!

認定証



学習ステータス

昇格はなかった