[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
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
*1번 문제는 지식인을 참고하였습니다.(이차원 배열과 단순 전치 암호문 참고하였습니다)
*3번 문제는 조원이 없기 때문에 생략하였고 2번 문제는 1번을 거꾸로 하면 되기 때문에 생략하였습니다
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 5.2장 연습문제 (0) | 2017.07.30 |
---|---|
명품 C언어 프로젝트 5.1장 연습문제 (0) | 2017.07.26 |
명품 C언어 프로젝트 4.5장 연습문제 (0) | 2017.07.14 |
명품 C언어 프로젝트 4.4장 연습문제 (0) | 2017.07.11 |
명품 C언어 프로젝트 4.3장 연습문제 (2) | 2017.07.09 |