
❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C++基础知识知识强化补充、C/C++干货分享&学习过程记录
🍉学习方向:C/C++方向
⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平
前言:之前博主更新过一个【C语言刷题12天IO强训】的专栏,那个是从入门到进阶的IO模式真题的训练,从本文开始博主要更新的内容是C语言16天强化训练,是从基础入门到进阶的,在假期我们也不能闲着,每天要有题目训练,才能温故知新,为期16天的C语言强化训练正式开始更新!

目录
[1.1 题目1](#1.1 题目1)
[1.2 题目2](#1.2 题目2)
[1.3 题目3](#1.3 题目3)
[1.4 题目4](#1.4 题目4)
[1.5 题目5](#1.5 题目5)
[2.1 打印从1到最大的n位数](#2.1 打印从1到最大的n位数)
[2.2 计算日期到天数转换](#2.2 计算日期到天数转换)
正文
一、五道选择题
1.1 题目1
**题干:**执行下面程序,正确的输出是( )
cpp
int x=5,y=7;
void swap()
{
int z;
z=x;
x=y;
y=z;
}
int main()
{
int x=3,y=8;
swap();
printf("%d,%d\n",x, y);
return 0;
}
A.5,7 B.7,5 C.3,8 D.8,3
解析:
答案是C. 3,8,因为swap()交换的是全局变量 x 和 y (即5和7),而main()中打印的是局部变量x和y (即3和8),局部变量不受swap()影响。
1.2 题目2
**题干:**以下不正确的定义语句是( )
A. double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0} ;
B. char c2[] = {'\x10', '\xa', '\8'} ;
C. char c1[] = {'1','2','3','4','5'} ;
D. int y[5+3]={0, 1, 3, 5, 7, 9} ;
解析:
答案是B选项不正确,因为字符数组c2[]的初始化包含无效的多字符常量(如"x10")和语法错误(混用双引号和单引号)。
1.3 题目3
**题干:**test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )
cpp
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;
A.a B.b C.c D.d
解析:
答案是:指针类型的变量是A. a、C. c、D. d,因为INT_PTR宏仅使a为指针(b是普通int),而typedef定义的 int_ptr 确保 c 和 d 均为指针。
1.4 题目4
**题干:**若给定条件表达式 (M)?(a++):(a--) ,则其中表达式 M ( )
A. 和(M==0)等价 B. 和(M==1)等价 C. 和(M!=0)等价 D. 和(M!=1)等价
解析:
答案是:条件表达式(M)?(a++):(a--) 中的M与C选项(M!=0)等价,因为C语言中非零值视为真,零为假。
1.5 题目5
**题干:**有如下定义语句,则正确的输入语句是【多选】( )
cpp
int b;
char c[10];
A. scanf("%d%s",&b,&c) ; B. scanf("%d%s",&b,c) ;
C. scanf("%d%s",b,c) ; D. scanf("%d%s",b,&c) ;
解析:
正确的输入语句是B. scanf("%d%s",&b,c) ;,因为b需要取地址符&,而数组名c本身表示地址,不需要再加&了。
选择题答案如下:
1.1 D
1.2 B
1.3 A C D
1.4 C
1.5 B
大家都做对了吗?
二、两道算法题
2.1 打印从1到最大的n位数
题目链接:JZ17 打印从1到最大的n位数
题目描述:


代码演示:
cpp
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改
*
* @param n 最大位数
* @param returnSize 返回数组行数
* @return int整型一维数组
*/
int* printNumbers(int n, int* returnSize) {
// 计算最大值:10^n - 1
int max_num = (int)pow(10, n) - 1;
// 分配内存空间
int* result = (int*)malloc(sizeof(int) * max_num);
// 填充数组
for (int i = 0; i < max_num; i++) {
result[i] = i + 1;
}
// 设置返回数组大小
*returnSize = max_num;
return result;
}
时间复杂度:O(10^n) ;
空间复杂度:O(10^n)。
这道题是C语言中一道比较经典的题目。
我们如果学习了C++也可以尝试用C++实现一下------
cpp
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改。直接返回方法规定的值即可
*
* @param n int整型 最大位数
* @return int整型vector
*/
std::vector<int> printNumbers(int n) {
std::vector<int> result;
// 计算最大值:10^n - 1
int max_num = static_cast<int>(std::pow(10, n)) - 1;
// 预分配空间提高效率
result.reserve(max_num);
// 填充数组
for (int i = 1; i <= max_num; ++i) {
result.push_back(i);
}
return result;
}
};
复杂度
时间复杂度:O(10^n) ,即需要生成10^n-1个数字;
空间复杂度:O(10^n) ,即需要存储10^n-1个数字。
这个涉及到很多后面的内容,包括C++的尾插push_back、还有pow等,博主还没有介绍过这些。
2.2 计算日期到天数转换
题目链接:HJ73 计算日期到天数转换
题目描述:

和前面的接口型不一样,这道题是IO型,也就是要求程序员自己实现输入输出。

代码演示:
cpp
#include <stdio.h>
#include <stdbool.h>
// 判断是否为闰年
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算日期到天数转换
int dayOfYear(int year, int month, int day) {
// 每个月的天数,索引0不用
const int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int totalDays = 0;
// 累加前month-1个月的天数
for (int i = 1; i < month; i++) {
totalDays += daysInMonth[i];
// 如果是闰年且当前是2月,多加1天
if (i == 2 && isLeapYear(year)) {
totalDays += 1;
}
}
// 加上当月的天数
totalDays += day;
return totalDays;
}
// 主函数
int main() {
int year, month, day;
// 读取输入
while (scanf("%d %d %d", &year, &month, &day) == 3) {
// 计算并输出结果
printf("%d\n", dayOfYear(year, month, day));
}
return 0;
}
这道题是C语言中一道的比较经典的题目。
我们学习了C++之后也可以挑战一下用C++实现------
cpp
//C++写法
#include <iostream>
using namespace std;
/**
* 判断是否为闰年
* @param year 年份
* @return bool 是否为闰年
*/
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
/**
* 计算日期到天数转换
* @param year 年份 (1900 ≤ year ≤ 2200)
* @param month 月份 (1 ≤ month ≤ 12)
* @param day 日 (1 ≤ day ≤ 31)
* @return int 该日期是该年的第几天
*/
int dayOfYear(int year, int month, int day) {
// 每个月的天数,索引0不用
const int daysInMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int totalDays = 0;
// 累加前month-1个月的天数
for (int i = 1; i < month; i++) {
totalDays += daysInMonth[i];
// 如果是闰年且当前是2月,多加1天
if (i == 2 && isLeapYear(year)) {
totalDays += 1;
}
}
// 加上当月的天数
totalDays += day;
return totalDays;
}
int main() {
int year, month, day;
while (cin >> year >> month >> day) {
cout << dayOfYear(year, month, day) << endl;
}
return 0;
}
这个涉及到很多后面C++的内容,所以只是一个展示,不做过多介绍。博主之前在C++专栏写类和对象的时候写过Date的实现,也就是日期类的实现,和这个有一点相像。
结尾
结语:感谢大家的阅读,记得给博主"一键四连",感谢友友们的支持和鼓励!