C语言:使用多文件编程实现冒泡排序,注释详细

一、多文件编程

1.1  多文件编程介绍

(1) 在实际的大型项目开发中,项目的代码是分文件和目录进行管理的:不同文件中编写不同功能的代码。

        .c ---> 源文件:主要存放函数的定义,变量的定义,头文件的包含。

        .h ---> 头文件:主要存放函数的声明,变量的声明,宏定义。

(2) 如果某个.c 文件中需要使用函数或者宏定义时,只需要在 .c 文件中使用#include 包含头文件即可。 

(3) 头文件在预处理阶段进行展开

1.2 防止头文件重复包含的机制:

头文件包含多次,只在第一次包含时展开,后边在包含时不进行展开。 

# ifndef  __头文件名变成大写_H__

# define __头文件名变成大写_H__

        函数的声明 / 变量的声明 / 宏定义

#endif


说明:

        第一次包含头文件时,判断 “__头文件名变成大写_H__” 宏定义是否被定义。此时没有进行宏定义,所以下边的代码会被展开。执行 “#define __头文件名变成大写_H__” 进行宏定义。

        第二次或者第三次等等再次包含此头文件时,判断 “__头文件名变成大写_H__” 宏定义是否被定义。很明显第一次包含此头文件之后进行了“__头文件名变成大写_H__” 的宏定义,因此后边在重复包含此头文件时,头文件中的声明将不会被展开。

二、多文件编程例题 --> 冒泡排序

冒泡排序的函数放到一个单独的.c文件中,在 main.c 中调用此函数。 

2.1 代码实现:

(1)sort.h 文件:

#ifndef __SORT_H__
#define __SORT_H__
#include<stdio.h>

void print_sort(int *arr);
void array_sort(int *arr, int len);

#endif

(2)sort.c 文件:

常规的写法:

#include "sort.h"

//遍历数组
void print_sort(int *arr){
    for(int i = 0; i < 10; i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
}
//排序 升序
void array_sort(int *arr, int len){
    int i = 0;
    int j = 0;
    int temp = 0;
    //外层循环控制比较的趟数
    //当只剩下最后一个元素时,就不用再比了,所以可以少比一趟
    for(i = 0; i < len-1; i++){
        //内层循环用来找每趟的最大值
        //因为每趟都能确定一个最大值,所有每趟可以少比一个元素,所以 -j
        for(j = 0; j < len-i-1; j++){
            //若要降序排序,只需把此处的 > 改成 < 即可
            if(arr[j] > arr[j+1]){ 
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }           
        }
    }    
}

优化的写法:

有时候,数据不一定需要必到最后才能确定有序,可能比到中途就已经有序了,如下数据:            1    2    3    4    5    6    7    8    10    9

此时对已经有序的数据进行比较,就是多余的操作

优化方式:使用标志位确定数据是否已经有序,代码优化如下:

#include "sort.h"

//遍历数组
void print_sort(int *arr){
    for(int i = 0; i < 10; i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
}
//排序 升序
void array_sort(int *arr, int len){
    //用于判断是否有序的标志位 0 有序 1 无序
    int flag = 0; 
    int i = 0;
    int j = 0;
    int temp = 0;

    //外层循环控制比较的趟数
    //当只剩下最后一个元素时,就不用再比了,所以可以少比一趟
    for(i = 0; i < len-1; i++){
        //每趟开始时,都认为是已经有序了
        flag = 0; 

        //内层循环用来找每趟的最大值
        //因为每趟都能确定一个最大值,所有每趟可以少比一个元素,所以 -j
        for(j = 0; j < len-i-1; j++){
            //若要降序排序,只需把此处的 > 改成 < 即可
            if(arr[j] > arr[j+1]){ 
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = 1; //如果发生交换,说明数据不是有序的,继续执行排序
            }           
        }
        //如果没有发生交换,flag仍然为0,说明数据已经有序,跳出循环
        if(flag == 0){
            break;
        }
    }    
}

(3)main.c 文件:

#include "sort.h"
                 
int main(int argc, const char *argv[])
{
    int arr[10] = {8,5,7,3,1,6,2,9,10,4};
    int len = sizeof(arr)/sizeof(arr[0]);
    //排序前
    print_sort(arr);
    //进行排序
    array_sort(arr,len);
    //排序后
    print_sort(arr);
              
    return 0;
}

2.2 代码的编译:

法1:gcc  main.c  sort.c  -o sort

法2:gcc  *.c  -o  sort

2.3 运行结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值