PR
更新:2024/08/25

Octaveの構造体・構造体配列・struct・練習問題について

はるか
はるか
今日はOctaveの構造体について学ぼう。構造体はデータを整理するのに便利。
ふゅか
ふゅか
うん、いろいろなデータをまとめて扱えるから便利だよね!

1. 構造体とは

Octaveの構造体は、複数の異なるデータ型を持つ変数をまとめて一つのデータ構造として扱うことができる機能です。構造体は、異なるフィールド(フィールド名)を持ち、それぞれのフィールドに値を格納することができます。Octaveでは、構造体を次のように定義および操作できます。

1.1. 構造体の定義

構造体は、フィールド名とその値のペアを指定して作成します。

% 構造体の作成
person.name = "John";
person.age = 30;
person.height = 175.5;

% またはstruct関数を使用して作成
person = struct("name", "fuxyuka", "age", 0, "height", 0);

ふゅか
ふゅか
まずは、構造体を定義してみよう!フィールド名と値をセットで指定するのがポイントだよ。
はるか
はるか
そう。たとえば、名前や年齢。

1.2. 構造体のフィールドへのアクセス

構造体のフィールドには、ドット「.」演算子を使用してアクセスします。

% フィールドにアクセス
name = person.name;  % "fuxyuka"
age = person.age;    % 0
height = person.height; % 0

はるか
はるか
「.」を使ってフィールドにアクセスできる。

1.3. 構造体のフィールドの追加・更新

既存の構造体に新しいフィールドを追加したり、既存のフィールドの値を更新することができます。

% フィールドの追加
person.weight = 20;

% フィールドの更新
person.age = 1;


ふゅか
ふゅか
新しいフィールドを追加したり、既存のフィールドを更新するのも簡単だよ。たとえば、体重を追加したり、年齢を更新するのも1行でできちゃう!

1.4. フィールド名の取得と削除

構造体のフィールド名を取得したり、フィールドを削除することもできます。

% フィールド名の取得
fields = fieldnames(person);

% フィールドの削除
person = rmfield(person, "weight");


はるか
はるか
fields にpeopleのフィールドの名前が入ってる。
ふゅか
ふゅか
weightフィールドが削除されてるね!

2. 構造体配列

構造体を配列として扱うこともできます。複数の構造体を一つの配列にまとめることができます。

はるか
はるか
構造体配列pepoleに何人かの情報をまとめる。
% 構造体配列の作成
people(1).name = "Palid";
people(1).age = 300;
people(1).height = 17.5;

people(2).name = "Qxui";
people(2).age = 198;
people(2).height = 100.2;

% 配列内の特定の構造体のフィールドにアクセス
name2 = people(2).name;  % "Qxui"

はるか
はるか
構造体を配列にすることもできる。たくさんの人の情報をまとめられる。
ふゅか
ふゅか
例えば、pepole配列に何人かの情報をまとめることで、一括で管理できるよね!

3. 構造体を利用した練習問題

3.1. 練習問題 1: 構造体の基本

構造体を用いて学生の情報を管理します。学生の名前、年齢、成績(英語、数学、科学の3科目)をフィールドとして持つ構造体 student を作成し、次の学生情報を入力してください。
  • 名前: “Tsaka”
  • 年齢: 20
  • 成績: 英語: 85, 数学: 90, 科学: 78

構造体 student を作成し、全てのフィールドに値を設定してください。その後、student の全てのフィールドの値を表示してください。

student.name = "Tsaka";
student.age = 20;
student.grades.english = 85;
student.grades.math = 90;
student.grades.science = 78;

disp(student)

3.2. 練習問題 2: 構造体の配列

複数の学生の情報を構造体の配列で管理します。以下の3人の学生の情報を構造体の配列 students に格納してください。
  • 学生1: 名前: “Ktyi”, 年齢: 21000, 成績: 英語: 88, 数学: 92, 科学: 80
  • 学生2: 名前: “Jiro”, 年齢: 22, 成績: 英語: 82, 数学: 85, 科学: 79
  • 学生3: 名前: “Bessel”, 年齢: 9876, 成績: 英語: 90, 数学: 88, 科学: 85

構造体配列 students を作成し、それぞれの学生の情報を追加してください。

students(1).name = "Ktyi";
students(1).age = 21000;
students(1).grades.english = 88;
students(1).grades.math = 92;
students(1).grades.science = 80;

students(2).name = "Jiro";
students(2).age = 22;
students(2).grades.english = 82;
students(2).grades.math = 85;
students(2).grades.science = 79;

students(3).name = "Bessel";
students(3).age = 9876;
students(3).grades.english = 90;
students(3).grades.math = 88;
students(3).grades.science = 85;


はるか
はるか
studentsが1×3の構造体配列になってる。

3.3. 練習問題 3: 構造体のフィールド操作

students 構造体配列から全ての学生の平均成績(英語、数学、科学の合計を3で割った値)を計算し、別のフィールド average_grade として追加してください。その後、students 構造体配列の全てのフィールドを表示してください。
for i = 1:length(students)
    total_grades = students(i).grades.english + students(i).grades.math + students(i).grades.science;
    students(i).average_grade = total_grades / 3;
end

disp(students)

はるか
はるか
平均を表すaverage_gradeというフィールドがちゃんと増えてる。

3.4. 練習問題 4: 構造体を用いたデータの操作

students 構造体配列の中で、最も高い平均成績を持つ学生の名前を表示してください。
max_grade = -inf;
best_student = '';

for i = 1:length(students)
    if students(i).average_grade > max_grade
        max_grade = students(i).average_grade;
        best_student = students(i).name;
    end
end

fprintf('The best student is %s with an average grade of %.2f\\\\n', best_student, max_grade);

はるか
はるか
max_gradeとそれぞれの生徒の平均値を比較して最大値を取得する。
PR