前面 52 题可以看下 《c语言基础程序——经典100道实例。》
c语言基础程序——经典100道实例
- 053,按位异或 ^
- 054,取数右端4~7位
- 055,按位取反~
- 056,画圆形
- 057,画直线
- 058,画矩形
- 059,画椭圆
- 060,混合画图
- 061,杨辉三角形
- 062,画点
- 063,画曲线
- 064,画扇形
- 065,画爱心
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位变成……1110000b = (-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 10int 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