行业知识
C语言初阶测评题:测试你的基础知识和编程技能!!
- 博客主页:江池俊的博客
- ⏩收录专栏:C语言刷题专栏
- 专栏推荐:✅C语言初阶之路 ✅C语言进阶之路
- 代码仓库:江池俊的代码仓库
- ���迎大家点赞评论收藏⭐
文章目录
- 选择题
- 编程题
- 求两个数的最小公倍数
- 倒置字符串
前言:
欢迎来到这个关于C语言的初阶测评题博客!在这里,我们将为您呈现一系列考察基础知识和编程技能的问题,帮助您巩固对C语言的了解并提升编程能力。这次的测评题包含 15个选择题+2个编程题,希望大家看完能够有所收获!!
选择题
- 下列程序执行后,输出的结果为( )
#include int cnt = 0;int fib(int n) {cnt++;if (n == 0)return 1;else if (n == 1)return 2;elsereturn fib(n - 1) + fib(n - 2);} void main(){fib(8);printf("%d", cnt);//67}A 41
B 67
C 109
D 177
正确答案:B 67
【解析】:
- cnt 是一个全局变量,用于统计递归调用次数。
- fib 函数用于计算斐波那契数列的第 n 项。在每次递归调用时,会将 cnt 增加 1。
- main 函数调用 fib(8),即计算斐波那契数列的第 8 项,同时会统计递归调用次数。
- 最后,printf 输出递归调用次数,这里输出结果为 67。
需要注意的是,这段代码使用递归来计算斐波那契数列,但是递归在计算较大的斐波那契数时会存在重复计算,效率较低。可以考虑使用循环或者记忆化递归等方法来优化计算。、
- 以下程序的输出结果是?
int x = 1;do { printf("%2d\n", x++);} while (x--);A 1
B 无任何输出
C 2
D 陷入***循环
正确答案: D 陷入***循环
【解析】:
- do while循环语句会先执行循环内语句再判断,x初值为1
- printf语句中打印的是x++的值,由于x是后置++,所以打印的值为1,执行完printf语句后x的值变为2
- 随后进行循环条件的判断(即判断x--是否为真),由于是后置–,所以此时x的值还是2,判断结果为结果为真
- 当再次进入循环后x的值变为1,再次循环上述步骤,所以该程序会陷入***循环。
- 下面的代码段中,执行之后i和j的值是什么()
int i = 1;int j;j = i++;
A 1,1
B 1,2
C 2,1
D 2,2
正确答案: C 2,1
【解析】:
在给定的代码段中,i 被赋值为 1,然后通过 j = i++; 因为是后置++,所以先将 i 的值赋给 j,然后 i 的值自增。 所以,i 的值变为 2,j 的值为 1。
- 以下程序的k最终值是:
int i = 10;int j = 20;int k = 3;k *= i + j;
A 90
B 50
C 70
D 30
正确答案: A 90
【解析】:
首先,计算 i + j,得到 10 + 20 = 30。
然后,将 k 乘以 30,所以 k 的值将变为 3 * 30= 90。
- 以下程序的最终的输出结果为:
#include#includeint a = 1;void test() { int a = 2; a += 1;}int main(){ test(); printf("%d\n", a); return 0;}A 1
B 2
C 3
D 4
正确答案: A 1
【解析】:
- 在这段代码中,首先在全局作用域中定义了一个名为 a 的全局变量并初始化为 1。然后在 test 函数中定义了一个同名的局部变量 a,其初始值为 2,然后通过 a += 1; 进行自增操作。由于这个自增操作仅在 test
函数的局部作用域内有效,它不会影响到全局变量 a。
- 在 main 函数中调用了 test 函数,然后打印全局变量 a 的值。由于全局变量 a 没有在 test 函数内被修改,所以 main 函数中的 printf 语句会输出全局变量 a 的值,即 1。
- 下列描述中正确的是()
A 表示m>n为true或者mn&&mn&&m --c; a = a - 1;} while (a 0);
A 0
B 1
C -1
D ***循环
正确答案: C -1
【解析】:
该循环会一直执行,直到 a 的值不大于 0。初始时,a 的值为 0,因此循环会至少执行一次。
在每次循环中,c 会递减 1,a 会减少 1。因此,第一次循环时,c 的值会从 0 减少到 -1,而 a 的值会从 0 减少到 -1。由于 a 的值已经不大于 0,因此循环会在第一次执行后终止。
因此,最终 c 的值是 -1。
- 假定 x 和 y 为 double 型,则执行 x=2 ; y=x+3/2; 后 y 的值为()
A 3.500000
B 3
C 2.000000
D 3.000000
正确答案: D 3.000000
【解析】:
在 C 语言中,整数除法的结果会被截断为整数部分,所以 3/2 的结果是 1。然后这个结果 1 会与 x(初始值为 2)相加,所以 y 的计算过程是 y = x + 1,即 y = 2 + 1,结果是 3.000000。
- 以 下 for 循 环 的 执 行 次 数 是()。
for(x=0,y=0; (y=123)&&(x float -> double。
所以,根据表达式 a*b+d-c,其中 a 和 b 的类型是 char 和 int,它们会被提升为 int 类型,而 c 的类型是float,会被提升为 double 类型。因此,整个表达式会以 double 类型进行计算,结果的类型也是 double。
编程题
求两个数的最小公倍数
【牛客网链接:HJ108 求最小公倍数】
【题目信息】:
【方法一】:暴力求解,假设最小公倍数为m,m从1开始每次增加1 ,直到m能同时整除输入的这两个数时,m就是最小公倍数。
#includeint main() {int a, b;while (scanf("%d %d", &a, &b) != EOF)//多组输入{int m = 1;while (1){if (m % a == 0 && m % b == 0)break;m++;}printf("%d\n", m);}return 0;}【方法二】:用其中一个数(假设为a)* i,i从 1 开始依次递增 1,再利用这个数(即a* i)% 另一个数(假设为b),直到 (a*i % b == 0)时,a * i 即为最小公倍数。(相比于方法一大大提高了效率)
#include int main() {int a, b;while (scanf("%d %d", &a, &b) != EOF)//多组输入{int i = 1;while (i * a % b != 0){i++;}printf("%d\n", i * a);}return 0;}【方法三】:两个数乘积除以它们的最大公因数(求最大公因数方法:辗转相除法)。
辗转相除法介绍:
辗转相除法,也称为欧几里德算法,是一种用于计算两个数的最大公约数(GCD)的方法。该算法基于以下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
以下是辗转相除法求最大公约数的详细步骤和示例:
-
假设要求两个数 a 和 b 的最大公约数,其中 a >= b。
-
计算 a 除以 b 的余数,记为 r(a = b * q + r,其中 q 是商,r 是余数)。
-
若 r 等于 0,则 b 即为最大公约数,算法结束。
-
若 r 不等于 0,则将 b 赋值给 a,将 r 赋值给 b,然后回到步骤 2。
重复执行步骤 2~4,直到余数为 0。此时的 b 就是两个数的最大公约数。
以下是一个示例,求解最大公约数 GCD(48, 18):
-
初始值:a = 48,b = 18。
-
计算商和余数:48 ÷ 18 = 2 余 12。
-
更新 a 和 b:a = 18,b = 12。
-
计算商和余数:18 ÷ 12 = 1 余 6。
-
更新 a 和 b:a = 12,b = 6。
-
计算商和余数:12 ÷ 6 = 2 余 0。
-
余数为 0,算法结束。最大公约数为 6。
通过上述步骤,我们得出了最大公约数 GCD(48, 18) = 6。
辗转相除法的优点在于它的迭代过程非常简单且有效。它被广泛用于计算最大公约数和最小公倍数,以及其他一些数学和算法问题中。
#include int main() {int a, b;while (scanf("%d %d", &a, &b) != EOF)//多组输入{ int product=a*b;//计算a、b的乘积 int r=a%b; while(r!=0) { a=b; b=r; r=a%b; }//当c==0时,b的值就是最大公因数printf("%d\n",product/b);}return 0;}倒置字符串
【牛客网链接:OR62 倒置字符串】
【题目信息】:
【方法一】:直接逆序打印,从后往前依次打印单词,因为单词间以空格字符为界,所以可以从字符串末尾遍历计算出空格的位置,每次计算到空格的位置,那么此位置+1就是单词首字母的位置,拿到这个地址打印字符串即可,打印完后将空格位置改成 ‘\0’ ,依次重复上述步骤,直到遍历完这个字符串为止。
#include#includeint main(){char arr[100] = { 0 };gets(arr);int sz = strlen(arr);while (sz){if (arr[sz] == ' '){printf("%s ", &arr[sz + 1]);arr[sz] = '';//打印完将字符串截断,去除打印完的字符}sz--;}printf("%s", arr);return 0;}【方法二】:先逆序整个字符串,再逆序每个单词(也可以反过来,先逆序每个单词,再逆序整个字符串)
#include#includevoid reverse(char* left, char* right)//逆序字符串函数{while (left今天的内容就到这里了,有什么问题的话欢迎大家在评论区讨论,也可以私信博主为你解答,如果觉得博主的文章还不错的话, 请三连支持一下博主哦
上一篇:超极本为什么贵?
下一篇:微软服务器出错怎么办?