(Java) for ループ ステートメント。一般的なタスク


次の問題を解決するプログラムを書いてみましょう。
100 ~ 500 のすべての整数の合計を求めます。

この問題を解くと、和を求めるのが難しくなります。たとえば、単に変数 s への加算結果を次のように記述するとします。

s=100+101+102+103+...+500

コンピュータは算術式の省略記号の使い方を理解できず、この合計に 100 から 500 までのすべての数字を書き込む必要があるため、記録自体に時間がかかります。そして、そのようなプログラムの価値はごくわずかです。特に、数値を変更して別の範囲を取りたい場合は.

何をすべきでしょうか?

上記のエントリに注目すると、足し算「+」が常に使用されています。
変数 s に徐々に数値を追加してみることができます。たとえば、この表記法を使用すると
s=s+i;
ここで行ったこと:
1) 右側に式 s+i を入力します。つまり、メモリ内にある変数 s の値を取得し、その値を加算します。変数 i< をそれに /strong>
追加します。 2) 左側で変数s の名前を設定します。つまり、右側の計算結果全体がこの変数に保存されるため、変数の値を変更します。 s. 

範囲内の数値はどこで取得できますか?

範囲に属する 100 から 500 までの数値は、i 変数に 1 つずつ入る必要があります。これはよく知られている for
ループを使用して実行できます。 たとえば、このようにして <プレ> s=0; //最初に変数 s をリセットする必要があります。そうすることで、最初のステップで数値 100 がメモリ内の値ではなくゼロに加算されます。 for ( i = 100; i<=500; i++) // 変数 i の値が 100 から 500 まで 1 ずつ変化するループのヘッダー s = s + i; // 変化する変数 i の値を変数 s に徐々に加算するループの本体 // 結果は変数 s に格納されます この解決策はアクションごとに合計を計算するのとよく似ています
 s = 0 + 100 = 100
 s = 100 + 101 = 201
 s = 201 + 102  = 303

指定された数値の最大数

条件演算子を学習するときに、入力された複数の数値から最大の数値を見つけるというトピックに触れました。 「数字は最大4つまで」という問題では次のアルゴリズムを使用しました。
1. 変数 M の値を 4 つの変数の最初の変数に代入します。
2. 2 番目の変数の値が変数 M の値より大きい場合、変数 の値を 2 番目の変数の値で置き換えます。
3. 3 番目の変数の値が変数 M の値より大きい場合、変数 M の値を 3 番目の変数の値に置き換えます。< br /> 4. 4 番目の変数の値が M 変数の値より大きい場合、 変数の値を 4 番目の変数の値で置き換えます。

それぞれのことがわかります。次のように、変数 M と比較した数値 (X で表します):
 
疑似コード
<プレ> 入力X (M < X) の場合   M = X
このコードの主な目的は、変数 M の初期値を決定することです。
通常、最大値または最小値を求める問題を解くとき、変数 M の初期値は最初の数値に等しく割り当てられます。
したがって、上記のコードは数値の数よりも 1 回少なく実行する必要があります (最初の数値を変数 M の初期値として入力して保存する必要があるため)。
キーボードから数値の数を設定した場合 (たとえば、変数 n 内)、次のコマンドを使用してサイクル (from 2 to n) を編成できます。数値変数を格納するには同じ数値を
入力します。
自分でプログラムを書いてみてください。

最大ではない

入力されたすべての数値の中からではなく、特定の条件を満たす数値の中からのみ最大値 (最小値) を見つける必要がある場合は、最初の数値が最大値の初期値であるという事実を考慮する必要があります。 (最小) が常に要件を満たすとは限りません。

たとえば、最大の負の数を探している場合、データセットは次のとおりです: \(\{5, -2, 4, 2, -1, -3\}\ ) 最大値の初期値で数値 5 を取得します。これは正であり、負の値よりも大きくなります。したがって、条件 X > は次のようになります。 M は常に false になります。

したがって、前の問題からアルゴリズムに負の数のチェックを 1 つだけ追加するだけでは十分ではなく、最初の数が必要な条件を満たさない可能性があるという事実も考慮する必要があります (この場合、負の.

これを修正するには、ループ内に次の条件を追加します:

疑似コード
<プレ> X が負の場合、 M >= 0 または M < の場合X、それから M=X
指定されたコードでは、 M >= 0 条件により、M = X アクションを実行できます。 > 変数には最初、残りの値よりも明らかに大きい値が含まれています (この例では、値は 5 です)。

また、数値の範囲がわかっている場合は、指定された範囲の最小 (最大) 数値を最大 (最小) の初期値として使用できることにも注意してください。

タスク

N 個の数値が与えられます。シーケンス内で 2 番目に大きい要素を見つけます。

この問題では2つの解釈が可能
です。 たとえば、一連の数値 \(10\ 15\ 20\ 35\ 14\ 35\ 10\) が与えられた場合、答えは何になりますか? ?
「2 番目に大きい要素」の下にまたは単に「2 番目の最大値」は次のように理解できます。
1)すべての値を非降順で並べた(ソートした)場合に最後から2番目の位置にある値(次の値はそれぞれ前の値以上になります)。次に、考慮された一連の数値の答えは値 35 になります。
2) 最大値よりも大きい要素の値。すると答えは20になります
。 数値の集合の中に最大の要素が 1 つだけある場合 (他はすべて小さい)、どちらの解釈も同じで、どちらの場合でも答えは同じになります。それ以外の場合、答えは異なります。

最初のケースを考えてみましょう (アルゴリズムは 疑似コード)。
答えを見つけるために、次の 2 つの変数を使用します。
1) maximum1 - 最大値 (最初の最大値);
2) maximum2 - 2 番目の最大値 (私たちの答え)。

値の変化の範囲がわかっている場合は、範囲の下限より明らかに小さい数値を初期値として採用します (たとえば、-1000 の範囲) から 1000 - 数字を入力します -1001)
値の範囲が不明な場合は、最初の 2 つの入力数値を変数 max1 max2 の初期値に書き込み、これらを比較できます。 2 つの変数。 <プレ> input N //数値の数 a、bを入力 max1 = a max2 = b b > の場合ああ、それでは     max1 = b     max2 = a
次に、他のすべての要素を検討します (最初の 2 つはすでに表示されているため、3 番目から始めます)。 <プレ> nc for i 3 から n を入力してください >の場合Maximum1 //maximum1 より大きい値がありました それか max2 = max1 //前の最初の高値が 2 番目の高値になります max1 = a //新しい要素が最初の最大値になります さもないと // 次の要素は max1 を超えないようにします // max2 の値と比較する必要があります >の場合最大2 それか max2 = a //それを新しい値として受け取ります max2 // この場合、max1 は変更されません 全て 全て kts
このアルゴリズムを自分で実装してみてください。