Saya memiliki beberapa loop yang saya perlukan dalam program saya. Saya dapat menulis kode pseudo tetapi saya tidak sepenuhnya yakin bagaimana menulisnya secara logis.
Saya butuh -
if (num is a multiple of 10) { do this }
if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) { do this }
else { do this } //this part is for 1-10, 21-30, 41-50, 61-70, 81-90
Ini untuk permainan papan ular tangga, jika pertanyaan saya lebih masuk akal.
Saya membayangkan yang pertama jika pernyataan saya harus menggunakan modulus, apakah if (num == 100%10)
benar?
Yang kedua saya tidak tahu. Saya bisa menuliskannya seperti if (num > 10 && num is < 21 || etc)
tetapi harus ada sesuatu yang lebih pintar dari itu.
c++
comparison
conditional-statements
integer-arithmetic
pengguna3419168
sumber
sumber
Jawaban:
Untuk yang pertama, untuk memeriksa apakah suatu bilangan adalah kelipatan penggunaan:
Untuk yang kedua:
Tapi itu agak padat, dan Anda mungkin lebih baik hanya mencantumkan opsi secara eksplisit.
Sekarang setelah Anda memberikan gambaran yang lebih baik tentang apa yang Anda lakukan, saya akan menulis yang kedua sebagai:
Logikanya sama, tetapi dengan menggunakan fungsi tersebut kami mendapatkan ide yang lebih jelas tentang apa artinya.
sumber
if((num - 1) / 10) % 2 == 1 && num < 100)
- Aku akan menangis jika melihatnya.num >= 11
sebagai (1) bahwa batas bawah dilarang, dan (2)%
pada bilangan negatif juga menghasilkan bilangan negatif. (Saya harus mengakui bahwa menggunakan di& 1
sini "lebih aman" tetapi juga mengasumsikan pengetahuan tambahan.)getRow(num) % 2 == 0
fungsi juga untuk membuatnya jelas apa maksudnya.bool inEvenRow(int num){ return getRow(num) % 2 ==0;}
Triknya di sini adalah mencari semacam kesamaan di antara rentang tersebut. Tentu saja, Anda selalu dapat menggunakan metode "brute force":
Tetapi Anda mungkin memperhatikan bahwa, jika Anda mengurangi
1
darinum
, Anda akan memiliki rentang:Dengan kata lain, semua angka dua digit yang digit pertamanya ganjil. Selanjutnya, Anda perlu membuat rumus yang mengungkapkan hal ini. Anda bisa mendapatkan digit pertama dengan membaginya dengan 10, dan Anda dapat menguji ganjilnya dengan memeriksa sisa 1 ketika Anda membagi dengan 2. Menyatukan semuanya:
Mengingat trade-off antara kode yang lebih panjang tetapi dapat dipelihara dan kode "pintar" yang lebih pendek, saya akan memilih yang lebih panjang dan lebih jelas setiap saat. Paling tidak, jika Anda mencoba untuk menjadi pintar, harap sertakan komentar yang menjelaskan dengan tepat apa yang ingin Anda capai.
Ini membantu untuk mengasumsikan pengembang berikutnya untuk mengerjakan kode dipersenjatai dan tahu di mana Anda tinggal. :-)
sumber
&& isTensDigitOdd(num)
, mungkin dengan komentar sebelum definisi fungsi menjelaskan apa yang dilakukannya. Jika pola seperti itu ada, komentar yang menjelaskan alasan pola tersebut mencerahkan imo rawatan.Jika Anda menggunakan GCC atau kompiler apa pun yang mendukung rentang kasus, Anda dapat melakukannya, tetapi kode Anda tidak akan portabel .
sumber
Ini untuk pengunjung masa depan lebih dari pemula. Untuk solusi yang lebih umum dan mirip algoritme, Anda dapat mengambil daftar nilai awal dan akhir dan memeriksa apakah nilai yang diteruskan ada di dalam salah satunya:
Untuk kesederhanaan, saya menggunakan lambda polimorfik (C ++ 14) alih-alih
pair
argumen eksplisit . Ini mungkin juga harus tetap menggunakan<
dan==
konsisten dengan algoritme standar, tetapi berfungsi seperti ini selamaElem
telah<=
ditentukan untuk itu. Bagaimanapun, itu bisa digunakan seperti ini:Ada contoh nyata di sini .
sumber
Yang pertama mudah. Anda hanya perlu menerapkan operator modulo ke nilai num Anda:
Karena C ++ mengevaluasi setiap angka yang bukan 0 sebagai benar, Anda juga bisa menulis:
Untuk yang kedua, saya pikir ini lebih bersih untuk dipahami:
Pola ini berulang setiap 20, sehingga Anda dapat menghitung modulo 20. Semua elemen yang Anda inginkan akan berada dalam satu baris kecuali elemen yang dapat dibagi 20.
Untuk mendapatkannya juga, gunakan saja num-1 atau lebih baik num + 19 untuk menghindari berurusan dengan bilangan negatif.
Ini mengasumsikan pola berulang selamanya, jadi untuk 111-120 itu akan berlaku lagi, dan seterusnya. Jika tidak, Anda perlu membatasi jumlahnya menjadi 100:
sumber
Dengan beberapa komentar bagus dalam kode, itu bisa ditulis dengan cukup ringkas dan mudah dibaca.
sumber
num % 10 == 0
adalah hal yang samanum
dengan kelipatan 10.if (num % 10 == 0)
berarti sama dengan// Check if it's a multiple of 10
tidak boleh memelihara kode Anda . Ini adalah anti-pola yang terkenal.%
adalah anti-pola; jelas tidak. Sungguh, dengan asumsi bahwa banyak pembaca posting ini adalah pemula, mengajari mereka gaya menulis komentar ini memberikan kontribusi negatif bagi perkembangan mereka sebagai programmer.Anda pada dasarnya menjelaskan jawabannya sendiri, tetapi inilah kodenya untuk berjaga-jaga.
sumber
x < 41 x > 50
dan beri tanda kurung.operator&&
memiliki prioritas lebih tinggi daripadaoperator||
, jadi tidak apa-apa, tapi saya cukup yakin GCC tetap memperingatkannya.10 < x < 21
sebagai10 < x && x < 21
gantinyax > 10 && x < 21
. Lebih mudah membaca pertidaksamaan jika urutannya sama seperti saat Anda menulisnya secara matematis.Anda mungkin terlalu memikirkan ini.
Baris pertama
if (x % 10)
berfungsi karena (a) nilai yang merupakan kelipatan 10 dihitung sebagai '0', angka lain menghasilkan sisa, (b) nilai 0 dalam anif
dianggapfalse
, nilai lainnya dianggaptrue
.Edit:
Untuk beralih bolak-balik di usia dua puluhan, gunakan trik yang sama. Kali ini, angka pentingnya adalah
10
:x/10
mengembalikan angka apa pun dari 0 hingga 9 sebagai0
, 10 hingga 19 sebagai1
dan seterusnya. Pengujian genap atau ganjil - itu& 1
- memberi tahu Anda apakah genap atau ganjil. Karena rentang Anda sebenarnya adalah "11 sampai 20", kurangi 1 sebelum pengujian.sumber
Permohonan agar mudah dibaca
Meskipun Anda sudah memiliki beberapa jawaban yang bagus, saya ingin merekomendasikan teknik pemrograman yang akan membuat kode Anda lebih mudah dibaca untuk beberapa pembaca yang akan datang - yaitu Anda dalam enam bulan, seorang kolega meminta untuk melakukan tinjauan kode, penerus Anda, .. .
Ini untuk membungkus setiap pernyataan "pintar" ke dalam fungsi yang menunjukkan dengan tepat (dengan namanya) apa yang dilakukannya. Meskipun ada dampak kecil pada kinerja (dari "fungsi pemanggilan overhead") ini benar-benar dapat diabaikan dalam situasi permainan seperti ini.
Sepanjang jalan Anda dapat membersihkan masukan Anda - misalnya, menguji nilai "ilegal". Jadi, Anda mungkin akan mendapatkan kode seperti ini - lihat seberapa jauh lebih mudah dibaca? "Fungsi pembantu" dapat disembunyikan di suatu tempat (tidak perlu berada di modul utama: jelas dari namanya apa fungsinya):
sumber
YES
danNO
?TRUE
,True
, atautrue
? Dan apa, jika ada, file header yang perlu saya sertakan dalam C biasa? Jadi saya menggulung sendiri. Bertanya-tanya apakah itu yang mendapat suara negatif ...Untuk yang pertama:
akan berlaku untuk:
Untuk yang kedua:
akan melamar:
Kami pada dasarnya pertama kali melakukan
x-1
untuk mendapatkan:Kemudian kami membaginya dengan
10
untuk mendapatkan:Jadi kami memeriksa apakah hasil ini ganjil.
sumber
Anda dapat mencoba yang berikut ini:
sumber
Saya tahu bahwa pertanyaan ini memiliki begitu banyak jawaban, tetapi saya akan tetap melemparkan pertanyaan saya ke sini ...
Diambil dari Steve McConnell's Code Complete , Edisi ke-2: "Tabel Akses Tangga-Tangga:
Jenis akses meja lainnya adalah metode anak tangga. Metode akses ini tidak langsung seperti struktur indeks, tetapi tidak membuang banyak ruang data. Ide umum dari struktur anak tangga, yang diilustrasikan pada Gambar 18-5, adalah bahwa entri dalam tabel valid untuk rentang data daripada untuk titik data yang berbeda.
Gambar 18-5 Pendekatan anak tangga mengkategorikan setiap entri dengan menentukan tingkat di mana ia mencapai "tangga". "Langkah" yang dipukul menentukan kategorinya.
Misalnya, jika Anda menulis program penilaian, kisaran entri "B" mungkin dari 75 persen hingga 90 persen. Berikut kisaran nilai yang mungkin harus Anda program suatu hari nanti:
Untuk menggunakan metode anak tangga, Anda meletakkan ujung atas setiap rentang ke dalam tabel dan kemudian menulis putaran untuk memeriksa skor terhadap ujung atas setiap rentang. Saat Anda menemukan titik di mana skor pertama kali melebihi puncak rentang, Anda tahu berapa nilainya. Dengan teknik anak tangga, Anda harus berhati-hati untuk menangani titik akhir rentang dengan benar. Berikut kode dalam Visual Basic yang memberikan nilai kepada sekelompok siswa berdasarkan contoh ini:
Meskipun ini adalah contoh sederhana, Anda dapat dengan mudah menggeneralisasikannya untuk menangani beberapa siswa, beberapa skema penilaian (misalnya, nilai yang berbeda untuk level poin yang berbeda pada tugas yang berbeda), dan perubahan dalam skema penilaian. "
Kode Lengkap , Edisi ke-2, halaman 426 - 428 (Bab 18).
sumber
Seperti yang ditunjukkan orang lain, membuat ketentuan lebih ringkas tidak akan mempercepat kompilasi atau eksekusi, dan juga tidak membantu keterbacaan.
Ini dapat membantu membuat program Anda lebih fleksibel, jika nanti Anda memutuskan bahwa Anda menginginkan versi balita dari permainan pada papan 6 x 6, atau versi lanjutan (yang dapat Anda mainkan sepanjang malam) pada papan 40 x 50 .
Jadi saya akan mengkodekannya sebagai berikut:
Ya, ini bertele-tele, tetapi menjelaskan dengan tepat apa yang terjadi di papan permainan.
Jika saya mengembangkan game ini untuk ditampilkan di ponsel atau tablet, saya akan membuat variabel BARIS dan KOLOM sebagai ganti konstanta, sehingga dapat disetel secara dinamis (di awal game) agar sesuai dengan ukuran dan orientasi layar.
Saya juga akan mengizinkan orientasi layar diubah kapan saja, di tengah permainan - yang perlu Anda lakukan hanyalah mengganti nilai ROWS dan COLUMNS, sambil meninggalkan yang lainnya (nomor kuadrat saat ini yang digunakan setiap pemain, dan kotak awal / akhir semua ular dan tangga) tidak berubah. Maka Anda 'hanya' harus menggambar papan dengan baik, dan menulis kode untuk animasi Anda (saya berasumsi bahwa itu adalah tujuan
if
pernyataan Anda ) ...sumber
#define
#define
instruksi mirip fungsi , untuk meletakkan tanda kurung di sekitar argumen, di mana mereka muncul dalam perluasan. Jadi, alih-alih#define finished(num) (num == lastSquare)
Anda harus menulis#define finished(num) ((num) == lastSquare)
. Alasannya adalah jika Anda menggunakan instruksi seperti itu dengan ekspresi yang mengandung operator dengan prioritas yang cukup rendah, Anda tidak akan mendapatkan jawaban yang Anda harapkan. Dalam kasus ini, jika Anda tidak menggunakan tanda kurung tambahan, lalufinished(a & b)
meluas ke(a & b == lastSquare)
yang hampir pasti bukan yang Anda inginkan.