Практические задания по программированию на C/C++ (часть 4)

Задание №11: Медицинские данные

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <vector>
#include <string>

using namespace std;

const char info[] =
" Задание №11n"
"n"
"5.2.2 Задачи разного содержанияn"
"n"
" По некоторой группе людей собраны следующие медицинскиеn"
"данные: возраст, пол, рост, вес, температура, артериальноеn"
"давление (два числа: верхнее и нижнее давление). Вывестиn"
"сведения о мужчинах моложе 25 лет, имеющих верхнее артери-n"
"альное давление больше 140.n";

struct MAN { unsigned age; char sex; unsigned h; unsigned w; double t; unsigned p0; unsigned p1; };
bool yes_man = false; vector<MAN> group; char inp[1024]; const unsigned CNT_PARAM = 7; int cnt;
unsigned char *param[7]; unsigned num; FILE *f;

bool get_param(void) {
char *s, c; ++num; cnt = 0; s = inp;
for (;;) {
while ((c = *s) == ' ' || c == 't' || c == 'n') ++s;
if (c == 0) break;
if (cnt == CNT_PARAM) { printf("Строка файла %u:nСлишком много параметровn", num); fclose(f); return false; }
param[cnt++] = (unsigned char *)s;
while ((c = *s) != ' ' && c != 't' && c != 'n' && c) ++s;
if (c == 0) break;
*s++ = 0;
}
if (cnt == 0 || cnt == CNT_PARAM) return true;
printf("Строка файла %u:nОжидалось %u параметровn", num, CNT_PARAM); fclose(f); return false;
}

int test_num(unsigned char *s, const char *name, int min, int max) {
int v; if (!isdigit(*s)) { printf("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
v = atoi((char *)s); while (isdigit(*++s));
if (*s) { printf("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
if (v < min || v > max) { printf("Строка файла %u:nЗначение '%s' не в диапазоне [%d...%d]n", num, name, min, max); fclose(f); return 0; }
return v;
}

double test_num2(unsigned char *s, const char *name, double min, double max) {
double v; char *end; v = strtod((const char*)s, &end);
if (*end) {
if ((end = (char *)strchr((const char *)s, '.')) != NULL) *end = ',';
else if ((end = (char*)strchr((const char*)s, ',')) != NULL) *end = '.';
v = strtod((const char*)s, &end);
if (*end) { printf("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
}
if (v < min || v > max) { printf("Строка файла %u:nЗначение '%s' не в диапазоне [%.1lf...%.1lf]n", num, name, min, max); fclose(f); return 0; }
return v;
}

bool input(void) {
string name; MAN man = {0};
printf("Имя файла с медицинскими данными: "); getline(cin, name);
if ((f = fopen(name.c_str(), "r")) == NULL) { printf("Ошибка открытия файлаn"); return false; }
while (fgets(inp, sizeof(inp) - 2, f)) {
if (!get_param()) return false;
if (cnt == 0) continue;
if ((man.age = test_num(param[0], "возраст", 17, 80)) == 0) return false;
if (strcmp((const char *)param[1], "М") && strcmp((const char*)param[1], "Ж")) { printf("Строка файла %u:nПол ошибоченn", num); fclose(f); return false; }
man.sex = param[1][0];
if ((man.h = test_num(param[2], "рост", 140, 200)) == 0) return false;
if ((man.w = test_num(param[3], "вес", 50, 140)) == 0) return false;
if ((man.t = test_num2(param[4], "температура", 36.0, 40.0)) == 0) return false;
if ((man.p0 = test_num(param[5], "нижнее артериальное давление", 80, 140)) == 0) return false;
if ((man.p1 = test_num(param[6], "верхнее артериальное давление", 100, 200)) == 0) return false;
if (man.p0 > man.p1) { printf("Строка файла %u:nНижнее артериальное давление больше верхнего артериального давленияn", num); fclose(f); return false; }
if (man.sex == 'М' && man.p1 > 140 && man.age < 25) yes_man = true;
group.push_back(man);
}
fclose(f); if (group.size() == 0) { printf("Файл не содержит медицинской информацииn"); return false; }
return true;
}

void print(bool flag, const char *head) {
int i; MAN man; bool b = false;
printf(head);
for (i = 0; i < group.size(); ++i) {
man = group[i]; if (!flag && !(man.sex == 'М' && man.p1 > 140 && man.age < 25)) continue;
if (!b) { b = true; printf("+-------+---+----+---+-----------+---------------+----------------+n|Возраст|Пол|Рост|Вес|Температура|Нижнее давление|Верхнее давление|n+-------+---+----+---+-----------+---------------+----------------+n"); }
printf("|%7u| %c |%4u|%3u|%11.1lf|%15u|%16u|n", man.age, man.sex, man.h, man.w, man.t, man.p0, man.p1);
}
printf("+-------+---+----+---+-----------+---------------+----------------+nn");
}

int main() {
SetConsoleOutputCP(1251); printf(info);
if (!input()) { system("pause"); return 0; }
print(true, "nВсе медицинские данныеn");
if (yes_man) print(false, "Молодые мужчины с повышенным артериальным давлениемn");
system("pause"); return 0;
}

Оцените статью
Сессия под ключ дистанционно
Добавить комментарий

Заявка на расчет