반응형
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 > 1) return 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 < 0) return Invalid;
if (bmi < 18.5) return Underweight;
if (bmi < 25) return Normal;
if (bmi < 30) return Overweight;
else return Obese;
}
// 유효성 검사 충족하지 못할 경우 출력
void printInvalid(int n) {
if (n != 1 || n == -1) printf("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 |
반응형
'C 언어 > C언어 기초' 카테고리의 다른 글
[C언어 #15_2] 점수 학점 변환 (0) | 2020.07.01 |
---|---|
[C언어 #14_2] 기름값 계산 (0) | 2020.07.01 |
[C언어 #30] 문자열 합치기 / 이어 붙이기 (0) | 2020.06.28 |
[C언어 #29] 문자열 비교 (0) | 2020.06.28 |
[C언어 #28] 문자열 복사 (0) | 2020.06.28 |