HWOD:计算日期到天数转换

本文介绍了如何使用C语言编写一个程序来判断给定年份是否为闰年,并计算特定日期在该年中的位置。通过逻辑判断和条件语句,作者展示了计算一年中第几天的基本算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、知识点

这里所有涉及到的都是公历(阳历)

1、闰年的判断

能被100整除的年份,能被400整除时,闰

不能被100整除的年份,能被4整除时,闰

2、一年有多少天

一年有12个月,这12个月分3类

第一类:大月,每月31天,共7个;分别是1月,3月,5月,7月,8月,10月,12月

第二类:小月,每月30天,共4个;分别是4月,6月,9月,11月

第三类:2月,平年2月是28天,闰年2月是29天

所以,平年全年是365天,闰年全年是366天

二、题目

1、描述

根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法。

2、输入

输入一行,每行空格分割,分别是年,月,日

3、输出

输出是这一年的第几天

三、自己写的代码

#include<stdio.h>
int main() {
    int year, month, day, sum = 0;
    char IsLeapYear = 0;
    scanf("%d %d %d", &year, &month, &day);
    if (year % 100 == 0) {
        if (year % 400 == 0) {
            IsLeapYear = 1;
        }
    } else {
        if (year % 4 == 0) {
            IsLeapYear = 1;
        }
    }
    if (month == 2) {
        sum += 31;
    } else if (month == 3) {
        sum += 59;
    } else if (month == 4) {
        sum += 90;
    } else if (month == 5) {
        sum += 120;
    } else if (month == 6) {
        sum += 151;
    } else if (month == 7) {
        sum += 181;
    } else if (month == 8) {
        sum += 212;
    } else if (month == 9) {
        sum += 243;
    } else if (month == 10) {
        sum += 273;
    } else if (month == 11) {
        sum += 304;
    } else if (month == 12) {
        sum += 334;
    }
    if (IsLeapYear == 1 && month > 2) {
        sum += 1;
    }
    sum += day;
    printf("%d\n", sum);
    return 0;
}

四、测试

<think>由于MiniGUI不支持Z序调整,但需要图片显示在其他控件上方,可以通过以下思路实现: 1. 在创建图片控件时,确保它是最后一个创建的子控件(这样在绘制时会最后绘制,从而覆盖之前绘制的控件)。 2. 或者,在需要显示时,将图片控件移动到父窗口的子控件列表的末尾(MiniGUI中可以通过`SetWindowPos`调整Z序,但有些版本不支持,所以这里采用重新创建控件的方式)。 但是,根据问题描述,这个版本的MiniGUI不支持Z序调整,因此我们采用以下方法: - 初始不创建图片控件,当鼠标悬停在按钮上时,动态创建图片控件(这样它将是最后一个子窗口,因此会显示在最前面)。 - 鼠标移开时,销毁图片控件。 注意:频繁创建销毁控件可能影响性能,但考虑到悬停事件不是非常频繁,可以接受。 步骤: 1. 在窗口过程中处理`MSG_MOUSEMOVE`消息。 2. 当鼠标移动到按钮上时,创建图片控件(如果尚未创建),并设置其位置在按钮右侧,显示图片。 3. 当鼠标移出按钮时,销毁图片控件。 代码示例: ```c #include <minigui/common.h> #include <minigui/minigui.h> #include <minigui/gdi.h> #include <minigui/window.h> #include <minigui/control.h> #define ID_BUTTON 100 static HWND hButton; // 按钮句柄 static HWND hPic = HWND_INVALID; // 图片控件句柄,初始为无效 static int MyWindowProc(HWND hWnd, int msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case MSG_CREATE: // 创建按钮 hButton = CreateWindowEx(CTRL_BUTTON, "Hover Me", WS_VISIBLE | WS_CHILD | WS_BORDER, ID_BUTTON, 50, 50, 100, 30, hWnd, 0); break; case MSG_MOUSEMOVE: { // 获取当前鼠标位置 int x = LOSWORD(lParam); int y = HISWORD(lParam); RECT rcBtn; // 获取按钮区域 GetWindowRect(hButton, &rcBtn); // 判断鼠标是否在按钮区域内 if (PtInRect(&rcBtn, x, y)) { // 如果图片控件尚未创建,则创建 if (hPic == HWND_INVALID) { // 计算图片显示位置:按钮右侧+10像素 int picX = rcBtn.right + 10; int picY = rcBtn.top; // 创建图片控件,使用SS_BITMAP样式 hPic = CreateWindowEx(CTRL_STATIC, "", WS_VISIBLE | WS_CHILD | SS_BITMAP, 0, picX, picY, 60, 60, hWnd, 0); // 设置图片(请替换为你的图片路径) SetWindowBkBitmap(hPic, "res/hover.bmp"); } } else { // 鼠标不在按钮上,如果图片控件存在则销毁 if (hPic != HWND_INVALID) { DestroyWindow(hPic); hPic = HWND_INVALID; } } } break; // 其他消息处理... case MSG_CLOSE: DestroyMainWindow(hWnd); PostQuitMessage(hWnd); break; } return DefaultMainWinProc(hWnd, msg, wParam, lParam); } // 其他注册窗口类等代码省略... ``` **说明:** - 通过`MSG_MOUSEMOVE`消息检测鼠标位置。 - 使用`PtInRect`判断鼠标是否在按钮区域内。 - 当鼠标进入按钮区域时,动态创建图片控件(如果尚未创建),并设置位图。 - 当鼠标移出按钮区域时,销毁图片控件。 - 由于每次创建都在当前鼠标位置,所以图片控件是最后一个子窗口,因此会显示在最上层(在没有Z序支持的情况下)。 **注意事项:** 1. 图片路径需要根据实际情况修改。 2. 频繁创建销毁控件可能会带来性能开销,如果性能敏感,可以考虑隐藏和显示控件(但需要确保隐藏时其他控件能正确重绘)。 3. 如果按钮区域外有其他控件,当鼠标移动到图片上时,由于图片是新建的,会触发`MSG_MOUSEMOVE`(此时鼠标在图片上,不在按钮上),因此会销毁图片。这样图片会立即消失,导致无法与图片交互。如果需要在图片上停留,则需调整逻辑(例如设置一个定时器,或者扩大检测区域包括图片)。 如果希望鼠标可以在图片上停留而不消失,需要修改判断逻辑,将图片区域也作为有效区域。但根据问题要求,鼠标移开按钮图片消失,所以上述代码已满足。 §§相关问题§§ 1. 在MiniGUI中如何避免频繁创建和销毁控件带来的性能问题? 2. 如果需要在鼠标悬停图片上时保持显示,应如何修改代码? 3. 如何确保动态创建的图片控件不会覆盖其他重要控件(如输入框)的功能? 4. 在MiniGUI中,除了动态创建,还有哪些方法可以实现类似悬浮提示的效果? 5. 当按钮位于窗口边缘时,如何调整图片位置防止显示超出窗口边界?</think>在MiniGUI不支持Z序调整的情况下,要实现悬浮图片显示在其他控件上方,可以通过动态创建/销毁控件的方式实现。以下是具体实现方案: ```c #include <minigui/common.h> #include <minigui/minigui.h> #include <minigui/gdi.h> #include <minigui/window.h> #include <minigui/control.h> #define ID_BUTTON 100 static HWND hButton; // 按钮句柄 static HWND hPic = HWND_INVALID; // 图片控件句柄 /* 窗口过程函数 */ static int MyWindowProc(HWND hWnd, int msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case MSG_CREATE: // 创建按钮 hButton = CreateWindowEx(CTRL_BUTTON, "悬停按钮", WS_VISIBLE | WS_CHILD, ID_BUTTON, 50, 50, 100, 30, hWnd, 0); break; case MSG_MOUSEMOVE: { static int lastX = -1, lastY = -1; int x = LOSWORD(lParam); int y = HISWORD(lParam); // 避免频繁处理 if (abs(x - lastX) < 3 && abs(y - lastY) < 3) break; lastX = x; lastY = y; RECT rcBtn; GetWindowRect(hButton, &rcBtn); // 检测鼠标是否在按钮上 if (PtInRect(&rcBtn, x, y)) { // 动态创建图片控件(如果尚未创建) if (hPic == HWND_INVALID) { // 计算显示位置(按钮右侧) int picX = rcBtn.right + 10; int picY = rcBtn.top; // 创建图片控件(最后创建,显示在最上层) hPic = CreateWindowEx(CTRL_STATIC, "", WS_VISIBLE | WS_CHILD | SS_BITMAP, 0, picX, picY, 80, 80, hWnd, 0); // 加载并显示图片 SetWindowBkBitmap(hPic, "res/hover.bmp"); } } // 鼠标不在按钮上且图片存在 else if (hPic != HWND_INVALID) { // 获取图片控件区域 RECT rcPic; GetWindowRect(hPic, &rcPic); // 鼠标也不在图片上时销毁图片控件 if (!PtInRect(&rcPic, x, y)) { DestroyWindow(hPic); hPic = HWND_INVALID; } } break; } // 其他消息处理... } return DefaultMainWinProc(hWnd, msg, wParam, lParam); } ``` **实现原理:** 1. **动态创建机制**: - 初始不创建图片控件(`hPic = HWOD_INVALID`) - 鼠标悬停按钮时动态创建图片控件 - 鼠标移出后立即销毁控件 2. **置顶显示技巧**: - 利用MiniGUI子窗口的创建顺序(后创建的显示在上层) - 图片控件在需要时最后创建,自然显示在最上层 3. **精确位置控制**: - 使用`GetWindowRect`获取按钮屏幕坐标 - 计算右侧位置:`rcBtn.right + 10` - 创建时直接设置正确位置 4. **性能优化**: - 添加坐标变化阈值检测,避免频繁处理 - 鼠标在图片上时不销毁控件 - 使用静态变量记录上次坐标 **注意事项:** 1. 图片路径需替换为实际资源路径 2. 需要处理图片加载失败的情况 3. 在嵌入式设备中,建议使用内存位图减少IO操作 4. 如果界面复杂,可考虑使用定时器优化鼠标移动检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值