首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言16天强化训练】从基础入门到进阶:Day 1

【C语言16天强化训练】从基础入门到进阶:Day 1

作者头像
艾莉丝努力练剑
发布2025-11-13 11:37:17
发布2025-11-13 11:37:17
70
举报
文章被收录于专栏:C / C++C / C++

🔥个人主页艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》C语言刷题12天IO强训LeetCode代码强化刷题洛谷刷题C/C++基础知识知识强化补充C/C++干货分享&学习过程记录 🍉学习方向:C/C++方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平

前言:之前博主更新过一个【C语言刷题12天IO强训】的专栏,那个是从入门到进阶的IO模式真题的训练,从本文开始博主要更新的内容是C语言16天强化训练,是从基础入门到进阶的,在假期我们也不能闲着,每天要有题目训练,才能温故知新,为期16天的C语言强化训练正式开始更新!


正文

一、五道选择题

1.1 题目1

题干:执行下面程序,正确的输出是( )

代码语言:javascript
复制
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 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )

代码语言:javascript
复制
#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

题干:有如下定义语句,则正确的输入语句是【多选】( )

代码语言:javascript
复制
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位数

题目描述:

代码演示:

代码语言:javascript
复制
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改
 *
 * @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++实现一下——

代码语言:javascript
复制
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型,也就是要求程序员自己实现输入输出。

代码演示:

代码语言:javascript
复制
#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++实现——

代码语言:javascript
复制
//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的实现,也就是日期类的实现,和这个有一点相像。


结尾

结语:感谢大家的阅读,记得给博主“一键四连”,感谢友友们的支持和鼓励!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
    • 一、五道选择题
      • 1.1 题目1
      • 1.2 题目2
      • 1.3 题目3
      • 1.4 题目4
      • 1.5 题目5
    • 二、两道算法题
      • 2.1 打印从1到最大的n位数
      • 2.2 计算日期到天数转换
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档