c语言函数

                                    第十次课----函数

一、函数的定义:包括两个部分,分别是“函数头”和“函数体”
返回值类型   函数名(形式参数1, 形参2, ...)//函数头
{
}//函数体

注意1:函数的返回值和参数可以是任意类型,包括空类型!!
void printfStart(void)//打印一行星号
{
    printf("************\n");
    return;
}
注意2:函数名是一种标识符,必须符合标识符的命名规则!通常用动词

注意3:函数的参数可以是一个变量
void sel(int n)//n表示输入的分数
{
    if (n > 90)
        printf("你的成绩属于优秀!");
    else if (n > 80)
        printf("你的成绩属于良好!");
    else if (n > 70)
        printf("你的成绩属于中等!");
    else if (n > 60)
        printf("你的成绩属于及格!");
    else
        printf("你的成绩属于不及格!");
}
思考:异常程序存在的缺陷:变量n的值没有进行异常检查,改进如下
void sel(int n)//n表示输入的分数
{
    if (n <0 || n > 100)
    {
        return;//有错误就中断,提前结束
    }
    if (n > 90)
        printf("你的成绩属于优秀!");
    else if (n > 80)
        printf("你的成绩属于良好!");
    else if (n > 70)
        printf("你的成绩属于中等!");
    else if (n > 60)
        printf("你的成绩属于及格!");
    else
        printf("你的成绩属于不及格!");
    return;//无意义的return!可以省略 改进如下
}
思考上面程序的缺陷:如果成绩非法应该返回假(0),正常结束返回真(1)!
void sel(int n)//n表示输入的分数
{
    if (n <0 || n > 100)
    {
        return 0;//有错误就中断,提前结束
    }
    if (n > 90)
        printf("你的成绩属于优秀!");
    else if (n > 80)
        printf("你的成绩属于良好!");
    else if (n > 70)
        printf("你的成绩属于中等!");
    else if (n > 60)
        printf("你的成绩属于及格!");
    else
        printf("你的成绩属于不及格!");
    return 1;//无意义的return! 改进如下
}

通过上面案例说明函数的返回值通常用于返回真或者假,还可以用于返回一个数

demo:我们做一个求和的函数 参数:两个整数,返回一个整数
int add(int a, int b)
{
    int c;
    c = a + b;
    return c;//有返回值
}

思考以上程序的缺陷,C是多余的变量定义!!且没有赋初值,改进如下
int add(int a, int b)
{
    return a + b;
}

void foo(int a)
{
   int b = 0;
   b = 1;
   a = 10;
   return ;
   b = 2;
}
int main(void)
{
  int c = 0;
  foo(c);
  printf("%d\n",c);//0
  return 0;
}

总结:
1.函数名要符合标识符命名规则
2.定义时的参数叫形参,个数没有限制,类型没有限制
3.返回值的类型没有限制
3.return 表达式; return语句后面的表达式是可以省略的
如果return后有表达式则返回值类型必须和表达式类型一致
如果return后没有表达式则用于中断函数执行


以上函数不调用是无法得到运行的!,函数要想被执行必须调用之

二、函数的调用:
语法 : 函数名(实际参数1,实参2,。。。。)

    注意:
     1 > A函数调用B函数,则A函数叫主调函数,B叫被调用函数
     demo printStar();
2 > 调用的参数个数、顺序、类型要与定义相同 demo add(1, 2);
3 > 函数调用步骤
step1.实参的值赋值给形参
step2.执行函数体
step3.返回主调函数
demo sel(10);

思考:函数名是否和变量名一样叫“标识符”?
思考:标识符是否要先定义后使用?
demo
int main(void){ a = 10; int a = 0; }//错误,标识符a要先定义后使用,改进如下
int main(void){ int a = 0; a = 10; }

思考:下面程序的错误原因
demo
int main(void){ printStar(); }
void printStar(void){ printf("********"); }//标识符printStar要先定义后使用!


三、函数的声明:
声明的方式:只保留函数头且后面加分号

demo:
void printStar(void);//声明
int main(void){ printStar(); //调用}
void printStar(void){ printf("********"); }//定义
思考:声明、调用、定义的区别和作用域

函数的定义:包括函数头和函数体
函数的调用:用于执行定义的函数,通常先定义后调用
函数的声明:用于扩展函数名称的作用域,使得可以先声明后使用!
demo计算器实现加减乘除

思考方式:
step1.分析计算器的功能包括:加减乘除四个功能,因此要写四个函数
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; }
int div(int a, int b){ return a / b; }
int main(void)
{
    return 0;
}
step2.分许用于的使用流程,如先提示显示菜单,提示用于选择,这个也算一个功能因此也要写一个函数
void menu(void){ 
    system("cls");//清屏
    printf("-----------Menu-----------\n");
    printf("1.add\n");
    printf("2.sub.\n");
    printf("3.mul.\n");
    printf("4.div.\n");
    printf("0.exit.\n");
    printf("------------------------------\n");
    printf("please input[0-4]:");
}
step3.显示菜单后要实现用户的输入,且用户非法输入的话要重新输入
int main(void)
{
    int sel = 0;
    while (1)
    {
        menu();
        scanf_s("%d", &sel);
        if (sel < 0 || sel > 4){ printf("错误,请输入0--4的数!"); continue; }
        break;
    }
    return 0;
}
step4.选择正确后,要输入两个数,然后计算
int main(void)
{
    int sel = 0;
    while (1)
    {
        menu();
        scanf_s("%d", &sel);
        if (sel < 0 || sel > 4){ printf("错误,请输入0--4的数!"); continue; }
        break;
    }

    //输入两个数
    int a = 0, b = 0;
    printf("请输入第一个数:");
    scanf_s("%d", &a);
    printf("请输入第二个数:");
    scanf_s("%d", &b);

    //计算
    switch (n)
    {
    case 1: printf("%d\n", add(a, b));
    case 2: printf("%d\n", sub(a, b));
    case 3: printf("%d\n", mul(a, b));
    case 3: printf("%d\n", div(a, b));
    default:printf("错误,请输入0--4的数.\n");
    }
    return 0;
}

思考:
1.加减乘等子函数放到主函数下面可以吗?然后复习声明
2.子函数放到其他文件可以吗?复习声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值