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


🔥个人主页艾莉丝努力练剑

❄专栏传送门:《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的实现,也就是日期类的实现,和这个有一点相像。


结尾

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

相关推荐
范范之交1 分钟前
JavaScript基础语法two
开发语言·前端·javascript
Felven2 分钟前
C. Game of Mathletes
c语言·开发语言
long31619 分钟前
构建者设计模式 Builder
java·后端·学习·设计模式
点云SLAM24 分钟前
C++中内存池(Memory Pool)详解和完整示例
开发语言·c++·内存管理·内存池·new/delete·malloc/free
程高兴1 小时前
遗传算法求解冷链路径优化问题matlab代码
开发语言·人工智能·matlab
wow_DG1 小时前
【C++✨】多种 C++ 解法固定宽度右对齐输出(每个数占 8 列)
开发语言·c++·算法
CHEN5_021 小时前
【Java基础】反射,注解,异常,Java8新特性,object类-详细介绍
java·开发语言
Cx330❀2 小时前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
云间月13142 小时前
飞算JavaAI智慧文旅场景实践:从景区管理到游客服务的全链路系统搭建
java·开发语言
杜子不疼.2 小时前
《Python学习之使用标准库:从入门到实战》
开发语言·python·学习