纯C语言写的一个Windows运行的计算器

#include <windows.h>
#include <stdio.h>
#include <string.h>

#define ID_BUTTON_0 100
#define ID_BUTTON_1 101
#define ID_BUTTON_2 102
#define ID_BUTTON_3 103
#define ID_BUTTON_4 104
#define ID_BUTTON_5 105
#define ID_BUTTON_6 106
#define ID_BUTTON_7 107
#define ID_BUTTON_8 108
#define ID_BUTTON_9 109
#define ID_BUTTON_ADD 110
#define ID_BUTTON_SUB 111
#define ID_BUTTON_MUL 112
#define ID_BUTTON_DIV 113
#define ID_BUTTON_EQUAL 114
#define ID_BUTTON_CLEAR 115
#define ID_BUTTON_DOT 116
#define ID_EDIT_DISPLAY 117

// 全局变量
double num1 = 0, num2 = 0, result = 0;
char operation = '\0';
BOOL newNumber = TRUE;
char displayText[50] = "0";

// 函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void CreateCalculatorControls(HWND hwnd);
void UpdateDisplay(HWND hEdit);
void HandleNumberClick(int number, HWND hEdit);
void HandleOperationClick(char op, HWND hEdit);
void CalculateResult(HWND hEdit);
void ClearCalculator(HWND hEdit);

// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "CalculatorClass";
    
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    
    RegisterClass(&wc);
    
    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0,
        CLASS_NAME,
        "C语言计算器",
        WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, 300, 400,
        NULL, NULL, hInstance, NULL
    );
    
    if (hwnd == NULL) return 0;
    
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    
    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return 0;
}

// 窗口过程函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hEdit;
    
    switch (uMsg) {
        case WM_CREATE:
            CreateCalculatorControls(hwnd);
            hEdit = GetDlgItem(hwnd, ID_EDIT_DISPLAY);
            break;
            
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                // 数字按钮
                case ID_BUTTON_0: HandleNumberClick(0, hEdit); break;
                case ID_BUTTON_1: HandleNumberClick(1, hEdit); break;
                case ID_BUTTON_2: HandleNumberClick(2, hEdit); break;
                case ID_BUTTON_3: HandleNumberClick(3, hEdit); break;
                case ID_BUTTON_4: HandleNumberClick(4, hEdit); break;
                case ID_BUTTON_5: HandleNumberClick(5, hEdit); break;
                case ID_BUTTON_6: HandleNumberClick(6, hEdit); break;
                case ID_BUTTON_7: HandleNumberClick(7, hEdit); break;
                case ID_BUTTON_8: HandleNumberClick(8, hEdit); break;
                case ID_BUTTON_9: HandleNumberClick(9, hEdit); break;
                
                // 操作符按钮
                case ID_BUTTON_ADD: HandleOperationClick('+', hEdit); break;
                case ID_BUTTON_SUB: HandleOperationClick('-', hEdit); break;
                case ID_BUTTON_MUL: HandleOperationClick('*', hEdit); break;
                case ID_BUTTON_DIV: HandleOperationClick('/', hEdit); break;
                
                // 功能按钮
                case ID_BUTTON_EQUAL: CalculateResult(hEdit); break;
                case ID_BUTTON_CLEAR: ClearCalculator(hEdit); break;
                case ID_BUTTON_DOT: 
                    if (strchr(displayText, '.') == NULL) {
                        strcat(displayText, ".");
                        UpdateDisplay(hEdit);
                    }
                    break;
            }
            break;
            
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
            
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// 创建计算器控件
void CreateCalculatorControls(HWND hwnd) {
    int row, col; // 在函数开头声明循环变量
    int index, width, x, y;
    
    // 创建显示框
    CreateWindow("EDIT", "0", 
                 WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_READONLY,
                 10, 10, 260, 30, 
                 hwnd, (HMENU)ID_EDIT_DISPLAY, 
                 NULL, NULL);
    
    // 创建按钮
    char* buttons[] = {
        "7", "8", "9", "/",
        "4", "5", "6", "*", 
        "1", "2", "3", "-",
        "0", ".", "=", "+",
        "C"
    };
    
    int ids[] = {
        ID_BUTTON_7, ID_BUTTON_8, ID_BUTTON_9, ID_BUTTON_DIV,
        ID_BUTTON_4, ID_BUTTON_5, ID_BUTTON_6, ID_BUTTON_MUL,
        ID_BUTTON_1, ID_BUTTON_2, ID_BUTTON_3, ID_BUTTON_SUB,
        ID_BUTTON_0, ID_BUTTON_DOT, ID_BUTTON_EQUAL, ID_BUTTON_ADD,
        ID_BUTTON_CLEAR
    };
    
    // 使用传统的循环变量声明方式
    row = 0;
    for (row = 0; row < 5; row++) {
        col = 0;
        for (col = 0; col < 4; col++) {
            index = row * 4 + col;
            if (index >= 17) break;
            
            width = (index == 16) ? 260 : 60; // 清除按钮宽度不同
            x = 10 + col * 65;
            y = 50 + row * 60;
            
            if (index == 16) { // 清除按钮
                x = 10;
                width = 260;
            }
            
            CreateWindow("BUTTON", buttons[index], 
                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                         x, y, width, 50, 
                         hwnd, (HMENU)ids[index], 
                         NULL, NULL);
        }
    }
}

// 更新显示
void UpdateDisplay(HWND hEdit) {
    SetWindowText(hEdit, displayText);
}

// 处理数字点击
void HandleNumberClick(int number, HWND hEdit) {
    if (newNumber) {
        strcpy(displayText, "0");
        newNumber = FALSE;
    }
    
    if (strcmp(displayText, "0") == 0) {
        sprintf(displayText, "%d", number);
    } else {
        char temp[50];
        sprintf(temp, "%s%d", displayText, number);
        if (strlen(temp) < 20) { // 限制长度
            strcpy(displayText, temp);
        }
    }
    UpdateDisplay(hEdit);
}

// 处理操作符点击
void HandleOperationClick(char op, HWND hEdit) {
    if (!newNumber) {
        num1 = atof(displayText);
        operation = op;
        newNumber = TRUE;
    }
}

// 计算结果
void CalculateResult(HWND hEdit) {
    if (operation != '\0') {
        num2 = atof(displayText);
        
        switch (operation) {
            case '+': result = num1 + num2; break;
            case '-': result = num1 - num2; break;
            case '*': result = num1 * num2; break;
            case '/': 
                if (num2 != 0) {
                    result = num1 / num2;
                } else {
                    MessageBox(NULL, "错误:除数不能为零!", "计算错误", MB_ICONERROR);
                    ClearCalculator(hEdit);
                    return;
                }
                break;
        }
        
        sprintf(displayText, "%.10g", result); // 格式化输出,避免多余的小数位
        UpdateDisplay(hEdit);
        
        operation = '\0';
        newNumber = TRUE;
    }
}

// 清除计算器
void ClearCalculator(HWND hEdit) {
    num1 = 0;
    num2 = 0;
    result = 0;
    operation = '\0';
    newNumber = TRUE;
    strcpy(displayText, "0");
    UpdateDisplay(hEdit);
}

-----------------------------

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值