JavaRush /Java Blog /Random-ID /Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6)
Masha
Level 41

Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6)

Dipublikasikan di grup Random-ID
tugas cs50 untuk perkuliahan 5 dan 6 Kuliah CS50 ada di sini: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Materi ini berisi 3 tugas, informasi teoritis tentangnya dan panduan untuk bertindak.

Sasaran

• Pelajari lebih dalam tentang fungsi dan perpustakaan. • Kenali kriptografi, terapkan beberapa sandi sederhana

Bahan tambahan

https://reference.cs50.net/ - penjelasan fungsi perpustakaan yang digunakan selama pelatihan. Dalam bahasa Inggris. http://computer.howstuffworks.com/c.htm halaman 11 – 14 dan 39

Persiapan

Masuk ke cs50.io update50 untuk memastikan versi ruang kerja Anda adalah yang terbaru. Jika Anda tidak sengaja menutup jendela terminal, buka menu Lihat dan pastikan ada tanda centang di sebelah item Konsol (centang jika tidak). Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 1 Klik (+), di dalam lingkaran hijau pada bingkai jendela terminal, pilih Terminal Baru . Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 2 Buat direktori kerja: mkdir ~/workspace/pset2 Perhatikan bahwa ada spasi antara mkdir dan ~/workspace/pset2 . Singkatnya, ~ berarti direktori root, ~/workspace adalah folder bernama workspace di dalam direktori root, ~/workspace/pset2 adalah direktori bernama pset2 di dalam ~/workspace . Sekarang jalankan: cd ~/workspace/pset2 untuk mengubah ke direktori baru. Baris perintahnya terlihat seperti ini: username:~/workspace/pset2 $ Jika ada yang salah, ulangi langkah-langkahnya. Anda juga dapat memanggil perintah history untuk melihat beberapa perintah terakhir dalam urutan kronologis. Anda juga dapat menempatkan kursor pada baris perintah dan menekan panah atas pada keyboard Anda untuk melihat semua perintah secara berurutan dari yang terakhir dimasukkan hingga yang pertama. Dengan menggunakan tombol bawah Anda dapat kembali. Omong-omong, alih-alih mengetikkan perintah yang sama setiap saat, Anda dapat menelusuri perintah yang telah Anda ketikkan dan menjalankannya lagi dengan menekan Enter. Anda mungkin memperhatikan bahwa David melakukan hal ini dalam kuliahnya. Tugas minggu kedua harus disimpan di pset2 .

Tugas 0. Inisialisasi

Mari kita lihat lebih dekat garis-garisnya. Di file inisial.c , tulis program yang meminta nama pengguna (menggunakan fungsi GetString kita mendapatkan nama sebagai string) dan kemudian menampilkan huruf pertama dari nama depan (atau nama depan) dan nama belakang dalam huruf besar tanpa spasi, titik atau karakter lain, hanya dengan umpan baris ( \n ). Kami berasumsi bahwa pengguna hanya memasukkan huruf (huruf kecil atau besar, atau keduanya) ditambah satu spasi antar kata. Pertimbangkan bahwa orang bernama Joseph Gordon-Levitt, Conan O'Brien, atau David J. Malan tidak akan menggunakan program ini. Untuk memeriksa kebenaran pengoperasian program, hubungi check50: Apakah Anda ingin bermain-main dengan implementasi program yang disiapkan oleh staf CS50? Ketikkan baris: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Kriptografi
Kriptografi, ilmu mengenkripsi dan menguraikan informasi... Faktanya, pesan terenkripsi telah ada sejak zaman kuno, dan digunakan oleh tentara untuk mengirimkan pesan rahasia. Nah, sekarang kata sandi Anda di Facebook dan jaringan lain disimpan dalam bentuk terenkripsi.

Tugas 1. Salam, Kaisar!

Informasi teoretis
Kita akan mempelajari salah satu sandi paling sederhana - sandi Caesar, yang dinamai menurut nama kaisar Romawi. Dalam sandi ini, setiap huruf dalam teks diganti dengan huruf lain, yaitu sejumlah huruf yang lebih rendah dalam alfabet. Jumlah huruf yang tetap ini disebut kunci . Jadi, kunci 1 mengubah huruf latin C menjadi huruf D, dan Z melalui siklus menjadi A. Jika kuncinya 3, maka huruf C akan berubah menjadi F, dan Z menjadi C. Contoh: kita menggunakan sandi Caesar dengan kunci 5 pada kata kucing. c -> h a -> f t -> y Caesar (cat, 5) = hfy Kunci = 7, kata = komputer c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 3 Sandi Caesar sederhana, tetapi, sayangnya, tidak dapat diandalkan (ini adalah hal-hal yang saling berhubungan!): untuk alfabet Inggris hanya ada 25 opsi enkripsi, semua opsi mudah untuk dilalui bahkan tanpa komputer. Namun, sandi Caesar sering kali digunakan sebagai langkah dalam sandi lain, seperti sandi Vigenère (lebih lanjut tentang itu di paragraf berikutnya). Mari kita "mengmatematiskan" sandi Caesar. Mari kita nyatakan teks biasa dengan huruf p, pi adalah huruf pada teks p yang berada pada posisi nomor i. Sebut saja kunci rahasianya dengan huruf k, c sebagai ciphertext, dan ci sebagai huruf pada ciphertext yang berada pada posisi i. Kemudian Anda dapat menghitung setiap huruf sandi menggunakan rumus: ci = (pi + k) % 26 Biasakan formalisasi ini, ini memungkinkan Anda memprogram algoritme dan mengungkapkan arti sandi secara akurat dan ringkas. Jika kunci k = 13 dan teks asli p adalah "Pastikan minum Ovaltine Anda!", inilah sandi yang kita peroleh: Or fher gb qevax lbhe Binygvar! Perhatikan bahwa O (huruf pertama dalam sandi sandi) digeser 13 posisi dari huruf B (huruf pertama dalam sandi tersebut) huruf pertama pada teks aslinya). Begitu pula dengan huruf r (huruf kedua pada enkripsi) digeser 13 huruf dari e (huruf kedua pada aslinya). Huruf ketiga dalam enkripsi, f, digeser 13 huruf dari s (yang ketiga dari aslinya), di sini kita melingkari dari z ke a. Sandi Caesar dengan kunci 13 mempunyai nama khusus ROT13 . Itu simetris: menerapkannya dua kali, kita kembali ke teks aslinya. Tentu saja ada juga ROT26, yang ini umumnya super aman, tetapi hanya jika Anda tidak mengungkapkan pikiran dengan jelas =).
Kondisi
Tulis di file caesar.c sebuah program yang mengenkripsi teks menggunakan sandi Caesar. Berikan satu argumen baris perintah sebagai masukan ke program: bilangan bulat non-negatif. Untuk mempermudah, sebut saja k. Jika pengguna menjalankan program tanpa argumen baris perintah atau dengan lebih dari satu argumen, aplikasi harus mengeluh dan mengembalikan nilai 1 (ini adalah bagaimana kesalahan biasanya dilambangkan): return 1; Dalam semua kasus lainnya, program meminta pengguna untuk memasukkan teks untuk mengenkripsi, lalu menampilkan teks yang dienkripsi dengan kunci k (yaitu, menggeser posisi k ke kanan sepanjang siklus). Jika teks berisi karakter di luar alfabet bahasa Inggris, program tidak akan mengubahnya. Setelah mencetak ciphertext, aplikasi keluar, main mengembalikan 0: return 0; Jika main tidak secara eksplisit mengembalikan nol, ia mengembalikannya secara otomatis (int sebenarnya adalah tipe pengembalian main, tetapi lebih dari itu di lain waktu). Menurut konvensi (aturan tata krama yang baik dalam pemrograman), jika Anda secara eksplisit mengembalikan 1 untuk menunjukkan kesalahan, maka Anda juga harus mengembalikan 0 sebagai penunjuk keberhasilan penyelesaian program. Meskipun hanya ada 26 huruf dalam alfabet Inggris, k bisa lebih besar dari 26. Intinya, kunci k = 27 akan memberikan hasil yang sama seperti k = 1, namun Anda harus mengizinkan pengguna memasukkan angka non-negatif apa pun, bukan melebihi 2^31 – 26 ( harus sesuai dengan int). Program juga harus memperhitungkan bahwa huruf kecil dienkripsi dengan huruf kecil, dan huruf besar dienkripsi dengan huruf besar. Di mana kita mulai? Karena aplikasi harus menerima nilai k secara langsung dalam string argumen, header fungsi utama kita terlihat seperti ini: int main(int argc, string argv[]) Dari Bab 6, Anda mengetahui bahwa argv adalah array string. Array tersebut dapat diibaratkan sebagai deretan loker di gym. Masing-masing dari mereka memiliki makna tersembunyi. Dalam kasus kita, di dalam setiap sel terdapat argumen seperti string Untuk membuka loker pertama, kita menggunakan argv[0], yang kedua - argv[1], dan seterusnya. Jika kita memiliki n kunci, maka kita harus berhenti di argv[n - 1], karena argv[n] sudah tidak ada lagi (atau ada, tetapi milik orang lain, sebaiknya kita tidak menyentuhnya). Jadi Anda dapat mengakses argumen k seperti ini: string k = argv[1]; Kami yakin memang ada sesuatu di sana! Ingatlah bahwa argc adalah variabel int yang sama dengan jumlah baris dalam argv. Artinya sebaiknya periksa dulu nilai argcnya sebelum mencoba membuka sel tersebut, karena bisa jadi ternyata tidak ada. Idealnya argc = 2. Mengapa demikian? Di dalam argv[0] biasanya terdapat nama programnya. Artinya, argc selalu minimal 1. Namun program kita mengharuskan pengguna untuk memberikan argumen baris perintah k, oleh karena itu, argc = 2. Tentu saja, jika pengguna memasukkan lebih dari satu argumen pada baris perintah, argc juga bertambah dan dapat lebih besar dari 2 Jika pengguna memasukkan bilangan bulat ke dalam string, ini tidak berarti bahwa nilai yang dimasukkan akan otomatis disimpan sebagai int. Lebih tepatnya, TIDAK. Ini akan menjadi string, meskipun terlihat persis seperti int! Jadi kita perlu mengubah string menjadi int sendiri. Untungnya, ada fungsi yang disebut atoi yang dirancang untuk tujuan ini. Sintaksnya adalah: int k = atoi(argv[1]); Perhatikan bahwa k bertipe int, sehingga Anda dapat melakukan aritmatika dengannya. Dengan fungsi ini, Anda tidak perlu khawatir apakah pengguna memasukkan bilangan bulat atau, katakanlah, foo: dalam hal ini, atoi akan mengembalikan 0. Fungsi atoi dideklarasikan di perpustakaan stdlib.h , jadi pastikan untuk # sertakan di awal program. Kode akan dikompilasi tanpa ini, karena kita telah menyertakan fungsi ini di perpustakaan cs50.h. Namun, lebih baik mempercayai perpustakaan asli. Jadi Anda menyimpan k sebagai int. Sekarang mari kita minta masukan teks. Jika Anda mengerjakan tugas minggu pertama, Anda sudah familiar dengan fungsi perpustakaan CS50 yang disebut GetString. Dia akan membantu kita. Setelah Anda menerima k dan teks awal, mari mulai enkripsi. Ringkasnya, Anda dapat mengulangi semua karakter string dan mencetaknya menggunakan loop berikut: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Dengan kata lain, sama seperti argv adalah array string, string adalah array karakter. Oleh karena itu, kita dapat menggunakan tanda kurung siku untuk mengakses elemen string individual dengan cara yang sama seperti mendapatkan string individual di argv. Tentu saja, tidak ada kriptografis dalam mencetak setiap karakter. Atau, secara teknis, ketika k = 0. Tapi kita harus membantu Caesar mengenkripsi teksnya! Salam, Kaisar! Untuk menggunakan strlen, Anda perlu menyertakan perpustakaan lain . Karena kami mengotomatiskan beberapa pengujian validasi, program akan berperilaku persis seperti ini: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Selain atoi , Anda dapat menemukan fungsi keren lainnya di perpustakaan ctype.h dan stdlib.h . Untuk melakukan ini, ikuti tautannya dan cari-cari sedikit di sana. Misalnya isdigit jelas sesuatu yang menarik =). Saat berpindah dari Z ke A (atau dari z ke a), jangan lupakan operator modulo %dalam bahasa C. Pelajari juga tabelnya , ini menunjukkan karakter ASCII tidak hanya untuk huruf. Untuk memeriksa apakah program berfungsi dengan benar dengan check50 , lakukan hal berikut: check50 2015.fall.pset2.caesar caesar.c Dan jika Anda tertarik bermain-main dengan kode yang dibuat oleh staf CS50, jalankan perintah: ~cs50/pset2/caesar Omong-omong, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Analisis tugas
  1. Dapatkan kuncinya
  2. Dapatkan teks
  3. Enkripsi
  4. Menampilkan pesan terenkripsi
1. Kami membentuk fungsi utama sehingga pengguna memasukkan kunci pada baris perintah dan memeriksa kebenaran kunci. int main(int argc, string argv[]) argc: • int • jumlah argumen yang dimasukkan pada baris perintah • jika argc = 2 semuanya baik-baik saja. Jika tidak, cetak instruksi dan tutup program. • Jika argc = 2 kita periksa apakah kuncinya adalah bilangan bulat. • Argv adalah array string, daftar dengan argumen yang dimasukkan ke dalamnya. Array adalah struktur data yang berisi data berbeda dengan tipe yang sama di sel berbeda. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 4 Misalnya, pengguna memasukkan string blastoff Team Rocket, lalu: Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 5 Dengan menggunakan fungsi atoi(), kita mengubah angka yang dihasilkan menjadi bilangan bulat. Jika hal ini tidak memungkinkan, fungsi akan mengembalikan 0. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 6 2. Minta teks kepada pengguna. Sederhana saja: semua yang dimasukkan pengguna adalah string. 3. Enkripsi. Algoritmenya sederhana, tetapi bagaimana Anda menjelaskan kepada komputer huruf mana yang muncul satu demi satu? Saatnya mengingat tabel ASCII! Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 7 Namun, mungkin ada lebih dari sekedar huruf dalam sebuah string... Sebelum beralih ke mengubah string, bayangkan Anda hanya perlu mengubah satu karakter. Kita ingin mengubah huruf dari teks awal, bukan tanda atau angka. Apa yang harus kita lakukan? Pertama kita perlu memeriksa apakah karakter ini ada dalam alfabet. Ini dapat dilakukan dengan menggunakan fungsi isalpha() . Jika karakternya dalam alfabet, fungsi ini mengembalikan nilai benar dan salah jika tidak. Dua fungsi yang lebih berguna - isupper() dan islower() mengembalikan nilai true jika hurufnya masing-masing huruf besar atau kecil. Jadi: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Jika isalpha mengembalikan nilai true, kita perlu mengubah karakter ini menggunakan kunci. Mari kita perhatikan dan analisa sebagai contoh program Zamili, asisten CS50. Anda mungkin bertanya-tanya mengapa 'A' adalah bilangan bulat padahal jelas-jelas merupakan huruf. Ternyata simbol dan bilangan bulat dapat dipertukarkan. Dengan meletakkan huruf A dalam tanda kutip tunggal Anda bisa mendapatkan kode ASCII-nya dalam int. Hati-hati: Anda memerlukan tanda kutip tunggal; tanpa tanda kutip tersebut, kompiler akan mencari variabel bernama A, bukan simbol. Kemudian pada baris tersebut kita menambahkan nilai kunci pada kode ASCII surat tersebut dan menyimpannya dalam variabel integer. Bahkan jika hasilnya adalah int, pernyataan printf menggunakan placeholder %c untuk karakter. Jadi program mencetak karakter yang terkait dengan hasil integer. Dalam kasus kedua, kami menampilkan nomor tersebut menggunakan placeholder %d. Anda dapat memasukkan kode ini ke dalam cs50 IDE dan memainkannya. Mari kita periksa cara kerja asciimath untuk kunci yang berbeda. Mari kita ambil nilai 25, kita akan melihat gambar berikut: Dan sekarang biarkan kuncinya menjadi 26: Kita mendapat [, dan bukan huruf A sama sekali. Itu hanya karakter ASCII berikutnya setelah Z. Jadi menambahkan kunci saja tidak akan cukup. bekerja. Kita perlu menggunakan rumus sandi untuk kembali ke awal alfabet segera setelah kita kehabisan huruf. Ingat, kami sudah menulis di atas: /* * asciimath.c * by Zamyla Chan * * Calculates the addition of a char and an integer, * and displays both the resultant character and its * ASCII value. * * Usage: ./asciimath key [char] * */ #include #include #include int main(int argc, string argv[]) { if (argc != 2) { printf("print the key next time \n"); return 1; } // key is the second command line argument int key = atoi(argv[1]); //преобразование строки в int int letter = 'A'; printf("\nCalculating '%c' + %d...\n", letter, key); int result = (letter + key); printf("The ASCII value of %c is %d.\n\n", result, result); return 0; } int result = (letter + key);Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 8Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 9ci = (pi + k) % 26 Dimana ci adalah huruf nomor i pada ciphertext, pi adalah huruf nomor i pada plaintext, k adalah kuncinya, dan %26 adalah sisa pembagian dengan 26 (atau “modulo 26”). Mari kita terapkan rumus ini pada huruf Y. Ambil k = 2. Hitung ('Y' + 2) %26 kode ASCII dari huruf 'Y' = 89. Maka ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 Tapi ini bukan nilai ASCII dari huruf A yang kita butuhkan, yaitu 65. Sekarang mari kita beri nilai 0 hingga 25 pada setiap huruf alfabet secara berurutan. Dalam hal ini, Y = 24. (24+2)%26 = 0 Huruf A mempunyai indeks seperti itu. Jadi, rumus ini mengacu pada indeks huruf berdasarkan abjad, bukan nilai ASCII-nya. Untuk mencetak karakter terenkripsi Anda memerlukan nilai ASCII-nya. Dan cari tahu cara beralih antara nilai ASCII dan angka dalam alfabet. Setelah kita mengetahui rumus untuk satu karakter, kita perlu menerapkannya pada setiap huruf dalam string yang dimasukkan dari keyboard. Tapi hanya jika ini surat! Dan ingat, huruf kapital dan huruf kecil memerlukan arti yang berbeda. Di sinilah fungsi isupper dan islower berguna. Anda mungkin memiliki dua rumus, satu untuk huruf kapital, yang lainnya untuk huruf kecil, fungsi akan membantu Anda memilih mana yang akan diterapkan. Bagaimana cara menerapkan rumus ke setiap karakter dalam sebuah string? Ingatlah bahwa string hanyalah serangkaian karakter. Fungsi strlen (panjang string) akan membantu Anda menentukan jumlah iterasi dalam satu loop .Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 10

Tugas 2. Parlez-vous français?

Teori
Sandi Vigenère agak lebih aman daripada sandi Caesar: sandi ini menggunakan kata sebagai kuncinya dan sulit untuk dipecahkan secara manual menggunakan analisis frekuensi atau kekerasan saja. Setiap huruf pada kunci menghasilkan angka, dan sebagai hasilnya kita mendapatkan beberapa kunci untuk menggeser huruf. Contoh: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 11 Jika jumlah huruf dalam pesan tidak habis dibagi kunci, kita hanya menggunakan sebagian saja pada penerapan kunci terakhir: Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 12 Untuk mencari nilai offset, kita menggunakan posisi tiap huruf pada kunci bacon kita dalam alfabet (dari a sampai z). Kami menghitung dari awal, seperti programmer sejati. Dan setiap huruf dalam teks asli digeser dengan nomor tertentu, seperti pada sandi Caesar, kembali, jika perlu, setelah Z ke awal alfabet. Jadi M akan berpindah 1, e pertama tidak bergerak sama sekali, dan e kedua berpindah 2 posisi. Di bawah ini Anda melihat pesan asli, kunci tertulis dan hasil penerapannya. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 13 Sandi Vigenère tentu saja lebih kuat, tetapi jika Anda mengetahui panjang kuncinya, maka cukup mudah untuk dipecahkan. Bagaimana cara mengidentifikasinya? Jika teks asli cukup panjang sehingga beberapa kata muncul beberapa kali di dalamnya, maka Anda akan melihat beberapa pengulangan: Anda Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 14 juga dapat menggunakan kekerasan, namun ada banyak pilihan: 26^n – 1 dimana n adalah panjang kunci yang tidak diketahui . Tapi biasanya jumlahnya banyak. Benar, ini bukan masalah bagi komputer. Dan sekarang perhitungan matematika sandinya: Misal p adalah suatu teks, k adalah kata kuncinya, kj adalah huruf ke-j dari kuncinya, pi adalah huruf nomor i pada teks aslinya, ci adalah huruf nomor i pada enkripsi . Kemudian: ci = (pi + kj) % 26
Latihan
Kondisi Tulis program vigenere.c yang mengenkripsi pesan menggunakan sandi Vigenere. Kami menyediakan satu argumen baris perintah ke input program: kata kunci k, terdiri dari huruf alfabet Inggris. Jika aplikasi diluncurkan dengan lebih dari satu argumen atau dengan argumen yang tidak termasuk dalam alfabet, maka perlu untuk menampilkan informasi kesalahan dan menghentikan program. Artinya, main akan mengembalikan 1 - dalam hal ini, pengujian otomatis kami akan memahami bahwa semuanya baik-baik saja di sini, dan kondisi ini diperhitungkan. Jika semuanya baik-baik saja, program harus melanjutkan untuk meminta string teks p, yang kami enkripsi dengan kunci k yang diperoleh di atas, cetak hasilnya dan selesaikan program, mengembalikan nilai 0. Klarifikasi Penting untuk memastikan bahwa di dalam kunci k karakter A dan a ditetapkan sebagai 0, B dan b sebagai 1, ..., Z dan z sebagai 25. Program harus menerapkan sandi Vigenère hanya pada huruf teks p. Karakter lainnya (angka, tanda baca, spasi) harus ditampilkan tanpa perubahan. Jika algoritme akan menerapkan karakter ke-j k ke karakter ke-i p yang tidak ada dalam alfabet, terapkan karakter kunci ke-j tersebut ke karakter alfabet berikutnya dalam teks; Anda tidak bisa meninggalkannya begitu saja dan beralih ke karakter lain di k. Terakhir, program harus mempertahankan huruf besar/kecil setiap huruf di p .
Tidak tahu harus mulai dari mana?
Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 15
Berikut beberapa tips dari Zamilya, asisten kursus CS50
Untungnya, program ini sangat mirip dengan Caesar cipher, hanya saja kuncinya adalah string, bukan integer. Jika Anda berhasil mengimplementasikan sandi nama penguasa Romawi, ini bisa menjadi awal yang baik untuk tugas kedua. Anda mungkin sudah menyadari bahwa sandi Vigenère dengan satu huruf sebagai kuncinya sama dengan sandi Caesar. Algoritma Vigenère menggunakan langkah-langkah yang sama seperti Caesar:
  1. Dapatkan kuncinya
    • codeword adalah argumen baris perintah kedua argv[1]
    • harus dalam alfabet: fungsi isalpha
  2. Dapatkan teks
  3. Enkripsi
  4. Cetak teks sandi
Jadi, mari kita periksa argumen baris perintah kedua argv[1] untuk melihat apakah argumen tersebut termasuk dalam karakter alfabet. Kami melakukan ini menggunakan isalpha yang sudah familiar . Jika kuncinya benar, kami menerima string dari pengguna dan memulai enkripsi. Rumus sandi Vigenère mirip dengan rumus sandi Caesar. Bagaimana Anda mengubah huruf menjadi cipher offset yang sesuai? Coba bandingkan nilainya menggunakan tabel ASCII. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 16 Kemungkinan besar, Anda akan dapat menemukan pola antara huruf dan indeks abjadnya menggunakan urutan dalam tabel. Sudahkah Anda menemukan cara mengurangi satu huruf dari huruf lainnya untuk mendapatkan hasil yang diinginkan? Offset untuk huruf kapital dan kecil adalah sama, jadi Anda harus menentukan dua rumus serupa untuk menentukan offset untuk huruf kecil dan secara terpisah untuk huruf besar. Ingat juga bahwa perulangan teks harus mengabaikan karakter non-Inggris. Dan jangan lupa untuk menyimpan kotak surat. Jika Anda melihat rumus sandi: ci = (pi + kj) % 26 Anda akan melihat dua variabel indeks, i dan j. Yang satu menyimpan posisinya di teks sumber, yang lain di kunci. Jika teks Anda lebih panjang dari kuncinya, indeks pada kunci akan berpindah dari akhir kunci kembali ke awal. Bagaimana cara melakukannya? Menggunakan operasi pembagian modulo! Hasil operasinya adalah sisa pembagian dua bilangan. Manfaat praktis dari operasi dalam pemrograman ini sungguh besar! Bayangkan sekelompok besar orang perlu dibagi menjadi tiga subkelompok. Salah satu cara untuk melakukannya adalah dengan meminta mereka membayar untuk yang pertama, kedua, ketiga. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 17 Artinya, orang pertama termasuk kelompok pertama, orang kedua termasuk kelompok kedua, orang ketiga termasuk kelompok ketiga, orang keempat termasuk kelompok pertama lagi, dan seterusnya. Anda dapat menggunakan pembagian modulo untuk melakukan operasi yang sama. Mari kita beri nomor pada tiga kelompok yang sama dari awal. Berikut cara melakukannya: Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 18 Jika Anda mengambil indeks dan membaginya dengan nilai maksimum, hasil yang dihasilkan tidak akan pernah lebih besar atau sama dengan nilai tersebut. Cobalah prinsip ini untuk mengembalikan kata kunci ke awal! Hanya saja, alih-alih mengurutkan berdasarkan grup, Anda memerlukan indeks kata kunci sehingga Anda dapat mengimbangi huruf yang benar tanpa melebihi panjang kunci. Karena kami mengotomatiskan beberapa pengujian kode Anda, program akan berperilaku seperti yang ditunjukkan di bawah ini: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz Bagaimana lagi Anda dapat menguji program selain menghitung ciphertext secara manual? Kami baik hati: untuk ini kami menulis program devigenere . Dibutuhkan satu dan hanya satu argumen baris perintah (kata kunci), dan tugasnya adalah mengambil teks tersandi sebagai masukan dan mengembalikan teks biasa. Jalankan: ~cs50/pset2/devigenere k Dimana k adalah kata kuncinya. Jika Anda ingin memeriksa kebenaran program Anda menggunakan check50, jalankan: check50 2014.fall.pset2.vigenere vigenere.c Dan jika Anda ingin mengevaluasi implementasi vigenere kami, ketik: ~cs50/pset2/vigenere

Cara memvalidasi kode Anda dan mendapatkan nilai

Perhatian! Jika penting bagi Anda untuk hanya memeriksa kebenaran tugas, gunakan cs50check. Jika Anda ingin mendapatkan nilai di platform edx, ikuti prosedur yang dijelaskan di bawah ini. Ingatlah bahwa prosedur ini menggunakan cs50check yang sama untuk memeriksa tugas. Satu-satunya perbedaan adalah ia mengingat hasil dan menghitung skor keseluruhan.
  1. Masuk ke IDE CS50
  2. Di dekat sudut kiri atas IDE CS50 , tempat browser file-nya berada (bukan di jendela terminal), klik kanan pada file inisial.c Anda yang terletak di direktori pset2 dan klik Unduh . Anda akan melihat bahwa browser telah memuat inisial.c .
  3. Ulangi untuk caesar.c .
  4. Ulangi untuk vigenere.c .
  5. Di jendela atau tab terpisah, masuk ke CS50 Submit
  6. Klik ikon Kirim di sudut kiri atas layar. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 19
  7. Pada daftar folder di sebelah kiri, klik direktori Kumpulan Masalah 2 , lalu klik tombol Unggah Pengajuan Baru . Ada di kanan. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 20
  8. Pada layar yang muncul, klik tombol Tambahkan file .... Sebuah jendela untuk memilih file dari komputer Anda akan terbuka. Harvard CS50: Tugas Minggu 2 (Kuliah 5 dan 6) - 21
  9. Arahkan ke folder tempat Anda menyimpan inisial.c . Kemungkinan besar terletak di folder Unduhan Anda atau di mana pun browser Anda meletakkan file secara default. Saat Anda menemukan inisial.c , klik sekali untuk memilihnya, lalu klik Buka.
  10. Klik Tambahkan file lagi.
  11. Temukan caesar.c dan buka.
  12. Lakukan hal yang sama untuk file vigenere.c .
  13. Klik Mulai unggah. File Anda akan diunggah ke server CS50 .
  14. Pada layar yang muncul, Anda akan melihat jendela No File Selected . Jika Anda menggerakkan kursor mouse ke kiri, Anda akan melihat daftar file yang diunduh. Untuk mengonfirmasi, klik masing-masingnya. Jika Anda tidak yakin tentang sesuatu, Anda dapat mengunggah ulang file tersebut dengan mengulangi langkah yang sama. Anda dapat melakukan ini sebanyak yang Anda suka hingga akhir tahun 2016.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION