C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 4.6장 연습문제

꾸준함. 2017. 7. 18. 18:59

[1번 문제]

/*

다음은 우리나에 "작은 별"로 알려진 "Twinkle, twinkle, little star" 가사의 일부분이빈다.

가사 부분을 다음과 같이 텍스트 파일(plaintext.txt)로 저장한 다음 Caesar 암호문,

단순 전치 암호문, XOR 암호문으로 변환한 텍스트 파일을 생성합니다.

*/

#include <stdio.h>

#include <string.h>

#include <Windows.h>

 

int main(void)

{

        char str[3][57]; //plain text 3

        FILE *fp = fopen("C:\\plaintext.txt", "r");

        printf("Caesar 암호문\n");

        printf("Plain Text\n");

        for (int i = 0; i < 3; i++)

        {

               for (int j = 0; j < 57; j++)

               {

                       fscanf(fp, "%c", &str[i][j]); //읽어오고

                       printf("%c", str[i][j]); //출력

               }

        }

        printf("\n\n");

        printf("Plain Text Caesar 암호화\n");

        for (int i = 0; i < 3; i++)

        {

               for (int j = 0; j < 57; j++)

               {

                       str[i][j] -= 3; //3씩 빼기

                       if (str[i][j] < 0)

                              str[i][j] += 3; //음수면 3씩 더하기

                       printf("%c", str[i][j]);

               }

        }

        printf("\n\n");

        fclose(fp);

        Sleep(3000); //잠시 딜레이

        system("cls");

        fp = fopen("C:\\plaintext.txt", "r");

        printf("단순 전치 암호문\n");

        printf("Plain Text\n");

        for (int i = 0; i < 3; i++)

        {

               for (int j = 0; j < 57; j++)

               {

                       fscanf(fp, "%c", &str[i][j]);

                       printf("%c", str[i][j]);

               }

        }

        printf("\n\n");

        printf("Plain Text 단순 전치 암호문\n");

        for (int i = 0; i < 57; i++)

        {

               for (int j = 0; j < 3; j++)

               {

                       printf("%c", str[j][i]); //인덱스 i j 바꾸기

               }

        }

        printf("\n\n");

        fclose(fp);

        Sleep(3000);

        system("cls");

        fp = fopen("C:\\plaintext.txt", "r");

        printf("XOR 암호문\n");

        printf("Plain Text\n");

        for (int i = 0; i < 3; i++)

        {

               for (int j = 0; j < 57; j++)

               {

                       fscanf(fp, "%c", &str[i][j]);

                       printf("%c", str[i][j]);

               }

        }

        printf("\n\n");

        printf("Plain Text XOR 암호문\n");

        for (int i = 0; i < 3; i++)

        {

               for (int j = 0; j < 57; j++)

               {

                       str[i][j] %= 3; //마스크

                       printf("%c", str[i][j]);

               }

        }

        printf("\n");

        fclose(fp);

        return 0;

}


 





[4번 문제]

/*

상대방이 입력한 비밀번호(숫자와 대소 영문자만 사용)을 찾아내는 프로그램을 작성합니다.

, 상대방이 비밀번호를 입력할 떄 화면에는 기로 *가 나타나도록 하고, 비밀번호를 찾기까지의 시간을 계산하여 출력합니다

*/

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

 

int main(void)

{

        int length;

        char sel;

        char *password;

        char *userpassword;

        clock_t start, end;

        printf("비밀번호 길이?");

        scanf("%d", &length);

        password = (char*)malloc(sizeof(char)*length);

        userpassword = (char*)malloc(sizeof(char)*length);

        srand((unsigned)time(NULL));

 

        for (int i = 0; i < length; i++)

               userpassword[i] = '\0'; //초기화

 

        for (int i = 0; i < length; i++)

        {

               int number = rand() % 2;

               if (number == 0)

               {

                       password[i] = rand() % 26 + 97; //소문자

               }

               else if (number == 1)

               {

                       password[i] = rand() % 26 + 65; //대문자

               }

        }

        printf("비밀번호: ");

        for (int i = 0; i < length; i++)

               printf("*");

        printf("\n");

        printf("치트키를 쓰시겠습니까?(Y/N)");

        getchar(); //버퍼 삭제

        scanf("%c", &sel);

        if (sel == 'Y' || sel == 'y')

               for (int i = 0; i < length; i++)

                       printf("%c", password[i]);

        printf("\n");

        start = clock();

 

        for(int i=0; i<length; i++)

        {

               printf("%d번째 비밀번호 맞춰보자: ", i + 1);

               getchar();

               scanf("%c", &userpassword[i]);

               if (userpassword[i] != password[i])

               {

                       printf("틀렸습니다. 다시 입력하세요\n");

                       i--;

                       printf("%d\n", i);

               }

               else

               {

                       printf("맞았습니다\n");

               }

        }

        end = clock();

        printf("비밀번호 다 맞추는데 걸린 시간: %lf\n", (double)(end - start) / CLK_TCK);

        free(password);

        free(userpassword);

        return 0;

}

 

 


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저, http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=139935411&sp=1&sort=time&sid=UwuAybAN0tIqB3nv18G5eQ%3D%3D&rank=1&pid=TT3kXwpySEZssadvaGdssssssZK-274477&search_sort=0&qb=Y%20yWuOyWtCBwbGFpbnRleHQsdHh0&spq=0&section=kin&enc=utf8


*1번 문제는 지식인을 참고하였습니다.(이차원 배열과 단순 전치 암호문 참고하였습니다)

*3번 문제는 조원이 없기 때문에 생략하였고 2번 문제는 1번을 거꾸로 하면 되기 때문에 생략하였습니다


반응형