前言
本文为C语言刷题的第二期。在这个阶段,我们将继续挑战自己,探索更深入的C语言知识和编程技巧。这将是一个更加具有挑战性的阶段,但也将带来更多的成长和收益。
1. 选择题
📖题目1:
1、以下程序段的输出结果是( )
#include<stdio.h> int main() { char s[] = "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }
A: 12 B: 13 C: 16 D: 以上都不对
✨题目解析:
这里考查转义字符,strlen统计的是\0之前的字符个数,注意:\\ 表示字符'\',\123表示字符'{',\t表示制表符,这些都是一个字符。
正确答案:A
📖题目2:
2、若有以下程序,则运行后的输出结果是( )
#include <stdio.h> #define N 2 #define M N + 1 #define NUM (M + 1) * M / 2 int main() { printf("%d\n", NUM); return 0; }
A: 4 B: 8 C: 9 D: 6
✨题目解析:
这里考察的是对宏
宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8
正确答案:B
📖题目3:
3、如下函数的 f(1) 的值为( )
int f(int n) { static int i = 1; if(n >= 5) return n; n = n + i; i++; return f(n); }
A: 5 B: 6 C: 7 D: 8
✨题目解析:
此题注意静态局部变量的使用
static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,依次类推
正确答案:C
📖题目4:
4、下面3段程序代码的效果一样吗( )
int b; (1)const int *a = &b; (2)int const *a = &b; (3)int *const a = &b;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样
✨题目解析:
这里考察的是对const的使用
const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为"左定值,右定向",(1)和(2)const都在*的左边,(3)中const在*的右边
正确答案:B
📖题目5:
对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D: 以上说法都不对
✨题目解析:
- A选项,结构体存在内存对齐,这里没有考虑内存对齐。
- B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。
- C选项,a为数组首地址是常量不能改变
所以ABC都错。
正确答案:D
2. 编程题
📖题目一:尼科彻斯定理
题目描述:
题目链接:
✨题目解析:
这道题目的解法有两种:
解法一:
通过观察我们可以发现,整数m的平方就是连续奇数的中间值,它的起始值就是:m*(m-1)+1,结束值就是:m*(m+1)-1,只需将中间值两边的奇数加起来验证一下就可以了。代码如下:
#include<stdio.h> int main(){ int n = 0; scanf("%d",&n); int m1 = n*(n-1); int m2 = n*(n+1); for(int i = m1+1; i < m2-1; i+=2){ printf("%d+",i); } printf("%d",m2-1); return 0; }
解法二:
解法二的方法就较为复杂了,这个方法使用了sprintf,将起始奇数转换成字符串输出到一个数组中,然后再依次将剩余的奇数输出到数组中,转换成字符串,最后输出字符串。
#include <stdio.h> int main() { int m; while(~scanf("%d", &m)){ int start = m * (m - 1) + 1;//找到对应m^3的起始奇数 char buf[10240] = {0}; //sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中 sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中 for (int i = 1; i < m; i++) { //然后将紧随随后的奇数转换为字符串,按照指定格式放入buf中 //%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数 sprintf(buf, "%s+%d", buf, start+=2); } printf("%s\n", buf); } return 0; }
这种方法更考察我们所学的知识 “ 读写文件 ”那期的内容。
📖题目二:等差数列
题目描述:
题目链接:
✨题目解析:
这道题目只要了解等差数列求和公式即可,Sn=n*a1+(n-1)*n*d/2,或者Sn=n*(a1+an)/2,两种方法都可以解决。使用第二个时要先算出an,an=a1+(n-1)d。
#include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { printf("%d\n",n*2+n*(n-1)*3/2 ); } return 0; }
总结
刷题是一个持续的过程,需要坚持和持之以恒。无论是遇到困难还是取得突破,我们都要保持积极的态度和信心。相信自己的能力,相信团队的力量,我们一定能够克服一切困难,取得更好的成果。最后,我要衷心感谢每一位参与刷题的读者,你们的支持和参与是我们前进的动力。希望你们在C语言的学习和编程之路上继续努力,不断追求卓越。祝愿你们在未来的编程之旅中取得更大的成功和成就!