広告
プログラミングって難しい!?
そんな事はありません!
Scratch(スクラッチ)を使えばカワイイキャラクター達と一緒にブロックを組み合わせるだけで簡単にプログラミングのキホンを学ぶことができます!
インターネットにつながるパソコンがあればすぐに始められますので「プログラミング授業の参考にしたい!」「まずは軽いプログラミングに触れてみたい!」などなどぜひ当サイトをご利用ください。
今回はたくさんの変数を一気に扱う事ができる「リスト」について学んでいきます。
ほとんどのプログラミング言語に「配列(はいれつ)」とか「Array(アレイ)」とかいう名前で用意されているとても大事なプログラミングテクニックの一つになります。
さっそくリストを作ってみます。
リストの場所ですが、「変数」ブロックの下の方「リストを作る」をクリックします。
普通の変数と同じように「すべてのスプライト用」か「このスプライトのみ」を選べるので使い方に合わせて作ってください。
名前は「くだものリスト」としました。
リストを作るとこんな感じで表示されます。
そしてリストをいじる為のブロックがどばっと表示されます。
それではリスト用のブロックを使っていろいろといじっていきましょう。
まずは空っぽのリストに何かを追加していきます。
「りんご、みかん、バナナ、すいか、マンゴー」と追加してみました。
実行すると・・・、
中身が入ったのが確認できましたね。
では一つだけ表示してみましょう。
スペースキーを押した時に一つだけ中身を表示します。
実行すると・・・、
指定した番号の中身が表示されましたね!
リストの中身を取り出したり表示したりするには「くだものリストの~番目」ブロックを使います。
そのまま旗を何回も押すとその分だけ中身が追加されてしまうので、プログラムの最初に「くだものリストのすべてを削除する」ブロックを使ってリストの中身を空っぽにしております。
ここからが本番です。
「繰り返し」と組み合わせる事によりリストの中身を一気に扱う事ができます。
ではやってみます。
カウントをする為の変数を一つ用意しておいてください。
リストに追加するトコロは一緒なので表示する部分だけを変更します。
実行すると・・・、
カンの良い方は気づいたかもしれませんが「くだものリストの~番目」に変数を使って指定すれば「繰り返し」でリストの中身を一気に処理する事ができます。
同じように内容を置き換えるブロックなどと組み合わせれば一気に中身を変更したりする事もできます。
もちろん数字でも大丈夫です。
あらためて数字用のリストを作成しておいてください。
プログラムになります。
実行すると・・・、
数字も問題なく扱う事ができました!
数字なので中身の数字を計算に使うことなどもできます。
こんな感じでたくさんの変数をグループ分けして一気に扱う事ができるのが「リスト」になります。
今回はわかりやすいように「くだもの」とか「数字」とかでグループ分けしましたが、別に数字と文章がまざっていても大丈夫です。
内容を変えてみましょう。
内容を変えるには「数字リストの~番目を~で置き換える」ブロックを使います。
実行すると・・・、
内容を変更する事ができました!
他にもリストの途中に新しい内容を追加したり、削除したりするブロックなどもあるのでこのへんは試してみてください。
指定する番号の事を少し難しい言葉で「添え字(そえじ)」と言ったりします。
最初のプログラムで言うと添え字2番目は「みかん」、添え字4番目は「すいか」とかそんな感じです。
そしてリストの中身一つ一つを「要素(ようそ)」と言います。
同じく最初のプログラムで言うと
添え字2番目の要素は・・・「みかん」
みたいな感じになります。
なんとなく覚えておきましょう。
広告
それではリストの使い方を工夫して7日目にやったクイズゲームをちょっとグレードアップしてみましょう。
問題の順番をランダムにして、一度出した問題は出さないようします。
答えは3択形式にします。
「問題用のリスト、答えの番号を入れる用のリスト、問題を出したかどうかを記録するリスト」の3つのリストを用意しておいてください。
「問題リスト」・・・問題を入れる用のリスト
「答えリスト」・・・3択の答えの番号を入れるリスト
「問題だしたフラグ」・・・問題を出したかどうかを記録するリスト
こんな感じで用意しました。
その他繰り返し用の変数などを使いますがそれはその時に追加していきます。
それではやってみましょう。
スペースの都合上プログラムを分けてのせますが、すべてネコちゃんのプログラムで大丈夫です。
問題と答えなどをそれぞれのリストに追加します。
ひとまず問題は3問だけにしました。
プログラムの仕組みがわかれば問題数は簡単に増やせますのでご安心ください。
「答えリスト」ですがここには3択の答えの番号を「問題リスト」の場所に合わせて入れていきます。
そして「問題だしたフラグ」に9日目にやった「りんごがまだあるか?ないか?変数」と同じような考え方で
リストの内容が「0」・・・まだ出されていない問題
リストの内容が「1」・・・もう出した問題
のように設定して問題の場所に合わせて「0」か「1」を入れていきます。
最初はどの問題も出てないのでもちろん全て「0」ですね!
問題数が大量になった時などは「繰り返し」を使って一気に「0」を入れていくのが良いでしょう。
実行すると・・・、
リストの中身はこんな感じになりますね。
問題をランダムに出題する前に、今作ったリストと「繰り返し」を組み合わせて問題を順番に出すというプログラムを作ってみましょう。
これができれば少しいじれば問題をランダムに出す事もできるようになります。
普通の変数で「出題された問題数をカウントする変数、現在「問題リスト」の何番目の問題が出ているのか?を記録する変数」の2つの変数を用意しておいてください。
そしてプログラムの頭に初期化を追加します。
「問題カウント」・・・出題された問題数をカウントします
「問題番号」・・・現在「問題リスト」の何番目の問題が出ているのか?を記録します
このように用意しました。
では問題を順番に出していきます。
さきほどのプログラムに追加してください。
まずは問題を3回「繰り返す」ので「問題カウントが3になるまで」の繰り返しを作ります。
そして繰り返しの中で問題を順番に出していきます。
変数「問題番号」を使って「問題リスト」から順番に出題しているだけなのですが、ここで「問題リスト」に合わせて「答えリスト」を作ったトコロがポイントになってきます。
こうする事で「問題リスト」と同じ番号の「答えリスト」を調べるだけで答えがわかるようになります。
あとは入力された「答え」とを比べて「正誤判定」をして変数「問題カウント・問題番号」をともに一つずつあげていけば順番に問題を出す事ができますね!
実行すると・・・、
問題が出されて・・・、
正解!
問題が出されて・・・、
残念!
問題を順番に出す事ができました!
変数の値に注目しながら実行してみてください。
では今のプログラムをちょこっと変えて問題をランダムに出題していきます。
「問題ok」という名前の変数を用意して中身を「no」という内容で初期化しておいてください。
ではメインテーマである「一度出した問題は出さないようにランダムに問題を出題する」部分のプログラムを説明します。
その問題を出して良いか?を判定する変数「問題ok」の内容が「ok」になるまで繰り返します。
問題をランダムに出題するのは「乱数」ブロックを使えば解決できますね!
あとはその問題が前に出されているのかをリスト「問題だしたフラグ」の内容で判断します。
「0」ならまだ出されていない、「1」なら前に出されている、でしたね。
まだ問題が出されていなければ「問題だしたフラグ」を「1」にして変数「問題ok」の内容を「ok」にすれば繰り返しを抜けて次のブロックに進んで問題が出題されます。
そうでなければ、つまり一度出した問題だった場合は頭に戻って再度問題番号をランダムに取得すればそのウチまだ出されていない問題番号にたどり着くという仕組みになります。
シンプルなプログラムですが、100個、200個ぐらいなら順調に処理してくれます!(あまり多すぎるとたどり着くまでに時間がかかるようになるので注意です)
この部分をさきほどのプログラムの途中「問題カウントが3になるまで」の先頭に加えて・・・、
プログラムの後半をちょっと変えれば
ランダムに問題を出題するプログラムの完成です!
実行して「問題番号」と「問題だしたフラグ」の中身を見てみると・・・、
問題を出した場所が「1」に変更されるのが確認できますね!
出題されて・・・、
残念!
問題がランダムに出題されるようになりました!
さきほどのプログラムで問題数が増えた場合にまだ出していない問題を探すのにどのぐらい時間がかかるのかを実験したプログラムを作ってみました。
コメントの部分の数字をテストしたい回数に全て同じ数で変更してください。
タイマーというのはプログラムを開始した瞬間から時間を計ってくれる便利な変数になります。
「調べる」ブロックにあります。
それではリストの要素数を「30000」個にして実行してみます。
結果は・・・、
「18.21秒」
まあまあな時間ですね!
ちなみに
1000個だと・・・0.67秒
10000個だと・・・6.27秒
100000個だと・・・151.91秒
ぐらいの時間でした。
要素数1000個ぐらいまでは使えそうですね!
リストはプログラムを組む上でスゴイ大事なテクニックです。何回も練習して身につけましょう!
広告
Copyright 2016 K.N/petitetech.com