【2024提前批/秋招笔试汇总1】——联发科-嵌入式软件-2023.07.19

一、不定项选择(27分)

1. 有如下程序,运行结果为

# include<stdio.h>
int main(void)
{
	int x=19;
	x&=0x1f;
	printf("%d %d\n", x << 1, x>>1);
	return 0;
}

A.18, 9   B.62,15   C38 ,9   D.38,9

19=0x13,0x13 & 0x1f = 0x13;0x13 << 1 = 0x26 = 38;0x13 >> 1 = 0x09 = 9
【答案D】

2. 下列说法正确的是:
A. int const* p与 int * const p表达t的含义是一样的
B. break可以跳出多层循环,continue只能跳出一层循环
C for循环头部中的表达式可以省略一个或者多个,并且用for循环实现的一定也可以用while循环实现
D.setjmp()与iongjmp()可以在函数间进行跳转
E. 结构体总空间大小一定等于成员总长度,联合体空间大小一定等于最大成员占据的空问

A项,参考https://www.zhihu.com/question/443195492
B项,break 和 continue 都只能跳出一层循环。break 语句用于跳出当前循环;continue 语句用于跳过当前循环的剩余部分并立即开始下一次循环迭代。
C项,for 循环头部中的三个表达式都可以省略,但是分号必须保留。例如,for(;;) 是一个有效的 for 循环,它相当于一个无限循环。任何可以用 for 循环实现的循环都可以用 while 循环来实现。for 循环和 while 循环本质上都是一种条件循环,它们之间的区别主要在于语法结构和使用方式。通常情况下,当循环次数已知时,我们会使用 for 循环;当循环次数未知,且循环条件需要在循环体内部进行判断时,我们会使用 while 循环。
D项,setjmp() 和 longjmp() 是 C 语言中提供的两个非常重要的函数,它们可以用来在函数间进行跳转和状态保存。setjmp() 函数用于保存当前函数执行的上下文,同时返回一个 int 类型的值。这个值由 setjmp() 函数自动生成,用于之后调用 longjmp() 函数时确定跳转目标。longjmp() 函数用于从之前保存的上下文中恢复执行状态,并跳转到指定的位置。它接受两个参数:一个是之前由 setjmp() 函数返回的值,用于确定跳转目标;另一个是一个整数值,用于指定 setjmp() 函数的返回值。
E项,结构体的总空间大小可能会大于成员总长度,这是因为编译器会在结构体中添加一些额外的空间,用于对齐结构体成员。这种额外的空间被称为“填充字节”,它可以提高结构体成员访问的效率。联合体的空间大小等于最大成员占据的空间,这是因为联合体中所有成员共享同一块内存空间。因此,联合体的大小必须足够容纳最大的成员。https://blog.youkuaiyun.com/qq_46731045/article/details/125822597
【答案CD】

3. 64bit系统上,有如下结构体定义,下面程序的输出结果为:

#include <stdio.h>
typedef unsigned int GEN_OBJ_T[7];
typedef enum
{
    COLOR_SYS_A,
    COLOR_SYS_B,
    COLOR_SYS_C,
    COLOR_SYS_D,
    COLOR_SYS_E,
    COLOR_SYS_F,
    COLOR_SYS_G,
    COLOR_SYS_H,
    COLOR_SYS_AUTO = 30,
    COLOR_SYS_UNKNOWN,
} COLOR_SYS_T;

#pragma pack(4)
typedef struct
{
    union
    {
        unsigned char   u_char;
        COLOR_SYS_T     u_sys_type;
        unsigned long int  u_long_int : 24;
        signed long long  _long : 16;
        int u_int[96 / COLOR_SYS_UNKNOWN];
    } u;
} GEN_SUB_OBJ_T;
#pragma pack()

typedef struct _my_obj_t
{
    signed char a;
    GEN_OBJ_T obj;
    GEN_SUB_OBJ_T sub_obj;
    struct _my_obj_t* next;
    struct _my_obj_t* prev;
} MY_OBJ_T;

int main(){
    printf("%d %d\n", sizeof(MY_OBJ_T), sizeof(GEN_SUB_OBJ_T));
    return 0;
}

A.64, 12   B.57,16   C.60 ,16   D.60,12  D.57,12

  • COLOR_SYS_UNKNOWN = 31,GEN_SUB_OBJ_T为联合体,大小为最大变量的大小,既int u_int[96 / COLOR_SYS_UNKNOWN];大小=12(注意强制4字节对齐)
  • MY_OBJ_T的大小在64位情况下为
    在这里插入图片描述
  • MY_OBJ_T的大小在32位情况下为(拓展)
    在这里插入图片描述
    参考连接 http://t.csdn.cn/piLGE
    答案【A】

4.以下二维数组声明中,错误的是
A. char a[2][3]={0};
B. char a[][3] = {0}
C. char a[2][] = {0};
D. char a[][] = {0};

在二维数组声明中,必须指定列数,但可以省略行数。原因:二维数组的顺序存储
答案【CD】

5.以下叙述中,错误的是

int main{
	int *p;
	*p = 10;
	return 0;
}

A.该代码编译可通过
B.该代码执行会有seamentation fault
C该代码可正常执行结束
D.该代码无法通过编译

本段程序可以通过编译,但是由于指针p未初始化,可能会出现出现seamentation fault。由于p未初始化,可能会导致程序崩溃或产生其他意外的结果。
答案【CD】

6.如果最常用的操作是取第i个无素的前驱节点,则采用()存储方式最节省时间?
A.单链表
B.双链表
C.单循环链表
D.顺序表

答案【B】

7.在进程的3个状态切换中,()是不会出现的
A. 阻塞>运行
B. 运行>就绪
C. 就绪->阻塞
D. 就绪->运行

答案【A】
请添加图片描述

8.在一次语文考试结束后,有五个同学对了对彼此五个选择题的答案,其中:
同学甲:第三题是A第二题是C.
同学乙:第四题是D,第二题是E.
同学丙:第—题是D,第五题是B.
同学丁:第四题是B,第三题是E.
同学戊:第二题是A第五题是C.
结果他们各答对了—个答案,根据这个条件猜猜哪个选项是正确的?
A.第一题是D,第二题是A
B.第二题是E,第三题是B
C.第三题是A,第四题是B
D.第四题是C,第五题是A

答案A

9.请给出下列数列的下—个数。21,27,40,61,94,148,()
A. 239
B. 242
C. 246
D. 252

答案A

二、单项选择(3分)

  • 一天,大壮的店里来了一位顾客,挑了25元的货,顾客拿出100元,大壮没零钱找不开,就到隔壁二胖的店里把这100元换成零钱,回来给顾客战了75元零钱。过一会。二胖来式大壮,说刚才的钱是假钱,大壮马上给二胖换了张真钱,问大壮赔了多少钱?
    A.25元
    B.100元
    C.75元
    D.125元

答案D

三、填空(26分)

  1. 假设CPU的时钟频率为2.5 GHz,执行—个指今需要3个时钟周则该指今的执行时间是?【1.2*10-9s】
  2. protected继承时,基类中public,protected成员在子类中分别会变成什么类型,请按顺序回答。【protected、protected】
  3. C++面向对象的三大特征是?【封装、继承、多态】
  4. 操作系统内核中的______是负责任务调度的核心模块,它按照一定的算法选择下个要运行的进程,并将CPU控制权交给该进程。【调度器/调度程序】
  5. 下面代码段输出的结果为?【8】
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void){
	int i,j,k=0;
	for(i = 2; i<20;i++){
		for(j = 2;j<i;j++){
			if(i%j==0){
				break;
			}
		}
		if(j==i){
			k++;
		}
	}
	printf("result is:%d\n",k);
	return 0;
}

在这里插入图片描述

四、简答题(29分)

  1. 下面代码段输出的结果为
#include <stdio.h>
int main(void){
	int a[5] = {1,2,3,4,5};
	int *ptr = (int*)(&a+1);
	printf("%d\n",*(a+1));
	printf ("%d\n",*(ptr-1));
 	return 0;
}

在C语言中,数组名称被解释为指向数组第一个元素的指针。但是,&a是指向整个数组的指针。将其加1会将其移动到数组结束后的内存位置。这是因为在C语言中,数组是在内存中连续存储的一系列元素。因此,将指向数组的指针加1会将其移动到下一个元素的内存位置。在这种情况下,&a+1将指向数组结束后的内存位置。详细结束见https://blog.youkuaiyun.com/longintchar/article/details/80044077
答案【 2 、5】

  1. 下面代码段输出的结果为
#include <cstdio>
class Base{
	public:
		Base(){
			Init();
		}
		virtual void Init(){
			printf("Base Init\n");
		}
		void func(){
			printf("Base func\n");
		}
	};
class Derived: public Base{
	public:
		virtual void Init(){
			printf("Derived Init\n");
		}
		void func(){
			printf("Derived fun\n");
		}
	};
int main(){
	Derived d;
	//printf("hello\n");
	((Base *)&d) ->func();
	return 0;
}
  • 在main函数中,创建了一个名为d的Derive d类的对象,调用了Base的构造函数,打印出Base Init。然后,将指向该对象的指针强制转换为指向Base类的指针,并调用了该指针的func()方法,打印出Base func。
  • 关于virtual虚函数,详见黑马程序员4.6.5同名函数和4.7多态的解释。
  • 答案Base Init Base func
  1. 请在答题处写出程序中的几处错误,并改正。每一个填空处作答时请使用下面的方式:原代码中的语句改为改正后的语句(例如XX修改为XX)。注意:不得更改程序的结构。下列给定程序将数组元素循环向右移,数组大小和元素以及移动位数由键盘输入指定;例如数组{1, 2, 3, 4, 5, 6},循环右移3位,得到的结构是{4, 5, 6, 1, 2, 3}。
#include <stdio.h>
#include <stdlib.h>
void shift_func(int *array, int len,int k){
	int i = 0,j = 0;
	int temp = 0;
	if(array == NULL)
		return ;
	k %= len;
	for (i = 0; i < k; i++){
		temp = array[len - 1];
		for(j = len; j > 0; j--){
			array[j] = array[j - 1];
		}
		array[0] = temp;
	}
}
int main(){
	int len = 0, k = 0,i = 8;
	int *array = NULL;
	scanf("%d %d",&len, &k);
	array  = (int*)malloc(len * sizeof(int*));
	if(array == NULL)
		return -1;
	printf("input the array\n");
	for(i = 0; i < len; i++)
		scanf("%d" , array[i]);
	shift_func(array, len, k);
	printf("after shift the array is:\n");
	for(i = 0; i < len; i++)
		printf ("%d" ,array[i]);
	printf ("\n");
	free(array);
	return 0;
}

1.array =(int*)malloc(len sizeof(int*)) 改为 array = (int*)malloc(len * sizeof(int)),输入的数字应该是整形
2.scanf(“%d”,array[i]) 改为 scanf(“%d”,&array[i]),scanf()函数在输入变量时应为一个地址,所以应是&array[i]
3.for (j= len; j>0; j–) 改为 for (j= len-1; j>=0; j–),数组长度为len,但是下表应该从len-1开始

五、编程(15分)

请用C语言程序完成此题:请实现函数对数组arr[n]快速排序。void quickSort(int arr[], int left, int right)

#include <stdio.h>

void quickSort(int arr[], int left, int right){
	if(left < right){
		int i = left;
  		int j = right;
   		int pivot = arr[(left + right) / 2];
   	while(i <= j){
     	while(arr[i] < pivot) i++;
    	while(arr[j] > pivot) j--;
     	if(i <= j){
       		int temp = arr[i];
       		arr[i] = arr[j];
       		arr[j] = temp;
       		i++;
       		j--;
     }
   }
   quickSort(arr, left, j);
   quickSort(arr, i, right);
 }
}

int main(){
	int arr[] = {10, 7, 8, 9, 1, 5};
	int n = sizeof(arr)/sizeof(arr[0]);
 	quickSort(arr, 0, n-1);
 	for(int i=0; i<n; i++){
   		printf("%d ", arr[i]);
 	}
 	return 0;
}

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值