1. 표준 출력 흐름 및 개행 문자 제어
콘솔 출력을 구현할 때 개행 문자(\n)의 배치에 따라 레이아웃이 달라집니다. 동일한 시각적 요소를 연속으로 배치할 때는 줄바꿈 시점을 명시적으로 조절해야 합니다.
#include <stdio.h>
int main(void) {
// 개별 행 출력 후 명시적 개행
puts(" O");
puts(" <H>");
puts(" I I");
// 공백 분리 및 단일 개행으로 병렬 배치
printf(" O O\n <H> <H>\n I I I I\n");
return 0;
}
2. 조건문을 활용한 기하학적 판별
삼각형의 성립 조건은 임의의 두 변의 합이 나머지 한 변보다 커야 한다는 부등식으로 정의됩니다. 부동소수점 비교 시 논리 연산자를 조합하여 검증합니다.
#include <stdio.h>
int main(void) {
double len_a, len_b, len_c;
printf("세 변의 길이를 입력하세요: ");
if (scanf("%lf %lf %lf", &len_a, &len_b, &len_c) == 3) {
int is_triangle = (len_a + len_b > len_c) &&
(len_a + len_c > len_b) &&
(len_b + len_c > len_a);
puts(is_triangle ? "삼각형 조건을 만족합니다." : "삼각형을 구성할 수 없습니다.");
}
return 0;
}
3. 문자 입력 처리 및 표준 입력 버퍼 관리
getchar()는 단일 문자를 읽지만, 이전 입력 시 남아있는 개행 문자(\n)를 소모하지 않으면 다음 입력이 건너뜁니다. 버퍼 정리는 연속적인 문자 읽기에서 필수적입니다.
#include <stdio.h>
int main(void) {
char study_habit, code_practice;
printf("정기적인 복습 여부 (y/n): ");
study_habit = getchar();
while (getchar() != '\n'); // 잔여 개행 문자 제거
printf("실제 코딩 연습 여부 (y/n): ");
code_practice = getchar();
if ((study_habit == 'y' || study_habit == 'Y') &&
(code_practice == 'y' || code_practice == 'Y')) {
puts("지속적인 학습이 실력으로 이어집니다.");
} else {
puts("기초부터 다지며 점진적으로 개선해 봅시다.");
}
return 0;
}
4. 자료형별 형식 지정자 적용
scanf()는 변수의 메모리 주소를 인자로 받으며, 자료형에 맞는 형식 지정자(%d, %c, %lf)를 사용해야 정확한 값 매핑이 가능합니다. 문자열 공백 처리를 위해 선행 공백을 형식 문자열에 포함할 수 있습니다.
#include <stdio.h>
int main(void) {
int num_x, num_y, num_z;
char ch_first, ch_mid, ch_last;
double val_f1, val_f2;
printf("정수 3개 입력: ");
scanf("%d %d %d", &num_x, &num_y, &num_z);
printf("정수 출력: %d, %d, %d\n", num_x, num_y, num_z);
printf("문자 3개 입력 (연속): ");
scanf(" %c%c%c", &ch_first, &ch_mid, &ch_last);
printf("문자 출력: %c, %c, %c\n", ch_first, ch_mid, ch_last);
printf("실수 2개 입력: ");
scanf("%lf %lf", &val_f1, &val_f2);
printf("실수 출력: %.2f, %.2f\n", val_f1, val_f2);
return 0;
}
5. 단위 변환 및 상수 연산
시간 단위를 연도로 변환할 때는 과학적 표기법과 부동소수점 연산을 활용하여 정밀도를 유지합니다. 중간 결과의 형 변환에 주의해야 합니다.
#include <stdio.h>
int main(void) {
double total_seconds = 1e9;
double sec_per_year = 60.0 * 60.0 * 24.0 * 365.0;
long calculated_years = total_seconds / sec_per_year;
printf("10억 초는 약 %ld년에 해당합니다.\n", calculated_years);
return 0;
}
6. EOF 기반 반복 입력과 수학 함수 연산
표준 입력 스트림의 끝(EOF)을 감지하여 루프를 제어하면 배치 처리나 파일 리디렉션 환경에서 유연하게 동작합니다. <math.h> 헤더를 링크하여 거듭제곱 및 제곱근 연산을 수행합니다.
#include <stdio.h>
#include <math.h>
int main(void) {
double base_val;
while (scanf("%lf", &base_val) != EOF) {
double power_result = pow(base_val, 365.0);
printf("기저 %.2f의 365승: %.2f\n\n", base_val, power_result);
}
return 0;
}
#include <stdio.h>
int main(void) {
double celsius_temp;
while (scanf("%lf", &celsius_temp) != EOF) {
double fahrenheit_temp = celsius_temp * 9.0 / 5.0 + 32.0;
printf("섭씨 %.2f도 → 화씨 %.2f도\n\n", celsius_temp, fahrenheit_temp);
}
return 0;
}
#include <stdio.h>
#include <math.h>
int main(void) {
double side_a, side_b, side_c;
while (scanf("%lf %lf %lf", &side_a, &side_b, &side_c) != EOF) {
double semi_perimeter = (side_a + side_b + side_c) / 2.0;
double area = sqrt(semi_perimeter * (semi_perimeter - side_a) *
(semi_perimeter - side_b) * (semi_perimeter - side_c));
printf("변 %.0f, %.0f, %.0f의 삼각형 넓이: %.3f\n\n", side_a, side_b, side_c, area);
}
return 0;
}