# 제출안내
1. 방법 : 본인 블로그에 작성 후 본 게시판에 링크를 업로드
또는 본 게시판에 작성. 제목은 '투자노트 금융공학 퀀트 프로그래밍 과정 x주차과제' 등으로 작성
(※ 본 게시판에 작성한 내용은 주기적으로 삭제 및 정리되오니 강의 내용을 가지고
있으시려면 본인 블로그에 작성하시오)
2. 양 : 최종과제 스크린샷 1장 이상 첨부. 스크린샷을 반드시 첨부하시오.
3. 기한 : 매주 일요일 오후 12시 전까지
# 기본과제 및 제출 양식
1. 문자열 편집을 위해 string.h 를 인클루드 하고 다음 문항에 답하시오. (1시간 소요)
가. char*변수를 만들고 자신의 아이디를 저장해보시오.
나. strlen의 사용방법은 아래와 같다.
문자열의 길이 = strlen(char*변수)
이를 암기하시오. 또한, '가'에서 만든 변수에 몇글자가 저장되어 있는지 구하고 printf로 출력해보시오.
다. '가'에서 만든 변수에 대해, 변수명[0], 변수명[1], 변수명[2]... 를 이용하여 문자열을 한글자씩 분리하고 이를 출력해보시오. 수동으로 하지 말고 반복문을 이용하시오.
라. '나'에서 만든 문자열의 길이와 '다'에서의 문자 한개씩 접근하는 방법을 이용하여 for문으로 아이디를 거꾸로 뒤집어 출력해보시오. 예를들어, 아이디가 apple2 였다면 2elppa 를 출력해야함.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char* id = "nuguri";
int length = strlen(id);
printf("당신의 아이디는 %d글자입니다\n", length);
for (int i = 1; i <= length; i++)
{
printf("%d번째 글자는 %c입니다.\n", i, id[i-1]);
}
printf("아이디를 거꾸로 뒤집으면 : ");
for (int i = length; i >= 1; i--)
{
printf("%c", id[i-1]);
}
return 0;
}
2. strcmp의 사용방법은 아래와 같다.
두 문자열의 비교값 = strcmp(문자열1 변수명,문자열2 변수명)
두문자가 같으면 0, 다르면 -1또는 1. https://dojang.io/mod/page/view.php?id=346 참조하시오.
이를 암기하시오. 또한 다음 문항을 해결하시오.
단, 버전에 따라 -1또는 1이 먹히지 않을 경우가 있고 그때는 양수 또는 음수가 받아지므로 이를 활용하시오(2시간 소요)
가. char* 배열에 다음의 값을 넣으시오. "Apple" "Dog" "Cat" "Banana" "Elephant"
나. '가'에서 만든 값을 strcmp값이 1임을 검사하여 사전식으로 재배열해 보시오. strcmp와 반복문을 이용하시오.
결과값은 Apple, Banana, Cat, Dog, Elephant 처럼 되어야 함.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char* tmp;
char* ex[5] = { "Apple", "Dog", "Cat", "Banana", "Elephant" };
printf("원본\n");
for (int i = 0; i < 5; i++)
{
printf("%s\t", ex[i]);
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5 - j; j++)
{
if (strcmp(ex[j], ex[j + 1]) == 1)
{
tmp = ex[j];
ex[j] = ex[j + 1];
ex[j + 1] = tmp;
}
}
}
printf("\n");
printf("사전식 배열\n");
for (int i = 0; i < 5; i++)
{
printf("%s\t", ex[i]);
}
return 0;
}
다. '가'에서 만든 값을 strcmp값이 -1임을 검사하여 사전식으로 재배열해 보시오. strcmp와 반복문을 이용하시오.
결과값은 Apple, Banana, Cat, Dog, Elephant 처럼 되어야 함.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char* tmp;
char* ex[5] = { "Apple", "Dog", "Cat", "Banana", "Elephant" };
printf("원본\n");
for (int i = 0; i < 5; i++)
{
printf("%s\t", ex[i]);
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5 - j; j++)
{
if (strcmp(ex[j+1], ex[j]) == -1)
{
tmp = ex[j];
ex[j] = ex[j + 1];
ex[j + 1] = tmp;
}
}
}
printf("\n");
printf("사전식 배열\n");
for (int i = 0; i < 5; i++)
{
printf("%s\t", ex[i]);
}
return 0;
}
라. '가'에서 만든 값을 알파벳 역순으로 재배열해보시오. strcmp와 반복문을 이용하시오.
결과값은 Elephant, Dog, Cat, Banana, Apple 처럼 되어야 함.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char* tmp;
char* ex[5] = { "Apple", "Dog", "Cat", "Banana", "Elephant" };
printf("원본\n");
for (int i = 0; i < 5; i++)
{
printf("%s\t", ex[i]);
}
for (int i = 4; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (strcmp(ex[j], ex[j+1]) == -1)
{
tmp = ex[j];
ex[j] = ex[j + 1];
ex[j + 1] = tmp;
}
}
}
printf("\n");
printf("역순 배열\n");
for (int j = 0; j < 5; j++)
{
printf("%s\t", ex[j]);
}
return 0;
}
3. 다음과 같은 원시자료가 있다.
번호 닉네임 ID PASSWORD
1 오리 DUCK dhflrhrl
2 돼지 PIG ehowlrhrl
3 토끼 RABBIT xhRlrhrl
4 새 BIRD torhrl
5 비둘기 PIGEON qlenfrlrhrl
6 두꺼비 FROG enRjqlrhrl
이에 따라 아래 문항을 해결하시오. (2시간 소요)
가. 위 자료를 처리하기 위해 배열이나 구조체 등을 이용하여 적절한 자료구조를 만들어 보시오.
나. ID와 PASSWORD를 입력받아 위 자료에 있는대로 입력되면,
"'닉네임'님, 로그인되었습니다."를 출력하시오. 누가 로그인하고 있는지를 판별하기 위해 입력받은 ID와 위 데이터베이스에 있는 ID를 반복문으로 일일이 검사하여야 함. 한편, strcmp를 이용하시오.
다. 입력받은 ID와 일치하는 ID가 없는 경우, "ID가 잘못되었습니다"를 출력하시오. 그리고, ID와 PW를 다시 받을수 있도록 해보시오.
라. 입력받은 ID는 있으나 PW가 일치하지 않는 경우, "PW가 잘못되었습니다"를 출력하시오. 그리고, ID와 PW를 다시 받을수 있도록 해보시오.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct inform
{
int num;
char nickname[10];
char id[10];
char pw[20];
};
int main()
{
struct inform animal[6] =
{
{1,"오리","DUCK","dhflrhrl" },
{2,"돼지","PIG","ehowlrhrl"},
{3,"토끼","RABBIT","xhRlrhrl"},
{4,"새","BIRD","torhrl"},
{5,"비둘기","PIGEON","qlenfrlrhrl"},
{6,"두꺼비","FROG","enRjqlrhrl"}
};
char user_id[10];
char user_pw[20];
int cnt = 0;
while (cnt != 2)
{
printf("ID : ");
scanf("%s", user_id);
printf("\n");
printf("PW : ");
scanf("%s", user_pw);
cnt = 0;
for (int i = 0; i < 6; i++)
{
if (strcmp(user_id, animal[i].id) == 0)
{
cnt++;
if (strcmp(user_pw, animal[i].pw) == 0)
{
printf("로그인 되었습니다.\n");
cnt++;
}
else
printf("패스워드를 잘못 입력하였습니다.\n");
}
}
if (cnt == 0)
{
printf("일치하는 ID를 찾을 수 없습니다\n");
}
}
return 0;
}
# 심화과제 제출 양식( 안해도 됨 )
1. 주민등록번호 검증 알고리즘을 구현하시오.
가. 주민등록번호 13자리를 입력받아 문자열 변수에 넣으시오.
나. 앞자리는 생년, 월, 일 이므로, 월은 1~12 중 하나인지 확인하는 알고리즘을 만드시오. (주민번호의 세번째수와 네번째수를 배열로 접근하여 가져온 후 처리하시오)
예를들어, '월'이 13월, 14월.... 등인 경우 유효하지 않음.
다. 앞자리의 '일'은 1일~월말의 날짜 중 하나인지 확인하는 알고리즘을 만드시오. 말일의 일 수는 자동화 하는 방법이 없으므로 일일이 구현하여야 함. (주민번호의 다섯번째수와 여섯번째수를 배열로 접근하여 가져온 후 처리하시오)
예를들어, '일'이 4월 31일, 6월 31일 .... 등인 경우 유효하지 않음.
라. '다'를 보충하여, 2월 29일이 있는 해에 대한 알고리즘을 구현하시오.
https://ko.wikipedia.org/wiki/2%EC%9B%94_29%EC%9D%BC 를 참조하시오.
예를들어, 2020년 2월 29일은 유효하며, 2019년 2월 29일은 없음.
마. 뒷자리 7자리 중 앞 6자리는 검사하지 않도록 하시오.
바. 뒷자리 7자리 중 맨 뒷 자리의 수를 정해보시오.
https://smok95.tistory.com/43 을 참조하시오.
사. 위 검증 알고리즘을 통과하면 '유효한 주민번호입니다'를 출력하고, 통과하지 못하면 '올바른 주민번호가 아닙니다'를 출력 후 다시 입력 받도록 해보시오.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
char code[13];
int numCode[13];
int codeLen = 0;
int year, month, day, finalday;
int cnt = 0;
while (cnt==0) {
printf("주민등록번호 13자리를 입력해주세요.\n");
scanf("%s", code);
codeLen = strlen(code);
if (codeLen != 13) {
printf("13자리 주민등록번호가 아닙니다.\n");
continue;
}
for (int i = 0; i < 13; i++) {
numCode[i] = code[i] - 48;
}
if (numCode[6] == 1 || numCode[6] == 2)
year = 1900 + numCode[0] * 10 + numCode[1];
else if (numCode[6] == 3 || numCode[6] == 4)
year = 2000 + numCode[0] * 10 + numCode[1];
else {
printf("유효하지 않은 주민등록번호입니다.\n");
continue;
}
month = numCode[2] * 10 + numCode[3];
if (month < 1 || month>12) {
printf("유효하지 않은 주민등록번호입니다.\n");
continue;
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
finalday = 31;
else if (month == 2)
{
if (year % 4 != 0)
finalday = 28;
else if (year % 400 == 0)
finalday = 29;
else if (year % 100 == 0)
finalday = 28;
else
finalday = 29;
}
else
finalday = 30;
day = numCode[4] * 10 + numCode[5];
if (day<1 || day>finalday) {
printf("유효하지 않은 주민등록번호입니다.\n");
continue;
}
const int tab[] = { 2,3,4,5,6,7,8,9,2,3,4,5 };
int sum = 0;
int i = 0;
for (i = 0; i < 12; i++)
sum += numCode[i] * tab[i];
if (numCode[12] == (11 - (sum % 11))) {
printf("유효한 주민등록번호입니다.\n");
cnt++;
}
else {
printf("유효하지 않은 주민등록번호입니다.\n");
continue;
}
}
return 0;
}
2. 다음과 같은 조건을 만족하는 암호 검증 알고리즘을 만드시오.
모 싸이트에서는 회원들의 패스워드를 안전하게 보호하기 위해 다음과 같은 규칙을 만들었다.
패스워드는 8자 이상, 문자와 숫자를 섞어 이용, 특수문자를 하나이상 포함, 로봇이 아님을 검증하기 위한 임의의 검증코드 입력. 여기까지 완료되면 안전한 패스워드로 판단하고, 프로그램 종료
가. 패스워드를 입력 받으시오.
나. 패스워드가 8자리 이상인지 글자수를 세어 보시오.
다. 패스워드가 저장된 문자열 변수에 변수[0], 변수[1], 변수[2]... 등으로 접근하여
패스워드가 끝나기 전까지 숫자가 있는지 확인하시오. 아스키코드를 이용하면 쉽게 구현됨. 없으면 오류를 출력하고 패스워드를 다시 입력받으시오.
라. 패스워드가 끝나기 전까지 알파벳 문자가 있는지 확인하시오.없으면 오류를 출력하고 패스워드를 다시 입력받으시오.
마. 패스워드가 끝나기 전까지 숫자,알파벳 이외의 특수문자가 있는지 확인하시오. 없으면 오류를 출력하고 패스워드를 다시 입력받으시오.
바. srand를 이용하여 여섯자리 정수를 만들고, '마'단계까지 통과한 경우에 한해 로봇이 아님을 검증하기 위한 코드를 입력받으시오. 여섯자리가 아닌 정수가 뽑아지는 경우 여섯자리가 나올때까지 다시 뽑도록 하는 알고리즘을 구현하시오.
사. '바'에서, 여섯자리 정수 생성값과 입력값이 같으면 '안전한 패스워드가 만들어졌습니다'를 출력하고 프로그램을 종료하시오. 같지 않으면 다시 여섯자리 정수를 만들어 로봇이 아님을 검증하도록 하시오. 단, 5번 연속 검증코드를 통과하지 못하는 경우 처음으로 돌아가 패스워드 입력을 다시 받도록 하시오.
#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
int check(char* password, char* pwCheck) {
int pwLength = strlen(password);
srand(time(NULL));
int check = 0;
if (pwLength < 8) {
printf("패스워드는 8자리 이상이어야 합니다.\n");
return 1;
}
for (int i = 0; i < pwLength; i++) {
if (password[i] >= 48 && password[i] <= 57) { // 숫자 check
pwCheck[0] = 1;
}
else if (password[i] >= 65 && password[i] <= 90) { // 대문자
pwCheck[1] = 1;
}
else if (password[i] >= 97 && password[i] <= 122) { // 소문자
pwCheck[1] = 1;
}
else if (password[i] >= 33 && password[i] <= 47) { // 특수문자 1
pwCheck[2] = 1;
}
else if (password[i] >= 58 && password[i] <= 64) { // 특수문자 2
pwCheck[2] = 1;
}
}
for (int i = 0; i < 3; i++) {
if (pwCheck[i] != 1) {
printf("패스워드는 숫자, 알파벳 문자, 특수문자를 반드시 포함해야 합니다.\n");
return 1;
}
}
printf("당신은 로봇입니까?\n");
while(1){
int botNum = rand() * rand() % 1000000;
int userNum = 0;
if (botNum >= 100000) {
printf("주어진 숫자를 입력해주세요. %d\n", botNum);
scanf("%d", &userNum);
if (userNum == botNum % 1000000) {
return 0;
}
}
continue;
}
return 1;
}
void initialCheck(char* pwCheck) {
for (int i = 0; i < 3; i++) {
pwCheck[i] = 0;
}
}
int main() {
char password[20];
char pwCheck[3] = { 0, };
do {
initialCheck(pwCheck);
printf("패스워드를 입력하세요 : ");
scanf("%s", password);
} while (check(password, pwCheck));
printf("안전한 패스워드가 만들어졌습니다.\n");
return 0;
}
'프로그래밍 > C' 카테고리의 다른 글
C언어 16주차 과제 (0) | 2021.01.29 |
---|---|
C언어 15주차 과제 (0) | 2021.01.12 |
C언어 13주차 과제 (0) | 2020.12.26 |
C언어 12주차 과제 (0) | 2020.12.16 |
C언어 11주차 과제 (1) | 2020.12.12 |