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);
}
程序功能说明
- 输入处理:用户输入出生日期(年、月、日)
- 日期验证:检查输入的日期是否有效
- 天数计算:计算从出生到现在的总天数
- 生物节律计算:
- 体力周期(23天)
- 情绪周期(28天)
- 智力周期(33天)
- 结果输出:
- 当前周期进度百分比
- 简单的波形图表示
- 当前状态(上升期/下降期/临界日)
- 距离下一个临界日的天数
使用示例
生物节律计算器
请输入您的出生日期(年 月 日,用空格分隔): 1990 5 15
从出生到今天已经过去: 11984 天
体力周期 (23天):
当前周期进度: 17.4%
波形: +-----------------|-----------------+
状态: 上升期
距离下一个临界日还有: 6 天
情绪周期 (28天):
当前周期进度: 28.6%
波形: +---------------------|----------------+
状态: 上升期
距离下一个临界日还有: 20 天
智力周期 (33天):
当前周期进度: 9.1%
波形: +------------------|------------------+
状态: 上升期
距离下一个临界日还有: 30 天
扩展建议
- 可以添加图形界面(如使用EasyX或GTK)显示更直观的波形图
- 可以增加历史记录功能,保存和查看过去的生物节律状态
- 可以添加警告功能,在临界日前提醒用户
- 可以增加多人比较功能,比较两个人的生物节律是否同步
这个程序提供了生物节律计算的基本功能,您可以根据需要进一步扩展和完善。
