(Java) Döngü deyimi için. Tipik görevler


Aşağıdaki problemi çözmek için bir program yazmaya çalışalım:
100 ile 500 arasındaki tüm tam sayıların toplamını bulun.

Bu problemi çözerken toplamı bulmak zorlaşır. Toplama işleminin sonucunu s değişkenine basitçe yazarsak, örneğin,

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

kaydın kendisi çok zaman alacaktır çünkü bilgisayar üç noktanın aritmetik ifadede nasıl kullanılacağını anlamayacak ve 100'den 500'e kadar tüm sayıları bu toplamın içine yazmamız gerekecek. Ve böyle bir programın değeri önemsiz olacaktır. Özellikle sayılarımızı değiştirip farklı bir aralık almak istiyorsak.

Ne yapmalıyız?

Yukarıdaki girişe dikkat edersek, sürekli olarak "+" ekini kullanırız.
s değişkenine kademeli olarak sayı eklemeyi deneyebilirsiniz. Örneğin, bu gösterimi kullanarak
s=s+i;
burada ne yaptık:
1) sağ tarafa s+i, ifadesini koyuyoruz yani artık hafızamızda bulunan s değişkeninin değerini alıp değeri ekliyoruz i< değişkeninin ona /strong>
2) solda s değişkeninin adını belirliyoruz, yani sağdaki hesaplamanın tüm sonucu bu değişkende saklanacak, böylece değişkenin değerini değiştireceğiz s. 

Aralığımızdaki sayıları nereden alabiliriz?

Aralığımıza ait 100'den 500'e kadar olan sayılar teker teker i değişkenine düşmelidir. Ve bu, iyi bilinen for
döngüsü kullanılarak yapılabilir. Örneğin, bu şekilde
s=0; //başlangıçta s değişkenini sıfırlamak gerekir, böylece ilk adımda 100 sayısı hafızada olana değil sıfıra eklenir!
for ( i = 100; i<=500; i++) //i değişkeninin değerini 1'lik artışlarla 100'den 500'e değiştirdiği döngünün başlığı
    s = s + ben; //değişen i değişkeninin değerini s değişkenine kademeli olarak eklediğimiz döngünün gövdesi
                 // ve sonuç s değişkeninde saklanır
Bu çözüm, toplamı işlemlere göre hesaplamaya çok benzer
 s = 0 + 100 = 100
 s = 100 + 101 = 201
 s = 201 + 102  = 303
vesaire.

Verilen sayılar arasındaki maksimum sayı

Koşullu operatörü incelerken, girilen birkaç sayıdan maksimum sayıyı bulma konusuna değindik. "En fazla dört sayı" probleminde aşağıdaki algoritmayı kullandık:
1. M değişkeninin değerini dört değişkenden ilkine atayın;
2. ikinci değişkenin değeri M değişkenindeki değerden büyükse, değişkeninin değerini ikinci değişkenin değeriyle değiştirin;
3. üçüncü değişkenin değeri M değişkenindeki değerden büyükse, M değişkeninin değerini üçüncü değişkenin değeriyle değiştirin;< br /> 4. dördüncü değişkenin değeri M değişkenindeki değerden büyükse, değişkeninin değerini dördüncü değişkenin değeriyle değiştirin.

Görüldüğü gibi her  M değişkeni ile karşılaştırdığımız sayı (X ile gösterelim) aşağıdaki gibidir:
 
sözde kod
X girişi
eğer (M < X) o zaman
  M = X

Bu koddaki ana şey, M değişkeninin hangi başlangıç ​​değerine sahip olacağını belirlemektir.
Genellikle, bir maksimum veya minimum bulma problemini çözerken, M değişkeninin başlangıç ​​değeri ilk sayıya eşit olarak atanır.
Bu nedenle yukarıdaki kod, sayı sayısından 1 kat daha az çalıştırılmalıdır (çünkü ilk sayının M değişkeninin başlangıç ​​değeri olarak girilip saklanması gerekir).
Klavyeden ayarlanan sayı sayısına sahipsek (örneğin, n değişkeninde), o zaman aşağıdakileri kullanarak bir döngü (2'den n'ye) düzenleyebiliriz. sayı değişkenini depolamak için aynı sayı.

Programı kendiniz yazmaya çalışın.

Maksimum hepsi arasında değil

Girilen tüm sayılar arasında değil, yalnızca belirli bir koşulu sağlayan sayılar arasında maksimum (minimum) bulmamız gerekiyorsa, o zaman maksimumun başlangıç ​​​​değeri olarak aldığımız ilk sayının olduğu gerçeğini dikkate almalıyız. (minimum) her zaman gereksinimlerimizi karşılamaz.

Örneğin, maksimum negatif sayıyı arıyorsak, o zaman veri kümesine sahibiz: \(\{5, -2, 4, 2, -1, -3\}\ ) maksimumun ilk değerinde 5 sayısını alacağız ve bu pozitiftir ve herhangi bir negatiften daha büyüktür. Ve dolayısıyla koşul X > M her zaman yanlış olacaktır.

Bu nedenle, önceki problemden algoritmaya negatif bir sayı için yalnızca bir kontrol eklemek yeterli değildir, ayrıca ilk sayının gerekli koşulu sağlamayabileceğini (bu durumda negatif olabilir) dikkate almak gerekir. ).

Bunu, döngünün içine aşağıdaki koşulu ekleyerek düzeltebilirsiniz:

sözde kod
X negatif ise, o zaman
  M >= 0 veya M < ise; X, o zaman
    M=X

Belirtilen kodda  M >= 0 koşulu, M = X eylemini gerçekleştirmenize izin verir. > değişkeni başlangıçta açıkça diğerlerinden daha büyük bir değer içerir (bizim örneğimizde değer 5'e eşittir).

Ayrıca, sayı aralığı biliniyorsa, belirtilen aralıktaki minimum (maksimum) sayının maksimumun (minimum) ilk değeri olarak alınabileceğini de not ediyoruz.

Görev

N numara verilir. Bir dizideki en büyük ikinci öğeyi bulun.

Bu problem iki yoruma izin verir.
Örneğin, bize bir dizi sayı verilirse: \(10\ 15\ 20\ 35\ 14\ 35\ 10\), o zaman cevap ne olmalıdır? ?
"İkinci en büyük öğe" altında veya basitçe "ikinci maksimum", şu şekilde anlaşılabilir:
1) tüm değerleri azalan olmayan bir düzende düzenlersek (sıralarsak) sondan bir önceki yerde olacak değer (bir sonraki her biri bir öncekinden büyük veya ona eşittir). Ardından, dikkate alınan sayı kümesi için cevap 35 değeri olacaktır;
2) sadece maksimumdan daha büyük olan elemanın değeri. O zaman cevap 20'dir.
Sayı kümesinde yalnızca bir maksimum öğe varsa (diğerleri daha azdır), o zaman her iki yorum da aynıdır ve cevap her iki durum için de aynı olacaktır, aksi halde cevap farklı olacaktır.

İlk durumu ele alalım (algoritmayı sözde kod).
Cevabı bulmak için iki değişken kullanacağız:
1) maksimum1 - maksimum değer (ilk maksimum);
2) maksimum2 - ikinci maksimum (bizim cevabımız).

Değer aralığının değiştiği biliniyorsa, başlangıç ​​​​değerleri olarak, aralığın alt sınırından açıkça daha az olan bir sayı alırız (örneğin, -1000 aralığında) ila 1000 - sayıyı al -1001)
Değer aralığı bilinmiyorsa, ilk iki giriş sayısını max1 ve max2 değişkenlerinin başlangıç ​​değerlerine yazabilir ve ardından bunları karşılaştırabilirsiniz. iki değişken.
giriş N //sayı sayısı
a, b girişi
maks1 = bir
maks2 = b
b > ise; bir, o zaman
    maks1 = b
    maks2 = bir

Sonra, diğer tüm unsurları göz önünde bulunduruyoruz (ilk 2 zaten görüntülendi, bu yüzden 3.'den başlayacağız)
3'ten n'ye i için nc
    bir girin
    eğer bir > maximum1 //max1'den büyük bir değer vardı
      O
        max2 = max1 //önceki ilk yüksek ikinci olur
        max1 = a //yeni eleman ilk maksimum olacak
      aksi takdirde
        //sonraki eleman max1'den fazla değil
        // maximum2 değeri ile karşılaştırılması gerekiyor
        eğer bir > maksimum 2
          O
            max2 = a //yeni değer olarak al max2
                           // max1 bu durumda değişmez
        Tüm
    Tüm
kt

Bu algoritmayı kendiniz uygulamaya çalışın.