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的偶数都可写成两个质数之和。

#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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41780234/article/details/126877167
今日推荐