대외활동 및 팀플/빡공팟(P4C) 시스템 해킹 트랙 4기

[빡공팟 4기] 1주차: C언어 배우기 코드업 기초 100제(20~30번) write-up

EYEN 2022. 4. 24. 06:00

20, 21, 24, 25, 28 write-up.

20번
앞의 6자리는 생년월일(yymmdd)이고 뒤 7자리는 성별, 지역, 오류검출코드이다.
주민번호를 입력받아 형태를 바꿔 출력해보자.

#include <stdio.h>

int main()
{
	int n,m;
	scanf_s("%d - %d", &n,&m);
	printf("%d%d", n, m);
}

변수 n,m를 선언하고, %d를 이용해 입력받는 형태와 출력받는 형태를 정해준다.
서식지정자 %d: 정수값을 출력하는 서식지정자



21번
1개의 단어를 입력받아 그대로 출력해보자. 한 단어가 입력된다. (단, 단어의 길이는 50자 이하이다.)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	char data[51];
	scanf("%s", data);
	printf("%s", data);
	return 0;
}
}


char=>character, 문자를 의미한다.
변수 data를 선언하고 크기를 51로 정한다. 단어길이가 50까지 될 수 있다는 뜻이다.
%s: 문자열을 출력하는 서식지정자, 띄어쓰기 한 문자까지만 출력한다.
*비주얼 스튜디오에서는 #define _CRT_SECURE_NO_WARNINGS를 맨처음에 정의하여 scanf 함수를 이용해야 한다.
scanf만 쓰면 에러가 나오고 scanf_s만 쓰면 오류는 없지만 작동이 안된다.



24번
단어(영어) 하나를 입력받는다. (단, 단어의 길이는 20자 이하이다.)
단어의 문자(영어)를 하나씩 나누어 한 줄에 한 개씩 ' '로 묶어서 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int i;
	char d[30];
	scanf("%s", d);
	for (i = 0; d[i] != '\0'; i++)
	{
		printf("'%c'\n", d[i]);
	}
	return 0;
}

정수 i와 문자 d를 선언, d의 길이는 29까지다. 30개의 문자를 입력하면 디버그에러가 뜬다.
서식지정자를 이용해 단어를 입력받는다. 이때 %s로 입력받았기 때문에 단어 마지막에 null문자가 자동으로 입력된다.
순서대로 한 문자씩 null인지 아닌지 보고, null이 아니면 해당 문자를 출력하고, 그다음 문자로 넘어가기를 단어가 끝날 때까지 반복.
%c: 문자를 출력하는 서식지정자 (%s는 문자열)



25번
다섯 자리의 정수 1개를 입력받아 각 자리별로 나누어 출력한다.
각 자리의 숫자를 분리해 한 줄에 하나씩 [ ]속에 넣어 출력한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a,b,c,d,e;
	scanf("%1d%1d%1d%1d%1d", &a, &b, &c, &d, &e);
	printf("[%d]\n", a * 10000);
	printf("[%d]\n", b * 1000);
	printf("[%d]\n", c * 100);
	printf("[%d]\n", d * 10);
	printf("[%d]", e * 1);

	return 0;
}
}

1d를 사용하면 1개의 숫자로 각각 구분되어 저장된다.

+

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a, b, c, d, e;
	scanf("%1d%1d%1d%1d%1d", &a, &b, &c, &d, &e);
	printf("[%d]\n", a + 2);
	printf("[%d]\n", b - 1000);
	printf("[%d]\n", c * 100);
	printf("[%d]\n", d / 10);
	printf("[%d]", e % 1);

	return 0;

 %d에 들어갈 정수에 대한 연산을 해보았는데 다 가능하다. 나누기 //로 하면 오류뜬다.



28번

정수 1개를 입력받아 그대로 출력해보자.

(단, 입력되는 정수의 범위는 0 ~ 4,294,967,295 이다.)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	unsigned n;
	scanf("%u", &n);
	printf("%u", n);

	return 0;
}

unsigned int: 부호 없는 정수를 뜻하고 범위가 0~4,294,967,295이며 int를 생략할 수 있다.

최댓값을 입력했을 때

최댓값+1을 입력했을 때 오버플로우가 발생해 최솟값인 0으로 되돌아간 모습.
 
 
29번은 실수(- 1.7*10^-308 ~ + 1.7*10^308), 30번은 정수(-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807)를 입력받아 출력하는 것인데, 각각 자료형 double과 long long int를 써서 해결할 수 있다.