JavaRush /Blog Java /Random-MS /Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6)
Masha
Tahap

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

Diterbitkan dalam kumpulan
tugasan cs50 untuk kuliah 5 dan 6 Kuliah CS50 ada di sini: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Bahan ini mengandungi 3 tugasan, maklumat teori tentangnya dan panduan untuk bertindak.

Matlamat

• Pergi lebih mendalam ke dalam fungsi dan perpustakaan • Biasakan diri dengan kriptografi, laksanakan beberapa sifir mudah

Bahan tambahan

https://reference.cs50.net/ - penerangan tentang fungsi perpustakaan yang digunakan semasa latihan. Dalam Bahasa Inggeris. http://computer.howstuffworks.com/c.htm muka surat 11 – 14 dan 39

Persediaan

Log masuk ke cs50.io update50 untuk memastikan versi ruang kerja anda dikemas kini. Jika anda menutup tetingkap terminal secara tidak sengaja, pergi ke menu View dan pastikan terdapat tanda semak di sebelah item Console (semak jika tidak). Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 1 Klik pada (+), di dalam bulatan hijau pada bingkai tetingkap terminal, pilih Terminal Baharu . Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 2 Cipta direktori kerja: mkdir ~/workspace/pset2 Ambil perhatian bahawa terdapat ruang antara mkdir dan ~/workspace/pset2 . Untuk mengimbas kembali, ~ bermaksud direktori akar, ~/workspace ialah folder yang dipanggil ruang kerja di dalam direktori akar, ~/workspace/pset2 ialah direktori yang dipanggil pset2 di dalam ~/workspace . Sekarang jalankan: cd ~/workspace/pset2 untuk menukar ke direktori baharu. Baris arahan kelihatan seperti ini: username:~/workspace/pset2 $ Jika ada yang salah, ulangi langkah. Anda juga boleh memanggil arahan history untuk melihat beberapa arahan terakhir dalam susunan kronologi. Anda juga boleh meletakkan kursor anda pada baris arahan dan tekan anak panah ke atas pada papan kekunci anda untuk melihat semua arahan mengikut urutan dari yang terakhir dimasukkan ke yang pertama. Menggunakan butang bawah anda boleh kembali. Ngomong-ngomong, daripada menaip arahan yang sama setiap kali, anda boleh menatal melalui arahan yang telah anda taip dan melaksanakannya semula dengan menekan Enter. Anda mungkin perasan bahawa David melakukan perkara ini dalam kuliahnya. Tugasan minggu kedua hendaklah disimpan dalam pset2 .

Tugasan 0. Permulaan

Mari kita lihat lebih dekat pada baris. Dalam fail initials.c , tulis program yang meminta nama pengguna (menggunakan fungsi GetString kita mendapat nama sebagai rentetan) dan kemudian memaparkan huruf pertama nama pertama (atau nama) dan nama akhir dalam huruf besar tanpa ruang, noktah atau aksara lain, hanya dengan suapan baris ( \n ). Kami menganggap bahawa pengguna hanya memasukkan huruf (huruf kecil atau besar, atau kedua-duanya) ditambah satu ruang antara perkataan. Pertimbangkan bahawa lelaki bernama Joseph Gordon-Levitt, Conan O'Brien, atau David J. Malan tidak akan menggunakan program ini. Untuk menyemak operasi program yang betul, hubungi check50: Adakah anda ingin bermain dengan pelaksanaan program yang disediakan oleh kakitangan CS50? Taip 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, sains menyulitkan dan mentafsir maklumat... Sebenarnya, mesej yang disulitkan telah wujud sejak zaman purba, dan digunakan oleh tentera untuk menghantar mesej rahsia. Nah, kini kata laluan anda di Facebook dan rangkaian lain disimpan dalam bentuk yang disulitkan.

Tugasan 1. Salam, Caesar!

Maklumat teori
Kami akan mengkaji salah satu sifir paling mudah - sifir Caesar, dinamakan sempena maharaja Rom. Dalam sifir ini, setiap huruf teks digantikan dengan huruf lain, iaitu bilangan huruf tetap yang lebih rendah dalam abjad. Bilangan huruf tetap ini dipanggil kunci . Jadi, kunci 1 mengubah huruf Latin C menjadi huruf D, dan Z melalui kitaran menjadi A. Jika kuncinya adalah 3, maka huruf C akan berubah menjadi F, dan Z menjadi C. Contoh: kita menggunakan sifir Caesar dengan kunci 5 pada perkataan kucing. c -> h a -> f t -> y Caesar (cat, 5) = hfy Kunci = 7, perkataan = komputer c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 3 Sifir Caesar adalah mudah, tetapi, sayangnya, tidak boleh dipercayai (ini adalah perkara yang saling berkaitan!): untuk abjad Inggeris terdapat hanya 25 pilihan penyulitan, mudah untuk melalui semua pilihan walaupun tanpa komputer. Walau bagaimanapun, sifir Caesar sering digunakan sebagai langkah dalam sifir lain, seperti sifir Vigenère (lebih lanjut mengenainya dalam perenggan seterusnya). Mari kita "matematikkan" sifir Caesar. Mari kita nyatakan plaintext dengan huruf p, pi ialah huruf dalam teks p yang berada pada kedudukan nombor i. Mari kita panggil huruf kunci rahsia k, c teks sifir, dan ci huruf dalam teks sifir yang berada pada kedudukan i. Kemudian anda boleh mengira setiap huruf sifir menggunakan formula: ci = (pi + k) % 26 Biasakan diri dengan pemformalan ini, ia membolehkan anda memprogramkan algoritma dan menyatakan maksud sifir dengan tepat dan padat. Jika kunci k = 13 dan teks asal p ialah "Pastikan minum Ovaltine anda!", ini adalah sifir yang kami dapat: Or fher gb qevax lbhe Binygvar! Perhatikan bahawa O (huruf pertama dalam teks sifir) dialihkan 13 kedudukan daripada huruf B ( huruf pertama dalam teks asal). Perkara yang sama dengan huruf r (huruf kedua dalam penyulitan) dialihkan 13 huruf daripada e (huruf kedua dalam asal). Huruf ketiga dalam penyulitan, f, dialihkan sebanyak 13 huruf daripada s (yang ketiga dalam huruf asal), di sini kita pergi dalam bulatan dari z ke a. Sifir Caesar dengan kunci 13 mempunyai nama khas ROT13 . Ia simetri: menggunakan dua kali, kita kembali ke teks asal. Sudah tentu, terdapat juga ROT26, yang ini secara amnya sangat selamat, tetapi hanya jika anda tidak menyatakan fikiran anda dengan jelas =).
keadaan
Tulis dalam fail caesar.c program yang menyulitkan teks menggunakan sifir Caesar. Sediakan satu hujah baris arahan sebagai input kepada program: integer bukan negatif. Untuk kesederhanaan, sebut saja k. Jika pengguna melaksanakan atur cara tanpa hujah baris arahan atau dengan lebih daripada satu hujah, aplikasi harus mengadu dan mengembalikan nilai 1 (ini adalah cara ralat biasanya dilambangkan): return 1; Dalam semua kes lain, atur cara menggesa pengguna untuk teks untuk menyulitkan, kemudian memaparkan teks yang disulitkan dengan kunci k (iaitu, mengalihkan kedudukan k ke kanan sepanjang kitaran). Jika teks mengandungi aksara yang berada di luar abjad Inggeris, program tidak mengubahnya. Selepas mencetak teks sifir, aplikasi keluar, utama mengembalikan 0: return 0; Jika utama tidak secara eksplisit mengembalikan sifar, ia mengembalikannya secara automatik (int sebenarnya jenis pulangan utama, tetapi lebih banyak lagi pada masa lain). Menurut konvensyen (peraturan bentuk yang baik dalam pengaturcaraan), jika anda secara eksplisit mengembalikan 1 untuk menunjukkan ralat, maka anda juga harus mengembalikan 0 sebagai penunjuk kepada kejayaan menyiapkan program. Walaupun terdapat hanya 26 huruf dalam abjad Inggeris, k boleh lebih besar daripada 26. Pada asasnya, kekunci k = 27 akan memberikan hasil yang sama seperti k = 1, tetapi anda perlu membenarkan pengguna memasukkan sebarang nombor bukan negatif tidak melebihi 2^31 – 26 (ia mesti masuk ke dalam int). Program ini juga mesti mengambil kira bahawa huruf kecil disulitkan dalam huruf kecil, dan huruf besar disulitkan dalam huruf besar. Di mana kita bermula? Memandangkan aplikasi mesti menerima nilai k terus dalam rentetan hujah, pengepala fungsi utama kami kelihatan seperti ini: int main(int argc, string argv[]) Daripada Bab 6, anda tahu bahawa argv ialah tatasusunan rentetan. Susunan boleh dianggap sebagai deretan loker di gim. Setiap daripada mereka mempunyai makna yang tersembunyi. Dalam kes kami, di dalam setiap sel terdapat hujah seperti string Untuk membuka loker pertama, kami menggunakan argv[0], yang kedua - argv[1], dan seterusnya. Jika kita mempunyai n kunci, maka kita perlu berhenti di argv[n - 1], memandangkan argv[n] tidak lagi wujud (atau wujud, tetapi milik orang lain, lebih baik kita tidak menyentuhnya). Jadi anda boleh mengakses hujah k seperti ini: string k = argv[1]; Kami percaya ada sesuatu di sana! Ingat bahawa argc ialah pembolehubah int sama dengan bilangan baris dalam argv. Ini bermakna lebih baik untuk menyemak nilai argc sebelum cuba membuka sel, kerana ia mungkin ternyata tidak wujud. Sebaik-baiknya argc = 2. Mengapa demikian? Di dalam argv[0] biasanya nama program. Iaitu, argc sentiasa sekurang-kurangnya 1. Tetapi program kami memerlukan pengguna untuk menyediakan argumen baris arahan k, oleh itu, argc = 2. Sememangnya, jika pengguna memasukkan lebih daripada satu argumen pada baris arahan, argc juga berkembang dan boleh lebih besar daripada 2 Jika pengguna memasukkan integer ke dalam rentetan, ini tidak bermakna nilai yang dimasukkan akan disimpan secara automatik sebagai int. Lebih tepat lagi, ia TIDAK akan. Ia akan menjadi rentetan, walaupun ia kelihatan seperti int! Jadi kita perlu menukar rentetan kepada int diri kita sendiri. Nasib baik, terdapat fungsi yang dipanggil atoi yang direka untuk tujuan ini. Sintaksnya ialah: int k = atoi(argv[1]); Ambil perhatian bahawa k adalah jenis int, jadi anda boleh melakukan aritmetik dengannya. Dengan fungsi ini, anda tidak perlu risau sama ada pengguna memasukkan integer atau, katakan, foo: dalam kes itu, atoi akan mengembalikan 0. Fungsi atoi diisytiharkan dalam perpustakaan stdlib.h , jadi pastikan untuk # sertakan pada permulaan program. Kod akan dikompil tanpa ini, kerana kami telah memasukkan fungsi ini dalam perpustakaan cs50.h . Walau bagaimanapun, adalah lebih baik untuk mempercayai perpustakaan asli. Jadi anda mendapat k disimpan sebagai int. Sekarang mari kita minta input teks. Jika anda melakukan tugasan minggu pertama, anda sudah biasa dengan fungsi perpustakaan CS50 yang dipanggil GetString. Dia akan membantu kita. Selepas anda menerima k dan teks awal, mari mulakan penyulitan. Untuk meringkaskan, anda boleh mengulangi semua aksara rentetan dan mencetaknya menggunakan gelung berikut: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Dalam erti kata lain, sama seperti argv ialah tatasusunan rentetan, rentetan ialah tatasusunan aksara. Oleh itu, kita boleh menggunakan kurungan segi empat sama untuk mengakses elemen rentetan individu dengan cara yang sama seperti mendapatkan rentetan individu dalam argv. Sudah tentu, tiada apa-apa kriptografi tentang mencetak setiap aksara. Atau, secara teknikal, apabila k = 0. Tetapi kita mesti membantu Caesar menyulitkan teksnya! Salam, Caesar! Untuk menggunakan strlen, anda perlu memasukkan perpustakaan lain . Memandangkan kami sedang mengautomasikan beberapa ujian pengesahan, atur cara harus berkelakuan seperti ini: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Selain atoi , anda boleh menemui fungsi hebat lain dalam perpustakaan ctype.h dan stdlib.h . Untuk melakukan ini, ikuti pautan dan cari sedikit di sekelilingnya. Contohnya, isdigit jelas sesuatu yang menarik =). Apabila pergi dari Z ke A (atau dari z ke a), jangan lupa tentang operator modulo %dalam bahasa C. Kaji juga jadual , ia menunjukkan aksara ASCII bukan sahaja untuk huruf. Untuk memastikan program berfungsi dengan betul dengan check50 , lakukan perkara berikut: check50 2015.fall.pset2.caesar caesar.c Dan jika anda berminat untuk bermain dengan kod yang dibuat oleh kakitangan CS50, jalankan arahan: ~cs50/pset2/caesar By the way, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Analisis tugasan
  1. Dapatkan kunci
  2. Dapatkan teks
  3. Sulitkan
  4. Paparkan mesej yang disulitkan
1. Kami membentuk fungsi utama supaya pengguna memasukkan kekunci pada baris arahan dan menyemak kekunci untuk ketepatan. int main(int argc, string argv[]) argc: • int • bilangan argumen yang dimasukkan pada baris arahan • jika argc = 2 semuanya ok. Jika tidak, cetak arahan dan tutup program. • Jika argc = 2 kita semak sama ada kunci itu ialah integer • Argv ialah tatasusunan rentetan, senarai dengan argumen yang dimasukkan ke dalamnya Tatasusunan ialah struktur data yang mengandungi data berlainan jenis yang sama dalam sel yang berbeza. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 4 Sebagai contoh, pengguna memasukkan string blastoff Team Rocket, kemudian: Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 5 Menggunakan fungsi atoi(), kami menukar nombor yang terhasil kepada integer. Jika ini tidak mungkin, fungsi akan mengembalikan 0. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 6 2. Gesa pengguna untuk teks. Ia mudah: semua yang dimasukkan pengguna adalah rentetan. 3. Penyulitan. Algoritmanya mudah, tetapi bagaimana anda boleh menerangkan kepada komputer huruf mana yang datang satu demi satu? Sudah tiba masanya untuk mengingati jadual ASCII! Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 7 Walau bagaimanapun, terdapat lebih daripada sekadar huruf dalam rentetan... Sebelum beralih kepada menukar rentetan, bayangkan anda hanya perlu menukar satu aksara. Kami mahu menukar huruf daripada teks awal, bukan tanda atau nombor. Apa yang patut kita buat? Mula-mula kita perlu menyemak sama ada watak ini dalam abjad. Ini boleh dilakukan menggunakan fungsi isalpha() . Jika aksara dalam abjad, fungsi ini mengembalikan benar dan palsu sebaliknya. Dua lagi fungsi berguna - isupper() dan islower() kembali benar jika huruf itu adalah huruf besar atau huruf kecil, masing-masing. Oleh itu: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Jika isalpha kembali benar, kita perlu menukar aksara ini menggunakan kekunci. Mari kita pertimbangkan dan analisa sebagai contoh program Zamili, pembantu CS50. Anda mungkin tertanya-tanya mengapa 'A' ialah integer sedangkan ia jelas satu huruf. Ternyata simbol dan integer boleh ditukar ganti. Dengan meletakkan huruf A dalam petikan tunggal anda boleh mendapatkan kod ASCII dalam int. Berhati-hati: anda memerlukan petikan tunggal; tanpanya, pengkompil akan mencari pembolehubah bernama A, bukan simbol. Kemudian dalam barisan kami menambah nilai kunci kepada kod ASCII huruf dan menyimpannya dalam pembolehubah integer. Walaupun hasilnya adalah int, pernyataan printf menggunakan pemegang tempat %c untuk aksara. Jadi program mencetak aksara yang dikaitkan dengan hasil integer. Dalam kes kedua, kami memaparkan nombor menggunakan pemegang tempat %d. Anda boleh memasukkan kod ini ke dalam cs50 IDE dan bermain dengannya. Mari semak cara asciimath berfungsi untuk kunci yang berbeza. Mari kita ambil nilai 25, kita akan melihat gambar berikut: Dan sekarang biarkan kuncinya 26: Kami mendapat [, dan bukan huruf A sama sekali. Ia hanyalah aksara ASCII seterusnya selepas Z. Jadi hanya menambah kunci tidak akan kerja. Kita perlu menggunakan formula sifir untuk kembali ke permulaan abjad sebaik sahaja kita kehabisan huruf. Ingat, kami telah 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: Tugasan Minggu 2 (Kuliah 5 dan 6) - 8Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 9ci = (pi + k) % 26 Di mana ci ialah nombor huruf i dalam teks sifir, pi ialah nombor huruf i dalam teks biasa, k ialah kunci, dan %26 ialah baki pembahagian sebanyak 26 (atau “modulo 26”). Mari gunakan formula ini pada huruf Y. Ambil k = 2. Kira ('Y' + 2) %26 Kod ASCII huruf 'Y' = 89. Kemudian ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 Tetapi ini bukan nilai ASCII bagi huruf A yang kita perlukan, iaitu 65. Sekarang mari kita berikan setiap huruf abjad nilai dari 0 hingga 25 mengikut urutan. Dalam kes ini, Y = 24. (24+2)%26 = 0 Huruf A hanya mempunyai indeks sedemikian. Oleh itu, formula ini merujuk kepada indeks abjad huruf, bukan nilai ASCIInya. Untuk mencetak aksara yang disulitkan, anda memerlukan nilai ASCIInya. Dan fikirkan cara untuk menukar antara nilai ASCII dan nombor dalam abjad. Setelah kita mengetahui formula untuk satu aksara, kita perlu menerapkannya pada setiap huruf dalam rentetan yang dimasukkan dari papan kekunci. Tetapi hanya jika ini adalah surat! Dan ingat, huruf besar dan huruf kecil memerlukan makna yang berbeza. Di sinilah fungsi isupper dan islower berguna. Anda mungkin mempunyai dua formula, satu untuk huruf besar, satu lagi untuk huruf kecil, fungsi akan membantu anda memilih yang mana untuk digunakan. Bagaimana untuk menggunakan formula untuk setiap aksara dalam rentetan? Ingat bahawa rentetan hanyalah susunan aksara. Fungsi strlen (panjang rentetan) akan membantu anda menentukan bilangan lelaran dalam gelung .Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 10

Tugasan 2. Parlez-vous français?

Teori
Sifir Vigenère agak lebih selamat daripada sifir Caesar: ia menggunakan perkataan sebagai kunci dan sukar untuk dipecahkan secara manual menggunakan analisis frekuensi atau kekerasan sahaja. Setiap huruf kunci menjana nombor, dan sebagai hasilnya kita mendapat beberapa kunci untuk menukar huruf. Contoh: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 11 Jika bilangan huruf dalam mesej tidak boleh dibahagikan dengan kunci, kami hanya menggunakan sebahagian daripadanya dalam aplikasi terakhir kekunci: Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 12 Untuk mencari nilai untuk offset, kami menggunakan kedudukan setiap huruf kunci bacon kami dalam abjad (dari a hingga z). Kami mengira dari awal, seperti pengaturcara sebenar. Dan setiap huruf dalam teks asal dialihkan oleh nombor tertentu, seperti dalam sifir Caesar, kembali, jika perlu, selepas Z ke permulaan abjad. Jadi M akan bergerak sebanyak 1, e pertama tidak akan bergerak sama sekali, dan yang kedua akan bergerak sebanyak 2 kedudukan. Di bawah anda melihat mesej asal, kunci bertulis dan hasil aplikasinya. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 13 Sifir Vigenère, sudah tentu, lebih kuat, tetapi jika anda mengetahui panjang kunci, ia agak mudah untuk dipecahkan. Bagaimana untuk mengenal pastinya? Jika teks asal cukup panjang sehingga beberapa perkataan muncul beberapa kali di dalamnya, maka anda akan melihat beberapa pengulangan: Anda Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 14 juga boleh menggunakan kekerasan, tetapi terdapat banyak pilihan: 26^n – 1 dengan n ialah panjang kunci yang tidak diketahui . Tetapi selalunya ini banyak. Benar, ini bukan masalah untuk komputer. Dan kini matematik sifir: Biarkan p ialah beberapa teks, k ialah kata kunci, kj ialah huruf ke-j kunci, pi ialah huruf nombor i dalam teks asal, ci ialah huruf nombor i dalam penyulitan. . Kemudian: ci = (pi + kj) % 26
Senaman
Syarat Tulis program vigenere.c yang menyulitkan mesej menggunakan sifir Vigenere. Kami membekalkan satu hujah baris arahan kepada input program: kata kunci k, yang terdiri daripada huruf abjad Inggeris. Jika aplikasi dilancarkan dengan lebih daripada satu hujah atau dengan hujah yang tidak disertakan dalam abjad, adalah perlu untuk memaparkan maklumat ralat dan menamatkan program. Iaitu, utama akan mengembalikan 1 - dalam kes ini, ujian automatik kami akan memahami bahawa semuanya baik-baik saja di sini, dan syarat ini diambil kira. Jika semuanya baik-baik saja, program harus meneruskan untuk meminta rentetan teks p, yang kami enkripsi dengan kunci k yang diperoleh di atas, mencetak hasilnya dan menyelesaikan program, mengembalikan nilai 0. Penjelasan Ia adalah perlu untuk memastikan bahawa dalam kunci k aksara A dan a ditetapkan sebagai 0, B dan b sebagai 1, ..., Z dan z sebagai 25. Program mesti menggunakan sifir Vigenère hanya pada huruf teks p. Aksara yang tinggal (nombor, tanda baca, ruang) mesti dikeluarkan tanpa perubahan. Jika algoritma akan menggunakan aksara jth k kepada aksara ke-i p yang tiada dalam abjad, gunakan aksara utama jth itu pada aksara abjad seterusnya dalam teks; anda tidak boleh meninggalkannya dan beralih kepada watak lain dalam k. Akhirnya, program mesti mengekalkan kes setiap huruf dalam p .
Tak tahu nak mula dari mana?
Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 15
Berikut adalah beberapa petua daripada Zamilya, pembantu kursus CS50
Nasib baik, program ini sangat serupa dengan sifir Caesar, hanya kuncinya adalah rentetan dan bukannya integer. Jika anda telah berjaya melaksanakan sifir nama pemerintah Rom, ia boleh menjadi permulaan yang baik untuk tugasan kedua. Anda mungkin telah menyedari bahawa sifir Vigenère dengan satu huruf sebagai kunci adalah sama dengan sifir Caesar. Algoritma Vigenère menggunakan langkah yang sama seperti Caesar:
  1. Dapatkan kunci
    • codeword ialah argumen baris perintah kedua argv[1]
    • mesti dalam abjad: fungsi isalpha
  2. Dapatkan teks
  3. Sulitkan
  4. Cetak teks sifir
Jadi, mari kita semak argumen baris perintah kedua argv[1] untuk melihat sama ada ia tergolong dalam aksara abjad. Kami melakukan ini menggunakan isalpha yang sudah biasa . Jika kuncinya betul, kami menerima rentetan daripada pengguna dan memulakan penyulitan. Formula sifir Vigenère adalah serupa dengan formula sifir Caesar. Bagaimanakah anda menukar huruf kepada offset sifir yang sepadan? Cuba bandingkan nilai menggunakan jadual ASCII. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 16 Kemungkinan besar, anda akan dapat mencari corak antara huruf dan indeks abjadnya menggunakan urutan dalam jadual. Pernahkah anda memikirkan cara untuk menolak satu huruf dari yang lain untuk mendapatkan hasil yang diinginkan? Offset untuk huruf besar dan kecil adalah sama, jadi anda perlu menentukan dua formula yang serupa untuk menentukan offset untuk huruf kecil dan secara berasingan untuk huruf besar. Juga ingat bahawa gelung teks harus mengabaikan aksara bukan bahasa Inggeris. Dan jangan lupa simpan bekas surat. Jika anda melihat formula sifir: ci = (pi + kj) % 26 anda akan melihat dua pembolehubah indeks, i dan j. Satu menyimpan kedudukan dalam teks sumber, satu lagi dalam kunci. Jika teks anda lebih panjang daripada kekunci, indeks pada kekunci pergi dari hujung kekunci kembali ke permulaan. Bagaimana hendak melakukannya? Menggunakan operasi pembahagian modulo! Hasil operasi ialah baki pembahagian dua nombor. Faedah praktikal operasi ini dalam pengaturcaraan adalah sangat besar! Bayangkan bahawa sekumpulan besar orang perlu dibahagikan kepada tiga subkumpulan. Satu cara untuk melakukan ini ialah meminta mereka membayar untuk yang pertama, kedua, ketiga. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 17 Maksudnya, orang pertama tergolong dalam kumpulan pertama, kedua kepada kedua, ketiga kepada ketiga, keempat kepada pertama lagi, dan seterusnya. Anda boleh menggunakan pembahagian modulo untuk melaksanakan operasi yang sama. Mari kita nombor tiga kumpulan yang sama dari awal. Begini cara untuk melakukannya: Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 18 Jika anda mengambil indeks dan membahagikannya modulo nilai maksimum, hasil yang terhasil tidak akan lebih besar daripada atau sama dengan nilai itu. Cuba prinsip ini untuk mengembalikan kata kunci ke permulaan! Hanya daripada mengisih mengikut kumpulan anda memerlukan indeks kata kunci supaya anda boleh mengimbangi huruf yang betul tanpa melebihi panjang kunci. Memandangkan kami sedang mengautomasikan beberapa ujian kod anda, atur cara harus berkelakuan seperti yang ditunjukkan di bawah: 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 boleh menguji atur cara selain mengira teks sifir secara manual? Kami baik: untuk ini kami menulis program devigene . Ia memerlukan satu dan hanya satu hujah baris perintah (kata kunci), dan tugasnya adalah untuk mengambil teks sifir sebagai input dan mengembalikan teks biasa. Jalankannya: ~cs50/pset2/devigenere k Di mana k ialah kata kunci. Jika anda ingin menyemak ketepatan program anda menggunakan check50, jalankan: check50 2014.fall.pset2.vigenere vigenere.c Dan jika anda ingin menilai pelaksanaan vigenere kami, taip: ~cs50/pset2/vigenere

Bagaimana untuk mengesahkan kod anda dan mendapatkan markah

Perhatian! Jika penting untuk anda menyemak hanya ketepatan tugasan, kemudian gunakan cs50check. Jika anda ingin mendapatkan gred pada platform edx, ikut prosedur yang diterangkan di bawah. Perlu diingat, prosedur ini menggunakan cs50check yang sama untuk menyemak tugas. Satu-satunya perbezaan ialah ia mengingati keputusan dan mengira skor keseluruhan.
  1. Log masuk ke CS50 IDE
  2. Berhampiran sudut kiri atas IDE CS50 , di mana penyemak imbas failnya terletak (bukan dalam tetingkap terminal), klik kanan pada fail initials.c anda yang terletak dalam direktori pset2 dan klik Muat turun . Anda seharusnya melihat bahawa penyemak imbas telah memuatkan inisial.c .
  3. Ulang untuk caesar.c .
  4. Ulang untuk vigenere.c .
  5. Dalam tetingkap atau tab yang berasingan, log masuk ke CS50 Submit
  6. Klik pada ikon Hantar di sudut kiri atas skrin. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 19
  7. Dalam senarai folder di sebelah kiri, klik pada direktori Set Masalah 2 , kemudian klik pada butang Muat Naik Penyerahan Baharu . Ia di sebelah kanan. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 20
  8. Pada skrin yang muncul, klik pada butang Tambah fail .... Tetingkap untuk memilih fail dari komputer anda akan dibuka. Harvard CS50: Tugasan Minggu 2 (Kuliah 5 dan 6) - 21
  9. Navigasi ke folder tempat anda menyimpan inisial.c . Ia berkemungkinan besar terletak dalam folder Muat Turun anda atau di mana-mana pelayar anda meletakkan fail secara lalai. Apabila anda menemui inisial.c , klik padanya sekali untuk memilihnya, kemudian klik Buka.
  10. Klik Tambah fail sekali lagi.
  11. Cari caesar.c dan bukanya.
  12. Lakukan perkara yang sama untuk fail vigenere.c .
  13. Klik Mula muat naik. Fail anda akan dimuat naik ke pelayan CS50 .
  14. Pada skrin yang muncul, anda sepatutnya melihat tetingkap Tiada Fail Dipilih . Jika anda menggerakkan kursor tetikus anda ke kiri, anda akan melihat senarai fail yang dimuat turun. Untuk mengesahkan, klik pada setiap satu daripadanya. Jika anda tidak pasti tentang sesuatu, anda boleh memuat naik semula fail dengan mengulangi langkah yang sama. Anda boleh melakukan ini seberapa banyak kali yang anda suka sehingga penghujung tahun 2016.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION