C 언어 기초 입출력 및 연산 처리 실습

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;
}

태그: c-language standard-input-output format-specifiers triangle-inequality buffer-management

8월 27일 19:00에 게시됨