一、不定项选择(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分)
- 假设CPU的时钟频率为2.5 GHz,执行—个指今需要3个时钟周则该指今的执行时间是?【1.2*10-9s】
- protected继承时,基类中public,protected成员在子类中分别会变成什么类型,请按顺序回答。【protected、protected】
- C++面向对象的三大特征是?【封装、继承、多态】
- 操作系统内核中的______是负责任务调度的核心模块,它按照一定的算法选择下个要运行的进程,并将CPU控制权交给该进程。【调度器/调度程序】
- 下面代码段输出的结果为?【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分)
- 下面代码段输出的结果为
#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】
- 下面代码段输出的结果为
#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
- 请在答题处写出程序中的几处错误,并改正。每一个填空处作答时请使用下面的方式:原代码中的语句改为改正后的语句(例如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;
}



777





