更新: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