見出し画像

(答案提出)C言語教室 第16回 - 構造体あれこれ

今回の課題は、シンプルに見えて、なかなか捻っていると感じました。

課題

商品コードと価格をメンバ変数に持つ構造体を定義して、この構造体の配列を作成し、適当な内容を設定してから、この構造体配列の内容を出力するような関数を書きなさい。

https://note.com/kazushinakamura/n/nec7d4499dbc7

答案作成上のポイント整理

  • 構造体のメンバ変数である商品コードは、文字列となる可能性が高い
    (文字列、つまり文字の配列)

  • 構造体自体を配列とする必要がある

  • 構造体配列を関数に参照渡しして処理する必要がある

、、、むむむ、かなりハードルが高い、、、。

答案

#include <stdio.h>

struct product {
    char *code;
    int price;
};

int print_product(struct product *p) {

  if (p[0].code == NULL) {
    return -1;
    break;
  } 

  for (int i = 0; p[i].code != "End of data"; i++) {
    printf("%sは、%d円です\n", p[i].code, p[i].price);
  }
  return 0;
}

void main(void) {
  struct product p1[3];
  
  p1[0].code = "うまい棒_001";
  p1[0].price = 12;
  p1[1].code = "うまい棒_002";
  p1[1].price = 10;
  p1[2].code = "End of data";
  p1[2].price = 0;

  print_product(&p1);
}

構造体のメンバーを参照するときにp->codeというような書式だと、構造体が配列の場合に配列の要素を指定する方法がわかりませんでした。
また、ブラウザ環境では、構造体を定義する時点で初期値を設定しようとするとエラーとなってしまいました。


実行結果

うまい棒_001は、12円です
うまい棒_002は、10円です

ふ〜、やっと動いた。

、、、どうでしょうか?


解答(2023.3.10)

追記(2023.03.15)

kznさんから、p->codeの書式の使い方についてアドバイスをいただきました。成る程、p++で次のレコードにポインタを進めることができたんですね。勉強になります。ありがとうございました。修正版はこちら---> lesson16.c(削除済み)

追記(2023.03.30)

Ayumiさんから、ループ処理についてご指導いただきました。確かにこの方がスッキリしますね。clangコンパイラの警告にも極力対応しました。修正版はこちら---> lesson16_r1.c



ここまで読んでいただき、有難うございました。


これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。