C语言练习题解析:挑战与突破,开启编程新篇章!(2)

文章目录


🎈前言:

  • 本专栏每篇练习将包括 5个选择题 + 2个编程题,将涵盖C语言的不同方面,包括基础语法、数据类型、控制结构、数组、指针和函数等。通过练习,你将逐步掌握C语言的基础知识和常见问题,提高你的编程技巧和解决问题的能力。
  • 我希望这个博客能够为你提供有价值的练习资源,让你在实践中不断进步。同时,我们也鼓励你在练习过程中进行思考和创新,尝试使用不同的编程方法和技巧。
  • 让我们一起挑战C语言练习题,攻克每一个难点,不断提升自己的编程技能!在评论区分享你的练习心得和问题,与我们一起交流和成长。

🌴选择题

  1. 以下程序段的输出结果是( )
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 表示制表符,这些都是一个字符。

  1. 若有以下程序,则运行后的输出结果是( )
c 复制代码
#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。

  1. 如下函数的 f(1) 的值为( )
c 复制代码
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,依次类推.

  1. 下面3段程序代码的效果一样吗( )
c 复制代码
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。

  1. 对于下面的说法,正确的是( )

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个奇数
    项之和的表达式即可。

  • 比如: 3^3^ 的起始奇数是 7 , 则 {7, 9, 11} 3个奇数求和表达式 7 + 9 + 11 。
    而起始奇数有个规则: m^3^ 的起始奇数值等于 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 (最终的表达式)

c 复制代码
//代码 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的例子:

  1. 基本的格式化
c 复制代码
#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;
}
  1. 使用标志符
c 复制代码
#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, 这时候只需要套入公式计算即可。
c 复制代码
#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;
}
  • 这题也可以遍历一遍等差数列,依次求和。
c 复制代码
#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;
}

🔥今天的内容就到这里了,有什么问题的话欢迎大家在评论区讨论,也可以私信博主为你解答,如果觉得博主的文章还不错的话, 请👍三连支持一下博主哦🤞

相关推荐
丫头,冲鸭!!!7 分钟前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚11 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会13 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香16 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??20 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
听忆.26 分钟前
手机屏幕上进行OCR识别方案
笔记
远望清一色36 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang