Teknik mendefinisikan kaedah baru, dan menentukan gelung-seperti yang berguna-tidak semestinya membolehkan Karel menyelesaikan sebarang masalah baru. Setiap kali anda run satu program ia selalu melakukan perkara yang sama. Program menjadi lebih berguna apabila mereka dapat memberi maklum balas yang berbeza kepada input yang berbeza.
Sebagai contoh. Katakan anda mahu menulis program untuk mempunyai Karel move ke dinding. Tetapi anda tidak hanya mahu program ini berfungsi pada satu dunia dengan saiz tetap. Anda ingin menulis satu program tunggal yang boleh berfungsi di mana-mana dunia.
Cuba ubah dunia dengan mengklik dropdown "Perubahan Dunia" di atas dunia. Untuk mana-mana dunia bersaiz, Karel akan move sehingga ia mencapai dinding. Perhatikan bahawa prestasi ini tidak dapat dilaksanakan dengan menggunakan for gelung. Itu akan memerlukan kita untuk mengetahui saiz dunia pada masa pengaturcaraan.
Di Karel, a while gelung digunakan untuk mengulangi kod tubuhas-long-askeadaan yang dipegang. Gelung sementara mempunyai bentuk umum berikut:
while( ujian ){
pernyataan yang akan diulang
}
Aliran kawalan gelung sementara adalah seperti berikut. Apabila program itu mencecah gelung sementara ia mula mengulangi proses di mana ia terlebih dahulucekjika ujian lulus, dan jika yarun skod dalam badan.
Apabila program tersebutcekjika ujian lulus, ia memutuskan jikaujianadalah benar untuk keadaan semasa dunia. Jika ya, gelung akan run kod dalam badan. Jika ujian gagal, gelung berakhir dan program move s.Apabila program tersebutrun sbadan gelung itu, program ini menjalankan garisan dalam badan satu demi satu. Apabila program tiba di akhir gelung sementara, ia melompat kembali ke bahagian atas gelung. Ia kemudian menguji semula ujian itu, dan terus gelung jika ia berlalu. Program ini tidak keluar dari gelung sehingga ia mendapat pemeriksaan, dan ujian gagal.
Karel mempunyai banyakujianpenyataan, dan kami akan mengatasi semuanya dalam bab seterusnya. Buat masa ini kami akan menggunakan satu kenyataan ujian: frontIsClear() yang benar jika tidak ada tembok langsung dari Karel.
Mari ubah suai program kami di atas untuk menjadikannya lebih menarik. Daripada hanya bergerak ke dinding, ada Karel meletakkan garis sebanyak beeper s, satu di setiap persegi. Sekali lagi kami mahu program ini berfungsi untuk dunia dengan saiz apa pun:
Itu kelihatan hebat. Kecuali satu masalah. Pada setiap dunia Karel tidak meletakkan beeper pada dataran terakhir baris (lihat dengan teliti). Apabila Karel berada di dataran terakhir, program ini tidak menjalankan badan gelung kerana ujian tidak lagi berlalu - Karel menghadapi dinding. Anda mungkin tergoda untuk mencuba menukar susunan badan supaya Karel move s sebelum meletakkan las. Kod ini boleh diedit jadi cuba!
Terdapat masalah yang lebih mendalam yang tidak dapat diselesaikan semula oleh badan. Untuk dunia dengan 7 tiang, Karel perlu meletakkan 7 beeper s, tetapi hanya boleh move 6 kali. Oleh kerana gelung semasa mengeksekusi kedua-dua baris apabila ujian lulus, bagaimana anda boleh mendapatkan program untuk melaksanakan satu perintah sekali lagi daripada yang lain?
Bug dalam program ini adalah contoh masalah pengaturcaraan yang disebut ralat fencepost . Nama itu berasal dari hakikat bahawa jika anda ingin membina pagar yang diperbuat daripada panel yang mempunyai satu pos pagar sama ada saiznya, bilangan jawatan pagar selalu lebih besar dari jumlah panel. Berapa banyak jawatan pagar, misalnya, adakah anda perlu membina pagar dengan 10 panel? Jawapannya adalah 11, seperti yang digambarkan oleh gambarajah berikut:
Sebaik sahaja anda menemuinya, menetapkan bug ini sebenarnya agak mudah. Sebelum Karel berhenti di hujung dunia, semua program yang perlu dilakukan ialah tempat terakhir beeper :