카테고리 없음

C언어 19주차 과제

yooongs 2021. 2. 21. 22:09

# 제출안내

 1. 방법 : 본인 블로그에 작성 후 본 게시판에 링크를 업로드

           또는 본 게시판에 작성. 제목은 '투자노트 금융공학 퀀트 프로그래밍 과정 x주차과제' 등으로 작성 

           (※ 본 게시판에 작성한 내용은 주기적으로 삭제 및 정리되오니 강의 내용을 가지고 

              있으시려면 본인 블로그에 작성하시오)

 2. 양 : 최종과제 스크린샷 1장 이상 첨부. 스크린샷을 반드시 첨부하시오.

 3. 기한 : 매주 일요일 오후 12시 전까지

 

 ​

# 기본과제 및 제출 양식

1. 문자 검사를 위해 ctype.h 를 인클루드 하고 다음 문항에 답하시오. (2시간 소요)

   가. isalpha 함수의 쓰임은 다음과 같다.

    참/거짓값을 받을 변수 = isalpha(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'a'를 넣어 참이 나오는지 검사하고, '1'을 넣어 거짓이 나오는지 검사하시오.

   나. isdigit 함수의 쓰임은 다음과 같다.

     참/거짓값을 받을 변수 = isdigit(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'a'를 넣어 거짓이 나오는지 검사하고, '1'을 넣어 참이 나오는지 검사하시오.

   다. isalnum 함수의 쓰임은 다음과 같다.

    참/거짓값을 받을 변수 = isalnum(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'a'를 넣어 참이 나오는지 검사하고, '1'을 넣어 참이 나오는지 검사하시오. 그리고 '@'을 넣어 거짓이 나오는지 확인하시오.

   라. isupper 함수의 쓰임은 다음과 같다.

    참/거짓값을 받을 변수 = isupper(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'a'를 넣어 거짓이 나오는지 검사하고, 'A'을 넣어 참이 나오는지 검사하시오.

   마. islower함수의 쓰임은 다음과 같다.

    참/거짓값을 받을 변수 = islower(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'A'를 넣어 거짓이 나오는지 검사하고, 'a'을 넣어 참이 나오는지 검사하시오.

   바. isspace함수의 쓰임은 다음과 같다

    참/거짓값을 받을 변수 = isspace(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 ' '를 넣어 참이 나오는지 검사하고, 'a'을 넣어 거짓이 나오는지 검사하시오.

   사. toupper함수의 쓰임은 다음과 같다.

    대문자를 받을 변수 = toupper(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'a'를 넣어 'A'가 나오는지 확인하시오.

   아. tolower함수의 쓰임은 다음과 같다.

    소문자를 받을 변수 = tolower(문자1개 변수);

    이를 암기하시오. 이 함수의 용도를 말하시오. 한편, char변수 'A'를 넣어 'a'가 나오는지 확인하시오.

 

#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main()
{
char a = 'a';
char n = '1';
char b = 'A';
printf("0이면 거짓, 0이 아니면 참\n");
printf("%d , %d\n", isalpha(a), isalpha(n));
printf("%d , %d\n", isdigit(a), isdigit(n));
printf("%d , %d\n", isalnum(a), isalnum(n));
printf("%d , %d\n", isupper(a), isupper(b));
printf("%d , %d\n", islower(b), islower(a));
printf("%d , %d\n", isspace(' '), isspace(a));
printf("%c\n", toupper(a));
printf("%c\n", tolower(b));

return 0;

}

실행 결과

2. ctype에 있는 함수들을 이용하여 다음 기능을 구축하시오. (2시간 소요)

  가. 문자열에 포함된 모든 공백을 제거하는 함수를 만드시오.

    예를들어, 아래 데이터를 그대로 사용하여 결과를 얻으시오.

 

    DATA[]= "     오리는 꽥꽥, 염소 음메, 돼지 꿀꿀, 소는 음무,           

             오리는           오리고기, 염는 염소탕,

             돼지는 돼지     국밥, 소는 소불고기   "

 

    를 넣으면 모든 공백이 제거되도록 해보시오. 

    https://security-nanglam.tistory.com/141를 참조하되, isspace를 사용하시오.

  나. 위 데이터를 저장할 적절한 자료구조를 만들고 ',' 을 기준으로 잘라 동물명과 울음소리를 정리하시오. '~는' 을 적절한 방법으로 삭제하고 동물명이 나오도록 해보시오.

#pragma warning (disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
void EraseSpace(char* dest, char* src);
int main()
{
char DATA[] = "     오리는 꽥꽥, 염소 음메, 돼지 꿀꿀, 소는 음무,             오리는           오리고기, 염소는 염소탕,돼지는 돼지     국밥, 소는 소불고기  ";
char* data = (char *)malloc(200);
    printf("공백 제거 전 : %s\n", DATA);
    EraseSpace(data, DATA);
printf("공백 제거 후 : %s\n", data);
    int i = 0;
    char* nameSound[8] = { NULL, };
    char* tmp = strtok(data, ",");
    while (tmp)
    {
        nameSound[i] = tmp;
        i++;
        tmp = strtok(NULL, ",");
    }
    
    for (int i = 1; i < 9; i++)
    {
        printf("%d번째 동물과 울음소리 : %s\n", i, nameSound[i-1]);
    }

    printf("\n");
    strtok(nameSound[0], "는");
    strtok(nameSound[1], "음");
    strtok(nameSound[2], "꿀");
    strtok(nameSound[3], "는 ");
    strtok(nameSound[4], "는");
    strtok(nameSound[5], "는");
    strtok(nameSound[6], "는");
    strtok(nameSound[7], "는");

    printf("동물 분리\n");
    for (int i = 1; i < 9; i++)
    {
        printf("%d번째 동물 : %s\n", i, nameSound[i - 1]);
    }

return 0;
}
void EraseSpace(char* dest, char* src)
{
    while (*src)
    {
        if (*src & 0x80)
        {
            *dest++ = *src++;
            *dest++ = *src++;
        }
        else if (isspace(*src))
            src++;
        else
            *dest++ = *src++;
    }
    *dest = NULL;
}

실행 결과

: 어려워서 다른 회원들이 한 것을 참조 (사실 거의 베낌) 했는데 strtok으로 쪼개어 나누는 것은 이해하였고 나중에 써먹을 수 있다는 생각이 들었으나 *src를 16진수 80과 &연산자를 이용하는 함수는 외워도 나중에 잘 써먹을 수 있을지 잘 모르겠따..

 

 

  다. 오리, 염소, 돼지, 소가 회원 가입을 한다.

 

     오리가 신청한 ID와 PW : ori_gogi    dhflrhrl12

     염소가 신청한 ID와 PW : YumSo1234    duath

     돼지가 신청한 ID와 PW : Piggogi    ehowlrhrl2

     소가 신청한 ID와 PW : So~Gogi    thrhrlSiaSia

 

   아이디는 숫자,영문자,-,_ 만 허용한다. 이를 검사하는 함수를 만들고 허용되지 않는 ID를 신청한 동물을 고르시오.

   비밀번호는 8자리 이상이며 영문,숫자가 1자 이상씩 포함되어야 한다. 이를 검사하는 함수를 만들고 허용되지 않는 PW를 신청한 동물을 고르시오.

   

 

 

# 심화과제 제출 양식( 안해도 됨 )

 

1. 오리, 염소, 돼지, 소가 다음과 같이 신용카드사에 가입 요청 하였다. 동물명, 신용카드 번호, 영어이름은 다음과 같다.

 

    DATA[]= "

    오리  1234-5678-9101   Ori Gogi

    염소  2345-6789-012     Goat Soup

    돼지  3456-7891-0123    Pig RiceSoup

    소     4567-8901-2345    Cow Bulgogi"

 

   가. 이를 저장할 적당한 자료구조를 설계하고 데이터를 분리하여 넣으시오.

   나. 여기에 카드사 정보를 추가하시오. (카드번호가 12자리인 동물은 비씨카드를 쓰고 11자리인 동물은 아멕스 카드를 쓴다. 이를 판별하는 함수를 만들고 값을 구하시오)

   다. 카드 앞면에는 이름을 대문자로 쓴다. 이름을 대문자로 바꾸어 정리하는 함수를 만들고 값을 구하시오.

   라. 카드 CVC는 앞쪽으로부터 3글자의 숫자에 뒷쪽으로부터의 3글자를 더하여 만든다. CVC를 만들어 보시오. 예를들어, 오리의 경우 123+101 이다. 이를 만들어주는 함수를 만들고 값을 구하시오.

 

 

 

2. 어떤 대북정보원이 다음과 같은 원문을 암호화하여 대한민국 국정원에 전송하고자 한다.

  원문 : "ToKEKiBaFeMaGnJilReHYo"

  한편, 다음을 참고하시오 : https://ko.wikipedia.org/wiki/%EC%B9%B4%EC%9D%B4%EC%82%AC%EB%A5%B4_%EC%95%94%ED%98%B8

 

 

  가. 이 중 E,F,G,H는 원문을 교란하기 위해 임의로 넣은 문자이다. 이를 삭제하는 함수를 만들고 삭제하시오.

      그리고, 보내고자 하는 평문은 무엇이었는지 읽어보시오.

  나. E,F,G,H가 제거된 상태에서 문자열의 각 문자를 3만큼 증가시키는 함수를 만드시오. 예를들어, a는 d로 바꾸시오. b는 e로 바꾸시오....

  다. '나'에서 만든 문자열의 맨 뒤에 C를 넣으시오. 이는, 3만큼 증가시켰다는 정보를 담는 것이며, 1만큼이라면 A, 2만큼이라면B.... 등으로 만들어 활용할 수 있음.

  라. 임의로 H,I,J,K 네 개의 문자를 암호문의 중간중간에 삽입시키시오.이는 E,F,G,H가 3만큼 증가된 값임. 수동으로 삽입하지 말고 현재의 문자열 길이를 구한 후 srand로 문자열 길이 이내의 값을 얻은 후 그 값이 나타내는 순서의 자리에 H를 넣고, 같은 방법으로 반복하여 다른 문자도 차례대로 넣으시오.

  마. 최종적으로 만든 암호가 무엇인지 출력해보시오.

  바. FRPXH WYR ZURPHC 는 X,Y,Z가 필요없는 문자이며, 3글자가 뒤로 미뤄졌기 때문에 끝이 C이다. 이를 복호화 해 보시오.