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;
}
'Programming Languages > C' 카테고리의 다른 글
[P4C] C언어 코딩 도장 : UNIT 58 ~ UNIT 59 (0) | 2021.04.03 |
---|---|
[P4C] C언어 코딩 도장 : UNIT 56 ~ UNIT 57 (0) | 2021.04.03 |
[P4C] C언어 코딩 도장 : UNIT 54 ~ UNIT 55 (0) | 2021.03.28 |
[P4C] C언어 코딩 도장 : 문제 풀이 7 (0) | 2021.03.28 |
[P4C] C언어 코딩 도장 : UNIT 51 ~ UNIT 53 (0) | 2021.03.28 |