選択肢があるクイズのプログラムを作成する

17 views (last 30 days)
竣 齊藤
竣 齊藤 on 19 Dec 2021
Commented: 竣 齊藤 on 19 Dec 2021
はじめに、OCR関数を用いて、英単語を読み取り、その英単語がallergy.xlsx内にあるかの判別を行います。順番に認識していき、英単語がallergy.xlsx内にあった場合、英単語と日本語訳とイラストに番号をつけていきます。次に、選択肢のランダムで3つ選びます。(このとき重複しないようにします。)その後、3つの中から答えとなるものを選びます。最後に問題を出題し、選択肢がイラストで表示されるようにします。
img = imread('C:\Users\shun_\OneDrive\デスクトップ\研究室2\成分表示.jpg');
results = ocr(img);
Ninshikimoji = lower(results.Words);
Ninshikiwaku = results.WordBoundingBoxes;
Jisho = readtable('allergy.xlsx','ReadRowNames',true);
word = categorical(Jisho.word);
Mininshiki = blanks(0);
m = 0;
for n = 1:size(Ninshikimoji,1)
if any(word == Ninshikimoji{n})
Shoukai = Jisho{Ninshikimoji{n},:};
img = insertObjectAnnotation(img,'rectangle',Ninshikiwaku(n,:),Shoukai{:},'font','Yu Gothic Bold');
%img = insertText(img,Ninshikiwaku(n,[1 2]),Shoukai{:},'font','fonts-japanese-gothic','AnchorPoint','LeftBottom');
x = Ninshikiwaku(n,1); y = Ninshikiwaku(n,2); w = Ninshikiwaku(n,3); h = Ninshikiwaku(n,4);
logo = imresize(imread([Shoukai{:} '.png']),0.3);
img(y:(y+size(logo,1)-1),(x+w):(x+w+size(logo,2)-1),:) = logo;
m = m+1;
tango{m} = word;
moji{m} = Shoukai;
fig{m} = logo;
else
Mininshiki = [Mininshiki ' ' Ninshikimoji{n}];
end
end
n = 1;
while n < 4
a{n} = randsample(m,1);
if not(a{1}==a{2} & a{2}==a{3} & a{1}==a{3})
n = n+1;
else
return
end
end
b = a{1};
c = a{2};
d = a{3};
t = 1;
while t < 2
n = randsample(3,1);
if n == 1
f = a{n};
elseif n == 2
f = a{n};
elseif n == 3
f = a{n};
end
t = t+1;
end
txt = [tango{f},'のいみをえらんでください '];
answer = questdlg(txt, ...
'選択肢', ...
fig{b},fig{c},fig{d},fig{f});
switch answer
case fig{b}
if fig{b}==fig{f}
disp(['せいかい!'])
else
disp(['はずれ・・・。せいかいは、',fig{f}])
end
case fig{c}
if fig{c}==fig{f}
disp(['せいかい!'])
else
disp(['はずれ・・・。せいかいは、',fig{f}])
end
case fig{d}
if fig{d}==fig{f}
disp(['せいかい!'])
else
disp(['はずれ・・・。せいかいは、',fig{f}])
end
end
プログラムは作成してみたのですが、様々なエラーが出てしまいました。
今回ご教授して頂きたい点は、プログラムを実行するために必要な修正箇所です。
ご教授の程よろしくお願いいたします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 19 Dec 2021
ざっと見て指摘事項が沢山あります。まだあると思います。
プログラムを細かく分けて、
  • やりたい事通りに書けているか
  • やりたい事通に動くか
を少しずつ確認していく必要があります。
  • このプログラム内でセル配列:aが初めて出現するのであればアクセスする前にサイズを宣言する必要があります
a = cell(3,1); % aにアクセスする前に追加。https://jp.mathworks.com/help/matlab/ref/cell.html
  • return文を実行するとプログラムまたは関数を終了します。ループを抜ける意図ならbreak文に変更してください
  • questdlg関数の選択肢として画像を入力する事は出来ません。選択肢及び正解に画像を用いるのではなく文字列を用いる事を提案致します質問ダイアログ ボックスの作成
  • questdlg関数に選択肢3つと正解の計4つ入力していますが、最後の入力は既定のボタン(defbtn)で、ユーザーがダイアログ ボックスでボタンをクリックする代わりにキーボードの Return キーを押した場合にMATLABがこの入力を選択します。つまりReturn キーを押すと勝手に正解が選択されてしまう事になり、おそらく意図しない動作となります
  • 2番目のwhile文でイテレータ(t)をループ内で使用していません。動作は変わりませんがwhile文よりfor文を使うべきです
  • 2番目のwhile文自体不要ではないでしょうか。「ランダムな添字の値を他変数へ代入」を繰り返す意図が不明です。
  • 下記のif文を使う意図が不明です。3分岐共実行内容が同じなので、if文が有っても無くても同じです
if n == 1
f = a{n};
elseif n == 2
f = a{n};
elseif n == 3
f = a{n};
end
  • 同様にswitch文を使用する意図が不明です。正解を判定するのにswitch文は不要です。
answer = questdlg(txt, '選択肢', fig{b},fig{c},fig{d},fig{f});
if answer==fig{f}
disp(['せいかい!'])
else
disp(['はずれ・・・。せいかいは、',fig{f}]) % これだけで良いと思います
end
  1 Comment
竣 齊藤
竣 齊藤 on 19 Dec 2021
ご教授して頂きありがとうございます。

Sign in to comment.

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!