目录

  • 0. 我的计算器坏了?!
  • 1. printf还能这么玩?
  • 2. 你好你好你好呀!
  • 3.换个变量名不行吗?
  • 4. 内存对不齐
  • 5. Bitwise
  • 6. 英译汉
  • 7. 汉译英
  • 8. 混乱中建立秩序
    • 1.冒泡排序
    • 2.选择排序
    • 3.插入排序
    • 4.快速排序
  • 9. 手脑并用
  • 10. 给你我的指针,访问我的心声
  • 11. 奇怪的参数
  • 12. 奇怪的字符
  • 13. 小试宏刀
  • 14. GNU/Linux命令 (选做)

0. 我的计算器坏了?!

2^10^=1024对应于十进制位,那么2^10000^对应于十进制的多少位呢

题解:

考点: 2^10000 大于long long类型,无法存储,只能用字符串计算

解法:
直接数学计算:第n位的位数=n*log2+1
ps:log2≈0.30103
将n=10000代入,得:3010.3+1=3011(取整)

1. printf还能这么玩?

尝试着解释程序的输出。

int main(void) {if ((3 + 2 < 2) > (3 + 2 > 2))printf("Welcome to Xiyou Linux Group\n");elseprintf("%d\n", `在这里插入代码片`printf("Xiyou Linux Group - 2%d", printf("")));
}

题解:

//考点:printf()的返回值
int main(void)
{if ((3 + 2 < 2) > (3 + 2 > 2))    //if(0>1) --> 为假,进入elseprintf("Welcome to Xiyou Linux Group\n");elseprintf("%d\n", printf("Xiyou Linux Group - 2%d", printf(""))); //嵌套进去的两个printf打出的字符个数依次0和22,//因此输出内容为:Xiyou Linux Group - 2022return 0;
}//输出内容:Xiyou Linux Group - 2022//1.printf()的返回值是输出的字符数量,包括数字,字母,标点符号,空格等。('\n'也是哦)

2. 你好你好你好呀!

程序的输出有点奇怪,请尝试解释一下程序的输出吧。
请谈谈对sizeof()及strlen()的理解吧。

int main(void)
{char p0[] = "Hello,Linux";char *p1 = "Hello,Linux";char p2[11] = "Hello,Linux";printf("p0==p1: %d, strcmp(p0,p2): %d\n", p0 == p1, strcmp(p0, p2));printf("sizeof(p0): %zu, sizeof(p1): %zu, sizeof(*p2): %zu \n",sizeof(p0), sizeof(p1), sizeof(*p2));printf("strlen(p0): %zu, strlen(p1): %zu\n", strlen(p0), strlen(p1));
}

题解:

int main(void)
{char p0[] = "Hello,Linux";    //栈区char* p1 = "Hello,linux";     //常量区char* p3 = "Hello,linux";char p2[11] = "Hello,Linux";printf("p0 == p1: %d,strcmp(p0,p2): %d\n", p0 == p1, strcmp(p0, p2));  //0 -1  //"字符串常量"存在常量区  //strcmp的返回值:printf("sizeof(p0):%zu,sizeof(p1):%zu,sizeof(*p2):%zu\n", sizeof(p0), sizeof(p1), sizeof(*p2));   //12 4 1printf("strlen(p0):%zu,strlen(p1):%zu\n", strlen(p0), strlen(p1));  //11 11//字符串常量存在常量区,p1指向这个字符串常量,常量区的内容不能被更改//第一句相当于定义了一个字符数组,但是这个p0数组是存放在栈区的,然后再把字符串常量"Hello,Linux"拷贝到栈区的p0数组内,那么此时的p0是可以修改的。
}//说明:%zu转换为size_t类型

3.换个变量名不行吗?

请结合本题,分别谈谈你对c语言中「全局变量」和「局部变量」的「生命周期」理解。

int a = 3;
void test()
{int a = 1;a += 1;{int a = a + 1;printf("a = %d\n", a);}printf("a = %d\n", a);
}
int main(void)
{test();printf("a= %d\n", a);
}

题解:

// 考点:全局变量和局部变量的生命周期
int a = 3;
void test()
{int a = 1;a += 1;{int a = a + 1;          //使用了未初始化的局部变量printf("a = %d\n", a); }printf("a = %d\n", a); //2
}
int main(void)
{test();printf("a = %d\n", a);  //3
}//注意:
//1.变量在作用时先找离他最近的作用域的并且可以使用的变量
//2.当局部变量和全局变量重名时,优先使用局部变量

4. 内存对不齐

union与struct各有什么特点呢,你了解他们的内存分配模式吗。

typedef union
{long l;int i[5];char c;
} UNION;
typedef struct
{int like;UNION coin;double collect;
} STRUCT;
int main(void)
{printf("sizeof (UNION) = %zu \n", sizeof(UNION));    //20printf("sizeof (STRUCT) = %zu \n", sizeof(STRUCT));  //32
}

题解:

结构体的对齐规则:

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的值为8
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

联合大小的计算:

  1. 联合的大小至少是最大成员的大小。
  2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

5. Bitwise

请使用纸笔推导出程序的输出结果。
请谈谈你对位运算的理解。

int main(void)
{unsigned char a = 4 | 7;a <<= 3;unsigned char b = 5 & 7;b >>= 3;unsigned char c = 6 ^ 7;c = ~c;unsigned short d = (a ^ c) << 3;signed char e = -63;e <<= 2;printf("a: %d, b: %d, c: %d, d: %d \n", a, b, c, (char)d);printf("e: %#x \n", e);
}

题解:

//考点:运算符的使用,数据的存储
int main(void)
{unsigned char a = 4 | 7;a <<= 3;unsigned char b = 5 & 7;b >>= 3;unsigned char c = 6 ^ 7;c = ~c;unsigned short d = (a ^ c) << 3;  //这个地方对(a^c)进行了计算,要进行整形提升//d:0000 0110 0011 0000signed char e = -63;e <<= 2;printf("a:%d,b:%d,c:%d,d:%d\n", a, b, c, (char)d);   //56 0 254 48//强转后d:0011 0000  -> 48printf("e:%#x\n", e);   //0x4   //记得打印要把补码转换为原码,打印记得要整形提升,截断后
}//%#x的意思是,以16进制打印,前面带0x

6. 英译汉

请说说下面数据类型的含义,谈谈const的作用。

  1. char *const p。
  2. char const *p。
  3. const char *p。

题解:

①const的含义:

  1. *const前,p不能指向其他对象,但此对象的值可以被改变
    2. *const后,p指向的对象的值不能被改变,但可以重新指向其他的对象
    ②const的作用:
    防止原本不想被改变的变量被改变

7. 汉译英

请用变量p给出下面的定义:

1.含有10个指向int的指针的数组。
2.指向含有10个int数组的指针。
3.含有3个「指向函数的指针」的数组,被指向的函数有1个int参数并返回int

题解:

  1. int*p[10] p先和[10]结合,表明p是一个数组,因此是一个int*型的指针数组
  2. int(*p)[10] p和*结合,表明p是一个指针,因此p是一个数组指针
  3. int(*p[3])(int) p首先和[3]结合表明p是一个数组,在于*结合表明p是一个指针数组,(int)表示函数的参数,表明被指向的函数有一个int的参数,最前面的int表明返回类型是int,即p是一个函数指针数组

注意:符号的优先级为:()> [ ] > *

8. 混乱中建立秩序

你对排序算法了解多少呢?
请谈谈你所了解的排序算法的思想、稳定性、时间复杂度、空间复杂度。

题解:

1.冒泡排序

void bubble_sort(int arr[], int sz)
{for (int i = 0; i < sz - 1; i++){int flag = 0;for (int j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 1;}}if (flag == 0){break;}}
}

2.选择排序


void select_sort(int *p,int n)
{int i,j;int min = 0;for(i = 0;i < n - 1;i++)//排序次数{min = i;for(j = i + 1;j < n;j++){if(p[j] < p[min]){min = j;//记录交换的元素下标值}}if(i != min){int temp = p[i];p[i] = p[min];p[min] = temp;}  }
}

3.插入排序

void insert_sort(int arr[], int sz)
{for (int i = 0; i < sz - 1; i++){int end = i;       //记录已排序好的最后一个元素的下标int tmp = arr[end + 1];   //记录下一个待排序数字while (end >= 0)   //其中一种退出循环的方式,这个待排数比前面所有有序数字都小{if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}

4.快速排序

void quick_sort(int arr[], int begin, int end)   //begin和end随着递归,在不断的变化
{if (begin >= end)   //递归的终止条件,排序到只剩下一个元素{return;}int left = begin;int right = end;int key = begin;while (begin < end)   //大循环,循环结束把选定的key值放入下标为end(right)的位置{//右边找while (arr[end] >= arr[key] && begin < end)   //右边选小,等号防止和key值相等,防止顺序begin和end越界{end--;}//左边找while (arr[begin] <= arr[key] && begin < end) //左边选大,等号防止和key值相等,防止顺序begin和end越界{begin++;}//交换左右找到的数,如果right和end相等就相当于自己和自己交换int tmp = arr[begin];arr[begin] = arr[end];arr[end] = tmp;}//把key值交换到在它该在的位置(end和right交界的地方)int tmp = arr[key];arr[key] = arr[end];arr[end] = tmp;key = end;quick_sort(arr, left, key - 1);quick_sort(arr, key + 1, right);
}

最后附上一个测试用的代码:

int main()
{int arr[50] = { 0 };int n = 0;scanf("%d", &n);for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}//bubble_sort(arr, n);//时间复杂度:最坏情况:O(N^2)//最好情况:O(N)//空间复杂度:O(1)// //select_sort(arr, n);//时间复杂度:最坏情况:O(N^2)//最好情况:O(N^2)//空间复杂度:O(1)////insert_sort(arr, n);//时间复杂度:最坏情况下为O(N * N),此时待排序列为逆序,或者说接近逆序//最好情况下为O(N),此时待排序列为升序,或者说接近升序。//空间复杂度:O(1)//quick_sort(arr, 0, n - 1);//时间复杂度:n*log2 n;for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

9. 手脑并用

请实现ConvertAndMerge函数:
拼接输入的两个字符串,并翻转拼接后得到的新字符串中所有字母的大小写。

提示:你需要为新字符串分配空间。

char* convertAndMerge(/*补全签名*/);
int main(void) {char words[2][20] = {"Welcome to Xiyou ", "Linux Group 2022"};printf("%s\n", words[0]);printf("%s\n", words[1]);char *str = convertAndMerge(words);printf("str = %s\n", str);free(str);
}

题解:

//学一下四个动态内存开辟的函数吧
//1.malloc 2.calloc 3.free 4.realloc
#include<stdio.h>
#include<string.h>
char* convertAndMerge(char word[2][20])
{//用malloc开辟10个整形大小的空间char* p = (char*)malloc(40);strcpy(p, word[0]);strcat(p, word[1]);char* tmp = p;while (*p){if (*p >= 'a' && *p <= 'z'){*p -= 'a' - 'A';p++;}else if(*p >= 'A' && *p <= 'Z'){*p += 'a' - 'A';p++;}else{p++;}}return tmp;
}

10. 给你我的指针,访问我的心声

程序的输出有点奇怪,请尝试解释一下程序的输出吧。

int main(int argc, char **argv) {int arr[5][5];int a = 0;for (int i = 0; i < 5; i++) {int *temp = *(arr + i);for (; temp < arr[5]; temp++) *temp = a++;}for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {printf("%4d", arr[i][j]);}printf("\n");}
}

题解:

程序输出结果:
0  1  2  3  4
25 26 27 28 29
45 46 47 48 49
60 61 62 63 64
70 71 72 73 74

如果题目看不懂,可以尝试用调试一步步看,就明白了

11. 奇怪的参数

你了解argc和argv吗?
直接运行程序argc的值为什么是1?
程序会出现死循环吗?

#include <stdio.h>
int main(int argc, char **argv)
{printf("argc = %d\n", argc);while (1){argc++;if (argc < 0){printf("%s\n", (char *)argv[0]);break;}}
}

题解:

考点:argc和argv的含义
答 :
argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。
argc的全称是 :arguments count(参数计数)
argv的全称是 :arguments value / vector(参数值)
argv[0] 指向程序运行时的全路径名
argv[1] 指向程序在DOS命令中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串
argv是指向指针的指针,main函数的第二个参数“char * argv[]“也可以替换为 “char * *argv“,两者是等价的。
在C++中:一般编译器默认使用argc和argv两个名称作为main函数的参数,但这两个参数如此命名并不是必须的,
你可以使用任何符合C++语言命名规范的变量名作为入参。
如果定义mian方法时没有定义形参也没有关系,因为在stdlib.h头文件中定义了_argc和_argv两个变量可以使用。

直接运行程序argc的值为什么是1?
答:因为肯定至少得输入要执行的exe文件名吧,所以参数至少会有一个

程序会出现死循环吗?
答:会

12. 奇怪的字符

程序的输出有点奇怪,请尝试解释一下程序的输出吧。

int main(int argc, char **argv)
{int data1[2][3] = {{0x636c6557, 0x20656d6f, 0x58206f74},{0x756f7969, 0x6e694c20, 0x00000000}};int data2[] = {0x47207875, 0x70756f72, 0x32303220, 0x00000a32};char *a = (char *)data1;char *b = (char *)data2;char buf[1024];strcpy(buf, a);strcat(buf, b);printf("%s \n", buf);
}

题解:

输出结果为:Welcome to Xiyou Linux Group 2022

考点:

  1. 大小端字节序
  2. (char*)型强制类型转换的应用
  3. 对照ascii码表得出答案

13. 小试宏刀

请谈谈你对#define的理解。
请尝试着解释程序的输出。

#include <stdio.h>
#define SWAP(a, b, t) t = a; a = b; b = t
#define SQUARE(a) a *a
#define SWAPWHEN(a, b, t, cond) if (cond) SWAP(a, b, t)
int main() {int tmp;int x = 1;int y = 2;int z = 3;int w = 3;SWAP(x, y, tmp);printf("x = %d, y = %d, tmp = %d\n", x, y, tmp);if (x > y) SWAP(x, y, tmp);printf("x = %d, y = %d, tmp = %d\n", x, y, tmp);SWAPWHEN(x, y, tmp, SQUARE(1 + 2 + z++ + ++w) == 100);printf("x = %d, y = %d,tmp=%d\n", x, y, tmp);printf("z = %d, w = %d ,tmp = %d\n", z, w, tmp);
}

题解:

  1. 预处理命令,正式编译前由系统自动完成。
  2. 第三行:翻译过来是:a*a = 1 + 2 + z++ + ++w * 1 + 2 + z++ + ++w,而不是(1 + 2 + z++ + ++w) * (1 + 2 + z++ + ++w)

14. GNU/Linux命令 (选做)

你知道以下命令的含义和用法吗:
注:
嘿!你或许对Linux命令不是很熟悉,甚至你没听说过Linux。
但别担心,这是选做题,不会对你的面试产生很大的影响!
了解Linux是加分项,但不了解也不扣分哦!

ls
rm
whoami
请问你还了解哪些GNU/Linux的命令呢。

题解:

ls: (list) 查看当前目录下的所有目录和文件
rm: (remove) 删除一个目录中的一个或多个文件或目录
whoami: (who am I) 显示自身的用户名称,相当于执行"id -un"指令

点击此处,了解更多linux常用指令

2022西邮linux兴趣小组纳新题解相关推荐

  1. 2021西邮linux兴趣小组纳新题解

    目录 1. 请试着解释其输出 2. 下面代码的运行输出结果是什么,并说说你的理解. 3. 这段代码的输出结果是什么?为什么会出现这样的结果? 4. 下面程序会出现什么结果?为什么会出现这样的结果? 5 ...

  2. 2021西邮linux兴趣小组纳新题题解

    1. 大小和长度竟然不是一个意思 sizeof()和strlen()有什么异同之处? 他们对于不同参数的结果有什么不同?请试举例子说明. int main(void) {char s[] = &quo ...

  3. 2020西邮linux兴趣小组纳新题题解

    1. 请试着解释其输出. int main(int argc , char *argv[]) {unsigned char a = 255;char ch = 128;a -= ch;printf(& ...

  4. 西邮Linux兴趣小组纳新笔试试题

    下面是西邮Linux小组今年纳新的笔试试题 1. 下面这个程序的输出结果是什么? int main() { int a = (1, 2); printf("a = %d\n", a ...

  5. 西邮linux兴趣小组网络,西邮Linux兴趣小组纳新笔试试题

    下面是西邮Linux小组今年纳新的笔试试题,原文在这里. 1. 下面这个程序的输出结果是什么? int main() { int a = (1, 2); printf("a = %d\n&q ...

  6. 2021年 西邮Linux兴趣小组 纳新免试题揭秘

    文章目录 引言 第一关 第二关 第三关 第四关 第五关 总结 引言 小组2020年的免试题的四位出题人是:小组18级成员李兆龙,20级成员赵子玮,刘树杭,任子涧. 同时19级成员周阔,戚凯萌,胡哲宁, ...

  7. 西邮linux面试题,西邮Linux兴趣小组纳新免试题! come on!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 密文: 0011011101111010101111001010111100100111000111000000000000000011100110111 ...

  8. 西邮linux兴趣小组网络,西邮Linux兴趣小组2012纳新笔试题

    这是我们西邮Linux兴趣小组2012的纳新笔试题,对于大一的学生,出得有难度哦,个人感觉比腾讯实习生的笔试题出的有水平. 西邮Linux兴趣小组纳新试题 姓名:                    ...

  9. 西邮Linux兴趣小组2022纳新面试题题解

    本题目只作为Xiyou Linux兴趣小组2022纳新面试的有限参考. 为节省版面,本试题的程序源码省去了#include指令. 本试题中的程序源码仅用于考察C语言基础,不应当作为C语言「代码风格」的 ...

最新文章

  1. python最新版本 效率_Python:迭代列表与dict项目效率
  2. 算法学习:后缀自动机
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数
  4. SAP 批次管理(Batch management)
  5. Java Spring源代码学习之DispatcherServlet.getHandler
  6. AT4437-[AGC028C]Min Cost Cycle【结论,堆】
  7. html:(17):img标签和表单标签
  8. python回车换行怎么不行_使用Python编写换行符时避免写入回车'\r'
  9. 千万不要被这些手机充电的谣言给误导了!现在了解还来得及
  10. python 同步event对象
  11. Java学习:抽象类与接口
  12. 【HTML5】input标签中的Require必填项
  13. 19-备忘录模式Quarkus实现
  14. fantastic-matplotlib:案例集合:
  15. linux编程常用指令
  16. 【三维激光扫描技术】原理、方法及实验图文教程目录
  17. Python进阶--网络爬虫基础
  18. 计算机专业的烧脑问题,这几类专业很“烧脑”,数学不好的同学慎报,不然就是噩梦的开始...
  19. 定积分的计算(分部积分法)习题
  20. 格创东智加入“长三角数字干线建设·合伙人行动”

热门文章

  1. 计算机网络之危机四伏,炉石传说最后的爆牌贼 奥术巨人危机四伏流分享
  2. sql 语句 增加列,在指定列后面添加列
  3. 【千奇百怪】java自定义spotbugs检测器
  4. android 扇形切换,Android 一个炫酷的扇形菜单
  5. 一键清理Linux缓存脚本
  6. OpenMesh学习笔记4 迭代器和循环器
  7. 社会主义市场经济的的理论与实践一
  8. 开源虚拟化工具VirtualBox安装部署
  9. 西安尚学堂练习9.5|Java编程笔试面试题
  10. ajax回调函数中获取到的日期类型为时间戳