前面 52 题可以看下 《c语言基础程序——经典100道实例。》
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