活动介绍

已知平面上两点的极坐标(极角单位为度),求两点之间的距离,结果保留3位小数。 提示:设A(ρ1,θ1),B(ρ2,θ2) 则根据余弦定理可得 输入样例1:1 0 1 90 输出样例1:1.414 输入样例2:1 0 2 60 输出样例2:1.732

时间: 2024-11-12 18:44:24 浏览: 126
在平面直角坐标系中,给定两个点A(ρ1, θ1)和B(ρ2, θ2)的极坐标,它们之间的欧几里得距离可以通过下面的公式计算: \[ d = \sqrt{(\rho_1 \cdot \cos(\theta_1 - \theta_2))^2 + (\rho_1 \cdot \sin(\theta_1 - \theta_2))^2} \] 这里,我们使用了余弦定理,因为极坐标转换到直角坐标后,x轴对应于余弦值,y轴对应于正弦值。首先,我们需要将极坐标转换为直角坐标(x, y),然后应用欧氏距离公式。 对于输入样例1 (1, 0, 1, 90),即点A在原点,点B与x轴正方向成90度角,显然构成一个45度角的直角三角形,所以d = ρ1 = 1. 对于输入样例2 (1, 0, 2, 60),即点A在原点,点B与x轴正方向成60度角,我们可以计算出角度差,然后代入公式。 假设我们有一个函数`distance_in_cartesian(rho1, theta1, rho2, theta2)`来进行计算,对于输入1和2,可以分别像下面这样计算: 输入1: ```python distance_1 = distance_in_cartesian(1, 0, 1, 90) ``` 输出1: ```markdown distance_1 ≈ 1.000 (因为A与B共线,实际长度就是ρ1) ``` 输入2: ```python angle_diff = calculate_angle_difference(0, 60) distance_2 = distance_in_cartesian(1, 0, 2, angle_diff) ``` 输出2: ```markdown distance_2 ≈ 1.414 (由于60度角,是一个等边三角形的一半) ``` 现在给出这两个例子的结果: 输出样例1: `1.000` (四舍五入至三位小数) 输出样例2: `1.414` (保留三位小数)
阅读全文

相关推荐

这个是我自己写的2024 年高教社杯全国大学生数学建模竞赛题目 a题第一问求每一个时刻,龙各个点的坐标,我的思路是先给时间求出来龙头走的路程,通过平面螺旋线的弧长公式求出来龙头的极角,然后根据x=r*cosθ求出来坐标,知道龙头的极角,用余弦定理求龙头后一节的极角,再通过公式求出来下一节的坐标以此类推求出来某一时刻所有点的坐标,注意点是,龙头和龙身子的一节的长度不同,所以龙头后面一节的坐标和极角需要单独计算,还有龙头是从螺旋线的外点向着原点螺线的,而且如果龙的那个位置没有进入螺旋线里面的时候,不会输出坐标,输出null。下面给出原题目:某板凳龙由223节板凳组成,其中第1节为龙头,后面221节为龙身,最后1节为龙 尾。龙头的板长为341 cm,龙身和龙尾的板长均为220 cm,所有板凳的板宽均为30 cm。每 节板凳上均有两个孔,孔径(孔的直径)为5.5 cm,孔的中心距离最近的板头27.5 cm(见 图1和图2)。相邻两条板凳通过把手连接 舞龙队沿螺距为55 cm的等距螺线顺时针盘入,各把手中心均位于螺线上。龙 头前把手的行进速度始终保持1 m/s。初始时,龙头位于螺线第16圈A点处(见图4)。请 给出从初始时刻到300 s为止,每秒整个舞龙队的位置和速度(指龙头、龙身和龙尾各前把 手及龙尾后把手中心的位置和速度,下同),将结果保存到文件result1.xlsx中(模板文件见 附件,其中“龙尾(后)”表示龙尾后把手,其余的均是前把手,结果保留6位小数,下同)。

/* * Copyright (c) 2021, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "board.h" #include "Key.h" int32_t L_PWM,R_PWM; int Flag_Stop=1; float ATarget_angle=0,BTarget_angle=0; int main(void) { int i=0; SYSCFG_DL_init(); DL_Timer_startCounter(PWM_0_INST); DL_Timer_startCounter(PWM_1_INST); NVIC_ClearPendingIRQ(TIMER_0_INST_INT_IRQN); delay_ms(500); NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN); while (1) { printf("L_Period:%.1lf,R_Period:%.1lf\r\n",ATarget_angle,ATarget_angle);//输出此时设置的设置Period_PWM_Count // delay_ms(500); // R_PWM=Calculate_MB_Angle_PWM(BTarget_angle); // Set_PWM(L_PWM,R_PWM);//PWM波驱动电机 // delay_ms(500); } } //5ms定时中断 void TIMER_0_INST_IRQHandler(void) { if(DL_TimerA_getPendingInterrupt(TIMER_0_INST)) { if(DL_TIMER_IIDX_ZERO) { // //LED_Flash(100);//led闪烁 Key();//获取当前BLS按键状态,单击后电机转过45° // //L_PWM=Calculate_MA_Angle_PWM(ATarget_angle); R_PWM=Calculate_MB_Angle_PWM(BTarget_angle); Set_PWM(L_PWM,R_PWM);//PWM波驱动电机 //R_PWM=Calculate_target(180);//设置电机每分钟60转 //Set_PWM(L_PWM,R_PWM);//PWM波驱动电机 } } } 这是我代码的主函数#include "motor.h" #include <math.h> #include <stdlib.h> // --- 硬件参数 #define STEPS_PER_REVOLUTION 200 // 电机物理参数: 电机转一圈(360度)需要的步数。1.8度步进角 = 360/1.8 = 200步。 #define MICROSTEPS 16 // 驱动器参数: 驱动器设置的细分数。细分越高,转动越平滑,但对单片机性能要求也越高。 #define PWM_CLOCK_FREQ 10000000 // --- 系统参数 --- #define ISR_INTERVAL_S 0.005f // 中断调用周期(秒)。 // --- 恒定转速参数 (修改部分) --- #define CONSTANT_SPEED_RPM 10 // 目标恒定转速,替代原来的快慢速切换 #define START_SPEED_RPM 3 // 启动速度,避免丢步 #define ACCELERATION_TIME_MS 200 // 加速时间200ms #define ACCELERATION_STEPS ((int)(ACCELERATION_TIME_MS / (ISR_INTERVAL_S * 1000))) // 加速需要的中断次数 // 全局常量:预先计算出"每转一度需要多少个脉冲",方便后续直接使用。 // 公式: (总步数/圈 * 细分数) / 360度/圈 const float PULSES_PER_DEGREE = (STEPS_PER_REVOLUTION * MICROSTEPS) / 360.0f; int Calculate_target(int Target) { if (Target==0) return 0;//如果目标值为0,直接返回0失能电机 // 方向由Target的符号决定,数值部分表示转速(RPM) int direction = (Target >= 0) ? 1 : -1; float speed = (float)ABS(Target); // 转速绝对值(RPM) // 计算每转需要的总步数(考虑细分) float stepsPerRevolution = STEPS_PER_REVOLUTION * MICROSTEPS; // 计算每秒需要的步数(SPM: Steps Per Minute -> SPS: Steps Per Second) float stepsPerSecond = (speed * stepsPerRevolution) / 60.0f; // 计算PWM频率(Hz):每秒需要的脉冲数 float pwmFrequency = stepsPerSecond; // 计算对应的PWM周期值(Period_PWM_Count) // 周期值 = PWM时钟频率 / PWM目标频率 - 1 uint16_t periodValue = (uint16_t)((PWM_CLOCK_FREQ / pwmFrequency) - 1); // 确保计算结果在有效范围内(0-65535) if (periodValue > 65535) { periodValue = 65535; // 限制最大值 } // 返回带方向的周期值 return direction * periodValue; } /** * @brief 将 RPM (每分钟转速) 转换为PWM定时器需要的周期计数值(LoadValue) * @param rpm 目标转速 * @return int 返回给PWM定时器设置的周期值。该值越大,PWM频率越低,电机转速越慢。 */ static int rpm_to_pwm_period(int rpm) { // 如果速度为0,不产生脉冲,直接返回0 if (rpm <= 0) return 0; // 1. 将 RPM (转/分钟) 转换为 RPS (转/秒) float rps = (float)rpm / 60.0f; // 2. 将 RPS (转/秒) 转换为 Steps-per-second (脉冲数/秒) float steps_per_second = rps * STEPS_PER_REVOLUTION * MICROSTEPS; // 3. 脉冲数/秒 就是PWM的频率(Hz) // 4. 根据PWM频率和时钟频率,计算定时器周期值。公式: Period = ClockFreq / PwmFreq - 1 return (int)((PWM_CLOCK_FREQ / steps_per_second) - 1); } /** * @brief 计算电机A(左)为到达目标角度所需要的PWM控制值 - 恒定转速版本(带加速) * @param target_angle 电机A的目标绝对角度 (单位: 度) * @return int 带符号的PWM周期值。 * - 正数: 表示正转,数值为PWM周期值。 * - 负数: 表示反转,数值的绝对值为PWM周期值。 * - 0: 表示停止。 */ int Calculate_MA_Angle_PWM(float target_angle) { // 电机A的私有状态变量。使用'static'关键字,使得它们的值在函数多次调用之间得以保持。 static float s_ma_current_target_angle = -999.0f; // 初始化为特殊值,避免启动误动作 static float s_ma_current_assumed_angle = 0.0f; // 内部追踪的电机当前假定位置(伪闭环) static long s_ma_pulses_remaining = 0; // 本次运动还剩余多少脉冲需要发送 static int s_ma_direction = 0; // 运动方向: 1=正, -1=反, 0=停 static float s_ma_pulse_accumulator = 0.0f; // 脉冲累加器,用于补偿浮点运算的精度损失 static int s_ma_acceleration_counter = 0; // 加速计数器 static int s_ma_first_call = 1; // 首次调用标志 // 首次调用特殊处理 - 避免启动震动 if (s_ma_first_call) { s_ma_first_call = 0; s_ma_current_target_angle = target_angle; s_ma_current_assumed_angle = target_angle; // 假设启动时已经在目标位置 return 0; // 首次调用不产生任何运动 } // 步骤 1: 检查目标角度是否发生变化。如果变了,就规划一次新的运动。 if (target_angle != s_ma_current_target_angle) { s_ma_current_target_angle = target_angle; // 锁定新目标 // 从上一次运动的终点,计算到新目标需要移动的角度 float angle_to_move = target_angle - s_ma_current_assumed_angle; // 如果移动角度太小(小于0.1度),直接跳转,不执行运动 if (fabs(angle_to_move) < 0.1f) { s_ma_current_assumed_angle = target_angle; s_ma_pulses_remaining = 0; s_ma_direction = 0; return 0; } // 计算总脉冲数 s_ma_pulses_remaining = (long)(fabs(angle_to_move) * PULSES_PER_DEGREE); // 重置脉冲累加器和加速计数器 s_ma_pulse_accumulator = 0.0f; s_ma_acceleration_counter = 0; // 根据移动角度的正负,确定方向 s_ma_direction = (angle_to_move > 0) ? 1 : ((angle_to_move < 0) ? -1 : 0); } // 步骤 2: 如果还有脉冲需要发送,就执行运动控制逻辑。 if (s_ma_pulses_remaining > 0) { // 计算当前应该使用的转速(平滑加速) int current_speed_rpm; if (s_ma_acceleration_counter < ACCELERATION_STEPS) { // 加速阶段:从启动速度线性加速到目标速度 float acceleration_progress = (float)s_ma_acceleration_counter / ACCELERATION_STEPS; current_speed_rpm = (int)(START_SPEED_RPM + (CONSTANT_SPEED_RPM - START_SPEED_RPM) * acceleration_progress); s_ma_acceleration_counter++; } else { // 恒速阶段 current_speed_rpm = CONSTANT_SPEED_RPM; } // 根据当前速度,计算在这个中断周期内(5ms),理论上应发送多少个脉冲(可能是小数) float steps_per_second = (current_speed_rpm * (STEPS_PER_REVOLUTION * MICROSTEPS)) / 60.0f; float pulses_to_send_float = steps_per_second * ISR_INTERVAL_S; // 使用累加器,将每次计算出的小数脉冲累加起来 s_ma_pulse_accumulator += pulses_to_send_float; // 从累加器中取出整数部分作为本次中断实际要发送的脉冲数 long pulses_this_interval = (long)s_ma_pulse_accumulator; if (pulses_this_interval > 0) { s_ma_pulse_accumulator -= pulses_this_interval; // 累加器减去已发送的部分,保留小数 s_ma_pulses_remaining -= pulses_this_interval; // 总剩余脉冲数也减去相应部分 } // 步骤 3: 检查运动是否完成 if (s_ma_pulses_remaining <= 0) { s_ma_pulses_remaining = 0; // 清零,防止负数 s_ma_direction = 0; // 停止 s_ma_acceleration_counter = 0; // 重置加速计数器 // 到达目标!更新电机的假定位置为当前目标位置。这是伪闭环的关键。 s_ma_current_assumed_angle = s_ma_current_target_angle; return 0; // 返回0,命令Set_PWM函数停止电机 } // 如果运动未完成,返回带方向的速度指令 return s_ma_direction * rpm_to_pwm_period(current_speed_rpm); } // 如果没有运动(已到达或无新指令),返回0 return 0; } /** * @brief 计算电机B(右)为到达目标角度所需要的PWM控制值 - 恒定转速版本(带加速) * @note 此函数逻辑与Calculate_MA_Angle_PWM完全相同,但使用独立的static变量, * 从而实现对电机B的独立状态追踪和控制。 */ int Calculate_MB_Angle_PWM(float target_angle) { // 电机B的私有状态变量 (与电机A的完全独立) static float s_mb_current_target_angle = -999.0f; // 初始化为特殊值 static float s_mb_current_assumed_angle = 0.0f; static long s_mb_pulses_remaining = 0; static int s_mb_direction = 0; static float s_mb_pulse_accumulator = 0.0f; static int s_mb_acceleration_counter = 0; static int s_mb_first_call = 1; // 首次调用标志 // 首次调用特殊处理 - 避免启动震动 if (s_mb_first_call) { s_mb_first_call = 0; s_mb_current_target_angle = target_angle; s_mb_current_assumed_angle = target_angle; // 假设启动时已经在目标位置 return 0; // 首次调用不产生任何运动 } if (target_angle != s_mb_current_target_angle) { s_mb_current_target_angle = target_angle; float angle_to_move = target_angle - s_mb_current_assumed_angle; // 如果移动角度太小,直接跳转 if (fabs(angle_to_move) < 0.1f) { s_mb_current_assumed_angle = target_angle; s_mb_pulses_remaining = 0; s_mb_direction = 0; return 0; } s_mb_pulses_remaining = (long)(fabs(angle_to_move) * PULSES_PER_DEGREE); s_mb_pulse_accumulator = 0.0f; s_mb_acceleration_counter = 0; s_mb_direction = (angle_to_move > 0) ? 1 : ((angle_to_move < 0) ? -1 : 0); } if (s_mb_pulses_remaining > 0) { // 计算当前应该使用的转速(平滑加速) int current_speed_rpm; if (s_mb_acceleration_counter < ACCELERATION_STEPS) { // 加速阶段:从启动速度线性加速到目标速度 float acceleration_progress = (float)s_mb_acceleration_counter / ACCELERATION_STEPS; current_speed_rpm = (int)(START_SPEED_RPM + (CONSTANT_SPEED_RPM - START_SPEED_RPM) * acceleration_progress); s_mb_acceleration_counter++; } else { // 恒速阶段 current_speed_rpm = CONSTANT_SPEED_RPM; } float steps_per_second = (current_speed_rpm * (STEPS_PER_REVOLUTION * MICROSTEPS)) / 60.0f; float pulses_to_send_float = steps_per_second * ISR_INTERVAL_S; s_mb_pulse_accumulator += pulses_to_send_float; long pulses_this_interval = (long)s_mb_pulse_accumulator; if (pulses_this_interval > 0) { s_mb_pulse_accumulator -= pulses_this_interval; s_mb_pulses_remaining -= pulses_this_interval; } if (s_mb_pulses_remaining <= 0) { s_mb_pulses_remaining = 0; s_mb_direction = 0; s_mb_acceleration_counter = 0; // 重置加速计数器 s_mb_current_assumed_angle = s_mb_current_target_angle; return 0; } return s_mb_direction * rpm_to_pwm_period(current_speed_rpm); } return 0; } // ============================================================================== // 5. 底层硬件驱动函数 // ============================================================================== /** * @brief 步进电机底层驱动函数 - 改进版(避免频繁使能/失能) * @param L_Target 左电机(A)的控制指令,由Calculate_MA_Angle_PWM()生成。 * @param R_Target 右电机(B)的控制指令,由Calculate_MB_Angle_PWM()生成。 * @details * - 根据指令值的正负号设置电机方向。 * - 根据指令值的绝对值设置PWM频率(即电机速度)。 * - 指令值为0时,停止PWM输出但保持使能,通过设置占空比为0来完全停止脉冲。 */ void Set_PWM(int L_Target, int R_Target) { // --- 左电机(A)控制 --- if(L_Target > 0) // 指令为正数: 正转 { DL_GPIO_setPins(EN_PORT, EN_MA_PIN); // 1. 打开电机A的使能 DL_GPIO_setPins(DIR_PORT, DIR_A_PIN); // 2. 设置电机A的方向为正转 DL_TimerA_setLoadValue(PWM_0_INST, abs(L_Target)); // 3. 设置PWM周期,决定转速 DL_Timer_setCaptureCompareValue(PWM_0_INST, abs(L_Target/2), GPIO_PWM_0_C0_IDX); // 4. 设置比较值,产生50%占空比方波 } else if(L_Target < 0) // 指令为负数: 反转 { DL_GPIO_setPins(EN_PORT, EN_MA_PIN); // 1. 打开电机A的使能 DL_GPIO_clearPins(DIR_PORT, DIR_A_PIN); // 2. 设置电机A的方向为反转 DL_TimerA_setLoadValue(PWM_0_INST, abs(L_Target)); DL_Timer_setCaptureCompareValue(PWM_0_INST, abs(L_Target/2), GPIO_PWM_0_C0_IDX); } else // 指令为0: 停止但保持使能 { DL_GPIO_setPins(EN_PORT, EN_MA_PIN); // 保持电机A的使能,不失能 // 通过设置占空比为0来完全停止PWM输出,没有脉冲产生 DL_Timer_setCaptureCompareValue(PWM_0_INST, 0, GPIO_PWM_0_C0_IDX); // 占空比为0,完全无输出 // 周期值可以保持之前的值,或者设置一个固定值 DL_TimerA_setLoadValue(PWM_0_INST, 1000); // 设置一个固定的周期值 } // --- 右电机(B)控制 --- if(R_Target > 0) // 指令为正数: 正转 { DL_GPIO_setPins(EN_PORT, EN_MB_PIN); DL_GPIO_setPins(DIR_PORT, DIR_B_PIN); DL_TimerG_setLoadValue(PWM_1_INST, abs(R_Target)); DL_Timer_setCaptureCompareValue(PWM_1_INST, abs(R_Target/2), GPIO_PWM_1_C1_IDX); } else if(R_Target < 0) // 指令为负数: 反转 { DL_GPIO_setPins(EN_PORT, EN_MB_PIN); DL_GPIO_clearPins(DIR_PORT, DIR_B_PIN); DL_TimerG_setLoadValue(PWM_1_INST, abs(R_Target)); DL_Timer_setCaptureCompareValue(PWM_1_INST, abs(R_Target/2), GPIO_PWM_1_C1_IDX); } else // 指令为0: 停止但保持使能 { DL_GPIO_setPins(EN_PORT, EN_MB_PIN); // 保持电机B的使能,不失能 // 通过设置占空比为0来完全停止PWM输出 DL_Timer_setCaptureCompareValue(PWM_1_INST, 0, GPIO_PWM_1_C1_IDX); // 占空比为0,完全无输出 DL_TimerG_setLoadValue(PWM_1_INST, 1000); // 设置一个固定的周期值 } } 这是步进电机驱动函数,现在我要控制它转动角度,但加上按键控制会变得很慢#include "key.h" extern float ATarget_angle,BTarget_angle; /************************************************************************** Function: Key scan Input : Double click the waiting time Output : 0:No action;1:click;2:Double click 函数功能:按键扫描 入口参数:双击等待时间 返回 值:按键状态 0:无动作 1:单击 2:双击 **************************************************************************/ u8 click_N_Double (u8 time) { static u8 flag_key,count_key,double_key=0; static u16 count_single,Forever_count; if(DL_GPIO_readPins(KEY_PORT,KEY_key_PIN)>0) Forever_count++; //长按标志位未置1 else Forever_count=0; if((DL_GPIO_readPins(KEY_PORT,KEY_key_PIN)>0)&&0==flag_key) flag_key=1; //第一次按下 if(0==count_key) { if(flag_key==1) { double_key++; count_key=1; //标记按下一次 } if(double_key==3) { //按下两次 double_key=0; count_single=0; return 2; //双击执行的指令 } } if(0==DL_GPIO_readPins(KEY_PORT,KEY_key_PIN)) flag_key=0,count_key=0; if(1==double_key) { count_single++; if(count_single>time&&Forever_count<time) { double_key=0; count_single=0; //超时不标记为双击 return 1;//单击执行的指令 } if(Forever_count>time) { double_key=0; count_single=0; } } return 0; } /************************************************************************** Function: Long press detection Input : none Output : 0:No action;1:Long press for 2 seconds; 函数功能:长按检测 入口参数:无 返回 值:按键状态 0:无动作 1:长按2s **************************************************************************/ u8 Long_Press(void) { static u16 Long_Press_count,Long_Press; if(Long_Press==0&&KEY==0) Long_Press_count++; //长按标志位未置1 else Long_Press_count=0; if(Long_Press_count>200) //10ms扫描一次 { Long_Press=1; Long_Press_count=0; return 1; } if(Long_Press==1) //长按标志位置1 { Long_Press=0; } return 0; } void Key(void) { u8 tmp,tmp2; tmp=click_N_Double(50); if(tmp==1)//单击电机转过45° { ATarget_angle+=45; BTarget_angle+=90; } } 这是按键代码,现在我想改一个方案,解决这个问题,并且能控制舵机画出一个·半径为6cm的圆

感觉被你变复杂了,不如你把官方代码详细注释一下给我吧#include <stdio.h> #include <string.h> void transform(int *arry, int col_row) { //找到最大值 int max = arry[0], max_idx; for (int i = 0; i < col_row * col_row; i++) { if (max < arry[i]) max = arry[i];//找出最大数 max_idx = i; } //行列相乘得到总数量,除以2后加1则为中心点(暂时不考虑偶数的情况) int center_idx = (col_row * col_row) / 2; int tmp = arry[cen ter_idx]; arry[center_idx] = arry[max_idx]; arry[max_idx] = tmp; //找到四个最小值 int min_idx[4]; for (int i = 0; i < 4; i++) {//循环4次获取到最小值 int min_tmp = arry[col_row * col_row - 1]; for (int j = 0; j < col_row * col_row; j++) {//遍历所有数据,逐个比较获取最小值 int k = 0; for (; k < i; k++) {//但是要注意如果某个下标的数据已经是获取过的最小值,则不能进行判断(因为这个肯定是最小的) if (j == min_idx[k]) break; } if (k != i) { continue; }//k和i不同表示j这个坐标已经是找到的最小的几个数字之一,则找下一个判断 if (min_tmp > arry[j]) { // 相当于在剩下的数中找到最小的那个数字 min_tmp = arry[j]; min_idx[i] = j; //并且记录这个数字的位置 } } } int change_idx[4];//先计算四个角的下标,便于后边进行交换 change_idx[0] = 0;//第一个要置换的数据的下标,也就是左上角 change_idx[1] = col_row - 1;//第二个要置换的数据的下标,也就是右上角 change_idx[2] = col_row * (col_row - 1);//第一个要置换的数据的下标,也就是左下角 change_idx[3] = (col_row * col_row) - 1;//第一个要置换的数据的下标,也就是右下角 for (int i = 0; i < 4; i++) { int tmp = arry[change_idx[i]]; arry[change_idx[i]] = arry[min_idx[i]]; arry[min_idx[i]] = tmp; } return ; } int main() { int arry[5][5]; printf("Please enter a 5x5 matrix: \n"); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { scanf_s("%d", &arry[i][j]); } } transform(*arry, 5);//将二维数组当做一维数组传入处理,并且传入行列数 printf("\n"); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { printf("%d ", arry[i][j]); } printf("\n"); } system("pause"); return 0; }

txt
zip

最新推荐

recommend-type

已知两点经纬度组成的直线_求指定距离的第三点经纬度公式

首先,我们有两个已知点A(α1,β1)和B(α2,β2),它们之间的距离D可以通过球面距离公式计算: \[ D = R \cdot \arccos\left[\cos(\alpha_1)\cos(\alpha_2)\cos(\beta_1 - \beta_2) + \sin(\alpha_1)\sin(\...
recommend-type

【地球科学与遥感】基于Google Earth Engine的哨兵2号数据分析:研究区域NDVI、LST及城市热岛效应评估系统设计

内容概要:本文档提供了一套完整的Python脚本,利用Google Earth Engine (GEE) API对哨兵2号卫星影像进行处理与分析。首先,导入必要的库(如ee、geemap、geopandas),并通过Google Drive加载GeoJSON文件定义研究区域。接着,对哨兵2号Harmonized数据进行预处理,包括云掩膜、日期筛选和区域过滤。然后,基于红波段和近红外波段计算归一化植被指数(NDVI),并进一步推算地表温度(LST)。最后,通过计算研究区域内的LST均值和标准差,构建标准化城市热岛指数(UHI)和城市热场变异指数(UTFVI),并将其可视化于交互式地图中。 适合人群:具备一定遥感和地理信息系统(GIS)基础知识的研究人员和技术人员,特别是从事环境监测、城市规划或气候变化相关领域的工作者。 使用场景及目标:① 对特定区域内的植被覆盖和地表温度进行动态监测;② 分析城市热岛效应及其空间分布特征;③ 辅助城市规划和环境管理决策,提高应对气候变化的能力。 阅读建议:此资源侧重于实际应用中的遥感数据分析流程,建议读者熟悉Python编程语言和GEE平台的基本操作,同时结合具体的科学问题来理解和实践代码中的各个步骤。在学习过程中应关注数据处理逻辑与方法论的应用,确保能够独立完成类似的数据分析任务。
recommend-type

2025二级建造师继续教育考试题库带有答案.docx

2025二级建造师继续教育考试题库带有答案.docx
recommend-type

Typora下载问题解决:资源安装包实测可用

### 知识点:Typora下载与安装问题解决 #### 1. Typora 简介 Typora 是一款流行的轻量级Markdown编辑器,它将实时预览功能和源代码编辑结合在一起,为用户提供了一个简洁高效的写作环境。由于其独特的设计和出色的用户体验,Typora 迅速在开发者和内容创作者之间获得了普及。 #### 2. Markdown 简介 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。Markdown 被广泛用于编写 README 文件、撰写文章、创建富文本内容等。其特点在于简化了传统的排版语法,让写作更加专注于内容本身。 #### 3. Typora 的特点和优势 - **所见即所得编辑器**:Typora 结合了传统Markdown编辑器和富文本编辑器的优点,使得用户在编写文档时可以直接看到最终效果。 - **跨平台兼容性**:Typora 支持Windows、macOS以及Linux等多个操作系统。 - **简洁的界面**:它拥有简洁的用户界面,没有复杂的菜单,这有助于减少分心,专注于内容创作。 - **即时预览**:Typora 提供即时预览功能,用户可以立即看到其标记语法对应的视觉效果。 - **集成度高**:支持插入图片、代码块、表格、数学公式等多种格式。 - **扩展性**:支持多种主题和插件,可以进一步增强其功能。 #### 4. 关于标题:“关于Typora下载找不到资源” 当用户在寻找Typora的下载资源时,可能会遇到找不到官方下载链接或被错误资源误导的问题。这可能是由于网络环境限制、搜索关键词不当或者不正确的网站导航等原因导致的。为了解决这个问题,重要的是要知道如何辨别官方下载渠道,以及如何查找和验证可靠的资源。 #### 5. 官方资源的识别和下载 - **访问官方网站**:访问 Typora 的官方网站(https://typora.io/)获取最新版本的下载信息。官方网站是获取软件的最安全和最可靠的方式。 - **下载安装包**:官方网站通常会提供最新版本的安装包下载链接,例如,在此案例中,压缩包子文件名列表中的 typora-setup-x64-0.9.49.exe 对应了 Typora 的一个版本号为 0.9.49 的安装程序,适用于64位Windows系统。 - **检查版本更新**:在安装之前,用户应当确认是否是当前最新版本。如果不是,可从官方网站下载最新版本。 #### 6. 安装包文件名称解析 文件名 typora-setup-x64-0.9.49.exe 中的各部分含义: - **typora**:指的是要安装的软件名。 - **setup**:通常表示这是一个安装程序。 - **x64**:表示这个安装程序支持64位系统架构。 - **0.9.49**:表示这个版本号,用户可以通过这个版本号了解其更新历史和功能改进情况。 #### 7. 实测完成 “实测完成”这一描述表明此文件已经过测试,并确认可以正常下载和安装。实测的流程包括下载安装包、运行安装程序、完成安装以及验证软件功能是否正常。 #### 8. 安装流程详解 1. **下载**:从官方网站下载对应操作系统版本的 Typora 安装包。 2. **运行安装程序**:双击下载的安装程序文件(例如 typora-setup-x64-0.9.49.exe)。 3. **安装向导**:安装向导启动后,遵循提示完成安装。可能包含选择安装路径、接受许可协议、选择开始菜单文件夹等步骤。 4. **完成安装**:完成安装向导后,可能需要重启电脑以完成安装。 5. **验证安装**:启动 Typora 程序,检查软件是否能够正常打开,并确保可以正常使用Markdown编辑功能。 #### 9. 常见问题及解决方案 - **找不到下载资源**:确保访问官方网站或使用正规的软件分发平台获取资源。 - **安装程序无法运行**:检查文件是否有损坏,重新下载安装包。确认系统环境满足安装需求,如操作系统版本兼容性、运行库等。 - **软件无法打开**:尝试以管理员权限运行 Typora,或检查是否有系统安全软件阻止其运行。 - **功能异常或错误**:检查是否有可用的软件更新,或者查看 Typora 官方论坛获取帮助。 #### 10. Typora 的未来展望 由于 Typora 不断更新迭代,功能和用户界面可能会有所改变,包括对新特性的支持和旧特性的优化。同时,开发者社区也在不断地为 Typora 开发新的主题和插件,以提供更加丰富的写作体验和扩展功能。用户应定期访问官方网站或关注官方消息,以便获取最新动态和软件更新。 通过以上介绍和问题解答,用户应该可以更好地理解 Typora 的下载与安装过程,并在遇到相关问题时快速找到解决方法,从而顺利使用这款强大的Markdown编辑器。
recommend-type

网络嗅探器实战进阶:掌握高效数据捕获与准确分析的6大策略

# 1. 网络嗅探器基础原理与工具介绍 网络嗅探器,或称为网络分析器、包分析器,是一种用于捕获网络中的数据包并分析其内容的工具。它们通过直接连接到网络上,读取传输中的数据包信息,为网络安全、故障排除和网络性
recommend-type

system verilog task中用宏定义传参

<think>好的,用户现在想了解如何在SystemVerilog中使用宏定义向task传递参数。之前我已经回答了C/C++中宏定义传参的方法,现在需要迁移到SystemVerilog,同时结合用户提供的引用内容。 首先,我需要回忆SystemVerilog中宏的基本语法,确认是否与C/C++类似。SystemVerilog确实支持`define宏,带参数的形式应该也是类似的。用户提供的引用中提到`__FILE__`和`__LINE__`,这些可能和调试有关,所以可能需要考虑在宏中加入这些信息来帮助调试。 接下来,用户的问题是关于如何通过宏向task传参。这里的task应该是指System
recommend-type

Java开发的Help GUI 1.1源码:可视化组件库详解

在分析给定文件信息后,可以提取出如下知识点: 首先,标题中提到了“基于java的开发源码-帮助视图组件库 Help GUI 1.1源代码.zip”,这说明文件包含了一个Java开发的开源项目,该库被命名为Help GUI,版本为1.1。在此基础上,我们可以讨论以下几个方面: 1. Java开发: - Java是一种广泛使用的面向对象的编程语言,它具有跨平台的特性,即“一次编写,到处运行”的能力。Java通过Java虚拟机(JVM)来实现跨平台运行。 - Java的开发环境一般需要配置Java开发工具包(JDK)和集成开发环境(IDE),如Eclipse、IntelliJ IDEA或PyCharm。 - Java支持多线程编程,拥有丰富的类库和框架,如Spring、Hibernate等,用以简化开发流程。 - Java在企业级应用、移动开发(Android)、桌面应用和服务器端应用中都有广泛的应用。 2. 开源项目: - 开源项目是指源代码公开的软件项目,通常遵循特定的开源许可协议,如GPL、LGPL、Apache License等。 - 开源项目的优势在于可自由使用、修改和分发代码,能够促进技术的交流和创新。 - 通过参与开源项目,开发者可以提高自身的技术水平,贡献代码以回馈社区。 3. 组件库Help GUI 1.1: - Help GUI可能是一个为开发者提供的图形用户界面(GUI)组件库,用于简化Java桌面应用的帮助视图创建。 - 组件库一般会包含一系列预制的用户界面组件,例如按钮、文本框、列表框、对话框等,以帮助快速构建用户界面。 - 版本1.1表明这是组件库的一个更新版本,通常新版本会增加新的特性、修复bug、优化性能。 4. PyCharm配置Python环境: - 这部分描述似乎与主标题无关,但其可能涉及PyCharm这一IDE的使用。 - PyCharm是专为Python语言开发的IDE,但也可以配置Java开发环境。 - 在配置Python环境时,需要安装Python解释器,并设置相关的路径、环境变量等。 - PyCharm提供了代码高亮、代码自动完成、版本控制等功能,能够提升开发效率。 由于【压缩包子文件的文件名称列表】中只有一个“codefans.net”,这可能是一个网站地址,但没有提供足够的信息来推断与上述Java项目或组件库直接相关的内容。 综上所述,文件描述了一个基于Java的开源组件库Help GUI 1.1,该组件库用于帮助开发者创建帮助视图,且暗示了PyCharm这一IDE的使用。通过探讨Java开发、开源项目、组件库和IDE配置等知识点,可以更好地理解文件所指的项目背景和应用场景。
recommend-type

网络嗅探器全攻略:从入门到精通的15大技巧与实践案例

# 1. 网络嗅探器基础与重要性 在数字化的世界中,网络嗅探器是IT专业人员的重要工具,它允许我们监视和分析经过网络的数据包。本章将带您了解网络嗅探器的基本概念及其在网络安全和性能监控中的关键作用。 ## 网络嗅探器概述 网络嗅探器,通常被称为“抓包工具”或“协议分析器”,是一种可以监听、记录和分析网络流量的程序或设备。它们在排除网络问题、进行安全审计和协议分析时发挥着重要作用。 ##
recommend-type

RTL8720DN-VA1-CG后面的VA1-CG是什么意思

<think>嗯,用户这次的问题转向了具体的芯片型号解析,询问RTL8720DN-VA1-CG后缀的含义。这属于硬件标识领域的专业问题,需要结合芯片命名规则和行业惯例来分析。 从用户提问方式看,ta应该具备一定技术背景,可能是电子工程师或物联网开发者,正在做物料选型或故障排查。用户特意强调"参考站内引用"但实际没有引用源,说明需要权威解释而非普通科普。之前讨论Wi-Fi频段差异时用户表现出对技术参数的敏感,这次提问同样注重细节标识。 关于这个型号后缀,需要拆解三部分分析: VA1通常代表芯片修订版本(revision),比如初版叫VA0,改进版叫VA1。CG后缀可能有多种含义:最常见的是封
recommend-type

CCPD2019车牌数据集:10000张带YOLO标签图片

车牌检测是计算机视觉领域的一个重要应用,尤其在智能交通系统、监控视频分析以及车辆管理等方面具有广泛的应用。CCPD2019车牌数据集是专为车牌检测任务设计的数据集,包含了大量的实际场景中拍摄的车辆图片及其对应的标注信息,这些标注信息以YOLO(You Only Look Once)格式提供。 YOLO是一种流行的目标检测算法,因其速度和准确性相结合而受到广泛欢迎。在YOLO算法中,整个图像被一次性通过网络进行处理,同时预测出多个边界框和这些框所属的类别。YOLO将目标检测任务视为一个回归问题,直接从图像像素到边界框坐标和类别概率的映射,与其他基于区域的方法相比,YOLO在速度上有很大的优势,可以实现实时检测。 YOLO格式标签是一种特殊的标注格式,它提供了用于训练和验证模型的数据。这些标签通常包含每个目标的类别以及它的位置信息,通常在一张图片的标注文件中,对于每一个检测到的车辆,都会有一个对应的标注行,标注行中包含了该车辆车牌的位置、大小和类别信息。通常这些信息包括:标注物体在原图中的中心点坐标(x,y)、宽度、高度以及类别ID。 使用CCPD2019车牌数据集,研究人员和工程师可以进行深度学习模型的训练,特别是基于YOLO算法的车牌检测模型。数据集中的图片是精心挑选的,包含了各种光照条件、不同角度和遮挡情况下的车牌图像,这对于提高模型在现实世界中检测的准确性和鲁棒性至关重要。 在深度学习中,训练模型需要大量的标注数据。一个高质量的数据集对于模型能否成功学习到目标检测中的关键特征是至关重要的。CCPD2019车牌数据集提供的10000张图片以及它们的YOLO格式标签,能够为模型提供充足的训练材料。这些标签通常都是由人工仔细标注,确保了标注的质量和准确性。 深度学习在车牌识别系统中的应用是多方面的,不仅包括检测车牌的位置,还包括车牌字符的分割和识别。在实际应用中,经过训练的YOLO模型首先对输入图像中的车牌区域进行定位,然后可以通过其他专门设计的深度学习模型对车牌上的文字进行识别。 CCPD2019车牌数据集对于研究和开发车牌识别技术具有重要价值,它有助于推动计算机视觉领域特别是车牌检测和识别技术的发展。通过深度学习,特别是使用YOLO这样的先进算法,可以实现车牌的快速准确识别,这对于智能交通管理、车辆安全监控和交通流量分析等应用具有十分重要的意义。