C语言如何实现生物节律计算?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 C语言 正文

C语言实现生物节律(Biorhythms)计算

生物节律理论认为人有三种周期性的生理节律:

  • 体力周期:23天
  • 情绪周期:28天
  • 智力周期:33天

下面是一个完整的C语言程序,用于计算和显示一个人的生物节律状态。

#include <stdio.h>
#include <math.h>
#include <time.h>
// 函数声明
void calculateBiorhythms(int birthYear, int birthMonth, int birthDay);
int isLeapYear(int year);
int daysInMonth(int month, int year);
int calculateDaysSinceBirth(int birthYear, int birthMonth, int birthDay);
void printBiorhythm(int days, const char* cycleName, int cycleLength);
int main() {
    int birthYear, birthMonth, birthDay;
    printf("生物节律计算器\n");
    printf("请输入您的出生日期(年 月 日,用空格分隔): ");
    scanf("%d %d %d", &birthYear, &birthMonth, &birthDay);
    // 验证输入日期的有效性
    if (birthYear < 1900 || birthMonth < 1 || birthMonth > 12 || 
        birthDay < 1 || birthDay > daysInMonth(birthMonth, birthYear)) {
        printf("无效的出生日期!\n");
        return 1;
    }
    calculateBiorhythms(birthYear, birthMonth, birthDay);
    return 0;
}
// 计算并显示生物节律
void calculateBiorhythms(int birthYear, int birthMonth, int birthDay) {
    // 获取当前日期
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    int currentYear = tm.tm_year + 1900;
    int currentMonth = tm.tm_mon + 1;
    int currentDay = tm.tm_mday;
    // 计算从出生到现在的天数
    int daysSinceBirth = calculateDaysSinceBirth(birthYear, birthMonth, birthDay);
    printf("\n从出生到今天已经过去: %d 天\n", daysSinceBirth);
    // 计算并显示三种生物节律
    printBiorhythm(daysSinceBirth, "体力", 23);
    printBiorhythm(daysSinceBirth, "情绪", 28);
    printBiorhythm(daysSinceBirth, "智力", 33);
}
// 判断是否为闰年
int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取某个月的天数
int daysInMonth(int month, int year) {
    switch (month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            return 31;
        case 4: case 6: case 9: case 11:
            return 30;
        case 2:
            return isLeapYear(year) ? 29 : 28;
        default:
            return 0;
    }
}
// 计算从出生到现在的总天数
int calculateDaysSinceBirth(int birthYear, int birthMonth, int birthDay) {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    int currentYear = tm.tm_year + 1900;
    int currentMonth = tm.tm_mon + 1;
    int currentDay = tm.tm_mday;
    int totalDays = 0;
    // 计算完整年份的天数
    for (int year = birthYear; year < currentYear; year++) {
        totalDays += isLeapYear(year) ? 366 : 365;
    }
    // 计算出生年份剩余天数
    for (int month = 1; month < birthMonth; month++) {
        totalDays += daysInMonth(month, birthYear);
    }
    totalDays += birthDay;
    // 减去出生年份已经计算的天数
    totalDays -= 1; // 因为出生日当天算作第0天
    // 计算当前年份已经过去的天数
    for (int month = 1; month < currentMonth; month++) {
        totalDays += daysInMonth(month, currentYear);
    }
    totalDays += currentDay;
    return totalDays;
}
// 打印生物节律状态
void printBiorhythm(int days, const char* cycleName, int cycleLength) {
    int position = days % cycleLength;
    double percentage = (double)position / cycleLength * 100;
    printf("\n%s周期 (%d天):\n", cycleName, cycleLength);
    printf("当前周期进度: %.1f%%\n", percentage);
    // 绘制简单的波形图
    printf("波形: ");
    for (int i = 0; i < cycleLength; i++) {
        if (i == position) {
            printf("|");
        } else if (i == 0 || i == cycleLength/2 || i == cycleLength-1) {
            printf("+");
        } else {
            printf("-");
        }
    }
    printf("\n");
    // 确定当前状态
    if (position == 0) {
        printf("状态: 临界日 (转折点)\n");
    } else if (position < cycleLength/2) {
        printf("状态: 上升期\n");
    } else {
        printf("状态: 下降期\n");
    }
    // 计算到下一个临界日的天数
    int daysToCritical = (cycleLength - position) % cycleLength;
    printf("距离下一个临界日还有: %d 天\n", daysToCritical);
}

程序功能说明

  1. 输入处理:用户输入出生日期(年、月、日)
  2. 日期验证:检查输入的日期是否有效
  3. 天数计算:计算从出生到现在的总天数
  4. 生物节律计算
    • 体力周期(23天)
    • 情绪周期(28天)
    • 智力周期(33天)
  5. 结果输出
    • 当前周期进度百分比
    • 简单的波形图表示
    • 当前状态(上升期/下降期/临界日)
    • 距离下一个临界日的天数

使用示例

生物节律计算器
请输入您的出生日期(年 月 日,用空格分隔): 1990 5 15
从出生到今天已经过去: 11984 天
体力周期 (23天):
当前周期进度: 17.4%
波形: +-----------------|-----------------+
状态: 上升期
距离下一个临界日还有: 6 天
情绪周期 (28天):
当前周期进度: 28.6%
波形: +---------------------|----------------+
状态: 上升期
距离下一个临界日还有: 20 天
智力周期 (33天):
当前周期进度: 9.1%
波形: +------------------|------------------+
状态: 上升期
距离下一个临界日还有: 30 天

扩展建议

  1. 可以添加图形界面(如使用EasyX或GTK)显示更直观的波形图
  2. 可以增加历史记录功能,保存和查看过去的生物节律状态
  3. 可以添加警告功能,在临界日前提醒用户
  4. 可以增加多人比较功能,比较两个人的生物节律是否同步

这个程序提供了生物节律计算的基本功能,您可以根据需要进一步扩展和完善。

-- 展开阅读全文 --
头像
dede为何无法连接数据库?
« 上一篇 今天
织梦医院网站免费模板哪里找?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]