重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

はじめまして。
どうぞよろしくお願いいたします。

JavaScriptを勉強中のプログラミング初心者です。

「1~10までの足し算の和をブラウザに書き出す」という処理を、
do~while文 と
for文 で試しています。

--------------------------------------------------------
// do~while文を使った場合

s=i=0;
do {
++i;
s=s+i;
} while(i < 10);
document.write("1から", i , "までの和は", s );

--------------------------------------------------------
// for文を使った場合

s=i=0;
for(i=0; i<=10; i++) {
s=s+i;
}
document.write("1から", i-=1 , "までの和は", s );

--------------------------------------------------------
ブラウザ表示結果:
1から10までの和は55
--------------------------------------------------------

それぞれ【変数i】の条件式を
「i<10;」、「i<=10;」に変えることで、計算としては同様の結果を得られるのですが、

for文では、末尾処理「i++」が実行されてしまう為、
書き出されるdocument.writeで
『1から11までの和は55』と表示されてしまいます。
そこで、無理くり(i-=1)にして『10』にしております。

このような不自然(?)な記述でなく、回避する方法がありましたら
何卒ご教示くださいませ。
散文失礼いたしました。どうぞよろしくお願いいたします。

質問者からの補足コメント

  • お世話になります。
    いくつかの回答をいただいた後の補足で申し訳ありません。

    最初に書くべきだったのですが、

    今回のサンプル文(do~while文)は、書籍に掲載されていたもので、
    同じ結果になるよう「for文でもできないか」という勉強で試している為、
    そもそもの条件式などが、本来よりもあまりスマートではないかも知れません...

    素人なもので説明不足で申し訳ありません。
    同箇所において、ちょっとした記述の変換でどう変わるか、を知りたく、
    質問させていただきました。

    引き続きどうぞよろしくお願いいたします…!

      補足日時:2021/03/11 15:48

A 回答 (7件)

こんにちは



>for(i=0; i<=10; i++) {
正確には 0から10までループしています。
ですので、「1~10の和」ではなく、「0~10の和」が実際に行われていることと言えます。

ループを抜けた際にカウンタがインクリメントされているのは仕様なので仕方がありません。
ですので、そのままやるのなら、-1するしかありませんけれど、
>i-=1
はチョットわかりにくいので、素直に i - 1 とするか、--i とするかでしょうか。
 document.write("1から", i-1 , "までの和は", s );
 document.write("1から", --i , "までの和は", s );

>このような不自然(?)な記述でなく
値が変化するカウンタの値をループ外で(ループ内ではなく)参照しようとするところにそもそもの気持ち悪さの原因があるのではないでしょうか。
範囲を示す変数として、ループの上限値を別の変数で保持しておけば、ループ外でカウンタの値がどうなっていようとも、関係なく元の値を参照できます。

s = 0, max = 10;
for(i = 1; i <= max; i++) {
s = s + i;
}
document.write(`1から${max}までの和は${s}`);
    • good
    • 0
この回答へのお礼

毎度お世話になっております。
このたびも、丁寧なご教示ありがとうございました…!

他の方からも色々ご回答をいただいたのですが、
まずは(正誤抜きで)元の構文をいちばん活かした形でのご回答をいただきましたので、ベストアンサーに選ばせていただきました^^

本当にありがとうございました。

お礼日時:2021/03/15 14:29

幾つか指摘しておくと


①do~whileはループ継続条件を冒頭でチェックしないので
滅多に使われない。忘れてもかまわないくらいの構文です。
②ループ処理の冒頭でループ継続条件を壊すのは原則として
してはいけないこと。ループがわかりにくくなります。
③できれば、inclusive-exclusiveなループ範囲の指定方法も覚えて欲しい

i=1~nを処理するなら
for(i=1; i < n+1; i++) {
・・・・
}

inclusive-exclusiveなループ範囲の指定方法はCやpythonの定番の
範囲指定方法なので、知らないとけっこう困ります。

④何が自然かは熟練者が述べていい事。右も左もわからない初心者は何が自然かを学ぶことからはじめましょう。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
このたびは複数ご教示くださりありがとうございました。

プログラミングに関しては完全に初心者で
どの言語が何にどう使われているのかなども含めて勉強中です;
質問の内容が面倒で申し訳ありません。

いろいろな技法を教えてくださりありがとうございます!
入門本にまだ出現していないことは未知すぎるのですが
基本から引き続き勉強を頑張っていきますね。

ありがとうございました!

お礼日時:2021/03/15 13:54

> 今回のサンプル文(do~while文)は、書籍に掲載されていたもので、


同じ結果になるよう「for文でもできないか」という勉強で試している為、
そもそもの条件式などが、本来よりもあまりスマートではないかも知れません...

まぁ、発想は良いでしょう。
で、結局 #5 でも書きましたけど、ハッキリ言って「構文がどうの」と言うより「考え方がどうの」って問題です。
do〜whileで書ける書き方をforで行いたい場合、同じ発想で書けば良いだけ。
そもそもfor文自体はC由来ですが、割とこう・・・デタラメっつーか、そこまで強制的に☓☓と書きなさい、とか言うような文でもないんですよね。
極端に言うと、例えば、

while (1) { ... }

と言う書き方と

for(;;) { ... }

と言う書き方は互換性があります。
そういうのを利用すれば良い(個人的には好きじゃないですけど)。

--------------------------------------------------------
// do~while文を使った場合

s=i=0;
do {
++i;
s=s+i;
} while(i < 10);
document.write("1から", i , "までの和は", s );

--------------------------------------------------------

ならそれをそのまま置き換えれば良いだけ、です。

s = i = 0;
for(; i < 10;) {
 ++i;
 s += i
}
print("1から", i, "までの和は", s); // printはRhino/V8依存

forは見た通りに「脱出条件」だけ記入しておいて、他を空欄にしておく事が可能なので、do { ... } while(i < 10)で書いた構造をそのまま持ってきても大丈夫でしょう。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
このたびは複数のご教示をありがとうございました。

for文で、(初期設定、条件式、カウンタの増え方)を分けて書いて良いことすら知りませんでした;;
基本もなかなか理解できていないので、応用までは遠い遠い道のりです^^;

慣れてこれば、自分なりにどう解釈できるかも変わってくる(と期待しつつ)、引き続き頑張りたいと思います。

このたびはありがとうございました!

お礼日時:2021/03/15 14:00

こういう事、とか?



// ここから

s = i = 0
for (i = 0; i < 10;) {
 ++i;
 s += i
}
print("1から", i, "までの和は", s, "\n"); // print は Rhino 依存

// ここまで

でもそもそも、関数化してるわけでもないし、10は固定されて変更されてないわけで、

> "1から", i-=1 , "までの和は", s

って1もfixedされてるなら、別に10をiから引っ張ってくる必要性も実はないんですよねぇ。
要するに、実際は、

> "1から10までの和は", s

って10自体も埋め込んじゃっても、この程度のコードなら何も問題ないわけです。
    • good
    • 0

do while はループ継続条件が i < 10 なのに i=0~10の計算が


されるのはとても不自然だし、

ループ条件を外れたのだからループを抜けてきたのに
for を抜けてきた時点で i=10 を期待するのもとても不自然。
言語機能にたいする感覚がずれていると思います。

var n = 10

s=i=0;
for(i=0; i<=n; i++) {
s=s+i;
}
document.write("0から", n , "までの和は", s );

こんな感じで素直なコードを書きましょう。
    • good
    • 0

何が言いたいのか解りませんが1から11までの和は66で1から10までの和は55で正解だと思いますよ


つまり
s=0, i=0;
for(i=0; i<=10; i++) {
s=s+i;
}
の結果は55になります
javascriptを知らないのでC言語での結果です
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
このたびはご教示くださりありがとうございました。

計算の結果をそのまま表現する文脈自体も難しいですね><
まで、とか、以下、などなど…;

ありがとうございました!

お礼日時:2021/03/15 14:01

> s=i=0;



iはfor文で初期値設定をするので s-0; でOK


> for(i=0; i<=10; i++) {
> s=s+i;
> }

一つ目の方法は

for(i=0; i<10; i++)
{
s = s + (i + 1);
}

これで0+1+1+ ・・・というループではなく1+2+3+・・・というループになる。
ここは s = s + (i + 1); は意味を示すためあえてカッコ付とした。

もう一つは

s = j = 0;
for(i=0; i<=10; i++)
{
s = s + i;
j = j + 1;
}
document.write("1から", j , "までの和は", s );

とりあえずこんな感じで。
参考まで。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません!
(いただいた回答を順に試しておりました…;)
このたびはご教示くださりありがとうございます。

「s = s + (i + 1);」で「1+2+3+…」にするというのが
勉強になりました。

奥が深いですね…!@_@;
もともと苦手な分野だけに、単純なことほど解らなくなってしまいます。

本当にありがとうございました!

お礼日時:2021/03/15 13:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!