c语言基础程序——经典100道实例(二)


前面 52 题可以看下 《c语言基础程序——经典100道实例。》

053,按位异或 ^

题目: 学习使用按位异或 ^。

问题分析: 按位异或有 4 种情况,相同的为 0 ,不同的为 1 。

  • 0 ^ 0=0;
  • 0 ^ 1=1;
  • 1 ^ 0=1;
  • 1 ^ 1=0;
/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include<stdio.h>

void printBinary(int num) {
    
    // 打印二进制
    for (int i = 31; i >= 0; i--) {
    
    
        int bit = (num >> i) & 1;
        printf("%d", bit);
        if (i % 8 == 0)// 每8个加一个空格
            printf(" ");
    }
    printf("\n");
}

int main() {
    
    
    int a = 17, b = 13;
    printf("整数 a 的值是:%d,二进制表示如下:\n", a);
    printBinary(a);
    printf("整数 b 的值是:%d,二进制表示如下:\n", b);
    printBinary(b);
    int xor = a ^ b;
    printf("a 和 b 按位 ^ 的值是:%d,二进制表示如下:\n", xor);
    printBinary(xor);
    return 0;
}

运行结果:

整数 a 的值是:17,二进制表示如下:
00000000 00000000 00000000 00010001
整数 b 的值是:13,二进制表示如下:
00000000 00000000 00000000 00001101
a 和 b 按位 ^ 的值是:28,二进制表示如下:
00000000 00000000 00000000 00011100
054,取数右端4~7位

题目: 取一个整数 a 从右端开始的 4~7 位。

问题分析: 假设最右边的是第 1 位,步骤如下:

1,先使 a 右移 3 位(右边的3为舍弃,后面从第4位开始截取)

2,设置一个低 4 位全为 1,其余全为 0 的数,因为 -1 的二进制全是 1 ,可以让它左移 4位,然后取反。

3,将上面二者进行 & 运算即可。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include<stdio.h>

void printBinary(int num) {
    
    // 打印二进制
    for (int i = 31; i >= 0; i--) {
    
    
        int bit = (num >> i) & 1;
        printf("%d", bit);
        if (i % 8 == 0)// 每8个加一个空格
            printf(" ");
    }
    printf("\n");
}

int main() {
    
    
    int a, b, c;
    printf("请输入整数:\n");
    scanf("%d", &a);
    printf("数字 a 的二进制是:\n");
    printBinary(a);
    a >>= 3;// 往右移3位
    // -1 的二进制都是 1 ,即……1111111,左移4位变成……1110000
    b = (-1) << (7 - 4 + 1);
    b = ~b;// 取反变成……0001111,前面都是 0 。
    c = a & b;// 截取 a 的四位。
    printf("数字 a 右边的4到7位是:\n", c);
    printBinary(c);
    return 0;
}

运行结果:

请输入整数:
206
数字 a 的二进制是:
00000000 00000000 00000000 11001110
数字 a 右边的4到7位是:
00000000 00000000 00000000 00001001
055,按位取反~

题目: 学习使用按位取反~。

问题分析: 二进制中 0 变成 1 ,1 变成 0 。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include<stdio.h>

void printBinary(int num) {
    
    // 打印二进制
    for (int i = 31; i >= 0; i--) {
    
    
        int bit = (num >> i) & 1;
        printf("%d", bit);
        if (i % 8 == 0)// 每8个加一个空格
            printf(" ");
    }
    printf("\n");
}

int main() {
    
    
    int a = 203;
    printf("a 的二进制表示如下:\n");
    printBinary(a);
    a = ~a;
    printf("a 按位取反之后的二进制表示如下:\n");
    printBinary(a);
    return 0;
}

运行结果:

a 的二进制表示如下:
00000000 00000000 00000000 11001011
a 按位取反之后的二进制表示如下:
11111111 11111111 11111111 00110100
056,画圆形

题目: 画圆形。

问题分析: 这里是通过windows.h头文件来绘制圆,圆的绘制在WindowProc函数中。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>

// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc; // 设备上下文句柄,用于绘制
    PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
    RECT rect; // 矩形区域,用于定义圆的位置和大小
    switch (uMsg) {
    
    
        case WM_PAINT: // 窗口需要重绘时发送的消息
            hdc = BeginPaint(hwnd, &ps); // 准备绘制
            // 矩形的左上角(100, 100),右下角(300, 300)
            SetRect(&rect, 100, 100, 300, 300);
            // 使用Ellipse函数绘制圆
            Ellipse(hdc, rect.left, rect.top,
                    rect.right, rect.bottom);
            EndPaint(hwnd, &ps); // 结束绘制
            break;
        case WM_DESTROY: // 窗口被销毁时发送的消息
            PostQuitMessage(0); // 发送退出消息,结束应用程序
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该圆由 \"公众号:数据结构和算法\" 绘制", // 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );

    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

057,画直线

题目: 画直线。

问题分析: 这里是通过windows.h头文件来绘制直线,直线的绘制在WindowProc函数中。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>

// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc; // 设备上下文句柄,用于绘制
    PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
    switch (uMsg) {
    
    
        case WM_PAINT: // 窗口需要重绘时发送的消息
            hdc = BeginPaint(hwnd, &ps); // 准备绘制
            // 使用MoveToEx设置直线的起点,然后使用LineTo绘制到终点
            MoveToEx(hdc, 50, 50, NULL); // 起点坐标(50, 50)
            LineTo(hdc, 400, 300);        // 终点坐标(400, 300)
            EndPaint(hwnd, &ps); // 结束绘制
            break;
        case WM_DESTROY: // 窗口被销毁时发送的消息
            PostQuitMessage(0); // 发送退出消息,结束应用程序
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制", // 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

058,画矩形

题目: 画矩形。

问题分析: 同上,也是使用windows.h头文件来绘制。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>

// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc; // 设备上下文句柄,用于绘制
    PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
    switch (uMsg) {
    
    
        case WM_PAINT: // 窗口需要重绘时发送的消息
            hdc = BeginPaint(hwnd, &ps); // 准备绘制
            // 使用Rectangle函数绘制矩形
            // 矩形的左上角(100, 100)和右下角(400, 300)的坐标
            Rectangle(hdc, 100, 100, 400, 300);
            EndPaint(hwnd, &ps); // 结束绘制
            break;
        case WM_DESTROY: // 窗口被销毁时发送的消息
            PostQuitMessage(0); // 发送退出消息,结束应用程序
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

059,画椭圆

题目: 画椭圆。

问题分析: 同上。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>

// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc; // 设备上下文句柄,用于绘制
    PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
    switch (uMsg) {
    
    
        case WM_PAINT: // 窗口需要重绘时发送的消息
            hdc = BeginPaint(hwnd, &ps); // 准备绘制
            // 使用Ellipse函数绘制椭圆
            // 椭圆的左上角(50, 50)和右下角(200, 150)的坐标
            Ellipse(hdc, 50, 50, 200, 150);
            EndPaint(hwnd, &ps); // 结束绘制
            break;
        case WM_DESTROY: // 窗口被销毁时发送的消息
            PostQuitMessage(0); // 发送退出消息,结束应用程序
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

060,混合画图

题目: 混合画图,画三角形,矩形,圆,扇形,椭圆,和五边形

问题分析: 同上

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>
#include <math.h>

#define PI 3.14159// 定义PI的值为3.14159

// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc; // 设备上下文句柄,用于绘制
    PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
    POINT points[5]; // 五角星的顶点数组
    double radius = 100.0; // 五角星的半径
    double angle = 0.0; // 初始角度(以弧度为单位)
    int offsetX = 200; // 五角星中心的X坐标
    int offsetY = 300; // 五角星中心的Y坐标

    switch (uMsg) {
    
    
        case WM_PAINT: // 窗口需要重绘时发送的消息
            hdc = BeginPaint(hwnd, &ps); // 准备绘制

            // 绘制矩形
            Rectangle(hdc, 50, 50, 200, 150);

            // 绘制椭圆(作为圆的特例)
            Ellipse(hdc, 250, 50, 400, 150);

            // 绘制三角形
            points[0].x = 500;
            points[0].y = 50;
            points[1].x = 650;
            points[1].y = 150;
            points[2].x = 500;
            points[2].y = 250;
            Polygon(hdc, points, 3);

            // 计算五角星的顶点坐标
            for (int i = 0; i < 5; i++) {
    
    
                points[i].x = (int) (offsetX + radius *
                              cos(angle + i * (2 * PI / 5)));
                points[i].y = (int) (offsetY - radius *
                              sin(angle + i * (2 * PI / 5)));
            }
            // 绘制五角星
            Polygon(hdc, points, 5);

            // 绘制扇形(使用Pie函数)
            // 注意:Pie函数绘制的是一个由两条半径和一个圆弧围成的区域
            Pie(hdc, 450, 300, 600, 450, 450, 300, 580, 300);

            EndPaint(hwnd, &ps); // 结束绘制
            break;
        case WM_DESTROY: // 窗口被销毁时发送的消息
            PostQuitMessage(0); // 发送退出消息,结束应用程序
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

061,杨辉三角形

题目: 打印出杨辉三角形(要求打印出10行)。

问题分析: 杨辉三角形,每一行除了最左边和最右边以外,每个值都等于正上面和左上角的和,如下所示。

1
1    1
1    2    1
1    3    3    1
1    4    6    4    1
/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <stdio.h>

#define N 10

int main() {
    
    
    int a[N][N];
    // 每一行最左边和最右边都是 1 。
    for (int i = 0; i < N; i++) {
    
    
        a[i][0] = 1;
        a[i][i] = 1;
    }

    // 其他位置每个值等于都等于正上面和左上角的和
    for (int i = 2; i < N; i++)
        for (int j = 1; j < i; j++)
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

    for (int i = 0; i < 10; i++) {
    
    
        for (int j = 0; j <= i; j++)
            printf("%-5d", a[i][j]);// 每个数字占5格,且左对齐
        printf("\n");// 每一行打印完之后要换行
    }
    return 0;
}

运行结果:

1
1    1
1    2    1
1    3    3    1
1    4    6    4    1
1    5    10   10   5    1
1    6    15   20   15   6    1
1    7    21   35   35   21   7    1
1    8    28   56   70   56   28   8    1
1    9    36   84   126  126  84   36   9    1
062,画点

题目: 画点

问题分析: 无。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>
#include <stdlib.h>
#include <time.h>

// 窗口过程函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc;
    PAINTSTRUCT ps;
    COLORREF color;
    int x, y;
    int numPoints = 1000; // 要绘制的点的数量
    switch (uMsg) {
    
    
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            // 设置随机种子
            srand((unsigned int) time(NULL));
            // 循环绘制点
            for (int i = 0; i < numPoints; i++) {
    
    
                // 生成随机坐标(假设窗口大小为400x300)
                x = rand() % 400;
                y = rand() % 300;
                // 生成随机颜色
                color = RGB(rand() % 256, rand() % 256,
                            rand() % 256);
                // 在随机位置绘制点
                SetPixel(hdc, x, y, color);
            }
            EndPaint(hwnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

063,画曲线

题目: 画一条贝塞尔曲线。

问题分析: 无。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>
#include <time.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc;
    PAINTSTRUCT ps;
    POINT bezierPoints[4]; // 贝塞尔曲线的四个控制点

    switch (uMsg) {
    
    
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);

            // 设置贝塞尔曲线的控制点
            bezierPoints[0].x = 50;
            bezierPoints[0].y = 200; // 起始点
            bezierPoints[1].x = 150;
            bezierPoints[1].y = 50;  // 第一个控制点
            bezierPoints[2].x = 250;
            bezierPoints[2].y = 200; // 第二个控制点
            bezierPoints[3].x = 350;
            bezierPoints[3].y = 350; // 终止点
            // 绘制贝塞尔曲线
            PolyBezier(hdc, bezierPoints, 4);

            EndPaint(hwnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 600, 450, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述

064,画扇形

题目: 画扇形。

问题分析: 无。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>
#include <math.h>

// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    HDC hdc; // 设备上下文句柄,用于绘制
    PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
    switch (uMsg) {
    
    
        case WM_PAINT: // 窗口需要重绘时发送的消息
            hdc = BeginPaint(hwnd, &ps); // 准备绘制
            // 绘制扇形(使用Pie函数)
            // 注意:Pie函数绘制的是一个由两条半径和一个圆弧围成的区域
            Pie(hdc, 50, 100, 300, 250, 50, 100, 280, 100);

            EndPaint(hwnd, &ps); // 结束绘制
            break;
        case WM_DESTROY: // 窗口被销毁时发送的消息
            PostQuitMessage(0); // 发送退出消息,结束应用程序
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:

在这里插入图片描述

065,画爱心

题目: 画爱心

问题分析: 无。

/**
 * Created by 公众号:数据结构和算法
 * Copyright wansuanfa.com All rights reserved.
 */

#include <windows.h>
#include <math.h>

#define WIDTH 800
#define HEIGHT 600

// 定义绘制窗口的回调函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
    
    
    PAINTSTRUCT ps;
    HDC hdc;
    switch (uMsg) {
    
    
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            // 设置画笔颜色为红色
            HPEN hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
            HGDIOBJ oldPen = SelectObject(hdc, hPen);
            // 画爱心
            MoveToEx(hdc, WIDTH / 2, HEIGHT / 2, NULL);
            for (double t = 0; t < 2 * 3.14159; t += 0.01) {
    
    
                int x = (int) (16 * sin(t) * sin(t) * sin(t)
                              * 20 + WIDTH / 2);
                int y = (int) (-(13 * cos(t) - 5 * cos(2 * t)
                              - 2 * cos(3 * t) - cos(4 * t))
                                      * 20 + HEIGHT / 2);
                LineTo(hdc, x, y);
            }
            // 恢复画笔
            SelectObject(hdc, oldPen);
            DeleteObject(hPen);

            EndPaint(hwnd, &ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow) {
    
    
    WNDCLASS wc = {
    
    0}; // 窗口类结构体,用于注册窗口类
    // 设置窗口类参数
    wc.lpfnWndProc = WindowProc; // 窗口过程函数
    wc.hInstance = hInstance; // 当前实例句柄
    wc.lpszClassName = "MyWindowClass"; // 窗口类名
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
    wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
            0, // 扩展风格
            "MyWindowClass", // 窗口类名
            "该直线由 \"公众号:数据结构和算法\" 绘制",// 窗口标题
            WS_OVERLAPPEDWINDOW, // 窗口风格
            CW_USEDEFAULT, CW_USEDEFAULT, 1000, 800, // 位置和大小
            NULL, // 父窗口
            NULL, // 菜单
            hInstance, // 实例句柄
            NULL // 附加数据
    );
    ShowWindow(hwnd, nCmdShow); // 显示窗口
    UpdateWindow(hwnd); // 更新窗口

    MSG msg; // 消息结构体,用于接收消息
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg); // 翻译消息
        DispatchMessage(&msg); // 分发消息
    }
    return (int) msg.wParam; // 返回消息参数
}

运行结果:
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

剩余部分可以在百度网盘下载:
链接: https://pan.baidu.com/s/1FXhdXvC7VkwWA9fQtOpHFA?pwd=6666
提取码: 6666