使用结构体(struct)处理窗口重叠问题

需积分: 5 0 下载量 17 浏览量 更新于2024-08-05 收藏 565KB PDF 举报
"struct.pdfy" 本资源主要介绍了C++中的结构体(struct)以及如何使用结构体来增强代码的可读性和效率。在程序设计中,结构体是一种自定义的数据类型,允许我们将多个不同类型的数据成员组合在一起,形成一个新的复合类型。这种特性在处理多个相关数据时非常有用。 在示例3.1.1中,问题是要判断两个窗口是否重叠以及重叠的面积。窗口的位置由四个整数定义:左边坐标(left)、右边坐标(right)、上边坐标(top)和下边坐标(bottom)。传统的做法是使用两个数组intA[4]和B[4]来存储这些信息,但这种方法缺乏语义清晰性,即无法一眼看出数组中的元素分别代表什么。而通过定义结构体tWindow,我们可以直接为每个坐标分配有意义的名字,如left、right、top和bottom,这大大提高了代码的可读性。 首先,定义了一个名为tWindow的结构体,包含四个整型成员变量: ```cpp struct tWindow { int left, right, top, bottom; }; ``` 接着,创建了两个tWindow类型的变量winA和winB,分别表示两个窗口。还定义了一个临时变量tmp,用于存储重叠部分的窗口信息。 为了输入窗口数据,定义了一个名为inData()的函数,该函数接收用户输入的四个整数,并返回一个tWindow类型的对象: ```cpp tWindow inData() { tWindow tmp; cin >> tmp.left >> tmp.right >> tmp.top >> tmp.bottom; return tmp; } ``` 在主函数main()中,调用两次inData()函数分别获取winA和winB的值,然后计算它们的重叠区域。这里使用了tmp变量来保存重叠部分的窗口信息,通过比较winA和winB的坐标找到最小的left和right,最大的top和bottom,这样就确定了重叠部分的边界。 计算重叠面积的逻辑如下: ```cpp tmp.left = max(winA.left, winB.left); tmp.right = min(winA.right, winB.right); tmp.top = max(winA.top, winB.top); tmp.bottom = min(winA.bottom, winB.bottom); ``` 最后,通过计算tmp.right - tmp.left + 1和tmp.bottom - tmp.top + 1的乘积得到重叠面积,如果面积为0,则表示没有重叠。 通过这个例子,我们可以看到结构体在编程中起到了重要的作用,它使我们能够创建更加抽象和具有意义的数据结构,从而简化代码并提高程序的可维护性。在实际开发中,特别是在处理复杂数据模型时,合理使用结构体可以极大地提升代码的清晰度和效率。
2023-07-22 上传

void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, Motor_IN4_Pin|Motor_IN3_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, Motor_IN7_Pin|Motor_IN8_Pin|Trig_Pin|Motor_IN5_Pin |Motor_IN6_Pin|Motor_IN2_Pin|Motor_IN1_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : PAPin PAPin */ GPIO_InitStruct.Pin = Motor_IN4_Pin|Motor_IN3_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PAPin PAPin PAPin */ GPIO_InitStruct.Pin = IR_3_Pin|IR_4_Pin|IR_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PBPin PBPin PBPin PBPin PBPin PBPin PBPin */ GPIO_InitStruct.Pin = Motor_IN7_Pin|Motor_IN8_Pin|Trig_Pin|Motor_IN5_Pin |Motor_IN6_Pin|Motor_IN2_Pin|Motor_IN1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = Echo_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(Echo_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PBPin PBPin */ GPIO_InitStruct.Pin = IR_2_Pin|IR_1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

2023-06-03 上传