目次へ

練習問題1・指南編

[TODO:動物さん]

もうちょっとシンプルにかけるのかな。
#!C:\python26\python.exe
 
print "Content-Type: text/html"
print 
print """
<html>
<head>
<title>9 x 9</title>
</head>
 
<body>
<h1>
Times table 1 to 9
</h1>"""
 
#table for layout
print """<table border = "0">
<tr>"""
 
#table and header for each table
for i in xrange(9):
  print """<td>
         <table border = "1"><tr><td>"""
  print "%d times table" % (i+1)
  print "</td></tr>"
 
#table body
  for j in xrange(9):
    print "<tr><td>"
    print "%d x %d = %d" % ((i+1), (j+1), (i+1)*(j+1))
    print "</td></tr>"
 
  print "</table></td>"
 
print """
</tr></table>
</body>
</html>"""

お疲れ様です。筆者の環境でCGIとして動作させてみたところ、完全にうまく動くようでした。とても結構です。

<table>タグの配置が独特の入れ子式になっています。なるほど、と思いながら拝見しました。第一のループを「外側」、第二のループを「内側」と名づけつつ、それぞれのループ内で何を行ったかを確認してまいります。

外側のループ(変数iをループ値に使う)は、九九でいう「一の段」「二の段」という順番を表現しています。内側のループ(変数jをループ値に使う)が、ひとつの段についての九種類の掛け算を表示する部分ですね。このふたつのループがかみ合って、九九の表をつくりました。

ひとつの「段」を縦方向に伸ばそうとしたのですね。普通にtable構造を作ろうとすると、横方向に値をつらねていくのが普通ですから、なかなか縦伸ばしというのはやりにくい。そこで、tableのセルひとつの中に「子table」を入れ込むという技を使ってこれを実現しました。

もし、table構造に正直に、横に伸ばしながら同様の表を実現したければ、「段」のループを内側に持ってきてしまうというやりかたもいいかもしれませんね。下のコード片は、回答にいただいたものと同様の表示をするものを、ひとつのtableだけで表示するようにしてみたものです。CGI特有の前処理は省いていますけど。

段を示すループ変数を、明示的に dan なんて名づけてみました。

print '<table border="1">'
for i in xrange(9+1):
  print "<tr>"
  for dan in xrange(9):
    if i == 0:
      print "<td>%d times table</td>" % (dan+1)
    else:
      print "<td>%d x %d = %d</td>" % (dan+1, i, i*(dan+1))
  print "</tr>"
print "</table>"

最初のループに、xrange(9+1) なんて書いたのは、段のヘッダ表示を行いたいから、ループは全部で9回+1回分行います、というのを個人的にあとで思い出しやすくするためです。別に xrange(10) でも同じことなんですけどね。

別に模範回答というほどのものでもないですが、何か参考にできそうと思っていただければなら幸いですよ。

他にも何か書けたかたがいらっしゃいましたら、どうぞ~

 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki