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是质数
}
运行结果如下: