C语言基础(八)

news2024/11/28 6:32:46

1、标准库函数:

测试代码1:

#include <stdio.h>  // 标准库函数头文件导入 
// 自定义函数  
int add(int a, int b) {  
    return a + b;  
}  
  
// 声明回调函数类型  
typedef void (*Callback)(int);  
  
// 调用回调函数的函数  
void process(Callback cb, int data) {  
    cb(data);  
}  
  
// 具体的回调函数实现  
void printData(int data) {  
    printf("Data: %d\n", data);  
}  
  
// 内联函数  
inline int max(int a, int b) {  
    return a > b ? a : b;  
}  
  
// 静态函数  
static void privateFunction() {  
    printf("This is a private function.\n");  
}  
  
// 递归函数  
int factorial(int n) {  
    if (n == 0) {  
        return 1;  
    } else {  
        return n * factorial(n - 1);  
    }  
}  
  
int main() {  
    // 调用用户自定义函数  
    int sum = add(5, 3);  
    printf("The sum is: %d\n", sum);  
  
    // 调用回调函数  
    process(printData, 10);  
  
    // 调用内联函数  
    int maxVal = max(7, 9);  
    printf("The max is: %d\n", maxVal);  
  
    // 调用静态函数
    privateFunction();  
  
    // 调用递归函数  
    int fact = factorial(5);  
    printf("Factorial of 5 is: %d\n", fact);  

    return 0;  
}

运行结果如下:

 

测试代码2:

#include <stdio.h>//标准库头文件
#include <time.h>//标准库头文件 
//获取系统时间并计算是第几周第几天。 
int main() {
	//定义time_t类型的变量rawtime,存储当前的时间戳。
    time_t rawtime;
    //定义指向struct tm类型的指针timeinfo,存储时间的详细信息。
    struct tm *timeinfo;
    //定义一个大小为80的字符数组buffer,存储格式化后的时间字符串。
    char buffer[80];
    //time()函数获取当前的时间戳,并将其保存在rawtime变量中。
    time(&rawtime);
    //localtime()函数将时间戳转换为本地时间,并将结果存储在timeinfo指针所指向的结构体中。
    timeinfo = localtime(&rawtime);
    //strftime()函数将时间信息按指定的格式写入buffer数组中。
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo);
    //输出当前时间。
    printf("当前时间: %s\n", buffer);
    //计算今天是一年中的第几天,并将结果存储在dayOfYear变量中。
    int dayOfYear = timeinfo->tm_yday + 1;  // 将0-based的天数转换为1-based
    //获取今天是星期几的信息,并存储在dayOfWeek变量中。
    int dayOfWeek = timeinfo->tm_wday;
    //如果dayOfWeek为0(星期日),则将其转换为7(ISO 8601标准中星期一为一周的起始)。
    if (dayOfWeek == 0) {  // 将星期天转换为 7
        dayOfWeek = 7;
    }
    //计算今天是当年的第几周,通过 (dayOfYear + 6 - dayOfWeek) / 7 这个公式计算。
    int week = (dayOfYear + 6 - dayOfWeek) / 7;
    //输出今天是当年的第几周的第几天。 
    printf("今天是第 %d 周的第 %d 天\n", week, dayOfWeek);
    //return 0;: 返回值0,表示程序正常结束。
    return 0;
}


运行结果如下:

 

 

2、自定义函数:

测试代码:

#include <stdio.h>  
  
// 无参无返回值的函数  
void printMessage() {  
    printf("Hello, this is a function with no parameters and no return value.\n");  
}  
  
// 无参有返回值的函数  
int getNumber() {  
    // 返回一个整数  
    return 42;  
}  
  
// 有参无返回值的函数  
void displayNumber(int num) {  
    printf("The number is: %d\n", num);  
}  
  
// 有参有返回值的函数  
int addNumbers(int a, int b) {  
    // 返回两个整数的和  
    return a + b;  
}  
  
int main() {  
    // 调用无参无返回值的函数  
    printMessage();  
  
    // 调用无参有返回值的函数,并打印返回值  
    int result1 = getNumber();  
    printf("The result of getNumber() is: %d\n", result1);  
  
    // 调用有参无返回值的函数  
    displayNumber(10);  
  
    // 调用有参有返回值的函数,并打印返回值  
    int result2 = addNumbers(5, 7);  
    printf("The result of addNumbers(5, 7) is: %d\n", result2);  
  
    return 0;  
}

运行结果如下:

 

3、函数的几种调用方式:

测试代码:

#include <stdio.h>  
// 函数的4种调用方式: 基本调用、递归调用、通过指针调用、作为另一个函数的参数 
// 定义一个函数  
int add(int a, int b) {  
    return a + b;  
}  
// 使用递归计算阶乘  
int factorial(int n) {  
    if (n == 0) {  
        return 1;  
    } else {  
        return n * factorial(n - 1); // 在函数中调用函数自身称为递归调用。
    }  
} 

// 声明一个函数指针  
 void (*funcPtr)();  
// 定义一个函数  
void sayHello() {  
    printf("Hello, World!\n");  
}  
 
 // 一个简单的函数  
void func1() {  
    printf("Function 1 called\n");  
}  
  
// 另一个简单的函数  
void func2() {  
    printf("Function 2 called\n");  
}  
  
// 接收函数指针作为参数的函数  
void callFunction(void (*func)()) {  
    func();  
}  
  
int main() {  
    // 基本调用直接使用函数名和括号包围的参数列表(如果有参数的话)来调用函数。
	// 如果函数有返回值,将该返回值赋给一个变量,或者直接在表达式中使用它。
    // 调用函数并打印结果  
    int sum = add(5, 3); // 将函数的返回值赋给变量sum  
    printf("The sum is: %d\n", sum);  
  
    // 也可以在调用时直接使用函数的返回值  
    printf("Direct use: %d\n", add(2, 4)); 
    
	//调用递归函数 
    printf("5! = %d\n", factorial(5));  
    
    // 将函数地址赋给函数指针  
    funcPtr = sayHello;  
  
    // 通过函数指针调用函数 
	// 函数指针指向函数的地址,可以像调用普通函数一样通过它们调用函数。 
    (*funcPtr)();  
  
    // 或者 
    funcPtr();  
    
    // 函数指针作为参数传递给其他函数,这里传递给func1 
    // 调用callFunction,传递func1的地址  
    callFunction(func1);  
    
    // 函数指针作为参数传递给其他函数,这里传递给func2 
    // 调用callFunction,传递func2的地址  
    callFunction(func2);  
  
    return 0;  
}

运行结果如下:

 

4、函数的嵌套调用:

测试代码:

// 函数声明  
double power(double base, int exponent);  
double multiply(double a, double b);  
double add(double a, double b);  
void printResult(double result);  
  
int main() {  
    // 调用最外层的函数  
    printResult(add(multiply(2.0, 3.0), power(2.0, 3)));  
    return 0;  
}  
  
// 幂运算函数  
double power(double base, int exponent) {  
    double result = 1.0;  
    for (int i = 0; i < exponent; i++) {  
        result *= base;  
    }  
    return result;  
}  
  
// 乘法函数  
double multiply(double a, double b) {  
    return a * b;  
}  
  
// 加法函数  
double add(double a, double b) {  
    return a + b;  
}  
  
// 输出结果函数  
void printResult(double result) {  
    printf("Result: %f\n", result);  
}

运行结果如下:

 

5、 求合数和

测试代码:

#include <stdio.h>  
#include <stdbool.h>  
#include <stdio.h>  
#include <stdbool.h>  
  
// 函数声明,用于检查一个数是否为合数  
bool isComposite(int num);  
  
int main() {  
    int n, sum = 0; 
    printf("请输入一个整数n: ");  
    scanf("%d", &n);  
  
    // 遍历从2到n的所有数(注意:1不是合数)  
    for (int i = 2; i <= n; i++) {  
        if (isComposite(i)) {  
            printf("%d ", i); // 如果是合数,则打印出来  
        }  
    }  
  
    printf("\n"); // 打印换行符以美化输出
	
	// 遍历从2到n的所有数(注意:1不是合数)  
    for (int i = 2; i <= n; i++) {  
        if (isComposite(i)) {  
            sum += i; // 如果是合数,则加到总和中  
        }  
    }  
  
    printf("小于等于%d的全部合数的和是: %d\n", n, sum);  
    return 0;  
}  
  
// 函数定义,检查一个数是否为合数  
bool isComposite(int num) {  
    if (num <= 1) return false; // 1和负数、0都不是合数  
    if (num == 2 || num == 3) return false; // 2和3是质数,不是合数  
    if (num % 2 == 0) return true; // 偶数(除了2)都是合数  
  
    // 只需检查到sqrt(num)即可  
    for (int i = 3; i * i <= num; i += 2) {  
        if (num % i == 0) return true; // 如果找到一个因子,则num是合数  
    }  
  
    return false; // 如果没有找到因子,则num是质数  
}

运行结果如下:

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程第三天

服务器&#xff1a; #include<sys/types.h> // 支持套接字地址结构 #include <sys/socket.h> // 提供套接字API #include <netinet/in.h> // 定义IP地址结构体 #include <string.h> // 提供字符串操作函数 #include <stdio.h> // 提供标准I/O操…

宠物空气净化器哪款能吸毛?希喂、米家宠物空气净化器测评分享

养猫最令人困扰的&#xff0c;就是掉毛与难以彻底消除的异味&#xff0c;这两个问题就成了养猫生活中的一大挑战。每当换季或是猫咪自我梳理时&#xff0c;家中便被一层细腻的绒毛覆盖&#xff0c;从地板到沙发&#xff0c;从床单到衣物&#xff0c;甚至是空气中都漂浮着细小的…

Dockerfile中CMD和ENTRYPOINT区别以及结合使用

1. 简述 在Dockerfile中,CMD和ENTRYPOINT都是用于指定容器启动时要运行的命令,但它们在使用方式和目的上有所不同。 下面将分别解释这两个指令的含义,并通过示例说明它们之间的区别,以及常见的结合使用案例。 Dockerfile制作镜像流程图: 2. CMD CMD指令用于指定容器启…

RocketMQ环境搭建(宝塔)

文章目录 1.介绍2.RocketMQ介绍1.官网2.基础概念3.组件架构 3.安装1.安装宝塔面板1.更新系统2.安装宝塔面板3.开放33142端口 2.创建存放软件的文件夹3.将软件上传到soft目录下4.安装unzip5.进入目录解压软件6.进入bin目录7.修改两个sh文件配置内存小一点8.在/usr/local/soft/ro…

Maven-08.依赖管理-生命周期

一.生命周期 Maven中的生命周期就是描述一次maven项目构建要经历那些阶段。包含clean&#xff0c;default和site三个。这三个生命周期时相互独立的。所谓相互独立&#xff0c;就是每套生命周期中的阶段互不干扰。 阶段是生命周期中最细化的操作。我们重点关注5个阶段&#xf…

教你学习企业高性能web服务器-nginx

一、web服务介绍 1、Apache的三种模型 &#xff08;1&#xff09;Apache prefork 预派生模式&#xff0c;有一个主控制进程&#xff0c;然后生成多个子进程&#xff0c;使用select模型&#xff0c;最大并发1024每个子进程有一个独立的线程响应用户请求相对比较占用内存&…

笔记(day24)正则表达式

一、正则表达式 1.1 概述 正则表达式定义了字符串的匹配模式,可以用来进行搜索,编辑,或处理文本 并不仅限于某一种语言,但是在每种语言中有细微的差别 1 数据校验、格式校验 2 数据提取 1.2 语法 元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如&a…

专题---自底向上的计算机网络(数据链路层)

目录 计算机网络概述 物理层 数据链路层 网络层 传输层 应用层 网络安全

pinctl 和 gpio子系统驱动

一.设备树中添加pinctl节点模板 1.创建对应的节点 同一个外设的 PIN 都放到一个节点里面&#xff0c;打开 imx6ull-14x14-evk.dts&#xff0c;在 iomuxc 节点 中的“imx6ul-evk”子节点下添加 “pinctrl_test” 节点。添加完成以后如下所示&#xff1a; pinctrl_test:test_g…

8.21Qt作业

运用网络通信&#xff0c;实现简单聊天室 客户端主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui-&g…

Postman之Newman命令以及常用参数

Newman介绍 Postman是专为接口测试而生&#xff0c;而Newman是专为Postman而生。因为服务器一般都是Linux系统&#xff0c;而前文提到的操作都离不开Postman的客户端&#xff0c;为解决这个问题&#xff0c;谷歌公司引入了 Newman工具。Newman是Postman的命令行&#xff0c;是…

STM32——I2C通信外设

软件只需要CR控制寄存器&#xff0c;DR数据寄存器&#xff0c;为实时监控状态&#xff0c;软件需要读取SR状态寄存器&#xff0c;好比&#xff1a;开车时CR是控制汽车方向&#xff0c;踩油门等&#xff0c;SR是仪表盘。 由于I2C是半双工&#xff0c;因此发送和接收数据都是在移…

又一家光伏企业终止,行业产能过剩竞争激烈,毛利率极低

一道新能终止原因如下&#xff1a;首先&#xff0c;一道新能从事光伏单晶电池和单晶组件业务&#xff0c;该行业竞争激烈&#xff0c;目前已经出现了产能过剩&#xff0c;甚至负毛利率的情况&#xff1b;其次&#xff0c;报告期内&#xff0c;一道新能营收高达227亿&#xff0c…

DC-DC 转换器中的压电谐振器:当前状态和限制

在小体积和高频下提高功率密度并减小电感器和变压器的尺寸是DC-DC转换器设计中的一大挑战。为了克服这些困难&#xff0c;压电谐振器&#xff08;PR&#xff09;通过利用潜在的压电效应&#xff0c;以振动模式而不是电模式存储能量。 即使 PR 的使用在效率和功率密度方面改进了…

关于开源许可协议

开源许可协议 引用开源代码之后是否可以保留知识产权&#xff0c;针对不同的开源协议要进行开源扫描。基于BSD、MIT和Apache三种是可以闭源。但是基于GPL、LGPL和Mozilla的开源方案必须同步开源。

2024年接口测试高频面试题及答案

1. 什么是接口测试&#xff1f; •接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求 •测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 2. 为什么要做接口…

【大模型从入门到精通32】开源库框架LangChain RAG 系统中的问答技术2

这里写目录标题 探索高级问答链类型MapReduce 和 Refine 技术 实用建议和最佳实践解决 RetrievalQA 限制结论进一步阅读和探索理论问题实践问题 探索高级问答链类型 MapReduce 和 Refine 技术 MapReduce 和 Refine 是设计用来规避由语言模型 (LM) 上下文窗口大小所导致的限制…

Pulsar官方文档学习笔记——消息机制

pulsar 基于3.x最新官方文档学习记录 概念与架构 典型的推送订阅模式。生产者发送消息&#xff0c;消费者订阅topic消费信息并回应ACK。订阅创建后&#xff0c;Pulsar会保留所有消息。仅消息被所有订阅 成功消费了才会丢弃&#xff08;可以配置消息保留机制保留一定量&#…

裸金属服务器和裸金属云服务器:区别、优势与选择

首先&#xff0c;必须肯定的是&#xff1a;裸金属服务器和裸金属云服务器是有区别的。 ‌ 二者的概述 裸金属服务器&#xff08;‌Bare Metal Server&#xff09;‌是一种物理服务器&#xff0c;‌它直接在硬件上运行&#xff0c;‌没有额外的虚拟化层。‌这意味着每个应用程…

封装通用第三方平台用户表(微信开放平台)

文章目录 一. 注册微信开放平台1.1 开发者资质认证1.2 应用申请1.3 配置应用 二.通用数据库表设计三.入库实体类四. 对接第三方平台4.1 微信开放平台VO对象4.2 通用方法 我们的系统可能要对接很多第三方系统&#xff0c;为了便利用户授权使用和对多平台账户的管理。有必要设计通…