C语言中自定义函数的使用和案例分享

这篇具有很好参考价值的文章主要介绍了C语言中自定义函数的使用和案例分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.函数的定义和声明

函数定义的语法:

函数类型 函数名(形式参数表){
函数体
}

函数的声明

函数返回值类型 函数名(变量1数据类型, 变量2数据类型,
变量n数据类型)

函数的调用

函数名(变量1, 变量2,
变量n)

函数调用时注意事项:

  • 函数调用的实参个数必须与形参个数相同。
  • 实参与形参按照在参数表中的位置一一对应传值,实参与形参的名称是否相同对调用传值无任何影响。
  • 实参与形参对应位置上的数据类型应该一致。
  • 对于无参数函数,即形参表为void的函数,函数调用时实参表必须为空,不能有任何内容。

当调用函数的位置在被调用函数之后,则可以不进行声明;反之则需要先声明,再调用。
以下案例可以不进行声明:

#include<stdio.h>

double max(double a, double b) {
    return a > b ? a:b;
}
void main(){
	double a = 1.3;
	double b = -5.6;
	printf("%.1lf和%.1lf的较大值为%.1lf\n", a, b, max(a, b));
}

以下案例,则需要进行先声明,再调用:

#include<stdio.h>
double max(double, double);

void main(){
	double a = 1.3;
	double b = -5.6;
	printf("%.1lf和%.1lf的较大值为%.1lf\n", a, b, max(a, b));
}
double max(double a, double b) {
    return a > b ? a:b;
}

2.递归函数

递归函数:在定义一个函数的过程中直接或间接地调用了被定义的函数本身。
递归函数一般分为两类:公式递归和非公式递归。

//公式递归
#include<stdio.h>
long l_sum(int n) {
    //求1至n的和
    if (n == 1) return 1;
    else{
       return  l_sum(n - 1) + n;
    }
}
//非公式递归
#include<stdio.h>
void hanoi(int n, char a, char b, char c) {
    // 汉塔诺问题
    if (n == 1) {
        printf("%c--->%c\n", a, b);
    }else{
        hanoi(n - 1, a, c, b);
        printf("%c--->%c\n", a, b);
        hanoi(n - 1, c, b, a);
    }
}

void main(){
    hanoi(3, 'A','B' ,'C');
}

3.指针函数

函数返回值是指针类型的函数称为指针函数。语法如下:

数据类型 *函数名称(形参表) {
函数体
}

3.1 指针函数例子1——求字符串数组中最长字符串
#include<stdio.h>
#include<string.h>
char *max_string_len(char *string[], int n){
    // 求给定的字符的指针数组中,字符长度最长的字符串。n为指针数组个数
    int i, posion, max_l;
    posion=0;
    max_l=strlen(string[0]);
    for (i = 0; i < n; i++){
        if (strlen(string[i]) > max_l){
            max_l = strlen(string[i]);
            posion = i;
        }
    }
    return string[posion];
}

void main(){
    char *pstring[4]={"abc", "peculiar", "accent", "rural"};
    printf("%s\n", max_string_len(pstring, 4));
}

3.2 指针函数例子1——求学生等级人数
#include<stdio.h>
#define N 6
void main(){
    int flag(int, int);
    void output(int *, int);
    int s1, s2, i;
    static int r[5];
    for (i = 0; i < N; i++){
        scanf("%d%d", &s1, &s2);
        r[flag(s1, s2)]++;
    }
    output(r,5);
}

int flag( int s1, int s2){
    // 根据传入的两门课的成绩,求平均值,并返回对应的等级。
    int ave;
    ave = (s1 + s2) / 2;
    if (ave >= 90) return 0;
    else if (ave >= 80) return 1;
    else if (ave >= 70) return 2;
    else if (ave >= 60) return 3;
    else return 4;
}

void output(int * p, int n){
    // 给定一个指针和整数n,从而实现逐个打印数组中元素的值
    int i;
    for (i = 0; i < n; i++){
        printf("%d  ", *(p + i));
    }
}

3.3 指针数组和数组指针
  • 数组指针:指向数组的指针,指针指向数组首元素地址的指针。例子: int (*p)[5]
  • 指针数组: 存放指针的数组,一般用来存放字符串。例子: char *p[5]。

4.函数案例分享

4.1 求1+2+…+n的和
int sum(int n){
    //求1+2+...+n的和
    int i, s = 0;
    for (i = 1; i <= n; i++){
        s = s + i;
    }
    return s;
}

4.2 绘制指定数量的*
void pstar(int n){
    // 绘制指定数量的*
    for (int i = 1; i <= n; i++){
        printf("*");
    }
}

4.3 求n的阶乘
long f(int n){
    //求n的阶乘
    long s = 1l;
    for (int i = 1; i <= n; i++){
        s = s * i;
    }
    return s;
}


4.4 绘制n个字符c
void pchar(char c, int n) {
    // 绘制n个字符c
    for (int i = 1; i <= n; i++){
        printf("%c",c);
    }
}

4.5 交换两个变量的值

void swap(int *p1, int *p2){ //传的是指针,实际的地址参数,与实参共享空间,实际值会发生改变
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

4.6 哥巴赫猜想

任一大于2的偶数都可写成两个质数之和。文章来源地址https://www.toymoban.com/news/detail-481723.html

#include<stdio.h>
#include<math.h>
int is_prime(int n){ //判断是否为素数,如果是素数返回1,否则0
    int i;
    for (i = 2; i <= sqrt(n); i++){
        if (n % i == 0) return 0;
    }
    return 1;
}

void main(void){
    int i, n;
    scanf("%d", &n);
    for(i = 3; i < n / 2 ; i += 2){
        if (is_prime(i) && is_prime(n - i)){
        printf("%d + %d = %d\n", i, n - i, n);
        break;
        }
    }
}

到了这里,关于C语言中自定义函数的使用和案例分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 回调函数的使用:案例一:c语言简单信号与槽机制。

    了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制; 回调函数就是一个通过函数指针调用的函数。如果你把 函数的指针 (地址)作为参数 传递 给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 A “callback” is any functi

    2024年02月15日
    浏览(47)
  • C语言第七课----------函数的定义及使用--------C语言重要一笔

                                                      个人主页::小小页面                  gitee页面:秦大大                 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________          1.函数是什么   

    2024年02月16日
    浏览(35)
  • Java中自定义注解

    当使用Java编写应用程序时,我们常常使用注解来为程序添加附加信息,并且可以在运行时读取这些注解。除了Java提供的预定义注解外,我们还可以自定义注解来满足自己的需求。在本文中,我们将介绍Java中自定义注解的基础知识。 一、什么是注解? 注解是一种元数据,可

    2024年02月14日
    浏览(36)
  • SpringBoot中自定义starter

    一、在线创建 首先打开 https://start.spring.io 这个网站,如下: 项目构建工具是 Maven 还是 Gradle ?有人用 Gradle 做 Java 后端项目,但是整体感觉 Gradle 在 Java 后端中使用的还是比较少,Gradle 在 Android 中使用较多,Java 后端,目前来看还是 Maven 为主,因此这里选择第一项。 开发语

    2024年02月10日
    浏览(47)
  • WPF中自定义Loading图

    纯前端方式,通过动画实现Loading样式,如图所示

    2024年02月14日
    浏览(32)
  • Vue中自定义.js变量

    order.js文件内容: // 订单是否报账 const EXPENESS_STATUS_NO=0; const EXPENESS_STATUS_YES=1; // 状态 0-未发货 1-发货 2-确认收获 const STATUS_NO=0; const STATUS_SEND=1; const STATUS_DELIVERY=2; //  如何不加这个,vue中引入不进来变量值 export {     EXPENESS_STATUS_NO,     EXPENESS_STATUS_YES,     STATUS_NO,     STAT

    2024年02月13日
    浏览(40)
  • Springboot中自定义拦截器

    Spring Boot 中使用拦截器 参考:https://blog.csdn.net/taojin12/article/details/88342576?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170823498416800197050192%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257Drequest_id=170823498416800197050192biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2 all top_positive~defa

    2024年02月19日
    浏览(58)
  • Spring中自定义Bean特性

    自定义扩展点 Spring框架提供了许多接口,可以使用它们来定制bean的性质。分组如下: 生命周期回调 ApplicationContextAware 和 BeanNameAware 其他 Aware 接口 为了与容器对bean生命周期的管理进行交互,可以实现Spring InitializingBean和DisposableBean接口。容器对前者调用afterPropertiesSet(),对后

    2024年02月16日
    浏览(39)
  • 关于:在 Office 2021 中自定义模板

    1、Word 2021 的默认模板: 1)打开 Word,创建自己的模板样式:     2)保存模板文件为 Normal.dotm。 3)复制并覆盖到以下位置的模板文件:    C:UsersCurrentUserAppDataRoamingMicrosoftTemplatesNormal.dotm     4)新建 Word 文档,确认以上设置生效。 5)其他说明:    - 如果删除该

    2024年02月04日
    浏览(40)
  • Drogon中自定义处理SIGINT信号

    SIGINT信号,用于捕获CTRL+C终止程序。当进程收到该信号时,系统将调用该函数,并允许我们执行自定义逻辑。 但在Drogon开发使用过程中,使用signal注册了SIGINT信号,我在终端输入CTRL+C终止程序,系统并没有执行func()函数就直接退出了,百思不得其解。

    2023年04月23日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包