質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

9513閲覧

テーブル要素を使った九九表の作り方に関する質問

ayaChi

総合スコア10

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/06/02 02:48

編集2019/06/02 02:54

学校のプログラミング課題で、
JavaScriptのfor文を使って
九九表を完成させろというものがありました。

JavaScript

1<script> 2 3 document.write("<center>"); 4 document.write("<h1>九九の表</h1>"); 5 document.write("<table border>"); 6 7 for( let i=1; i<=9; i++){ 8 document.write("<tr>"); 9 for(let j=1; j<=9; j++){ 10 document.write("<td>",i*j,"</td>"); 11 } 12 document.write("</tr>"); 13 } 14 document.write("</center>"); 15 document.write("</table border>"); 16</script>

九九を作る時、
for文の中にfor文を書くという
発想は分かるのですが、

上記のコードを見て、
1回目のfor文の中の処理に<tr>と書くだけで
ループしてるiの中身が表示される
理由がよく分かりません。
私は、document.write("<tr>${i}</tr>");
と書くのかなと思いました。

また、1〜9のループを作る箇所は、
縦列1〜9、横列1〜9の二箇所あると思ったのですが、なぜ1〜9を一個作るだけで 縦と横の端っこの列に両方表示されるんですか?

2回目のfor文のループで

<td>の中(つまりセルの中)に i *jの結果を挿入するのは分かるんですが、 それ以外が全体的によく分かりません。

大変初歩的な質問をして申し訳ないのですが、初心者のため、平易な言葉でご説明していただけると、とてもありがたいです。

よろしくおねがい致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

1回目のfor文の中の処理に<tr>と書くだけで
ループしてるiの中身が表示される
理由がよく分かりません。
私は、document.write("<tr>${i}</tr>");
と書くのかなと思いました。

最終的に出力しようとしている、テーブルの記法を正確に理解出来ていないんだと思います。
この課題ではJavaScriptはあくまで目標のHTMLを出力するための手段なので、ゴールとなるHTML(tableタグで記述された九九の表)を把握していることが大前提です。

まずはJavaScriptを使わずにテーブルを自力で書いてみることを強くお勧めします。

また、1〜9のループを作る箇所は、
縦列1〜9、横列1〜9の二箇所あると思ったのですが、なぜ1〜9を一個作るだけで 縦と横の端っこの列に両方表示されるんですか?

行(横列)を9個縦に並べているので、自動的に縦列も作られるためです。
二箇所に分けて記述することも可能ですが、複雑な記述になります。

投稿2019/06/02 03:37

編集2019/06/02 05:58
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayaChi

2019/06/02 23:04

昨日、テーブルについて勉強しました。テーブルを自分で書いたことがありませんでしたので。提言してくださって、ありがとうございました。勉強になります。 また、縦列を書いたら横列が自動的に作られるというのがあまり理解できなかったのですが、一体どういう仕組みになっているのでしょうか。 もしご存知でしたらご教示いただけると、ありがたいです。
tanat

2019/06/03 00:14

>また、縦列を書いたら横列が自動的に作られるというのがあまり理解できなかったのですが、一体どういう仕組みになっているのでしょうか。 今回の場合は逆です。 行(横列)を積み重ねるとその厚みが列(縦列)になるよね。ということです。 これはhtmlは関係の無い単純な話で、例えば1から9の数字で構成される3x3の表を書くときは 一行目 123 二行目 456 三行目 789 と、書いて行ごとに書くと三行目を書き終わったタイミングでは結果として 123 456 789 という表が出来上がります。 行しか書いていないのに、 147,258,369という列も出来ています。
guest

0

念の為、for文の中にfor文を書いた時の動作の確認をしておきます。

for文1つ目開始 1周目: i=1 <tr>を表示 for文2つ目開始 1周目: j=1 <td>i*j</td>を表示 2周目: j=2 <td>i*j</td>を表示 ...9周目まで繰り返し(省略) for文2つ目終了 </tr>を表示 2周目: i=2 <tr>を表示 for文2つ目開始 1周目: j=1 <td>i*j</td>を表示 2周目: j=2 <td>i*j</td>を表示 ...9周目まで繰り返し(省略) for文2つ目終了 </tr>を表示 ...9周目まで繰り返し for文1つ目終了

以上で合計9×9の81回<td>i*j</td>が表示されます。

それでは、プログラムを実行して表示されるHTMLの完成図を見てみましょう。

html

1<center> 2<h1>九九の表</h1> 3<table border> 4<tr><td>1*1</td><td>1*2</td><td>1*3</td>... </tr> 5<tr><td>2*1</td><td>2*2</td><td>2*3</td>... </tr> 6<tr><td>3*1</td><td>3*2</td><td>3*3</td>... </tr> 7... 8</table border> 9</center>

これで察しが付けば感が鋭いです。

横方向は 11=1、12=2、13=3、... だから1~9が並び、
縦方向は
1
1=1
21=2
3
1=3
...
だから1~9が並ぶのです。

<tr>と書いたからではなく、<td>i*j</td>の結果1~9が並んだわけです。 (<tr>は表を表示する上で1行ずつをまとめるために使われているだけです。)

追記: 本題に比べて些細なことですが、修正箇所があります

  1. </center>の場所が違います。正しくは</table>の下です。

なぜか?: <center><table></table></center>とtableを囲っていなければいけないから
2. </table>の閉じタグにborderは不要です

正しくは下のとおりです。

js

1<script> 2 document.write("<center>"); 3 document.write("<h1>九九の表</h1>"); 4 document.write("<table border>"); 5 6 for( let i=1; i<=9; i++){ 7 document.write("<tr>"); 8 for(let j=1; j<=9; j++){ 9 document.write("<td>",i*j,"</td>"); 10 } 11 document.write("</tr>"); 12 } 13 document.write("</table>"); 14 document.write("</center>"); 15</script>

投稿2019/06/02 03:35

HAC

総合スコア118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayaChi

2019/06/02 05:40

分かりやすい解説ありがとうございます。 for文の中のループを書いてくださったことで頭が整理されました。 ひとつ気になったのですが、 2回目の繰り返し文の中の処理を document.write("<td>i *j</td>") とすると、 正しい結果は得られませんでした。 カンマで必ず区切らなければいけないものなのでしょうか…。
HAC

2019/06/02 06:43

はい、この区切りは必要です。 "" で囲って "<td>"と書くと、文字列とみなされ、そのまま出力され、 "" で囲わずに i*j と書くと、変数を使った計算が行われ、その計算結果が出力されます。 "<td>i*j</td>"とすると、ひとまとめの文字列とみなされて計算が行われません。 i*j i*j i*j ... という感じに文字が表示されてしまったはずです。 文字列と計算部分は分けて書きましょう
ayaChi

2019/06/03 00:01 編集

解説ありがとうございます。 "<td>",i *j,"<td>"だと、 " "で囲った中身が出力されるのかと思っていましたが、< >で囲われたものは、なにかしらのタグと見なされて 文字列だけど表示されないということでしょうか…。で、数値のi *jのみ出力されるということですかね…! 例えばなんですけど、 `<td>${i *j}</td>`と書いても問題ないですか? 重ね重ねすみませんが、 いま思ったのですが、 私が最初にあげた書き方だと 九九の表の1の段にあたる 部分がないなと思ったのですが、 例えば下記のような表にするとしたら [] 1 2 3 4 ... 1 1 2 3 4 ... 2 2 4 6 8 ... 3 3 ... (空白)を最初のマス(td)に手動で 表示させて、1〜9のループ(カウンター変数i)を一列目につくって そのあとの1〜9列(カウンタ変数jとする)の縦行(tr)を作るループのうしろに tdをi *jの形で表示したらいいのかな、、って思ったのですが、どう思われますか、、? 上手に説明出来てなくてすみません。 さきに示した表のように書くための 効率的なプログラムがあれば、 お手数ですが 教えていただけませんか。
x_x

2019/06/03 00:39

すみません、直接の回答ではないのでここにぶら下げさせてください 「HTML5」タグが付いていますが、HTML5 では center 要素は削除済みです。 出力場所を修正するよりも、出力しないようにしましょう。 https://developer.mozilla.org/ja/docs/Web/HTML/Element/center
HAC

2019/06/05 23:15

>ayaChiさま javascriptの基礎の理解はされていたみたいですね。 文字リテラルを使って`<td>${i *j}</td>`と書いても大丈夫です。 > < >で囲われたものは、なにかしらのタグと見なされて... はい、HTMLのタグとみなされて文字列としては表示されません。 「JavascriptがHTMLを生成」→「ブラウザがHTMLを解釈」→「表示」 という形なので、HTMLタグは直接表示には現れません。 <td></td>は表のセルを表すタグです。tableタグについて押さえておられないよなので、どこかで勉強されたほうがよいと思います。 > 下記のような表にするとしたら > [] 1 2 3 4 ... > 1 1 2 3 4 ... > 2 2 4 6 8 ... > 3 3 ... 不親切ですみませんが、効率的でなくてもよいので、一度自分の手で作ってみることをおすすめします。 その方がfor文への理解が深まると思うので。 その上でわからないことがあれば再度新たな質問を立てるのがよいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問