#include #include #include #include #include void header(int width, int margin, char lineChar, char *headerTitle, char *inputMessage, int meslen); int main(){ // Declare Variables // Float values for calculations float bmi, weight, height, mostellar, duBois, boyd, lifeExpect; // Int values to store the result of the scanf fucntion int weightResult, heightResult; // Char to store the gender with max length of 7 and a line string for formatting char gender[7]; char message[] = "This program will calculate your BMI, Life Expectancy, and BSA(multiple methods) with just your weight(kg), height(cm), and gender."; // Display Program Purpose header(80, 4, '*', "Purpose", message, (int)strlen(message)); // Read in weight, height, and gender from user printf("Please enter your weight(kg): "); weightResult = scanf("%f", &weight); while (weight <= 0 || weightResult != 1) { while (getchar() != '\n'); if (weight <= 0) { printf("Bad Value: Weight must greater than 0! fmt: XX.X\n"); } else { printf("Bad Value: Please enter a decimal input! fmt: XX.X\n"); } printf("Please re-enter your weight(kg): "); weightResult = scanf("%f", &weight); } printf("Please enter your height(cm): "); heightResult = scanf("%f", &height); while (height <= 0 || heightResult != 1) { while (getchar() != '\n'); if (height <= 0) { printf("Bad Value: Height must greater than 0! fmt: XX.X\n"); } else { printf("Bad Value: Please enter a decimal input! fmt: XX.X\n"); } printf("Please re-enter your height(cm): "); heightResult = scanf("%f", &height); } // Make sure correct values for gender are entered while (1) { // Read in gender from user printf("Please enter your gender(male or female): "); scanf("%s", gender); // Loop through all chars in gender and convert to lower case for (int i = 0; i < (int)strlen(gender); i++) { gender[i] = tolower(gender[i]); } // Check if gender is valid if (!(strcmp("male", gender)) || !(strcmp("female", gender))) { break; } else { printf("Bad value: Please enter either male or female\n"); } } // Calculate the BMI bmi = 10000 * (weight / pow(height, 2)); // Calculate the BSA(Mosteller's) mostellar = sqrt((height * weight) / 3600); // Calculate the BSA(Dubois) duBois = (0.20247 * pow((height / 100), 0.725)) * pow(weight, 0.425); // Calculate the BSA(boyd) boyd = (0.0003207 * pow(height, 0.3)) * pow((1000 * weight), (0.6721 - (0.0188 * log10(weight)))); // Check if overweight and gender to select correct life expectancy message // Only need to check one since the input screens to just two options if (strcmp("male", gender)) { if (bmi > 25) { lifeExpect = 81.4; } else { lifeExpect = 83.5; } } else { if (bmi > 25) { lifeExpect = 77.3; } else { lifeExpect = 79.4; } } // Display values and output printf("For a %s with weight(kg) of %.1fkg and height(cm) of %.1fcm\n", gender, weight, height); printf("You have a BMI of %.1f and a life expectancy of %.1f years\n", bmi, lifeExpect); printf("You also have a BSA calculated using\n"); printf(" - Mosteller's:\t%.3f\n", mostellar); printf(" - DuBois:\t\t%.3f\n", duBois); printf(" - Boyd:\t\t%.3f\n", boyd); return 0; } void header(int width, int margin, char lineChar, char *headerTitle, char *inputMessage, int meslen) { int TITLE_MARGIN = 3; int CONTENT_MARGIN = margin; int rows = 1; char line[width + 1]; char topLine[width + 1]; int contentWidth = (width - 2 * CONTENT_MARGIN) - 2; // Create Line for (int i = 0; i < width; i++) { line[i] = lineChar; } line[width] = 0; strcpy(topLine, line); // Add header title for (int i = TITLE_MARGIN; i < ((int)strlen(headerTitle) + TITLE_MARGIN); i++) { topLine[i] = headerTitle[i - TITLE_MARGIN]; } topLine[width] = 0; char *message = (char *)malloc((meslen + 100) * sizeof(char)); if (message == NULL) { printf("Memory allocation failed!\n"); exit(1); } strncpy(message, inputMessage, meslen + 100); while(1) { if ((contentWidth * rows) > (int)strlen(message)) { break; } if (message[(contentWidth * rows)] != ' ') { int i = 1; int tempCounter = 0; while (1) { if (message[(contentWidth * rows) - i] == ' ') { int start = ((contentWidth * rows) - i) + 1; char tempMessage[(int)strlen(message)]; int k = 0; for (int j = 0; j < (int)strlen(message); j++) { tempMessage[j] = ' '; } for (int j = start; j < strlen(message); j++) { tempMessage[k] = message[j]; tempCounter = k; k++; } for (int j = 0; j < i; j++) { message[start + j] = ' '; } for (int j = 0; j < tempCounter + 2; j++) { message[(start + i) + j] = tempMessage[j]; if (tempCounter + 1 == j) { message[(start + i) + j] = 0; } } break; } i++; } } rows++; } printf("%s\n", topLine); for (int i = 0; i < rows; i++) { int charCount = 0; printf("*"); for (int j = 0; j < CONTENT_MARGIN; j++) { printf(" "); } for (int j = 0; j < contentWidth; j++) { if (charCount == 0 && (message[j + (i * contentWidth)] == ' ')) {j++;} if (!(message[j + (i * contentWidth)])) { break; } printf("%c", message[j + (i * contentWidth)]); charCount++; } for (int j = 0; j < contentWidth - charCount; j++) { printf(" "); } for (int j = 0; j < CONTENT_MARGIN; j++) { printf(" "); } printf("*\n"); } printf("%s\n", line); free(message); }