文章标题

函数

首先,什么是函数?函数是完成特定任务的独立程序代码单元。语法规则定义了函数的结构和使用方式。虽然C中的函数和其他语言中的函数、子程序、过程作用相同,但是细节上略有不同。一些函数执行某些动作,如printf()把数据打印到屏幕上;一些函数找出一些值供程序使用,如strlen()把指定字符串的长度返回给程序。一般而言,函数可以同时具备以上两种功能。
  1. 函数的三要素:返回值、参数列表、声明。
 * */


#include <stdio.h>
#include <string.h>

//main函数作为整个程序的入口,返回值给了他的父进程
//char *argv[]指针数组:[]优先级很高,argv[]代表数组,里面所有的元素是char*类型,每个main函数的参数都是字符串(char *)
//直接给main函数传参,一空格表示一个参数的结束
int main(int argc, char *argv[])
{

    //strcmp比较两个字符串大小strcmp(const char *s1, const char *s2)

    int ret = strcmp("08", "123467");

    printf("ret = %d.\n", ret);

    ret = strcmp("923456", "123467");

    printf("ret = %d.\n", ret);

    char *p = "中国";

    printf("%s.\n", p);


    char str[] = "123";
    char *p_str = "123";
    char *p_str1 = "123";

    if (p_str == p_str1)
        printf("==.\n");


    if (str == p_str)
        printf("ok.\n");


/*
    //终端输入1:打印出男孩,输入2:打印女孩
    if (2 != argc)
    {
        printf("参数错误.\n");

        return -1;
    }

    if (!strcmp(argv[1],"1") // strcmp(argv[1], "1") == 0
    {

        printf("男孩.\n");
    }

    else if(!strcmp(argv[1],"2"))
    {
        printf("女孩.\n");        
    }

*/

/*  
    char buf[100] = {0};

    printf("终端输入:\n");
    scanf("%s", buf);

    //main函数的参数,argc代表main函数参数个数

    printf("main函数个数:%d.\n", argc); 

    //打印出main函数的参数

    int i = 0;

    for (i=0; i<argc; i++)
    {
        printf("argv[%d] = %s\n", i, argv[i]);

    }   
*/
    return 0;
}
  1. 递归函数
* */

#include <stdio.h>

//计算阶乘(递归)
int jiecheng(int a)
{
    if (a <= 0)
    {
        printf("参数错误.\n");
        return -1;
    }
    //回归条件
    if (a == 1)
    {
        return 1;
    }

    return a * jiecheng(a-1);
}

//递归解决求fibo数列某一项的值: 1 1 2 3 5 8 13 21 34 55
int fibo(int num)
{
    if (num > 0)
    {
        if (1 == num)
        {
            return 1;
        }

        if (2 == num)
        {
            return 1;
        }

        return fibo(num-1) + fibo(num-2);
    }
}

int main(void)
{
//  int arr[10000000000000000000000];
//  int ret = jiecheng(-1);

//  printf("ret = %d.\n", ret);

    int a = 0;

    while (1)
    {
        printf("输入0表示推出.\n");
        scanf("%d", &a);
        if (0 == a)
        {
            break;
        }

        printf("%d项的fibo值:%d.\n", a, fibo(a));

    }

    return 0;
}
  1. 迭代函数
/

#include <stdio.h>

//计算从1开始到某个数据内所有的和
int sum(int a)
{
    int i = 1, sum = 0;

    if (a > 0)
    {

        for (i=1; i<=a; i++)
        {
            //迭加
            //i值每变化一次就更新sum值
            sum += i;
        }
    }
    //最终的结果,中间环节不需要
    return sum;
}

int main(void)
{
    int a = 100;

    printf("%d内的和:%d.\n", a, sum(a));

    int i = 1, sum;

    for (i=1; i<10; i++)
    {
//      printf("sum = %d.\n", sum+=i);
        printf("sum = %d", sum+=i);
        sleep(1);
    }


    return 0;
}
  1. 函数的声明
#include <stdio.h>
#include <unistd.h>


//函数的声明
float add(float a, float b);
float sub(float a, float b);
float mul(float a, float b);
float div(float a, float b);

int main(void)
{
    //用标准输入scanf
    printf("从键盘输入两个数,以回车结束:\n");
    float a, b, ret;
    //默认是行缓冲。留在了你的输入的缓冲区,留下了一个'\n'
    scanf("%f %f", &a, &b);

    char ch = 0;

    printf("从键盘输入你要计算的运算符:+ - * /:\n");
/*  scanf("%c", &ch);
    //ch = 10.对应‘\n’的asc码值:
    printf("ch = %d.\n", ch);
*/
    do 
    {
        scanf("%c", &ch);
    }while (ch == '\n');

    switch (ch)
    {
        case '+':
        ret = add(a, b);
        break;

        case '-':
        ret = sub(a, b);
        break;

        case '*':
        ret = mul(a, b);
        break;

        case '/':
        ret = div(a, b);
        break;

        default:
        printf("error.\n");
        break;
    }

    printf("%.2f %c %.2f = %.2f.\n", a, ch, b, ret);
/*
    //调用函数
    float ret = add(a, b);
    //float类型默认精度小数点后6位
    printf("ret = %.2f.\n", ret);
*/
    return 0;
}


//函数实现(定义)
float add(float a, float b)
{
    float c = a + b;

    return c;
//  return a + b;
}

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

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

float div(float a, float b)
{
    if (b == 0)
    {
        printf("除数不能是0.\n");
        //高精度向低精度隐式转换,会丢掉数据。低精度向高精度隐式转换,结果更精确。
//      return -1;
//      结束整个程序
        _exit(0);
    }

    return a / b;
}

  1. void
/*
 *  void表示类型的一个关键字,空类型(暂时我们不知道该给他什么类型)
 *  void类型占1个字节,但是需要特定类型时,可以进行强制类型转换
 *
 * */


#include <stdio.h>

void func1(void)
{

    printf("hello, world.\n");
}
//a就是子函数的形参,相当于子函数里的局部变量,函数结束,也就销毁了。
int func2(int a)
{   
    printf("a = %d.\n", a);
    a = 23;
}

//交换a、b的值
void func3(int a, int b)
{
    int temp = 0;

    temp = a;
    a = b;
    b = temp;
}

int main(void)
{
    int x = 3, y = 4;
    //分析:1、在子函数里是实参x值(3)、y值(4),进入子函数,分别赋值给了a、b。
    //子函数里,是发生了变化,但是main函数里的实参一点也没变
    func3(x, y);

    printf("x = %d, y = %d.\n", x, y);
/*
    //函数调用
    func1();

    int val = 2;

    //传值调用:1、val变量里面的值(2),进入了子函数里,并赋值给了a,所以val本身(真身)没有进去子函数
    func2(val);

    printf("val = %d.\n", val);

*/
/*
    //不允许定义此类型变量
//  void a = 1;
    //error: variable or field ‘a’ declared void
//  int b = (int)a;

//  printf("b = %d.\n", b);

    printf("sizeof(void) = %d.\n", sizeof(void));
*/  


    return 0;
}
  1. 带参宏和普通函数
 *  1、能完成相类似的功能
 *  2、函数会检查你的参数列表和返回值类型,而宏定义没有类型,也就谈不上检查
 *  3、宏定义只是替换,没有调用开销,函数有开销。
 *
 *  你的函数短小,但是还想利用检查参数的机制,要提高我的效率?
 *  内联函数,处理这些问题.调用开销
 *
 * */

#include <stdio.h>

#define MAX 5

#define S(x) ((x)*(x))

#define MIN(a, b) (((a)<(b)) ? (a) : (b))

#define STR "123456789"

//函数会检查你的参数类型
int func_min(int a, int b)
{

    return (a < b ? a : b);
/*
    if (a > b)
    {
        return b;
    }
    else
    {
        return a;
    }
*/
}

//内联函数
inline void func1(void)
{
    printf("hello.\n");
}

int main(void)
{


/*
    unsigned  a = -1;
    float b = 0.1;

    printf("数据:%f.\n", a);
    printf("数据:%f", a + b); 
    printf("数据:%u.\n", a + b);
*/
/*
    func1();

    float f1 = 3.14;
    float f2 = 3.15;

    int ret = func_min('A', f2);

    printf("ret = %d.\n", ret);
    func_min(3.14, 3.15);
*/
/*
    int ret = S(3);

    printf("ret = %d.\n", ret);

    ret  = S(3+1);

    printf("ret = %d.\n", ret);

    float ret1 = MIN(3.14, 3.15);

    ret = MIN(3, 4);

    char *p = STR;

    printf("字符串:%s.\n", STR);
*/


    return 0;
}
  1. 数学库
链接的时候需要-lm
 * */

#include <stdio.h>
#include <math.h>

int main(void)
{
    double ret = sqrt(16);

    printf("ret = %.2f.\n", ret);

    char *p1;
    short *p2;
    double *p3;

    printf("sizeof(p1) = %d.\n", sizeof(p1));
    printf("p1 = %p.\n", p1);   


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值