正しいパスワードなのにログインできない? Scratchの授業で見つけた「増え続ける空白」の謎
正しいパスワードを入力したのに……
Scratchの授業で、掲示板アプリを制作していたときのことです。
生徒がログイン機能の動作確認を行ったところ、正しいパスワードを入力しているはずなのに、「パスワードが間違っています」と表示される問題が発生しました。
入力内容を確認しても、間違っているようには見えません。
では、プログラムは一体何と比較しているのでしょうか?
原因を調べていくと、Scratchの「リスト」に思いがけない問題が見つかりました。
ログインの仕組みは「リスト」で管理
今回の掲示板アプリでは、Scratchの「リスト」という機能を使って、アカウント名とパスワードを管理しています。
リストとは、複数のデータを番号順に保存できる仕組みです。
例えば、次のように情報を登録します。
| 番号 | アカウント名 | パスワード |
|---|---|---|
| 1 | user01 | apple123 |
| 2 | user02 | orange456 |
| 3 | user03 | grape789 |
※説明用の架空のデータです。
ログインするときは、まず入力されたアカウント名が何番目にあるかを調べます。
そして、パスワードリストの同じ番号に保存された文字と、入力されたパスワードを比較します。
つまり、アカウント名が3番目なら、パスワードも3番目を確認する仕組みです。
この方法では、2つのリストの順番が正しく対応していることが重要になります。
プログラムは正しいのに、ログインできない?
原因を調べるため、生徒のScratchプロジェクトファイルを教材の完成図と比較しました。
すると、アカウント作成とログインのブロックは、どちらも完成図どおりに組み立てられていました。
少なくとも、保存された時点のプログラムには、教材との違いが見つからなかったのです。
そこで、今度はリストに保存されているデータを詳しく調べてみました。
すると、次のような状態になっていました。
- アカウント名のリスト:6件
- パスワードのリスト:20件
パスワードのリストだけ、14件も多かったのです。
しかも、先頭の14件には、空欄やスペースだけが保存されていました。
本来のパスワード6件は、その後ろの15〜20番目に並んでいたのです。
例えば、6番目のアカウントでログインしようとすると、プログラムはパスワードリストの6番目を確認します。
しかし、そこに保存されているのはスペースだけ。
これでは、正しいパスワードを入力しても一致しません。
入力が間違っていたのではなく、プログラムが参照する位置に正しいパスワードが保存されていなかったのです。
空白の数に不思議な規則を発見
では、なぜパスワードリストに14件もの空白が保存されていたのでしょうか。
さらにファイルの内部を調べると、興味深いことがわかりました。
空白に見える項目には、次のような数のスペースが保存されていたのです。
| 項目 | 保存されていた文字数 |
|---|---|
| 1番目 | 0文字 |
| 2番目 | 0文字 |
| 3番目 | 1文字 |
| 4番目 | 3文字 |
| 5番目 | 7文字 |
| 6番目 | 15文字 |
| 7番目 | 31文字 |
| … | … |
| 14番目 | 4095文字 |
0、0、1、3、7、15、31……。
一見すると不思議な数字ですが、実は一定の規則で増えています。
新しい項目を追加するたびに、それまでの空白が組み合わさり、文字数がほぼ2倍になっていたのです。
原因は「変数」と「リスト」の取り違え?
Scratchには、「変数」と「リスト」という2つのデータを扱う機能があります。
変数は一つの値を保存するもの、リストは複数の値を順番に保存するものです。
今回の教材では、どちらにも「パスワード」という同じ名前が使われていました。
そのため、制作途中で「パスワード変数」と「パスワードリスト全体」のブロックを取り違えた可能性が考えられます。
例えば、パスワードリストに新しいパスワードを追加するつもりで、誤って「パスワードリスト全体」を同じリストに追加してしまった場合です。
Scratchでは、リスト全体を一つの値として扱う際、項目の間にスペースが入ることがあります。
この操作を空のリストから繰り返すと、空白の文字数が規則的に増えていきます。
実際に、この動きを14回繰り返して検証したところ、保存されていた14件と、スペースの数も並び順も完全に一致しました。
ただし、これはあくまで有力な仮説です。
保存されたファイルでは、すでに正しい「パスワード変数」のブロックが使われていました。
制作途中に取り違えがあり、その後ブロックを修正したとしても、過去の実行で追加されたデータはリストに残ります。
そう考えると、完成したプログラムが正しかったにもかかわらず、ログインできなかったことを説明できます。
実際にどの操作で14件が追加されたのかまでは、保存されたファイルから特定できていません。
リストをリセットして問題を解決!
今回の授業では、アカウント名とパスワードのリストをいったんすべてリセットし、正しい順番で登録し直すことで問題を解決できました。
また、元のファイルについても、余分な14件を取り除き、両方のリストが6件ずつ対応する修正版を作成しました。
修正版では、保存されたデータの内容と順番が正しいことを確認しています。
ここで注意したいのが、Scratchでは緑の旗を押しても、リストの中身が自動的に消えるわけではないという点です。
今回のプログラムでも、緑の旗を押すと変数は初期化されますが、リストの中身はそのまま残る仕組みになっていました。
つまり、制作途中で間違ったデータが追加されると、ブロックを正しく修正したあとも、そのデータが残り続けることがあります。
今回のように、プログラム自体は正しくても、以前の実行結果が原因で不具合が発生する場合があるのです。
エラーの原因を探すことも大切な学び
今回の問題は、保存時点のプログラムが教材どおりに作られていたにもかかわらず、リストに残ったデータのずれによって発生していました。
同じような問題が起きたときは、次の点を確認してみましょう。
- プログラムがリストの何番目を参照しているか。
- その番号には、実際に何が保存されているか。
- 複数のリストの件数や順番が一致しているか。
- リストに追加するブロックが、意図した変数や値を使っているか。
特にScratchでは、変数とリストに同じ名前を付けることもできるため、どちらのブロックを使用しているか確認することも大切です。
今回の事例では、リストのずれを調べたことから、空白の文字数に隠れた規則まで発見できました。
プログラミングでは、思い通りに動かないことも珍しくありません。
しかし、エラーが出たときこそ、プログラムの動きやデータの仕組みを理解する機会になります。
「なぜ動かないのだろう?」と考え、一つずつ原因を調べていく。
こうした試行錯誤も、プログラミング学習で育てたい大切な力の一つです。


体験会詳細
お問い合わせ
