JavaRush /Java Blog /Random-IT /Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6)
Masha
Livello 41

Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6)

Pubblicato nel gruppo Random-IT
compiti CS50 per le lezioni 5 e 6 Le lezioni su CS50 sono qui: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Questo materiale contiene 3 attività, informazioni teoriche su di essi e una guida all'azione.

Obiettivi

• Approfondire funzioni e librerie. • Acquisire familiarità con la crittografia, implementare un paio di semplici cifrari

Materiali aggiuntivi

https://reference.cs50.net/ - spiegazione delle funzioni della libreria utilizzate durante la formazione. In inglese. http://computer.howstuffworks.com/c.htm pagine 11 – 14 e 39

Preparazione

Accedi a cs50.io update50 per assicurarti che la versione dell'area di lavoro sia aggiornata. Se chiudi accidentalmente la finestra del terminale, recati nel menu Visualizza e assicurati che sia presente il segno di spunta accanto alla voce Console (selezionalo se non lo è). Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 1 Fare clic su (+), all'interno del cerchio verde sulla cornice della finestra del terminale, selezionare Nuovo terminale . Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 2 Crea una directory di lavoro: mkdir ~/workspace/pset2 nota che c'è uno spazio tra mkdir e ~/workspace/pset2 . Per ricapitolare, ~ indica la directory root, ~/workspace è una cartella chiamata workspace all'interno della directory root, ~/workspace/pset2 è una directory chiamata pset2 all'interno ~/workspace . Ora esegui: cd ~/workspace/pset2 per passare alla nuova directory. La riga di comando è simile a questa: username:~/workspace/pset2 $ Se qualcosa non va, ripetere i passaggi. Puoi anche chiamare un comando history per visualizzare gli ultimi comandi in ordine cronologico. Puoi anche posizionare il cursore sulla riga di comando e premere la freccia su sulla tastiera per visualizzare tutti i comandi in ordine dall'ultimo inserito al primo. Usando il pulsante giù puoi tornare indietro. A proposito, invece di digitare ogni volta gli stessi comandi, puoi scorrere i comandi che hai già digitato ed eseguirli nuovamente premendo Invio. Potresti aver notato che David fa esattamente questo nelle sue lezioni. Le attività della seconda settimana dovrebbero essere salvate in pset2 .

Compito 0. Inizializzazione

Diamo uno sguardo più da vicino alle linee. Nel file iniziali.c scrivere un programma che richieda il nome dell'utente (usando la funzione GetString otteniamo il nome come stringa) e poi visualizzi le prime lettere del nome (o dei nomi) e del cognome in maiuscolo senza spazi, punti o altri caratteri, solo con un avanzamento riga ( \n ). Supponiamo che gli utenti inseriscano solo lettere (minuscole o maiuscole o entrambe) più uno spazio tra le parole. Considera che i ragazzi di nome Joseph Gordon-Levitt, Conan O'Brien o David J. Malan non utilizzeranno il programma. Per verificare il corretto funzionamento del programma chiama check50: Vuoi giocare con l'implementazione del programma preparato dallo staff CS50? Digita la riga: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Crittografia
Crittografia, la scienza della crittografia e della decifrazione delle informazioni... In effetti, i messaggi crittografati esistono fin dall'antichità e venivano utilizzati dagli eserciti per trasmettere messaggi segreti. Bene, ora le tue password su Facebook e altre reti vengono archiviate in forma crittografata.

Compito 1. Ave, Cesare!

Informazioni teoriche
Studieremo uno dei codici più semplici: il codice di Cesare, dal nome dell'imperatore romano. In questo codice, ogni lettera del testo viene sostituita da un'altra, ovvero un numero fisso di lettere più in basso nell'alfabeto. Questo numero fisso di lettere è chiamato chiave . Quindi, la chiave 1 trasforma la lettera latina C nella lettera D e Z attraverso il ciclo in A. Se la chiave è 3, allora la lettera C si trasformerà in F e Z in C. Esempi: usiamo il cifrario di Cesare con tasto 5 sulla parola cat. c -> h a -> f t -> y Caesar (cat, 5) = hfy Chiave = 7, parola = computer c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 3 Il codice di Cesare è semplice, ma ahimè inaffidabile (sono cose interconnesse!): per l'alfabeto inglese ci sono solo 25 opzioni di crittografia, è facile passare attraverso tutte le opzioni anche senza un computer. Tuttavia, il cifrario di Cesare viene spesso utilizzato come passaggio in altri cifrari, come il cifrario di Vigenère (ne parleremo più avanti nel paragrafo successivo). "matematizziamo" il codice di Cesare. Indichiamo il testo in chiaro con la lettera p, pi è la lettera nel testo p che si trova nella posizione numero i. Chiameremo k la chiave segreta, c testo cifrato e ci la lettera del testo cifrato che si trova nella posizione i. Quindi puoi calcolare ogni lettera del codice utilizzando la formula: ci = (pi + k) % 26 Abituati a questa formalizzazione, ti consente di programmare l'algoritmo ed esprime il significato del codice in modo accurato e conciso. Se la chiave k = 13 e il testo originale p è "Assicurati di bere la tua Ovomaltina!", questo è il codice che otteniamo: Or fher gb qevax lbhe Binygvar! Nota che O (la prima lettera nel testo cifrato) è spostata di 13 posizioni dalla lettera B (la prima lettera del testo originale). La stessa cosa con la lettera r (la seconda lettera nella crittografia) viene spostata di 13 lettere dalla e (la seconda lettera nell'originale). La terza lettera nella crittografia, f, viene spostata di 13 lettere dalla s (la terza nell'originale), qui andiamo in cerchio dalla z alla a. Un cifrario Caesar con chiave 13 ha il nome speciale ROT13 . È simmetrico: applicandolo due volte si ritorna al testo originale. Naturalmente c'è anche ROT26, questo è generalmente super sicuro, ma solo se non esprimi chiaramente i tuoi pensieri =).
Condizione
Scrivi nel file caesar.c un programma che crittografi il testo utilizzando la cifra di Cesare. Fornire un argomento della riga di comando come input al programma: un numero intero non negativo. Per semplicità chiamiamolo k. Se l'utente esegue il programma senza argomenti sulla riga di comando o con più di un argomento, l'applicazione dovrebbe lamentarsi e restituire il valore 1 (così vengono solitamente indicati gli errori): return 1; In tutti gli altri casi, il programma richiede all'utente il testo da crittografare, quindi visualizza il testo crittografato con la chiave k (ovvero, spostato k posizioni a destra lungo il ciclo). Se il testo contiene caratteri esterni all'alfabeto inglese, il programma non li modifica. Dopo aver stampato il testo cifrato, l'applicazione esce, main restituisce 0: return 0; se main non restituisce esplicitamente zero, lo restituisce automaticamente (int è in realtà il tipo restituito di main, ma ne parleremo un'altra volta). Secondo la convenzione (le regole della buona forma nella programmazione), se restituisci esplicitamente 1 per indicare un errore, dovresti restituire anche 0 come puntatore al completamento con successo del programma. Sebbene ci siano solo 26 lettere nell'alfabeto inglese, k può essere maggiore di 26. In sostanza, il tasto k = 27 darà lo stesso risultato di k = 1, ma è necessario consentire all'utente di inserire qualsiasi numero non negativo non superiore a 2^31 – 26 (deve rientrare in int). Il programma deve inoltre tenere conto del fatto che le lettere minuscole vengono crittografate in minuscolo e le lettere maiuscole vengono crittografate in maiuscolo. Da dove cominciamo? Poiché l'applicazione deve accettare il valore di k direttamente nella stringa dell'argomento, l'intestazione della nostra funzione principale assomiglia a questa: int main(int argc, string argv[]) Dal Capitolo 6, sai che argv è un array di stringhe. L'array può essere pensato come una fila di armadietti in una palestra. Ognuno di essi ha un significato nascosto. Nel nostro caso, all'interno di ogni cella c'è un argomento come string Per aprire il primo armadietto, usiamo argv[0], il secondo - argv[1] e così via. Se abbiamo n lucchetti, allora dobbiamo fermarci a argv[n - 1], poiché argv[n] non esiste più (o esiste, ma appartiene a qualcun altro, è meglio non toccarlo). Quindi puoi accedere all'argomento k in questo modo: string k = argv[1]; Crediamo che ci sia davvero qualcosa lì! Ricordiamo che argc è una variabile int uguale al numero di righe in argv. Ciò significa che è meglio controllare il valore di argc prima di provare ad aprire la cella, perché potrebbe risultare che non esiste. Idealmente argc = 2. Perché è così? All'interno di argv[0] c'è solitamente il nome del programma. Cioè, argc è sempre almeno 1. Ma il nostro programma ha bisogno che l'utente fornisca un argomento della riga di comando k, quindi argc = 2. Naturalmente, se l'utente inserisce più di un argomento nella riga di comando, anche argc cresce e può essere maggiore di 2 Se l'utente inserisce un numero intero in una stringa, ciò non significa che il valore inserito verrà automaticamente memorizzato come int. Più precisamente, NON lo farà. Sarà una stringa, anche se assomiglia esattamente a un int! Quindi dobbiamo convertire noi stessi la stringa in int. Fortunatamente esiste una funzione chiamata atoi pensata proprio per questo scopo. La sua sintassi è: int k = atoi(argv[1]); Nota che k è di tipo int, quindi puoi eseguire operazioni aritmetiche con esso. Con questa funzione, non devi preoccuparti se l'utente inserisce un numero intero o, ad esempio, foo: in tal caso, atoi restituirà 0. La funzione atoi è dichiarata nella libreria stdlib.h , quindi assicurati di # includerlo all'inizio del programma. Il codice verrà compilato senza questo, poiché abbiamo già incluso questa funzione nella libreria cs50.h. Tuttavia, è meglio fidarsi delle librerie native. Quindi hai k memorizzato come int. Ora chiediamo l'immissione di testo. Se hai svolto i compiti della prima settimana, hai già familiarità con la funzione della libreria CS50 chiamata GetString. Lei ci aiuterà. Dopo aver ricevuto k e il testo iniziale, avviamo la crittografia. Per ricapitolare, puoi scorrere tutti i caratteri di una stringa e stamparli utilizzando il seguente ciclo: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } In altre parole, proprio come argv è un array di stringhe, string è un array di caratteri. Pertanto, possiamo utilizzare le parentesi quadre per accedere ai singoli elementi della stringa nello stesso modo in cui otteniamo le singole stringhe in argv. Naturalmente, non c'è nulla di crittografico nella stampa di ciascuno dei caratteri. Oppure, tecnicamente, quando k = 0. Ma dobbiamo aiutare Cesare a crittografare il suo testo! Salve, Cesare! Per utilizzare strlen, è necessario includere un'altra libreria . Dato che stiamo automatizzando alcuni test di validazione, il programma dovrebbe comportarsi esattamente così: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Oltre a atoi , puoi trovare altre interessanti funzioni nelle librerie ctype.h e stdlib.h . Per fare questo, segui il link e fruga un po' lì intorno. Ad esempio, isdigit è chiaramente qualcosa di interessante =). Quando vai da Z ad A (o da z ad a), non dimenticare l'operatore modulo %in linguaggio C. Studia anche la tabella , mostra i caratteri ASCII non solo per le lettere. Per verificare che il programma funzioni correttamente con check50 , fai quanto segue: check50 2015.fall.pset2.caesar caesar.c E se sei interessato a giocare con il codice realizzato dallo staff CS50, esegui il comando: ~cs50/pset2/caesar A proposito, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Analisi del compito
  1. Prendi la chiave
  2. Ottieni testo
  3. Crittografare
  4. Visualizza un messaggio crittografato
1. Formiamo la funzione principale in modo che l'utente inserisca la chiave sulla riga di comando e ne controlli la correttezza. int main(int argc, string argv[]) argc: • int • numero di argomenti immessi nella riga di comando • se argc = 2 è tutto ok. In caso contrario, stampare l'istruzione e chiudere il programma. • Se argc = 2 controlliamo se la chiave è un intero • Argv è un array di stringhe, una lista con argomenti inseriti al suo interno Array è una struttura dati contenente diversi dati dello stesso tipo in celle diverse. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 4 Ad esempio, l'utente ha inserito la stringa blastoff Team Rocket, quindi: Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 5 Utilizzando la funzione atoi(), convertiamo il numero risultante in un numero intero. Se ciò non è possibile, la funzione restituirà 0. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 6 2. Richiedere all'utente il testo. È semplice: tutto ciò che l'utente inserisce è una stringa. 3. Crittografia. L'algoritmo è semplice, ma come spiegare al computer quali lettere si succedono una dopo l'altra? È ora di ricordare la tabella ASCII! Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 7 Tuttavia, in una stringa possono esserci più che semplici lettere... Prima di passare alla modifica delle stringhe, immagina di dover modificare solo un carattere. Vogliamo cambiare le lettere del testo iniziale, non i segni o i numeri. Cosa dovremmo fare? Per prima cosa dobbiamo verificare se questo carattere è nell'alfabeto. Questo può essere fatto usando la funzione isalpha() . Se il carattere è nell'alfabeto, questa funzione restituisce vero e falso altrimenti. Altre due funzioni utili: isupper() e islower() restituiscono true se la lettera è rispettivamente maiuscola o minuscola. Pertanto: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true se isalpha restituisce true, dobbiamo modificare questo carattere utilizzando la chiave. Consideriamo ed analizziamo come esempio il programma di Zamili, l'assistente CS50. Forse ti starai chiedendo perché "A" è un numero intero quando è chiaramente una lettera. Si scopre che simboli e numeri interi sono intercambiabili. Mettendo la lettera A tra virgolette singole si ottiene il suo codice ASCII in int. Attenzione: sono necessarie le virgolette singole; senza di esse il compilatore cercherà una variabile denominata A, non un simbolo. Quindi in linea aggiungiamo il valore della chiave al codice ASCII della lettera e lo memorizziamo in una variabile intera. Anche se il risultato è un int, l'istruzione printf utilizza il segnaposto %c per i caratteri. Quindi il programma stampa il carattere associato al risultato intero. Nel secondo caso visualizziamo il numero utilizzando il segnaposto %d. Puoi inserire questo codice nell'IDE cs50 e giocarci. Controlliamo come funziona l'asciimath per chiavi diverse. Prendiamo il valore 25, vedremo la seguente immagine: E ora lasciamo che la chiave sia 26: Abbiamo ottenuto [, e non la lettera A. È solo il carattere ASCII successivo dopo Z. Quindi la semplice aggiunta della chiave non lavoro. Dobbiamo usare una formula cifrata per tornare all'inizio dell'alfabeto non appena finiamo le lettere. Ricorda, abbiamo già scritto sopra: /* * 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: Compiti della settimana 2 (lezioni 5 e 6) - 8Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 9ci = (pi + k) % 26 Dove ci è la lettera numero i nel testo cifrato, pi è la lettera numero i nel testo in chiaro, k è la chiave e %26 è il resto della divisione per 26 (o “modulo 26”). Applichiamo questa formula alla lettera Y. Prendi k = 2. Calcola ('Y' + 2) %26 codice ASCII della lettera 'Y' = 89. Quindi ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 Ma questo non è il valore ASCII della lettera A di cui abbiamo bisogno, che è 65. Ora diamo a ciascuna lettera dell'alfabeto un valore da 0 a 25 in ordine. In questo caso, Y = 24. (24+2)%26 = 0 La lettera A ha proprio questo indice. Pertanto, questa formula si riferisce all'indice alfabetico delle lettere, non ai loro valori ASCII. Per stampare un carattere crittografato avrai bisogno del suo valore ASCII. E scopri come passare da un valore ASCII a un numero dell'alfabeto. Una volta individuata la formula per un carattere, dobbiamo applicarla a ciascuna lettera della stringa inserita dalla tastiera. Ma solo se queste sono lettere! E ricorda, le lettere maiuscole e quelle minuscole richiedono significati diversi. È qui che le funzioni isupper e islower tornano utili. Potresti avere due formule, una per le maiuscole, l'altra per le minuscole, le funzioni ti aiuteranno a scegliere quale applicare. Come applicare una formula a ogni singolo carattere in una stringa? Ricorda che una stringa è solo un array di caratteri. La funzione strlen (lunghezza della stringa) ti aiuterà a determinare il numero di iterazioni in un ciclo .Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 10

Attività 2. Parlez-vous français?

Teoria
Il codice Vigenère è in qualche modo più sicuro del codice Cesare: utilizza una parola come chiave ed è difficile da decifrare manualmente utilizzando l'analisi della frequenza o la sola forza bruta. Ogni lettera del tasto genera un numero e di conseguenza otteniamo diversi tasti per spostare le lettere. Esempio: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 11 Se il numero di lettere del messaggio non è divisibile per la chiave, ne utilizziamo solo una parte nell'ultima applicazione della chiave: Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 12 Per trovare il valore dell'offset, utilizziamo le posizioni di ciascuna lettera della nostra chiave bacon nell'alfabeto (dalla a alla z). Contiamo da zero, come veri programmatori. E ogni lettera del testo originale viene spostata di un dato numero, come nel cifrario di Cesare, ritornando, se necessario, dopo la Z all'inizio dell'alfabeto. Quindi M si sposterà di 1, la prima e non si sposterà affatto e la seconda si sposterà di 2 posizioni. Qui sotto vedete il messaggio originale, la chiave scritta e il risultato della sua applicazione. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 13 Il codice di Vigenère è, ovviamente, più potente, ma se si conosce la lunghezza della chiave è abbastanza facile da decifrare. Come identificarlo? Se il testo originale è abbastanza lungo da far apparire alcune parole più volte, vedrai alcune ripetizioni: puoi Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 14 anche usare la forza bruta, ma ci sono molte opzioni: 26^n – 1 dove n è la lunghezza della chiave sconosciuta . Ma di solito questo è molto. È vero, questo non è un problema per un computer. E ora la matematica del cifrario: sia p un testo, k sia la parola chiave, kj sia la j-esima lettera della chiave, pi sia la lettera numero i nel testo originale, ci sia la lettera numero i nella crittografia . Poi: ci = (pi + kj) % 26
Esercizio
Condizione Scrivere un programma vigenere.c che crittografi un messaggio utilizzando la cifratura Vigenere. Forniamo un argomento della riga di comando all'input del programma: la parola chiave k, composta da lettere dell'alfabeto inglese. Se l'applicazione viene lanciata con più argomenti o con un argomento non compreso nell'alfabeto è necessario visualizzare l'informazione di errore e terminare il programma. Cioè, main restituirà 1: in questo caso, i nostri test automatici capiranno che qui va tutto bene e questa condizione verrà presa in considerazione. Se tutto va bene, il programma dovrebbe procedere a richiedere una stringa di testo p, che cripteremo con la chiave k ottenuta sopra, stamperemo il risultato e completeremo il programma, restituendo il valore 0. Chiarimento È necessario assicurarsi che nella chiave k i caratteri A e a vengono designati come 0, B e b come 1, ..., Z e z come 25. Il programma deve applicare la cifratura di Vigenère solo alle lettere del testo p. I restanti caratteri (numeri, segni di punteggiatura, spazi) devono essere emessi senza modifiche. Se l'algoritmo applicherà il jesimo carattere k all'iesimo carattere p che non è nell'alfabeto, applica quel jesimo carattere chiave al successivo carattere alfabetico nel testo; non puoi semplicemente lasciarlo e passare a un altro carattere in k. Infine, il programma deve preservare il maiuscolo/minuscolo di ciascuna lettera in p .
Non sai da dove cominciare?
Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 15
Ecco alcuni suggerimenti di Zamilya, assistente del corso CS50
Fortunatamente, il programma è molto simile al codice di Cesare, solo che la chiave è una stringa anziché un numero intero. Se hai implementato con successo il codice del nome del sovrano romano, può essere un ottimo inizio per il secondo compito. Probabilmente hai già capito che il cifrario di Vigenère con una lettera come chiave è uguale al cifrario di Cesare. L'algoritmo di Vigenère utilizza gli stessi passaggi di Caesar:
  1. Prendi la chiave
    • codeword è il secondo argomento della riga di comando argv[1]
    • deve essere nell'alfabeto: funzione isalfa
  2. Ottieni testo
  3. Crittografare
  4. Stampa testo cifrato
Quindi, controlliamo il secondo argomento della riga di comando argv[1] per vedere se appartiene a caratteri alfabetici. Lo facciamo utilizzando il già familiare isalpha . Se la chiave è corretta, riceviamo una stringa dall'utente e iniziamo la crittografia. La formula del cifrario di Vigenère è simile alla formula del cifrario di Cesare. Come si converte una lettera nell'offset cifrato corrispondente? Prova a confrontare i valori utilizzando la tabella ASCII. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 16 Molto probabilmente sarai in grado di trovare uno schema tra le lettere e i loro indici alfabetici utilizzando le sequenze nella tabella. Hai capito come sottrarre una lettera da un'altra per ottenere il risultato desiderato? Gli offset per le lettere maiuscole e minuscole sono gli stessi, quindi dovrai definire due formule simili per determinare l'offset per le lettere minuscole e separatamente per le lettere maiuscole. Ricorda inoltre che il ciclo di testo dovrebbe ignorare i caratteri non inglesi. E non dimenticare di conservare le maiuscole. Se guardi la formula di cifratura: ci = (pi + kj) % 26 vedrai due variabili indice, i e j. Uno salva la posizione nel testo sorgente, l'altro nella chiave. Se il testo è più lungo della chiave, l'indice sulla chiave va dalla fine della chiave all'inizio. Come farlo? Utilizzando l'operazione di divisione del modulo! Il risultato dell'operazione è il resto della divisione di due numeri. I vantaggi pratici di questa operazione di programmazione sono semplicemente enormi! Immagina che un grande gruppo di persone debba essere diviso in tre sottogruppi. Un modo per farlo è chiedere loro di pagare il primo, il secondo, il terzo. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 17 Cioè la prima persona appartiene al primo gruppo, la seconda al secondo, la terza al terzo, la quarta ancora al primo e così via. È possibile utilizzare la divisione modulo per eseguire la stessa operazione. Numeriamo gli stessi tre gruppi da zero. Ecco come farlo: Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 18 se prendi un indice e lo dividi modulo il valore massimo, il risultato risultante non sarà mai maggiore o uguale a quel valore. Prova questo principio per riportare una parola chiave all'inizio! Solo che invece di ordinare per gruppo è necessario l'indice della parola chiave in modo da poter compensare la lettera corretta senza superare la lunghezza della chiave. Dato che stiamo automatizzando alcuni test del tuo codice, il programma dovrebbe comportarsi come mostrato di seguito: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz In quale altro modo puoi testare il programma oltre a calcolare manualmente il testo cifrato? Siamo gentili: per questo abbiamo scritto il programma devigenere . Richiede uno e un solo argomento della riga di comando (parola chiave) e il suo compito è prendere il testo cifrato come input e restituire testo in chiaro. Eseguilo: ~cs50/pset2/devigenere k dove k è la parola chiave. Se vuoi verificare la correttezza del tuo programma usando check50, esegui: check50 2014.fall.pset2.vigenere vigenere.c E se vuoi valutare la nostra implementazione di vigenere, digita: ~cs50/pset2/vigenere

Come convalidare il tuo codice e ottenere voti

Attenzione! Se per te è importante verificare solo la correttezza delle attività, utilizza cs50check. Se vuoi ottenere i voti sulla piattaforma edx, segui la procedura descritta di seguito. Tieni presente che questa procedura utilizza lo stesso cs50check per controllare le attività. L'unica differenza è che ricorda i risultati e calcola il punteggio complessivo.
  1. Accedi all'IDE CS50
  2. Vicino all'angolo in alto a sinistra dell'IDE CS50 , dove si trova il browser dei file (non nella finestra del terminale), fare clic con il pulsante destro del mouse sul file iniziali.c situato nella directory pset2 e fare clic su Scarica . Dovresti vedere che il browser ha caricato iniziali.c .
  3. Ripetere per caesar.c .
  4. Ripetere per vigenere.c .
  5. In una finestra o scheda separata, accedi a CS50 Submit
  6. Fare clic sull'icona Invia nell'angolo in alto a sinistra dello schermo. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 19
  7. Nell'elenco delle cartelle a sinistra, fare clic sulla directory Problem Set 2 , quindi fare clic sul pulsante Carica nuovo invio . E 'sulla destra. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 20
  8. Nella schermata che appare, clicca sul pulsante Aggiungi file .... Si aprirà una finestra per selezionare i file dal tuo computer. Harvard CS50: Compiti della settimana 2 (lezioni 5 e 6) - 21
  9. Passare alla cartella in cui conservi iniziali.c . Molto probabilmente si trova nella cartella Download o ovunque il browser inserisca i file per impostazione predefinita. Quando trovi iniziali.c , fai clic una volta su di esso per selezionarlo, quindi fai clic su Apri.
  10. Fare di nuovo clic su Aggiungi file .
  11. Trova caesar.c e aprilo.
  12. Fai lo stesso per il file vigenere.c .
  13. Fai clic su Avvia caricamento. I tuoi file verranno caricati sui server CS50 .
  14. Nella schermata che appare, dovresti vedere la finestra Nessun file selezionato . Se sposti il ​​cursore del mouse verso sinistra, vedrai un elenco di file scaricati. Per confermare, fare clic su ciascuno di essi. Se non sei sicuro di qualcosa, puoi ricaricare i file ripetendo gli stessi passaggi. Puoi farlo quante volte vuoi fino alla fine del 2016.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION