Untuk pernyataan gelung. Tugas biasa


Mari cuba menulis atur cara untuk menyelesaikan masalah berikut:
Cari jumlah semua integer antara 100 dan 500. 

Apabila menyelesaikan masalah ini, ia menjadi sukar untuk mencari jumlahnya. Jika kita hanya menulis hasil penambahan kepada pembolehubah s, sebagai contoh, sebagai

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

ia akan mengambil banyak masa untuk rakaman itu sendiri, kerana komputer tidak akan memahami cara menggunakan elipsis dalam ungkapan aritmetik dan kita perlu menulis semua nombor dari 100 hingga 500 ke dalam jumlah ini. Dan nilai program sedemikian akan diabaikan. Terutamanya jika kita ingin menukar nombor kita dan mengambil julat yang berbeza.

Apakah yang perlu kita lakukan?

Jika kita perhatikan entri di atas, maka kita sentiasa menggunakan penambahan "+".
Anda boleh cuba menambah nombor pada pembolehubah s secara beransur-ansur. Contohnya, menggunakan notasi ini
s := s + i;
apa yang kami lakukan di sini:
1) di sebelah kanan kita meletakkan ungkapan s+i, , iaitu, kita mengambil nilai pembolehubah s, yang kini ada dalam ingatan dan menambah nilai daripada pembolehubah i< kepadanya /strong>
2) di sebelah kiri kami menetapkan nama pembolehubah s, iaitu, keseluruhan hasil pengiraan di sebelah kanan akan disimpan dalam pembolehubah ini, jadi kami akan menukar nilai pembolehubah s. 

Di manakah kami boleh mendapatkan nombor daripada julat kami?

Nombor dari 100 hingga 500 yang tergolong dalam julat kami harus dimasukkan ke dalam pembolehubah i satu demi satu. Dan ini boleh dilakukan menggunakan gelung
yang terkenal Sebagai contoh, dengan cara ini s := 0; //pada mulanya adalah perlu untuk menetapkan semula pembolehubah s, supaya pada langkah pertama nombor 100 ditambah kepada sifar, dan bukan kepada apa yang ada dalam ingatan! for i := 100 to 500 do //header of the loop, di mana pembolehubah i mengubah nilainya daripada 100 hingga 500 dalam kenaikan 1 s := s + i; //badan gelung, di mana kita menambah secara beransur-ansur nilai pembolehubah berubah i kepada pembolehubah s // dan hasilnya disimpan semula dalam pembolehubah s Penyelesaian ini sangat serupa dengan mengira jumlah dengan tindakan
 s = 0 + 100 = 100
 s = 100 + 101 = 201
 s = 201 + 102  = 303
dan lain-lain.

Nombor maksimum antara nombor yang diberikan

Apabila mengkaji pengendali bersyarat, kami menyentuh topik mencari nombor maksimum daripada beberapa nombor yang dimasukkan. Dalam masalah "Maksimum empat nombor" kami menggunakan algoritma berikut:
1. tetapkan nilai kepada pembolehubah M kepada yang pertama daripada empat pembolehubah;
2. jika nilai pembolehubah kedua lebih besar daripada nilai dalam pembolehubah M, maka gantikan nilai pembolehubah dengan nilai pembolehubah kedua;
3. jika nilai pembolehubah ketiga lebih besar daripada nilai pembolehubah M, maka gantikan nilai pembolehubah M dengan nilai pembolehubah ketiga;< br /> 4. jika nilai pembolehubah keempat lebih besar daripada nilai dalam pembolehubah M, maka gantikan nilai pembolehubah dengan nilai pembolehubah keempat.

Dapat dilihat bahawa setiap  nombor (mari kita nyatakan dengan X) kita bandingkan dengan pembolehubah M, seperti berikut:
 
pseudokod
input X jika (M < X) maka   M = X
Perkara utama dalam kod ini adalah untuk menentukan nilai awal yang akan dimiliki oleh pembolehubah M.
Biasanya, apabila menyelesaikan masalah mencari maksimum atau minimum, nilai awal pembolehubah M ditetapkan sama dengan nombor pertama.
Oleh itu, kod di atas mesti dilaksanakan 1 kali kurang daripada bilangan nombor (kerana nombor pertama mesti dimasukkan dan disimpan sebagai nilai awal pembolehubah M).
Jika kita mempunyai bilangan nombor yang ditetapkan daripada papan kekunci (contohnya, dalam pembolehubah n), maka kita boleh mengatur kitaran (dari 2 hingga n), menggunakan nombor yang sama untuk menyimpan pembolehubah nombor.

Cuba tulis program itu sendiri.

Maksimum bukan antara semua

Jika kita perlu mencari maksimum (minimum) bukan antara semua nombor yang dimasukkan, tetapi hanya antara nombor yang memenuhi syarat tertentu, maka kita mesti mengambil kira fakta bahawa nombor pertama yang kita ambil sebagai nilai awal maksimum (minimum) tidak akan sentiasa memenuhi keperluan kami.

Sebagai contoh, jika kita mencari nombor negatif maksimum, maka mempunyai set data: \(\{5, -2, 4, 2, -1, -3\}\ ) kita akan mendapat nombor 5 dalam nilai awal maksimum, dan ia adalah positif dan lebih besar daripada mana-mana negatif. Dan oleh itu keadaan X > M akan sentiasa palsu.

Oleh itu, tidak cukup untuk menambah hanya satu cek untuk nombor negatif kepada algoritma dari masalah sebelumnya, ia juga perlu mengambil kira fakta bahawa nombor pertama mungkin tidak memenuhi syarat yang diperlukan (dalam kes ini, menjadi negatif ).

Anda boleh membetulkannya dengan menambah keadaan berikut di dalam gelung:

pseudokod
jika X adalah negatif, maka jika M >= 0 atau M < X, kemudian M=X
Dalam kod yang ditentukan, syarat  M >= 0 membolehkan anda melakukan tindakan  M = X walaupun > pembolehubah pada mulanya mengandungi nilai yang jelas lebih besar daripada yang lain (dalam contoh kami, nilainya adalah sama dengan 5).

Kami juga ambil perhatian bahawa jika julat nombor diketahui, maka nombor minimum (maksimum) daripada julat yang ditentukan boleh diambil sebagai nilai awal maksimum (minimum).

Tugas

N nombor diberikan. Cari elemen kedua terbesar dalam jujukan.

Masalah ini membenarkan dua tafsiran.
Sebagai contoh, jika kita diberi satu set nombor: \(10\ 15\ 20\ 35\ 14\ 35\ 10\), maka apakah jawapan yang sepatutnya ?
Di bawah "elemen kedua terbesar" atau hanya "maksimum kedua", boleh difahami sebagai:
1) nilai yang akan berada di tempat kedua terakhir jika kita menyusun (mengisih) semua nilai dalam susunan tidak menurun (setiap yang berikutnya lebih besar daripada atau sama dengan yang sebelumnya). Kemudian untuk set nombor yang dipertimbangkan jawapannya ialah nilai 35;
2) nilai elemen, yang lebih besar daripada maksimum sahaja. Maka jawapannya ialah 20.
Jika terdapat hanya satu elemen maksimum dalam set nombor (semua yang lain kurang), maka kedua-dua tafsiran adalah sama, dan jawapannya akan sama untuk kedua-dua kes, jika tidak, jawapannya akan berbeza.

Pertimbangkan kes pertama (kami akan menulis algoritma pada pseudokod).
Untuk mencari jawapan, kami akan menggunakan dua pembolehubah:
1) maksimum1 - nilai maksimum (maksimum pertama);
2) maksimum2 - maksimum kedua (jawapan kami).

Jika julat nilai berubah diketahui, maka sebagai nilai awal kita mengambil nombor yang jelas kurang daripada had bawah julat (contohnya, dengan julat dari -1000 kepada 1000 - ambil nombor -1001)
Jika julat nilai tidak diketahui, maka anda boleh menulis dua nombor input pertama ke dalam nilai awal pembolehubah max1 dan max2, dan kemudian membandingkannya dua pembolehubah. input N //bilangan nombor input a, b maks1 = a maks2 = b jika b > a, kemudian     maks1 = b     maks2 = a
Seterusnya, kami mempertimbangkan semua elemen lain (2 yang pertama telah dilihat, jadi kami akan bermula dari yang ke-3) nc untuk i dari 3 hingga n input a jika a > maksimum1 //ada nilai yang lebih besar daripada maksimum1 Itu max2 = max1 //bekas tinggi pertama menjadi kedua max1 = a //elemen baharu akan menjadi maksimum pertama sebaliknya //elemen seterusnya tidak melebihi max1 // ia perlu dibandingkan dengan nilai maksimum2 jika a > maksimum 2 Itu max2 = a //anggap ia sebagai nilai baharu max2 // max1 tidak berubah dalam kes ini Semua Semua kts
Cuba laksanakan sendiri algoritma ini.