字符串排列-wyc-debug--

#ifndef EXAM_H
#define EXAM_H

#include <stdio.h>
#include <stdlib.h>

//计算字符数组的长度
int my_strlen(const char *str)
{
	if(str == NULL)
	{
		return 0;
	}
	int i = 0;
	while(str[i] != '\0')
	{
		i++;
	}
	return i;
}

//计算排列组合的个数
int my_arr_count(int len)
{
	int sum = 1;
	int i;
	for(i = 1; i <= len; i++)
	{
		sum = sum*i;
	}
	return sum;
}

//指针数组初始化
void p_arr_init(char **arr, int len)
{
	if(arr == NULL)
	{
		printf("arr=NULL\n");
		return;
	}
	int i;
	for(i = 0; i < len; i++)
	{
		arr[i] = (char*)malloc(len*sizeof(char) + 1);
		if(arr[i] == NULL)
		{
			printf("malloc faile!! arr[%d]\n",i);
		}
	}
	return;
}

//指针数组空间释放
void p_arr_free(char **arr, int len)
{
	if(arr == NULL)
	{
		return;
	}
	int i;
	for(i = 0; i < len; i++)
	{
		if(arr[i] != NULL)
		{
			free(arr[i]);
			arr[i] = NULL;
		}
	}
	return;
}

//字符串复制函数
void my_cpy(const char *input, char *output)
{
	if(input == NULL || output == NULL)
	{
		return;
	}
	int i = 0;
	while(input[i] != '\0')
	{
		output[i] = input[i];
		i++;
	}
	output[i] = input[i];
	return;
}

//字符串比较函数
int my_cmp(const char *input, const char *output, int strlen)
{
	if(input == NULL || output == NULL)
	{
		return 10086;
	}
	int i;
	for(i = 0; input[i] == output[i] && input[i] != '\0'; i++)
	{
		;
	}
	if(input[i] == output[i])
	{
		return 0;
	}
	else if(input[i] < output[i])
	{
		return -1;
	}
	else if(input[i] > output[i])
	{
		return 1;
	}
	else
	{
		//printf("Unknow!!!\n");
		return 10086;
	}
}

//单个字符交换函数
void str_swap(char *a, char *b)
{
	char t = *a;
	*a = *b;
	*b = t;
	return;
}

//字符串交换
void str_swaps(char *a, char *b, int strlen)
{
	char t[strlen];
	my_cpy(a,t);
	my_cpy(b,a);
	my_cpy(t,b);
	return;
}


/*******************在生成结果的过程中排序********************/
void testing_sort(char **arr, int n, int strlen)
{
	if(n > 0)
	{
		int i;
		for(i = n; i > 0; i--)
		{
			if(my_cmp(arr[i],arr[i-1],strlen) == -1)
			{
				str_swaps(arr[i],arr[i-1],strlen+1);
			}
			else if(my_cmp(arr[i],arr[i-1],strlen) == 1 || my_cmp(arr[i],arr[i-1],strlen) == 0)
			{
				return;
			}
		}
	}
	return;
}
/*************************************************************/

int n = 0;
//实现排列组合功能
void arr_com(char *input, char **output, int count, int strlen)
{
	if(count > strlen)
	{
		my_cpy(input, output[n]);
		testing_sort(output, n, strlen);
		n++;	
	}
	else
	{
		for(int i = count; i <= strlen; i++)
		{
			str_swap(&input[count], &input[i]);
			arr_com(input, output, count+1, strlen);
			str_swap(&input[count], &input[i]);
		}
	}
	return;
}


/*************************快排********************************/
//对字符串数组进行排序
int my_sort(char **arr, int start, int end, int strlen)
{
	char temp[strlen];
	my_cpy(arr[start], temp);
	while(start < end)
	{
		while(start<end && (my_cmp(arr[end],temp, strlen) == 0 || my_cmp(arr[end], temp, strlen) == 1))
		{
			end--;
		}		
		str_swaps(arr[end], arr[start], strlen);
		while(start<end && (my_cmp(arr[start],temp, strlen) == 0 || my_cmp(arr[start], temp,  strlen) == -1))
		{
			start++;
		}
		str_swaps(arr[start], arr[end], strlen);
	}
	my_cpy(temp, arr[start]);
	return start;
}

void Sort(char **arr, int start, int end, int strlen)
{
	if(start < end)
	{
		int temp = my_sort(arr, start, end, strlen);
		Sort(arr, start, temp-1, strlen);
		Sort(arr, temp+1, end, strlen);
	}
}
/*************************************************************/


//打印出排列组合结果
void my_printf(char **input, int arrnum)
{
	int i;
	for(i = 0; i < arrnum; i ++)
	{
		printf("%s\n", input[i]);
	}
}

//对一个字符串进行排列组合测试
void test(const char *input)
{
	if(input == NULL)
	{
		return;
	}
	int len = 0;
	len = my_strlen(input);
	int arrnum = 0;
	arrnum = my_arr_count(len);
	//printf("arrnum = %d\n", arrnum);
	char *arr[arrnum];
	p_arr_init(arr, arrnum);
	char temp[len+1];
	my_cpy(input, temp);
	arr_com(temp, arr, 0, len-1);
	my_printf(arr, arrnum);
	p_arr_free(arr, arrnum);

}
#endif // EXAM_H

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您的要求,我给您提供一份基于HAL库的STM32F103RET6的Keil代码,实现您的需求。代码如下: ```c #include "stm32f1xx_hal.h" #include "string.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); char lock = 0; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); char rx_data[15]; while (1) { HAL_UART_Receive(&huart1, (uint8_t *) rx_data, 15, 1000); // 接收数据,等待时间为1s if (strstr(rx_data, "get_temp_adc()") != NULL) // 判断字符串中是否包含 "get_temp_adc()" { // 执行获取温度和ADC值的函数 get_temp_adc(); } else if (rx_data[0] == '0') // 判断第一个字符是否为 '0' { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 将 PA0 拉低,锁住 I/O 口 lock = 0; } else if (rx_data[0] == '1') // 判断第一个字符是否为 '1' { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 将 PA0 拉高,释放 I/O 口 lock = 1; } } } void get_temp_adc() { // 执行获取温度和ADC值的操作,此处省略 } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void Error_Handler(void) { __disable_irq(); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } ``` 在这份代码中,我们通过串口1接收数据,在 while 循环中判断接收到的数据是 "get_temp_adc()" 还是 "0" 或 "1",然后根据不同的情况执行相应的操作。函数 get_temp_adc() 是获取温度和 ADC 值的函数,您需要自行实现。 注意事项: 1. PA0 为我们锁住 I/O 口的控制引脚,需要在 MX_GPIO_Init() 函数中初始化并设置为输出,初始状态为释放 I/O 口,即 PA0 为高电平; 2. 在接收数据时,我们设置了等待时间为 1s,如果 1s 内没有接收到数据,函数会自动退出; 3. 如果您的上位机发送的数据不包含 "get_temp_adc()",则程序不会执行任何操作,可以根据实际需要做出修改。 希望这份代码能够帮到您,如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值