profile image

L o a d i n g . . .

56.6 심사 문제 : 구조체로 플래그 비트 필드 만들기

문제 : 다음 소스 코드를 완성하여 15 127 7이 출력되게 만드세요.

정답 :

#include <stdio.h>
 
struct Flags {
    unsigned int a : 4;
    unsigned int b : 7;
    unsigned int c : 3;
};

int main()
{
    struct Flags f1;

    f1.a = 0xffffffff;
    f1.b = 0xffffffff;
    f1.c = 0xffffffff;

    printf("%u %u %u\n", f1.a, f1.b, f1.c);

    return 0;
}

 

 

 

56.6 심사 문제 : 구조체로 플래그 비트 필드 만들기

문제 : 다음 소스 코드를 완성하여 57412가 출력되게 만드세요.

정답 :

#include <stdio.h>

struct Flags {
    union {
        struct {
            unsigned short a : 3;
            unsigned short b : 4;
            unsigned short c : 7;
            unsigned short d : 2;
        };
        unsigned short e;
    };
};
 
int main()
{
    struct Flags f1 = { 0, };
 
    f1.a = 4;
    f1.b = 8;
    f1.c = 64;
    f1.d = 3;

    printf("%u\n", f1.e);

    return 0;
}

 

 

 

57.8 심사 문제 : 프로토콜 종류 정의하기

문제 : 다음 소스 코드를 완성하여 6 5 4가 출력되게 만드세요.

정답 : 

#include <stdio.h>

enum PROTOCOL_TYPE{
    
    PROTOCOL_IP = 4,
    PROTOCOL_UDP,
    PROTOCOL_TCP
    
};

int main()
{
    enum PROTOCOL_TYPE p1, p2, p3;

    p1 = PROTOCOL_TCP;
    p2 = PROTOCOL_UDP;
    p3 = PROTOCOL_IP;

    printf("%d %d %d\n", p1, p2, p3);

    return 0;
}

 

 

 

57.9 심사 문제 : 게임 캐릭터 스킬 처리하기

문제 : 다음 소스 코드를 완성하여 "명상"이 출력되게 만드세요.

정답 : 

#include <stdio.h>

enum MasterYiSkill {
    AlphaStrike = 1,
    Meditation,
    WujuStyle,
    Highlander
};
 
int main()
{
    enum MasterYiSkill skill;

    skill = Meditation;

    switch (skill)
    {
    case AlphaStrike:
        printf("일격 필살\n");
        break;
    case Meditation:
        printf("명상\n");
        break;
    case WujuStyle:
        printf("우주류 검술\n");
        break;
    case Highlander:
        printf("최후의 전사\n");
        break;
    default:
        break;
    }
    return 0;
}

 

 

 

57.10 심사 문제 : 인터페이스 타입 출력하기

문제 : 다음 소스 코드를 완성하여 열거형 INTERFACE_TYPE의 값이 모두 출력되게 만드세요. 단, InterfaceTypeUndefined의 값은 출력하지 않아야 합니다.

정답 :

#include <stdio.h>

// INTERFACE_TYPE은 Windows 커널의 winddk.h 헤더 파일에 정의된 열거형
typedef enum _INTERFACE_TYPE {
    InterfaceTypeUndefined = -1,
    Internal,
    Isa,
    Eisa,
    MicroChannel,
    TurboChannel,
    PCIBus,
    VMEBus,
    NuBus,
    PCMCIABus,
    CBus,
    MPIBus,
    MPSABus,
    ProcessorInternal,
    InternalPowerBus,
    PNPISABus,
    PNPBus,
    MaximumInterfaceType
} INTERFACE_TYPE, *PINTERFACE_TYPE;

int main()
{
    for(INTERFACE_TYPE i = Internal; i < MaximumInterfaceType; i++)
    {
        printf("%d ", i);
    }

    return 0;
}

 

 

58.10 심사 문제 : 소수점 이하 버리기

문제 : 표준 입력으로 실수가 입력됩니다. 다음 소스 코드를 완성하여 입력된 실수에서 소수점 이하를 버린 결과가 출력되게 만드세요. 단, 컴파일 경고가 발생하지 않아야 합니다.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    float num1;
    int num2;

    scanf("%f", &num1);

    num2 = (int)num1;
    printf("%d\n", num2);

    return 0;
}

 

 

 

58.11 심사 문제 : 포인터 변환하기

문제 : 표준 입력으로 8바이트 크기의 16진 정수가 입력됩니다. 다음 소스 코드를 완성하여 16진 정수의 낮은 자릿수 4바이트가 출력되게 만드세요. 단, 컴파일 경고가 발생하지 않아야 합니다.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned long long *numPtr1 = malloc(sizeof(unsigned long long));
    unsigned int *numPtr2;

    scanf("%llx", numPtr1);

    numPtr2 = (unsigned int *)numPtr1;
    printf("0x%x\n", *numPtr2);

    free(numPtr1);

    return 0;
}

 

 

 

58.12 심사 문제 : void 포인터 변환하기

문제 : 표준 입력으로 실수가 입력됩니다. 다음 소스 코드를 완성하여 입력된 실수가 그대로 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    long double *numPtr1 = malloc(sizeof(long double));
    void *ptr;

    scanf("%Lf", numPtr1);

    ptr = numPtr1;

    printf("%Lf\n", *(long double *)ptr);

    free(numPtr1);

    return 0;
}

 

 

 

58.11 심사 문제 : 포인터 변환하기

문제 : 표준 입력으로 게임 캐릭터의 마나와 이동 속도가 정수로 입력됩니다. 다음 소스 코드를 완성하여 마나와 이동 속도가 각 줄에 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Stats {
    float health;
    float healthRegen;
    unsigned int mana;
    float manaRegen;
    float range;
    float attackDamage;
    float armor;
    float attackSpeed;
    float magicResist;
    unsigned int movementSpeed;
};
 
int main()
{
    void *ptr = malloc(sizeof(struct Stats));
    struct Stats st;

    scanf("%u %u", &st.mana, &st.movementSpeed);

    memcpy(ptr, &st, sizeof(struct Stats));
    st.mana = 0;
    st.movementSpeed = 0;

    printf("%d\n", ((struct Stats *)ptr)->mana);
    printf("%d", ((struct Stats *)ptr)->movementSpeed);

    free(ptr);

    return 0;
}

 

 

 

59.9 심사 문제 : 포인터 연산으로 메모리 주소 조작하기

문제 : 다음 소스 코드를 완성하여 입력된 메모리 주소에서 순방향으로 6바이트, 10바이트만큼 떨어진 메모리 주소가 각 줄에 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    short *numPtrA;
    short *numPtrB;
    short *numPtrC;

    scanf("%p", &numPtrA);

    numPtrB = numPtrA + 3;
    numPtrC = numPtrA + 5;
 
    printf("%X\n", numPtrB);
    printf("%X\n", numPtrC);

    return 0;
}

 

 

 

59.10 심사 문제 : 포인터 연산과 역참조 사용하기

문제 : 표준 입력으로 정수 여섯 개가 입력되어 두 배열에 저장됩니다. 다음 소스 코드를 완성하여 입력 된 정수 중 세 번째와 다섯 번째가 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int numArr1[3] = { 0, };
    long long numArr2[3] = { 0, };
    int *numPtr = malloc(sizeof(int) * 3);
    void *ptr = malloc(sizeof(long long) * 3);
    int num1;
    long long num2;

    scanf("%d %d %d %lld %lld %lld", 
        &numArr1[0], &numArr1[1], &numArr1[2], 
        &numArr2[0], &numArr2[1], &numArr2[2]
    );

    memcpy(numPtr, numArr1, sizeof(int) * 3);
    memcpy(ptr, numArr2, sizeof(long long) * 3);
    numArr1[0] = numArr1[1] = numArr1[2] = 0;
    numArr2[0] = numArr2[1] = numArr2[2] = 0;

    num1 = *(numPtr + 2);
    num2 = *((long long *)ptr + 1);

    printf("%d %lld\n", num1, num2);

    free(ptr);
    free(numPtr);
 
    return 0;
}

 

 

 

59.11 심사 문제 : 포인터 연산과 역참조 사용하기

문제 : 표준 입력으로 x, y, z 좌표 3개가 입력되어 Point3D 배열에 저장됩니다. 다음 소스 코드를 완성하여 구조체 배열에서 두 번째 요소의 x 멤버와 세 번째 요소의 z 멤버가 출력되게 만드세요.

정답 :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Point3D {
    float x;
    float y;
    float z;
};

int main()
{
    void *ptr = malloc(sizeof(struct Point3D) * 3);
    struct Point3D p[3];
    float result1, result2;

    scanf("%f %f %f %f %f %f %f %f %f", 
        &p[0].x, &p[0].y, &p[0].z, 
        &p[1].x, &p[1].y, &p[1].z, 
        &p[2].x, &p[2].y, &p[2].z
    );

    memcpy(ptr, p, sizeof(struct Point3D) * 3);
    memset(p, 0, sizeof(struct Point3D) * 3);

    result1 = ((struct Point3D *)ptr + 1)->x;
    result2 = ((struct Point3D *)ptr + 2)->z;

    printf("%.1f %.1f\n", result1, result2);

    free(ptr);

    return 0;
}
복사했습니다!