はじめまして。
どうぞよろしくお願いいたします。
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』にしております。
このような不自然(?)な記述でなく、回避する方法がありましたら
何卒ご教示くださいませ。
散文失礼いたしました。どうぞよろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
こんにちは
>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}`);
毎度お世話になっております。
このたびも、丁寧なご教示ありがとうございました…!
他の方からも色々ご回答をいただいたのですが、
まずは(正誤抜きで)元の構文をいちばん活かした形でのご回答をいただきましたので、ベストアンサーに選ばせていただきました^^
本当にありがとうございました。
No.7
- 回答日時:
幾つか指摘しておくと
①do~whileはループ継続条件を冒頭でチェックしないので
滅多に使われない。忘れてもかまわないくらいの構文です。
②ループ処理の冒頭でループ継続条件を壊すのは原則として
してはいけないこと。ループがわかりにくくなります。
③できれば、inclusive-exclusiveなループ範囲の指定方法も覚えて欲しい
i=1~nを処理するなら
for(i=1; i < n+1; i++) {
・・・・
}
inclusive-exclusiveなループ範囲の指定方法はCやpythonの定番の
範囲指定方法なので、知らないとけっこう困ります。
④何が自然かは熟練者が述べていい事。右も左もわからない初心者は何が自然かを学ぶことからはじめましょう。
お礼が遅くなり申し訳ございません。
このたびは複数ご教示くださりありがとうございました。
プログラミングに関しては完全に初心者で
どの言語が何にどう使われているのかなども含めて勉強中です;
質問の内容が面倒で申し訳ありません。
いろいろな技法を教えてくださりありがとうございます!
入門本にまだ出現していないことは未知すぎるのですが
基本から引き続き勉強を頑張っていきますね。
ありがとうございました!

No.6
- 回答日時:
> 今回のサンプル文(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)で書いた構造をそのまま持ってきても大丈夫でしょう。
お礼が遅くなり申し訳ございません。
このたびは複数のご教示をありがとうございました。
for文で、(初期設定、条件式、カウンタの増え方)を分けて書いて良いことすら知りませんでした;;
基本もなかなか理解できていないので、応用までは遠い遠い道のりです^^;
慣れてこれば、自分なりにどう解釈できるかも変わってくる(と期待しつつ)、引き続き頑張りたいと思います。
このたびはありがとうございました!

No.5
- 回答日時:
こういう事、とか?
// ここから
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自体も埋め込んじゃっても、この程度のコードなら何も問題ないわけです。
No.3
- 回答日時:
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 );
こんな感じで素直なコードを書きましょう。
No.1
- 回答日時:
> 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 );
とりあえずこんな感じで。
参考まで。
お礼が遅くなり申し訳ございません!
(いただいた回答を順に試しておりました…;)
このたびはご教示くださりありがとうございます。
「s = s + (i + 1);」で「1+2+3+…」にするというのが
勉強になりました。
奥が深いですね…!@_@;
もともと苦手な分野だけに、単純なことほど解らなくなってしまいます。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby VBA 2 2023/01/14 14:14
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# C言語 3 2022/10/04 15:07
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 以前シートを集めて1シートへ繋げる下記コードをご教授いただき作成しました。 今回すでに集めてある「ま 1 2022/08/29 20:38
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- 英語 提示文の文頭の"for"の意味と役割について 4 2023/03/04 18:28
- Ruby プログラミング 3 2023/06/09 14:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
EXCEL VBA ユーザーフォームの...
-
DoEventsが必要な理由について
-
UWSCの終了の仕方
-
VBA for文が止まらない
-
VBAでの一時停止と再開の方法
-
スプレッドシート GASの繰り返...
-
VB2010でCSVファイルの読み込み
-
「偶数・奇数の和」のフローチ...
-
エクセルの当番表を作っていま...
-
Do whileでExitせず、ループの...
-
ループフリー
-
一巡伝達関数と開ループ伝達関数
-
VBA for i=1 to lastrow
-
Escキーを押すと、中断する時と...
-
ネットワークループとルーティ...
-
StatementとResultSetのclose()...
-
乱数の桁数指定、または範囲指定。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
流れ図(フローチャート)が分か...
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
VBAで3秒だけ時間を止めたい
-
vb.netです。2次元配列の要素を...
-
エクセルの当番表を作っていま...
-
vb.netからエクセル関数書き込み
-
DOSコマンドのループ内のTIMEコ...
-
「偶数・奇数の和」のフローチ...
-
GIFアニメをループさせたくない
-
Do whileでExitせず、ループの...
-
VB2010でCSVファイルの読み込み
-
【VBA】全て空白のセルの列の非...
-
アクティブセルから、A列最終行...
おすすめ情報


お世話になります。
いくつかの回答をいただいた後の補足で申し訳ありません。
最初に書くべきだったのですが、
今回のサンプル文(do~while文)は、書籍に掲載されていたもので、
同じ結果になるよう「for文でもできないか」という勉強で試している為、
そもそもの条件式などが、本来よりもあまりスマートではないかも知れません...
素人なもので説明不足で申し訳ありません。
同箇所において、ちょっとした記述の変換でどう変わるか、を知りたく、
質問させていただきました。
引き続きどうぞよろしくお願いいたします…!