JavaRush /Java Blog /Random-KO /Harvard CS50: 2주차 과제(강의 5 및 6)
Masha
레벨 41

Harvard CS50: 2주차 과제(강의 5 및 6)

Random-KO 그룹에 게시되었습니다
강의 5, 6에 대한 cs50 과제CS50 강의는 https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html 에 있습니다 . 이 자료에는 3가지 작업, 이에 대한 이론적 정보 및 실행 지침이 포함되어 있습니다.

목표

• 기능과 라이브러리에 대해 더 자세히 알아봅니다. • 암호화에 익숙해지고 몇 가지 간단한 암호를 구현합니다.

추가 자료

https://reference.cs50.net/ - 학습 중에 사용되는 라이브러리 기능에 대한 설명입니다. 영어로. http://computer.howstuffworks.com/c.htm 페이지 11 – 14 및 39

준비

cs50.io에 로그인하여 update50 작업 공간 버전이 최신인지 확인하세요. 실수로 터미널 창을 닫은 경우 보기 메뉴로 이동하여 콘솔 항목 옆에 확인 표시가 있는지 확인하세요(그렇지 않은 경우 확인). Harvard CS50: 2주차 과제(강의 5 및 6) - 1 터미널 창 프레임의 녹색 원 안에 있는 (+)를 클릭하고 New Terminal 을 선택합니다 . Harvard CS50: 2주차 과제(강의 5 및 6) - 2 작업 디렉터리 만들기: mkdir​​~/workspace/pset2mkdir ~/workspace/pset2 사이에 공백이 있습니다 . 요약하면 ~는 루트 디렉터리를 의미하고, ~/workspace 는 루트 디렉터리 내의 작업 공간이라는 폴더를 의미하며, ~/workspace/pset2 는 ~/workspace 내의 pset2 라는 디렉터리를 의미합니다 . 이제 다음을 실행하여 새 디렉터리로 변경합니다. 명령줄은 다음과 같습니다. 잘못된 것이 있으면 단계를 반복하십시오. 명령을 호출하여 마지막 몇 개의 명령을 시간순으로 볼 수도 있습니다. 명령줄에 커서를 놓고 키보드의 위쪽 화살표를 눌러 마지막으로 입력한 명령부터 첫 번째 명령까지 순서대로 모든 명령을 볼 수도 있습니다. 아래쪽 버튼을 사용하면 뒤로 돌아갈 수 있습니다. 그런데 매번 동일한 명령을 입력하는 대신 이미 입력한 명령을 스크롤하고 Enter 키를 눌러 다시 실행할 수 있습니다. 당신은 데이비드가 그의 강의에서 정확히 이런 일을 한다는 것을 눈치챘을 것입니다. 두 번째 주의 작업은 pset2 에 저장되어야 합니다 . cd ~/workspace/pset2username:~/workspace/pset2 $history

작업 0. 초기화

라인을 자세히 살펴보겠습니다. initials.c 파일 에서 사용자 이름을 요청하는 프로그램을 작성하고(GetString 함수를 사용하여 이름을 문자열로 가져옴) 이름(들)과 성의 첫 글자를 공백 없이 대문자로 표시합니다. 마침표 또는 기타 문자는 줄 바꿈( \n )만 사용할 수 있습니다. 사용자가 문자(소문자, 대문자 또는 둘 다)와 단어 사이에 공백 하나만 입력한다고 가정합니다. Joseph Gordon-Levitt, Conan O'Brien 또는 David J. Malan이라는 사람들이 이 프로그램을 사용하지 않을 것이라는 점을 고려하십시오. 프로그램의 올바른 작동을 확인하려면 check50을 호출하십시오. CS50 직원이 준비한 프로그램 구현을 가지고 놀겠습니까? 다음 줄을 입력하세요. username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
암호화
정보를 암호화하고 해독하는 과학인 암호화... 실제로 암호화된 메시지는 고대부터 존재해 왔으며 군대에서 비밀 메시지를 전송하는 데 사용되었습니다. 이제 Facebook 및 기타 네트워크의 비밀번호는 암호화된 형태로 저장됩니다.

작업 1. 만세, 시저!

이론적인 정보
우리는 가장 간단한 암호 중 하나인 로마 황제의 이름을 딴 카이사르 암호를 연구할 것입니다. 이 암호에서는 텍스트의 각 문자가 다른 문자로 대체됩니다. 이는 알파벳에서 더 낮은 고정된 수의 문자입니다. 이 고정된 문자 수를 라고 합니다 . 따라서 키 1은 라틴 문자 C를 문자 D로 변환하고 Z는 순환을 통해 A로 변환합니다. 키가 3이면 문자 C는 F로 변환되고 Z는 C로 변환됩니다. 예: 우리는 카이사르 암호를 다음과 함께 사용합니다. 고양이라는 단어의 키 5입니다. c -> h a -> f t -> y Caesar (cat, 5) = hfy 키 = 7, 단어 = 컴퓨터 c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: 2주차 과제(강의 5 및 6) - 3 Caesar 암호는 간단하지만 아쉽게도 신뢰할 수 없습니다(상호 연결된 것입니다!). 영어 알파벳의 경우 암호화 옵션이 25개뿐이므로 컴퓨터 없이도 모든 옵션을 쉽게 통과할 수 있습니다. 그러나 Caesar 암호는 Vigenère 암호(다음 단락에서 자세히 설명)와 같은 다른 암호의 단계로 사용되는 경우가 많습니다. 카이사르 암호를 "수학적"으로 만들어 봅시다. 일반 텍스트를 문자 p로 표시해 보겠습니다. pi는 텍스트 p에서 위치 번호 i에 있는 문자입니다. 비밀 키 문자 k, c를 암호문, ci를 i 위치에 있는 암호문의 문자라고 부르자. 그런 다음 다음 공식을 사용하여 암호의 각 문자를 계산할 수 있습니다. ci = (pi + k) % 26 이 형식화에 익숙해지면 알고리즘을 프로그래밍하고 암호의 의미를 정확하고 간결하게 표현할 수 있습니다. 키 k = 13이고 원본 텍스트 p가 "Ovaltine을 꼭 드세요!"인 경우, 다음과 같은 암호를 얻게 됩니다. Or fher gb qevax lbhe Binygvar! O(암호문의 첫 문자)가 문자 B(암호문의 첫 문자)에서 13자리 이동되었다는 점에 유의하세요. 원문의 첫 글자). 문자 r(암호화의 두 번째 문자)과 동일한 내용이 e(원본의 두 번째 문자)에서 13문자 이동됩니다. 암호화의 세 번째 문자인 f는 s(원본에서는 세 번째 문자)에서 13개의 문자로 이동됩니다. 여기서는 z에서 a로 원을 그리며 이동합니다. 키가 13인 Caesar 암호의 특수 이름은 ROT13 입니다 . 대칭적입니다. 두 번 적용하면 원래 텍스트로 돌아갑니다. 물론 ROT26도 있습니다. 이것은 일반적으로 매우 안전하지만 생각을 명확하게 표현하지 않는 경우에만 =).
상태
Caesar 암호를 사용하여 텍스트를 암호화하는 프로그램을 caesar.c 파일에 작성하십시오 . 프로그램에 대한 입력으로 하나의 명령줄 인수(음이 아닌 정수)를 제공합니다. 단순화를 위해 k라고 부르겠습니다. 사용자가 명령줄 인수 없이 또는 둘 이상의 인수를 사용하여 프로그램을 실행하는 경우 응용 프로그램은 오류를 표시하고 값 1을 반환해야 합니다(일반적으로 오류가 표시되는 방식입니다). return 1; 다른 모든 경우에는 프로그램이 사용자에게 텍스트를 입력하라는 메시지를 표시합니다. 암호화하려면 키 k로 암호화된 텍스트를 표시합니다(즉, 주기를 따라 오른쪽으로 k 위치 이동). 텍스트에 영어 알파벳 이외의 문자가 포함되어 있으면 프로그램은 해당 문자를 변경하지 않습니다. 암호문을 인쇄한 후 애플리케이션이 종료되고 main은 0을 반환합니다 . main이return 0; 명시적으로 0을 반환하지 않으면 자동으로 반환합니다(int는 실제로 main의 반환 유형이지만 나중에 더 자세히 설명합니다). 관례(프로그래밍의 올바른 형식 규칙)에 따르면 오류를 나타내기 위해 명시적으로 1을 반환하는 경우 프로그램이 성공적으로 완료되었음을 나타내는 포인터로 0도 반환해야 합니다. 영어 알파벳에는 26자 밖에 없지만 k는 26보다 클 수 있습니다. 기본적으로 키 k = 27은 k = 1과 동일한 결과를 제공하지만 사용자가 음수가 아닌 숫자를 입력할 수 있도록 허용해야 합니다. 2^31 – 26을 초과합니다(int에 맞아야 함). 또한 프로그램은 소문자는 소문자로 암호화되고 대문자는 대문자로 암호화된다는 점도 고려해야 합니다. 어디서부터 시작할까요? 애플리케이션은 인수 문자열에서 k 값을 직접 받아들여야 하므로 주요 함수 헤더는 다음과 같습니다. 6장에서 argv 가 문자열 배열이라는 것을 알 수 있습니다 . 이 어레이는 체육관의 사물함 줄로 생각할 수 있습니다. 각각에는 숨겨진 의미가 있습니다. 우리의 경우 각 셀 내부에는 첫 번째 사물함을 열려면 argv[0], 두 번째는 argv[1] 등을 사용하는 인수가 있습니다. n개의 잠금이 있는 경우 argv[n - 1]에서 중지해야 합니다. argv[n]은 더 이상 존재하지 않기 때문입니다(또는 존재하지만 다른 사람에게 속하므로 건드리지 않는 것이 좋습니다). 따라서 다음과 같이 k 인수에 액세스할 수 있습니다. int main(int argc, string argv[])stringstring k = argv[1]; 우리는 거기에 정말로 뭔가가 있다고 믿습니다! argc는 argv의 행 수와 동일한 int 변수라는 점을 기억하세요. 이는 셀을 열려고 시도하기 전에 argc 값을 확인하는 것이 더 낫다는 것을 의미합니다. argc 값이 존재하지 않는 것으로 판명될 수 있기 때문입니다. 이상적으로는 argc = 2입니다. 왜 그렇습니까? argv[0] 내부에는 일반적으로 프로그램 이름이 있습니다. 즉, argc는 항상 1 이상입니다. 그러나 우리 프로그램에서는 사용자가 명령줄 인수 k를 제공해야 하므로 argc = 2입니다. 당연히 사용자가 명령줄에 두 개 이상의 인수를 입력하면 argc도 커지며 2보다 커야 합니다. 사용자가 문자열에 정수를 입력한다고 해서 입력한 값이 자동으로 정수로 저장된다는 의미는 아닙니다. 더 정확하게 말하면 그렇지 않습니다. int와 똑같아 보이더라도 문자열이 됩니다! 그래서 우리는 string을 int로 직접 변환해야 합니다. 다행히도 이러한 목적으로 설계된 atoi라는 기능이 있습니다. 구문은 다음과 같습니다. int k = atoi(argv[1]); k는 int 유형이므로 산술 연산을 수행할 수 있습니다. 이 함수를 사용하면 사용자가 정수를 입력하는지 또는 foo를 입력하는지 걱정할 필요가 없습니다. 이 경우 atoi는 0을 반환합니다. atoi 함수는 stdlib.h 라이브러리에 선언되어 있으므로 # 프로그램 시작 부분에 포함시킵니다. 이 함수는 이미 cs50.h 라이브러리 에 포함되어 있으므로 코드는 이 함수 없이 컴파일됩니다 . 그러나 기본 라이브러리를 신뢰하는 것이 좋습니다. 그래서 k를 int로 저장했습니다. 이제 텍스트 입력을 요청해 보겠습니다. 첫 번째 주의 과제를 수행했다면 이미 GetString이라는 CS50 라이브러리 함수에 익숙할 것입니다. 그녀는 우리를 도울 것입니다. k와 초기 텍스트를 받은 후 암호화를 시작하겠습니다. 요약하면 문자열의 모든 문자를 반복하고 다음 루프를 사용하여 인쇄할 수 있습니다. for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } 즉, argv 가 문자열 배열인 것처럼 string 은 문자 배열입니다. 따라서 argv에서 개별 문자열을 가져오는 것과 동일한 방식으로 대괄호를 사용하여 개별 문자열 요소에 액세스할 수 있습니다. 물론 각 문자를 인쇄하는 데에는 암호화가 없습니다. 또는 기술적으로는 k = 0일 때입니다. 하지만 우리는 카이사르가 그의 텍스트를 암호화하도록 도와야 합니다! 만세, 카이사르! strlen을 사용하려면 다른 라이브러리를 포함해야 합니다 . 일부 유효성 검사 테스트를 자동화하고 있으므로 프로그램은 정확히 다음과 같이 작동해야 합니다. atoiusername:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! 외에도 ctype.hstdlib.h 라이브러리 에서 다른 멋진 함수를 찾을 수 있습니다 . 이렇게 하려면 링크를 따라가서 주변을 조금 뒤져보세요. 예를 들어, isdigit는 분명히 흥미로운 것입니다 =). Z에서 A로(또는 z에서 a로) 이동할 때 모듈로 연산자 %를 잊지 마세요.C 언어로 또한 표를 연구하면 문자뿐만 아니라 ASCII 문자도 표시됩니다. 프로그램이 check50 으로 올바르게 작동하는지 확인하려면 다음을 수행하십시오. check50 2015.fall.pset2.caesar caesar.c 그리고 CS50 직원이 만든 코드를 가지고 놀고 싶다면 다음 명령을 실행하십시오. ~cs50/pset2/caesar 그런데 uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
작업 분석
  1. 열쇠를 얻으세요
  2. 문자 받기
  3. 암호화
  4. 암호화된 메시지 표시
1. 사용자가 명령줄에 키를 입력하고 키가 올바른지 확인하도록 기본 기능을 구성합니다. int main(int argc, string argv[]) argc: • int • 명령줄에 입력된 인수 수 • argc = 2인 경우 모든 것이 정상입니다. 그렇지 않은 경우 지침을 인쇄하고 프로그램을 닫습니다. • argc = 2이면 키가 정수인지 확인합니다. • Argv는 문자열 배열, 인수가 입력된 목록입니다. 배열은 서로 다른 셀에 동일한 유형의 서로 다른 데이터를 포함하는 데이터 구조입니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 4 예를 들어, 사용자가 blastoff Team Rocket이라는 문자열을 입력한 다음 Harvard CS50: 2주차 과제(강의 5 및 6) - 5 atoi() 함수를 사용하여 결과 숫자를 정수로 변환합니다. 이것이 불가능할 경우 함수는 0을 반환합니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 6 2. 사용자에게 텍스트를 입력하라는 메시지를 표시합니다. 간단합니다. 사용자가 입력하는 모든 것은 문자열입니다. 3. 암호화. 알고리즘은 간단하지만 어떤 문자가 차례로 나오는지 컴퓨터에 어떻게 설명할 수 있습니까? 이제 ASCII 테이블을 기억할 시간입니다! Harvard CS50: 2주차 과제(강의 5 및 6) - 7 그러나 문자열에는 문자 이상의 것이 있을 수 있습니다... 문자열 변경으로 넘어가기 전에 문자 하나만 변경하면 된다고 상상해 보십시오. 기호나 숫자가 아닌 초기 텍스트의 문자를 변경하고 싶습니다. 우리는 무엇을 해야 합니까? 먼저 이 문자가 알파벳인지 확인해야 합니다. 이는 isalpha() 함수를 사용하여 수행할 수 있습니다 . 문자가 알파벳이면 이 함수는 true를 반환하고 그렇지 않으면 false를 반환합니다. 두 가지 유용한 함수인 isupper()islower()는 각각 문자가 대문자이거나 소문자인 경우 true를 반환합니다. 따라서 Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true isalpha가 true를 반환하면 키를 사용하여 이 문자를 변경해야 합니다. CS50 어시스턴트인 Zamili의 프로그램을 예로 들어 살펴보고 분석해 보겠습니다. 'A'가 분명히 문자인데 왜 정수인지 궁금할 것입니다. 기호와 정수는 서로 바꿔서 사용할 수 있다는 것이 밝혀졌습니다. 문자 A를 작은따옴표로 묶으면 int 형식의 ASCII 코드를 얻을 수 있습니다. 주의하세요: 작은 따옴표가 필요합니다. 작은 따옴표가 없으면 컴파일러는 기호가 아닌 A라는 변수를 찾습니다. 그런 다음 문자의 ASCII 코드에 키 값을 추가하고 이를 정수 변수에 저장합니다. 결과가 int인 경우에도 printf 문은 문자에 %c 자리 표시자를 사용합니다. 따라서 프로그램은 정수 결과와 관련된 문자를 인쇄합니다. 두 번째 경우에는 %d 자리 표시자를 사용하여 숫자를 표시합니다. 이 코드를 cs50 IDE에 입력하고 사용할 수 있습니다. Asciimath가 다양한 키에 대해 어떻게 작동하는지 확인해 보겠습니다. 값 25를 선택하면 다음 그림이 표시됩니다. 이제 키를 26으로 설정합니다. 문자 A가 아닌 [를 얻었습니다. 이는 Z 다음의 ASCII 문자일 뿐입니다. 따라서 단순히 키를 추가하면 일하다. 글자가 없어지자마자 알파벳의 처음으로 돌아가려면 암호 공식을 사용해야 합니다. 우리는 이미 위에서 다음과 같이 썼다는 것을 기억하세요: /* * 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: 2주차 과제(강의 5 및 6) - 8Harvard CS50: 2주차 과제(강의 5 및 6) - 9ci = (pi + k) % 26 여기서 ci는 암호문의 문자 번호 i이고, pi는 일반 텍스트의 문자 번호 i이며, k는 키이고, %26은 26으로 나눈 나머지(또는 "모듈로 26")입니다. 이 공식을 문자 Y에 적용해 보겠습니다. k = 2를 취합니다. 문자 'Y'의 ('Y' + 2) %26 ASCII 코드 = 89를 계산합니다. 그러면 ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 그러나 이것은 우리가 필요로 하는 문자 A의 ASCII 값인 65가 아닙니다. 이제 알파벳의 각 문자에 0부터 25까지의 값을 순서대로 부여해 보겠습니다. 이 경우 Y = 24입니다. (24+2)%26 = 0 문자 A에는 바로 이러한 인덱스가 있습니다. 따라서 이 공식은 ASCII 값이 아닌 문자의 알파벳순 인덱스를 나타냅니다. 암호화된 문자를 인쇄하려면 해당 문자의 ASCII 값이 필요합니다. 그리고 ASCII 값과 알파벳 숫자 사이를 전환하는 방법을 알아보세요. 한 문자에 대한 공식을 알아낸 후에는 키보드에서 입력한 문자열의 각 문자에 이를 적용해야 합니다. 하지만 이것이 편지인 경우에만! 그리고 대문자와 소문자에는 서로 다른 의미가 필요하다는 점을 기억하세요. isupper 및 islower 기능이 유용한 곳입니다. 두 개의 수식(하나는 대문자, 다른 하나는 소문자)이 있을 수 있으며, 함수는 적용할 수식을 선택하는 데 도움이 됩니다. 문자열의 모든 단일 문자에 수식을 적용하는 방법은 무엇입니까? 문자열은 문자의 배열일 뿐이라는 점을 기억하세요. strlen 함수 (문자열 길이) 는 루프의 반복 횟수를 결정하는 데 도움이 됩니다 .Harvard CS50: 2주차 과제(강의 5 및 6) - 10

작업 2. Parlez-vous français?

이론
Vigenère 암호는 Caesar 암호보다 다소 안전합니다. 단어를 키로 사용하며 빈도 분석이나 무차별 대입만으로는 수동으로 해독하기가 어렵습니다. 키의 각 문자는 숫자를 생성하고 결과적으로 문자 이동을 위한 여러 키를 얻습니다. 예: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: 2주차 과제(강의 5 및 6) - 11 메시지의 문자 수가 키로 나누어지지 않는 경우 키를 마지막으로 적용할 때 문자의 일부만 사용합니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 12 오프셋 값을 찾으려면 베이컨 키의 각 문자 위치를 사용합니다. 알파벳(a부터 z까지)으로. 우리는 진정한 프로그래머처럼 처음부터 계산합니다. 그리고 원본 텍스트의 각 문자는 카이사르 암호에서와 같이 주어진 숫자만큼 이동되어 필요한 경우 Z 이후 알파벳의 시작 부분으로 돌아갑니다. 따라서 M은 1만큼 이동하고 첫 번째 e는 전혀 이동하지 않으며 두 번째는 2만큼 이동합니다. 아래에서 원본 메시지, 작성된 키 및 적용 결과를 볼 수 있습니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 13 물론 Vigenère 암호는 더 강력하지만 키의 길이를 알면 해독하기가 매우 쉽습니다. 그것을 식별하는 방법? 원본 텍스트가 너무 길어 일부 단어가 여러 번 나타날 경우 일부 반복이 표시됩니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 14 무차별 대입을 사용할 수도 있지만 다양한 옵션이 있습니다. 26^n – 1 여기서 n은 알 수 없는 키의 길이입니다. . 그러나 일반적으로 이것은 많은 것입니다. 사실, 이것은 컴퓨터에는 문제가 되지 않습니다. 이제 암호의 수학은 다음과 같습니다. p를 텍스트로, k를 키워드로, kj를 키의 j번째 문자로, pi를 원본 텍스트의 문자 번호 i로, ci를 암호화의 문자 번호 i로 설정합니다. . 그 다음에: ci = (pi + kj) % 26
운동
조건 Vigenere 암호를 사용하여 메시지를 암호화하는 프로그램 vigenere.c를 작성하세요. 우리는 프로그램 입력에 하나의 명령줄 인수를 제공합니다: 영어 알파벳 문자로 구성된 키워드 k입니다. 두 개 이상의 인수를 사용하거나 알파벳에 포함되지 않은 인수를 사용하여 애플리케이션을 실행하는 경우 오류 정보를 표시하고 프로그램을 종료해야 합니다. 즉, main은 1을 반환합니다. 이 경우 자동 테스트에서는 여기의 모든 것이 정상임을 이해하고 이 조건이 고려됩니다. 모든 것이 정상이라면 프로그램은 위에서 얻은 키 k로 암호화한 텍스트 문자열 p를 요청해야 하며 결과를 인쇄하고 프로그램을 완료하여 값 0을 반환해야 합니다 . k 문자 A와 a는 0으로, B와 b는 1로, ..., Z와 z는 25로 지정됩니다. 프로그램은 텍스트 p의 문자에만 Vigenère 암호를 적용해야 합니다. 나머지 문자(숫자, 구두점, 공백)는 변경 없이 출력되어야 합니다. 알고리즘이 j번째 문자 k를 알파벳이 아닌 i번째 문자 p 에 적용하려는 경우 해당 j번째 키 문자를 텍스트의 다음 알파벳 문자에 적용합니다. 그냥 놔두고 k의 다른 캐릭터로 넘어갈 수는 없어요. 마지막으로 프로그램은 p 에 있는 각 문자의 대소문자를 유지해야 합니다 .
어디서부터 시작해야 할지 모르시나요?
Harvard CS50: 2주차 과제(강의 5 및 6) - 15
CS50 코스 조수인 Zamilya의 몇 가지 팁은 다음과 같습니다.
다행스럽게도 이 프로그램은 Caesar 암호와 매우 유사하며 키만 정수가 아닌 문자열입니다. 로마 통치자의 이름 암호를 성공적으로 구현했다면 두 번째 작업을 위한 좋은 시작이 될 수 있습니다. 한 문자를 키로 사용하는 Vigenère 암호가 Caesar 암호와 동일하다는 것을 이미 알고 계실 것입니다. Vigenère 알고리즘은 Caesar와 동일한 단계를 사용합니다.
  1. 열쇠를 얻으세요
    • codeword는 두 번째 명령줄 인수 argv[1]입니다.
    • 알파벳이어야 합니다: isalpha 함수
  2. 문자 받기
  3. 암호화
  4. 암호문 인쇄
그럼 두 번째 명령줄 인수 argv[1]이 알파벳 문자에 속하는지 확인해 보겠습니다. 우리는 이미 익숙한 isalpha 를 사용하여 이를 수행합니다 . 키가 정확하면 사용자로부터 문자열을 받고 암호화를 시작합니다. Vigenère 암호 공식은 Caesar 암호 공식과 유사합니다. 문자를 해당 암호 오프셋으로 어떻게 변환합니까? ASCII 표를 사용하여 값을 비교해 보세요. Harvard CS50: 2주차 과제(강의 5 및 6) - 16 아마도 표에 있는 순서를 사용하여 문자와 알파벳 색인 사이의 패턴을 찾을 수 있을 것입니다. 원하는 결과를 얻기 위해 한 글자를 다른 글자에서 빼는 방법을 알아냈나요? 대문자와 소문자에 대한 오프셋은 동일하므로 소문자에 대한 오프셋과 대문자에 대한 오프셋을 별도로 결정하려면 두 개의 유사한 수식을 정의해야 합니다. 또한 텍스트 루프는 영어가 아닌 문자를 무시해야 한다는 점을 기억하십시오. 그리고 대소문자를 보존하는 것을 잊지 마세요. 암호 공식을 보면 ci = (pi + kj) % 26 i와 ​​j라는 두 개의 인덱스 변수가 표시됩니다. 하나는 소스 텍스트에 위치를 저장하고 다른 하나는 키에 저장합니다. 텍스트가 키보다 긴 경우 키의 인덱스는 키의 끝에서 다시 처음으로 이동합니다. 어떻게 하나요? 모듈로 나눗셈 연산을 사용해보세요! 연산의 결과는 두 숫자를 나눈 나머지입니다. 프로그래밍에서 이 작업의 실질적인 이점은 엄청납니다! 대규모의 사람들이 세 개의 하위 그룹으로 나누어져야 한다고 상상해 보십시오. 이를 수행하는 한 가지 방법은 첫 번째, 두 번째, 세 번째 비용을 지불하도록 요청하는 것입니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 17 즉, 첫 번째 사람은 첫 번째 그룹에 속하고, 두 번째 사람은 두 번째 그룹에 속하고, 세 번째 사람은 세 번째 그룹에 속하고, 네 번째 사람은 다시 첫 번째 그룹에 속합니다. 모듈로 나눗셈을 사용하여 동일한 작업을 수행할 수 있습니다. 동일한 세 그룹에 처음부터 번호를 매겨 보겠습니다. 이를 수행하는 방법은 다음과 같습니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 18 인덱스를 가져와 이를 최대값으로 모듈로 나누면 결과 결과는 해당 값보다 크거나 같을 수 없습니다. 키워드를 처음으로 되돌리려면 이 원리를 시도해 보세요! 그룹별로 정렬하는 대신 키 길이를 초과하지 않고 올바른 문자를 오프셋할 수 있도록 키워드의 인덱스가 필요합니다. 코드의 일부 테스트를 자동화하고 있으므로 프로그램은 아래와 같이 작동해야 합니다. jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz 암호문을 수동으로 계산하는 것 외에 프로그램을 테스트할 수 있는 다른 방법은 무엇입니까? 우리는 친절합니다. 이를 위해 우리는 devigenere 프로그램을 작성했습니다 . 단 하나의 명령줄 인수(키워드)를 사용하며 해당 작업은 암호 텍스트를 입력으로 사용하고 일반 텍스트를 반환하는 것입니다. 실행해 보세요. ~cs50/pset2/devigenere k 여기서 k는 키워드입니다. check50을 사용하여 프로그램의 정확성을 확인하려면 다음을 실행하십시오. check50 2014.fall.pset2.vigenere vigenere.c vigenere 구현을 평가하려면 다음을 입력하십시오. ~cs50/pset2/vigenere

코드를 검증하고 점수를 받는 방법

주목! 작업의 정확성만 확인하는 것이 중요하다면 cs50check를 사용하세요. edx 플랫폼에서 성적을 받으려면 아래 설명된 절차를 따르세요. 이 절차에서는 동일한 cs50check를 사용하여 작업을 확인합니다. 유일한 차이점은 결과를 기억하고 전체 점수를 계산한다는 것입니다.
  1. CS50 IDE 에 로그인
  2. 파일 브라우저가 있는 CS50 IDE 왼쪽 상단 근처 (터미널 창이 아님)에서 pset2 디렉터리 에 있는 이니셜.c 파일을 마우스 오른쪽 버튼으로 클릭 하고 다운로드를 클릭합니다 . 브라우저가 initials.c를 로드한 것을 볼 수 있습니다 .
  3. caesar.c 에 대해 반복합니다 .
  4. vigenere.c 에 대해 반복합니다 .
  5. 별도의 창이나 탭에서 CS50 에 로그인하세요.
  6. 화면 왼쪽 상단에 있는 제출 아이콘을 클릭하세요 .Harvard CS50: 2주차 과제(강의 5 및 6) - 19
  7. 왼쪽 폴더 목록에서 Problem Set 2 디렉토리를 클릭한 다음 Upload New Submission 버튼을 클릭합니다 . 그것은 오른쪽에 있습니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 20
  8. 나타나는 화면에서 파일 추가 ... 버튼을 클릭하십시오. 컴퓨터에서 파일을 선택하는 창이 열립니다. Harvard CS50: 2주차 과제(강의 5 및 6) - 21
  9. initials.c 를 보관하는 폴더로 이동하세요 . 다운로드 폴더 나 브라우저가 기본적으로 파일을 저장하는 위치에 있을 가능성이 높습니다 . initials.c를 찾으면 한 번 클릭하여 선택한 다음 열기를 클릭하세요.
  10. 파일 추가를 다시 클릭합니다 .
  11. Caesar.c를 찾아 엽니다.
  12. vigenere.c 파일 에도 동일한 작업을 수행합니다 .
  13. 업로드 시작을 클릭합니다. 파일이 CS50 서버 에 업로드됩니다 .
  14. 나타나는 화면에 선택한 파일 없음 창이 표시되어야 합니다 . 마우스 커서를 왼쪽으로 움직이면 다운로드된 파일 목록이 표시됩니다. 확인하려면 각각을 클릭하세요. 확실하지 않은 부분이 있으면 동일한 단계를 반복하여 파일을 다시 업로드할 수 있습니다. 2016년 말까지 원하는 만큼 이 작업을 수행할 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION