- 💓博客主页:江池俊的博客
- ⏩收录专栏:C语言刷题专栏
- 👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路
- 💻代码仓库:江池俊的代码仓库
- 🎉欢迎大家点赞👍评论📝收藏⭐
文章目录
- 🌴选择题
- 🌴编程题
- 📌尼科彻斯定理
- 📌等差数列
🎈前言:
- 本专栏每篇练习将包括
5个选择题 + 2个编程题
,将涵盖C语言的不同方面,包括基础语法、数据类型、控制结构、数组、指针和函数等。通过练习,你将逐步掌握C语言的基础知识和常见问题,提高你的编程技巧和解决问题的能力。- 我希望这个博客能够为你提供有价值的练习资源,让你在实践中不断进步。同时,我们也鼓励你在练习过程中进行思考和创新,尝试使用不同的编程方法和技巧。
- 让我们一起挑战C语言练习题,攻克每一个难点,不断提升自己的编程技能!
在评论区分享你的练习心得和问题,与我们一起交流和成长。
🌴选择题
- 以下程序段的输出结果是( )
#include<stdio.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
A: 12 B: 13 C: 16 D: 以上都不对
🔎正确答案:
A
【解析】:
这里考查转义字符,注意:\ \ 表示字符 ’ \ ',\123 表示字符 ‘{’,\t 表示制表符,这些都是一个字符。
- 若有以下程序,则运行后的输出结果是( )
#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
🔎正确答案:
B
【解析】:
宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8。
- 如下函数的 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
🔎正确答案:
C
【解析】:
此题注意静态局部变量的使用,static
改变了i
的生命周期,第一次调用函数:i
初值是1
,递归第二次调用函数时,i
还是第一次那个变量,值已经变成了2
,再一次调用函数时i
就是3
,依次类推.
- 下面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: 都一样
🔎正确答案:
B
【解析】:
const
在*
的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*
的右边,则指针的指向不可变。简记为 “左定值,右定向” ,(1)和(2)const
都在*
的左边,(3)中const
在*
的右边,所以应该选择B。
- 对于下面的说法,
正确
的是( )
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: 以上说法都不对
🔎正确答案:
D
【解析】:
- A选项,没有考虑内存对齐。
- B选项,考察
double
类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常 采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。- C选项,
a
为数组首地址是常量不能改变,- 所以A,B,C都是错的,选择D
🌴编程题
📌尼科彻斯定理
【牛客网链接:HJ76 尼科彻斯定理】
【题目信息】:
【答案解析】:
- 这道题的关键在于知道规律后,能够找到第
n
个数据立方的起始奇数
,从这个起始奇数开始,组成连续的n
个奇数
项之和的表达式即可。 - 比如: 33 的起始奇数是 7 , 则 {7, 9, 11} 3个奇数求和表达式 7 + 9 + 11 。
而起始奇数有个规则: m3 的起始奇数值等于 m * (m - 1) + 1
奇数起始项规律:
首先所有奇数项构成一个差值为2的等差数列, 1 3 5 7 9 ....
其次,1的起始奇数是第1个等差数列项,2的起始奇数是第2个等差数列项,3的起始奇数是第4个等差数列项...
形成规律:
1 2 4 7....,而他们的差值分别是1 2 3 4 5...,所以第n项的起始奇数就是一个从1开始到n-1的等差数列(1 2 3 4 5....)之和+1
因此,
当需要求m的立方的起始奇数时,首先计算他的第一个奇数项是总体的第几个,然后再根据等差数列(1 3 5 7 9...)求这个起始奇数。
等差数列求和公式 Sn=n(a1+an)/2 ---> m * (m - 1) / 2 (计算奇数项是总体的第几个)
等差数列第n项公式 an=a1+(n-1)d ---> 1 + ((m * (m - 1) / 2) + 1 - 1) * 2 (计算这个起始奇数的值)
最终得到m的立方的表达式起始奇数: m * (m - 1) + 1 (最终的表达式)
//代码 1:
#include <stdio.h>
int main() {
int m = 0;
while (scanf("%d", &m) != EOF)
{
int start = m * m - m + 1;//找到起始奇数
printf("%d", start);//先打印出起始奇数
for (int i = 1; i < m; i++) //依次打印后面连续的m-1个奇数
{
printf("+%d", start + 2 * i);
}
printf("\n");
}
return 0;
}
//代码 2:
#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++)
{
//然后将紧随其后的m-1个奇数数字转换为字符串,按照指定格式放入buf中
//%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式;buf对应原先的数据,start += 2对应紧随其后的奇数
sprintf(buf, "%s+%d", buf, start += 2);
}
printf("%s\n", buf);
}
return 0;
}
【拓展】:sprintf
函数
下面是一些使用sprintf
的例子:
- 基本的格式化
#include <stdio.h>
int main() {
char buffer[50];
int a = 10;
float b = 3.14;
sprintf(buffer, "整数是 %d, 浮点数是 %f", a, b);
printf("%s\n", buffer); // 输出: 整数是 10, 浮点数是 3.140000
return 0;
}
- 使用标志符
#include <stdio.h>
int main() {
char buffer[50];
int a = 10;
float b = 3.14;
sprintf(buffer, "整数是 %2d, 浮点数是 %6.2f", a, b);
printf("%s\n", buffer); // 输出: 整数是 10, 浮点数是 3.1400
return 0;
}
在这个例子中,%2d
表示将整数输出为至少两位的数,如果不足两位则在前面补一个空格。%6.2f
表示将浮点数输出为至少6位的数,其中小数点后有两位,如果不足则补0。
这只是sprintf
函数的基本用法,实际上它还有许多更复杂的用法和标志符,可以用来处理各种复杂的字符串格式化需求。
📌等差数列
【牛客网链接:HJ100 等差数列】
【题目信息】:
【答案解析】:
- 这道题了解了等差数列求和公式
Sn=n(a1+an)/2
就简单了 ,根据题目得知a1=2
,而等差数列第n项也有具体公式
an=a1+(n-1)d
,而公差为3
, 这时候只需要套入公式计算即可。
#include <stdio.h>
int main()
{
int n, a1 = 2;
while (~scanf("%d", &n))
{
int an = a1 + (n - 1) * 3;//等差数列第n项计算
printf("%d\n", n * (a1 + an) / 2); //等差数列求和打印
}
return 0;
}
- 这题也可以遍历一遍等差数列,依次求和。
#include<stdio.h>
int main() {
int n;
while (EOF != scanf("%d", &n))
{
int sum = 0;
for (int i = 2; i <3* n+2; i+=3) //等差数列第n项的值为3*(n-1)+2
{
sum += i;//计算前n项和
}
printf("%d\n", sum);
}
return 0;
}
🔥今天的内容就到这里了,有什么问题的话欢迎大家在评论区讨论,也可以私信博主为你解答,如果觉得博主的文章还不错的话, 请👍三连支持一下博主哦🤞