您现在的位置是:首页 >其他 >c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复网站首页其他

c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复

冰露可乐 2023-05-29 00:00:03
简介c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复

c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c++的话,
我所知道的周边的会c++的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg
提示:系列c++学习的基础和高阶知识,用于公司生产实践中,实实在在的公司部署产品要用的,因为c++速度快,
而java和Python速度慢,自然往硬件里面部署算法啥的,都得用c++或者c,因此本科学的c很重要,后来的Python或者java就没有那么重要了,
c/c++系列文章:
【1】c++:c语言优缺点,visual studio2019如何新建项目,写hello world程序
【2】c/c++:gcc安装,gcc编译hello world文件,system函数调用系统命令,sleep函数
【3】linux下gcc的编译过程和功能,预处理,编译,汇编,链接,.c预处理为.i文件.s文件.o文件.exe文件
【4】c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键
【5】c/c++:数据类型,常量变量,标识符,有符号整型,无符号unsigned,字符类型,字符串类型,实数类型,浮点型,科学计数法
【6】c/c++:2进制、8进制、10进制、16进制和进制之间的转换,c语言输出匹配格式%
【7】c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
【8】c/c++:类型限定符,printf输出格式,putchar,scanf,getchar
【9】c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换
【10】c/c++:顺序结构,if else分支语句,do while循环语句,switch case break语句
【11】c/c++:for循环语句,分号不可省略,表达式可以省略,猜数字游戏,跳转语句continue,break,避免写goto
【12】c/c++:一维数组,初始化数组,循环打印数组,计算数组存储空间,数组元素个数,数组逆序算法
【13】c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
【14】c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键
【15】c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式
【16】c/c++:gets(),fgets(),puts(),fputs(),strlen(),字符串拼接函数


c/c++:函数的作用

现在发现,c真的是超级底层的编程语言,很多功能没有集成的函数
还得自个儿写

python,java,c++他们会集成很多函数,我们可以用,舒服
不过c和c++运行速度就是很快的。

咱们今天会就这下面几个问题,讨论c语言中的函数
在这里插入图片描述
在这里插入图片描述
提高代码的复用性

注意,传入数组作为参数时,要单独传入数组的长度,这样才能遍历处理
这c语言,狗的很,比java麻烦多了



void swap(int arr[], int i , int j)
{
    //传入数组,直接交换--感觉和java没区别
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

void bubble_sort(int arr[], int n)
{
    if (sizeof(arr) == 0) return;
    //冒泡排序
    //int n = sizeof(arr) / sizeof(arr[0]);
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = i; j < n - 1; j++)//每次都是右边i--n-1对比一把,大的冒泡
        {
            if (arr[j] > arr[j + 1]) swap(arr, j, j +1);//交换
       }//知道i=0,整体比一遍
    }
}

void printArr(int arr[], int n)
{
    //整体打印一个数组
    if (sizeof(arr) == 0) return;
    //冒泡排序
    //int n = sizeof(arr) / sizeof(arr[0]);
    for (size_t i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("
");
}


int main(void)
{
    //f53();
    int arr[] = { 9,2,3,6,1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, n);
    printArr(arr, n);

    system("pause");
    return 0;
}

在这里插入图片描述
其他的跟java没区别,反正传入的时候数组整体带入了,不要在函数里面去求数组的sizeof

模块化组织

今后都不用一个main通用干所有
之前我都是f123456
等等

main调用f即可

你上面看看我就是这么干的

函数的分类

系统库函数:标准的c库
用户自定义函数

系统库函数,首先要引入头文件–它就是申明函数
你调用函数原型就行

比如,获取随机数
播种随机数srand(time(NULL))

srand
time
都是系统库函数
直接用就完事了
rand()生成随机数,%N就是0–N-1之间的数


//rand函数%n,0--n-1之间的数
void frand(void)
{
    srand(time(NULL));
    printf("%d
", rand() % 10);//0--9
}

int main(void)
{
    frand();
    

    system("pause");
    return 0;
}

在这里插入图片描述
至于用户自定义呢
就是上面函数的作用那一个小节
我是了解了。

函数定义:函数原型和函数体{}

包含函数的原型【1返回值类型,2函数名字,3形参列表】

在这里插入图片描述
下面是4函数体
{}
在这里插入图片描述
整体就是一个函数


void bubble_sort(int arr[], int n)
{
    if (sizeof(arr) == 0) return;
    //冒泡排序
    //int n = sizeof(arr) / sizeof(arr[0]);
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = i; j < n - 1; j++)//每次都是右边i--n-1对比一把,大的冒泡
        {
            if (arr[j] > arr[j + 1]) swap(arr, j, j +1);//交换
       }//知道i=0,整体比一遍
    }
}
int add(int a, int b)
{
	int c=a+b;
	return c;
}

形式参数ab,它们各自有自己的类型
函数名add
返回int类型数据
函数体是:

	int c=a+b;
return c;

这就是函数的定义

函数的调用

使用的时候,直接用函数名,传入实际参数ab


int add(int a, int b)
{
    int c = a + b;
    return c;
}

void f54(void)
{
    int a = 10;
    int b = 20;
    int c = add(a, b);//顺序,类型,调用类型得一致
    printf("%d
", c);
}

int main(void)
{
    f54();
    

    system("pause");
    return 0;
}

在这里插入图片描述
很简单的

形参实参的顺序类型不可乱哦

在这里插入图片描述

函数申明

函数调用它之前,编译器必须见过这个定义
否则需要函数申明

说白了,你要么把函数写在调用之前写好
要么就是你把函数写在调用之后,但是,调用前,好歹你要申明一下。

上面小结说的就是往往我把函数写在前面,然后main调用

如果你要把函数放在main之后,那需要再main前还是说一下

在这里插入图片描述
在这里插入图片描述


void f54(void);//申明一波即可

int main(void)
{
    f54();
    

    system("pause");
    return 0;
}


int add(int a, int b)
{
    int c = a + b;
    return c;
}


void f54(void)
{
    int a = 10;
    int b = 20;
    int c = add(a, b);//顺序,类型,调用类型得一致
    printf("%d
", c);
}

在这里插入图片描述
懂了没,编译器必须要把函数编译在前
然后调用在后
怎么着也要提前说清楚,我要申明用这种函数。

在这里插入图片描述
在这里插入图片描述
那些头文件的作用就是申明

exit()函数和return类似

stdlib.h
中的退出函数

参数是整数,执行完就闪退了整个程序。

return是返回当前函数调用,将返回值返回给调用者
但是exit是直接结束当前程序。
在这里插入图片描述



void f54(void);//申明一波即可

int main(void)
{
    f54();
    

    system("pause");
    //return 0;
   
}


int add(int a, int b)
{
    int c = a + b;
    //return c;
    exit(1);//退出整个程序

}


void f54(void)
{
    int a = 10;
    int b = 20;
    int c = add(a, b);//顺序,类型,调用类型得一致
    printf("%d
", c);
}

在这里插入图片描述

多文件联合编程

在这里插入图片描述
在这个解决方案上再加一个新建项目

目前你可以看到day01是主要的main启动项

你可以设置多文件联合编程项目为新的main启动项

在这里插入图片描述
这样的话,它就可以直接启动
其他项目内部的main是没用的

好,

我们在这个main
下加函数
正常情况下,你申明函数,构建函数,调用函数,都在本文件下使用

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>

//申明
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);

void f(void)
{
    int a = 10;
    int b = 5;

    printf("add:%d
", add(a, b));
    printf("sub:%d
", sub(a, b));
    printf("mul:%d
", mul(a, b));
}

int main(void)
{
    f();

    system("pause");
    return 0;
}


int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int mul(int a, int b)
{
    return a * b;
}

在这里插入图片描述
但是,如果我们要把add这仨函数独立出去每一个文件下,怎么玩?
首先把代码分别建立在其他的c文件中,命名为函数名.c
add.c
sub.c
mul.c
在这里插入图片描述
现在呢,你运行看看能行吗?

在这里插入图片描述
在这里插入图片描述
显然,你那些c文件,还没有办法联合为头文件

将多个不同函数功能的c文件模块编译生成1个exe文件:叫联合多文件编程

我们去把这仨函数申明,添加到新建一个head.h头文件,我们来自定义一个头文件

int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);

在这里插入图片描述

放head里面了
#program once,这是Windows系统中的用法
下面放你要的函数申明即可
在这里插入图片描述
然后你再main中调用这个手动的头文件head.h
冒号打头哦
尖括号是系统头文件
【好像这样不行,我试了,还是按照下面的方法】

Linux中:
#ifndefine HEAD_H
#define HEAD_H
头文件内容

endif

防止头文件包含,这叫头文件守卫。
像这样:
head.h

//#pragma once

#ifndef __HEAD_H__
#define __HEAD_H__

//include头文件也可以放
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>
//函数申明
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
//宏定义也可以往这里放

#define PI 3.14


#endif // !__HEAD_H__


main中这样调用:




//申明自定义头文件
#include "head.h"

void f(void)
{
    int a = 10;
    int b = 5;

    printf("add:%d
", add(a, b));
    printf("sub:%d
", sub(a, b));
    printf("mul:%d
", mul(a, b));
}

int main(void)
{
    f();

    system("pause");
    return 0;
}



我这个没有成功,不知道设置哪里有问题,很狗很狗

先不管了,出去散步再说,吃太饱了


总结

提示:重要经验:

1)
2)学好c++,即使经济寒冬,手握10个大厂offer绝对不是问题!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。