嵌入式软件笔试常见编程题汇总

本文汇总了嵌入式软件笔试中常见的编程题目,包括快速排序、冒泡排序、简单选择排序、直接插入排序、希尔排序以及基础操作如二分查找、数字反转、字符串处理等。这些题目展示了面试者对基础算法和数据结构的理解能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序算法

快速排序

/* 选择数组的一个数作为基数,一次排序完使得 
 * 基数左边全是小于基数; 基数右边全是于基数*/
void quick_sort(int a[], int start, int end)
{
	if(start >= end){
		return ;
	}
	int x = start;
	int y = end;
	int base = a[start];
	
	while(x < y){
		while(a[y] > base && x < y){
			y--;
		}
		if(x < y){
			a[x++] = a[y];
		}
		while(a[x] < base && x < y){
			x++;
		}
		if(x < y){
			a[y--] = a[x];
		}
	}
	a[x] = base;
	quick_sort(a, start, x-1);
	quick_sort(a, x+1, end);
}

冒泡排序

void Bubble_sorting(int *a, int len)
{
    int i = 0,j = 0;
    int temp;
    for(i=0; i<len-1; i++){
    /* 此层循环选择一个大的数放后面 */ 
        for(j=0; j<len-1-i; j++){
            if(*(a+j) > *(a+j+1)){
                temp = *(a+j+1);
                *(a+j+1) = *(a+j);
                *(a+j) = temp;
            }
        }
    }
}

简单选择排序

/* 记下头一个数的下标与数字
 * 再向后面的数组找比它小的数
 * 记下下标与数字,然后换掉  */
void Simple_choice(int a[], int length)
{
	int i,j,num,index;
	for(i=0; i<length; i++)
	{
		num = a[i];
		index = i;
/* 此层循环 在i后面的数组找到比num小的数 */
		for(j=i+1; j<length; j++)
		{
			if(a[j]<num)
			{
				num = a[j];
				index = j;
			}
		}
/* 当找到索引就会变化, 就需交换这两个数 */
		if(i != index)
		{
			a[index] = a[i];
			a[i] = num;
		}
	}
}

直接插入排序

void zhicha(int a[], int length)
{
	int i,j,num;
	for(i=1; i<length; i++)
	{
		num = a[i];
	/* 此层循环把num插入前面的序列中
	   插完0-i已经排好序            */
		for(j=i-1; j>=0; j--)
		{
			if(a[j] > num)
			{
				a[j+1] = a[j];
			}
			else{
				break;
			}
			a[j] = num;
		}
	}
}

希尔排序

void shell_sort(int a[], int length)
{
	int i,j,h, num;
	for(h=length/2; h>0; h/=2)
	{
		for(i=h; i<length; i++)
		{
			num = a[i];
			for(j=i-h; j>=0; j-=h)
			{
				if(a[j] > num)
				{
					a[j+h] = a[j];
				}
				else{
					break;
				}
			}
			a[j+h] = num;
		}
	}
}

二分查找

/* 
参数:数组,数组元素个数,要查找的数
返回:成功找到返回元素下标;失败返回-1
*/
int binary_search(int a[], int len, int num)
{
	int low = 0, high = len-1;
	int mid = (low+high) / 2;
	
	while(low <= high){
		if(num == a[mid]){
			return mid;
		}
		else if(num > a[mid]){
			low = mid + 1;
			mid = (low+high) / 2;
		}
		else{
			high = mid - 1;
			mid = (low+high) / 2;
		}
	}
	return -1;
}

数字反转

int turn_number(int num)
{
	int ret = 0;
	int yu;
	
	while(num){
		yu = num % 10;
		ret = yu + 10*ret;
		num = num / 10;
	}
	return ret;
}

字符串反转

char *str_reversal(char *p_str)
{
	if(NULL == p_str)
		return NULL;
	char *pHead = p_str;
	char *pTail = p_str + strlen(p_str)-1;
	char temp;
	
	do{
		temp = *pHead;
		*pHead = *pTail;
		*pTail = temp;
		pHead++;
		pTail--;
	}while(pHead <= pTail);
	return p_str;
}

字符串转换数字

int stoi(char *p)
{
	int i = 0;
	for(i = 0; *p; p++){
		i = (*p - '0') + 10 * i;
	}
	return i;
}

求一个数中1的位数

算法:让一个数的最低位和1位与,位与完数向右移1位,如果与的结果位1,计数+1。返回计数值。

int NumOne(int i)
{
	int ret = 0;
	while(i){
		if(i & 1)
			ret++;
		i = i>>1;
	}
	return ret;
}

判断一个数是否为2的幂

算法:2的次幂的二进制特征是最高位为1,其余全0。可以用它和(它-1)位与,结果为0表示是,反之不是

/* 传一个整数,当这个数为2的幂时返回0;不是返回1 */
int judge(int i)
{
	if(i <= 0)      //2的次方都是正数
		return 1;
	else{
		if(!(i & (i-1)))
			return 0;
		else
			return 1;
	}
}

实现strcat

char *my_strcat(char *dest, const char *src)
{
	char *p = dest;
	if(NULL == dest || NULL == src){
		return NULL;
	}
	while(*dest){
		dest++;
	}
	while(*dest++ = *src++);
	return p;
}

实现strcmp

int my_strcmp(const char *s1, const char *s2)
{
	for(; *s1 == *s2; s1++,s2++){
		if(*s1 == '\0')
			return 0;
	}
	return *s1-*s2;
}

实现strcpy

char *my_strcpy(char *dest, const char *src)
{
    char *p = dest;
    if(NULL == dest || NULL == src){
        return NULL;
    }
    while((*dest++ = *src++) != '\0');
    return p;
}

实现memcpy

void *my_memcpy(void *dest, const void *src, size_t count)
{
	char *pdest = dest;
	const char *psrc = src;
	
	while(count--){
		*pdest++ = *psrc++;
		
	}
	return dest;
}

实现memmove

void *my_memmove(void *dest, const void *src, size_t count)
{
	char *tmp;
	const char *s;

	if((dest + count < src) || (src+ count) < dest)){  //两个内存没有重叠
		tmp = dest;
		s = src;
		while (count--)
			*tmp++ = *s++;
	} else {
		tmp = dest;
		tmp += count;
		s = src;
		s += count;
		while (count--)
			*--tmp = *--s;
	}
	return dest;
}

实现atoi

描述:字符串转换成数字,前面跳过空格,当第一个字符为+、-、数字字符时,函数转换,直到非数字字符,返回转换后的整型数。若非空格后的第一个字符不是上面三者其一,则返回0

int my_atoi(const char s[])
{
	int i;
	int sign;
	int ret = 0;
	
	for(i = 0; isspace(s[i]); i++);  //isspace()跳过空格
	sign = (s[i] == '-') ? -1 : 1;

	if(s[i] == '+' || s[i] == '-'){
		i++;
	}
	for(ret = 0; isdigit(s[i]); i++)  // isdigit()判断是否是数字
		ret = (s[i]-'0') + ret*10;
	return ret * sign;
}
<think>嗯,用户问的是小天才软件测试的笔试情况。首先,我需要确定小天才这家公司的情况。小天才主要是做儿童智能手表的,属于步步高旗下的品牌。他们的软件测试笔试可能会涉及哪些内容呢? 首先,软件测试的基础知识肯定是重点。比如测试用例设计方法,像等价类划分、边界值分析这些。可能还会有一些测试理论的问题,比如黑盒测试和白盒测试的区别,测试流程步骤之类的。 然后,编程能力也是必须的。笔试中可能会有编程题,考察基本的算法和逻辑,比如字符串处理或者数组操作。可能用Python或者Java,但得看公司具体用什么语言。不过小天才的产品可能更偏向嵌入式系统,所以C语言也可能相关。 数据库相关的题目也可能出现,比如SQL查询,特别是增删改查操作。还有Linux命令,毕竟测试环境可能在Linux下,需要掌握基本的文件操作、进程管理命令。 逻辑题和智力题也是常见笔试环节,考察应聘者的逻辑思维和问题解决能力。比如数列题、图形推理或者数学应用题。 项目经验方面,可能会让应聘者描述过去参与的项目,遇到的挑战和解决方案。这里需要结合实际情况,展示测试用例设计、自动化测试工具的使用经验。 另外,小天才的产品是儿童智能设备,所以可能涉及硬件和软件的结合测试,比如蓝牙连接、定位功能、家长控制功能等。在笔试中可能会有相关的情景题,考察如何设计测试用例来验证这些功能。 需要提醒用户注意笔试的时间管理和答题技巧,先做熟悉的题目,合理安排时间。还有复习常见的测试理论,刷一些编程题和逻辑题,准备项目经验的描述。 不过,用户可能没有参加过类似的笔试,所以需要详细分点说明,结构清晰,帮助他们逐步准备。另外,要注意使用正确的中文表达,避免术语错误,同时确保LaTeX格式正确,虽然用户的问题中没有数学公式,但按照系统指令,如果有的话需要正确应用格式。 总结下来,回答的结构应该是先介绍小天才公司背景,然后分点讲解笔试可能涉及的内容,每个部分详细说明,最后给出备考建议。这样用户能有一个全面的了解,并知道如何针对性准备。</think>以下关于小天才软件测试笔试的介绍将分模块说明,内容基于行业常规测试岗位笔试框架整理,供参考: --- ### 一、笔试考察方向 小天才作为儿童智能硬件厂商,其软件测试笔试可能聚焦以下方向: 1. **软件测试基础** - 黑盒/白盒测试原理(如等价类划分、边界值分析) $$ \text{有效等价类} \cup \text{无效等价类} = \text{全集} $$ - 测试用例设计方法(场景法、因果图法) - 缺陷管理流程(Bug生命周期) 2. **编程能力** - 基础算法(字符串处理、数组操作) ```python # 示例:统计字符串中数字出现次数 def count_digits(s): return sum(c.isdigit() for c in s) ``` - 数据结构(链表、栈的应用) 3. **数据库与Linux** - SQL查询(SELECT、JOIN操作) - Linux命令(如 `grep` 日志过滤、`ps` 查看进程) 4. **逻辑思维题** - 数列推理(如 $1, 3, 6, 10, \underline{\quad}$) - 场景分析(如测试智能手表定位功能) --- ### 二、题型示例 1. **理论题** > Q: 边界值分析法适用于哪种数据类型? > A: 数值型、有序集合(如日期范围) 2. **编程题** > 实现函数:判断一个数是否为回文数(如121) > 要求时间复杂度 $O(\log n)$ 3. **场景应用题** > 设计儿童手表「禁用时段」功能的测试用例,需覆盖正常/异常场景 --- ### 三、备考建议 1. **复习重点** - 掌握测试方法论(如ISTQB基础概念) - 熟悉Python/Java基础语法 - 练习LeetCode简单/中等算法题 2. **实践建议** - 使用Postman模拟API测试 - 通过Wireshark分析蓝牙通信协议(加分项) 3. **资源推荐** - 书籍:《软件测试的艺术》 - 工具:JIRA缺陷管理模拟练习 --- ### 四、注意事项 - 笔试可能包含限时编程题(如HackerRank平台) - 关注智能硬件特性(如低功耗测试、传感器校准) 建议结合岗位JD(Job Description)针对性准备,尤其注意硬件相关测试场景的延伸问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值