반응형

C언어 비만도 (BMI) 계산 프로그램

 

 

 

비만도 (BMI) 계산 및 결과 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* 비만도 (BMI) 계산 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
 
// 비만도 분류를 위한 표시
enum { Underweight, Normal, Overweight, Obese, Invalid };
 
// 입력값 유효성 검사
bool isValid(int n, const char input[]) {
    int count = 0;
    for (int i = 0; i < n; i++) {
        if (!isdigit(input[i])) {
            if (input[i] == '.') {
                count += 1;
                if (count > 1return false;
            } else {
                return false;
            }
        }
    }
    return true;
}
 
// 문자열 실수 변환
double convert(int n, const char input[]) {
    return isValid(n, input) ? atof(input) : -1;
}
 
// 키, 몸무게 유효성 검사
bool isInvalid(double height, double weight) {
    bool b = (height >= 3.5 || height <= 0.2 || weight >= 350 || weight <= 15);
    return b;
}
 
// 비만도 (BMI) 계산: 몸무게(kg) ÷ (키²)
double getBmi(double height, double weight) {
    double bmi;
    if (isInvalid(height, weight)) bmi = -1;
    else bmi = weight / (height * height);
    return bmi;
}
 
// 비만도 분류
int classifyBmi(double bmi) {
    if (bmi < 0return Invalid;
    if (bmi < 18.5return Underweight;
    if (bmi < 25return Normal;
    if (bmi < 30return Overweight;
    else return Obese;
}
 
// 유효성 검사 충족하지 못할 경우 출력
void printInvalid(int n) {
    if (n != 1 || n == -1printf("Invalid input!!\n");
    fprintf(stderr, "Try:   .\\bmi Height(m) weight(kg)\n");
    fprintf(stderr, "ex.    .\\bmi 1.8 80\n");
}
 
// 결과 출력
void print(double bmi, int bmiClass) {
    switch (bmiClass) {
        case Obese: printf("BMI: %f - Obese\n", bmi); break;
        case Overweight: printf("BMI: %f - Overweight\n", bmi); break;
        case Normal: printf("BMI: %f - Normal\n", bmi); break;
        case Underweight: printf("BMI: %f - Underweight\n", bmi); break;
        case Invalid: printInvalid(bmi); break;
    }
}
 
// 키, 몸무게 출력
void printHW(double height, double weight) {
    printf("Height: %f (m), Weight: %f (kg)\n", height, weight);
}
 
// 키, 몸무게, BMI, BMI 분류 출력
void printResult(double height, double weight, double bmi, int bmiClass) {
    switch (bmiClass) {
        case Invalid: printInvalid(bmi); break;
        case Obese:
            printHW(height, weight);
            printf("BMI: %f - Obese\n", bmi); 
            break;
        case Overweight:
            printHW(height, weight);
            printf("BMI: %f - Overweight\n", bmi); 
            break;
        case Normal:
            printHW(height, weight);
            printf("BMI: %f - Normal\n", bmi); 
            break;
        case Underweight:
            printHW(height, weight);
            printf("BMI: %f - Underweight\n", bmi); 
            break;
    }
}
 
int main(int n, char *args[n]) {
    setbuf(stdout, NULL);    
    if (n == 3) {
        double height = convert(strlen(args[1]), args[1]);
        double weight = convert(strlen(args[2]), args[2]);
        double bmi = getBmi(height, weight);
        int bmiClass = classifyBmi(bmi);        
        // print(bmi, bmiClass);
        printResult(height, weight, bmi, bmiClass);
    } 
    else printInvalid(n);
}
cs

 

 

반응형