第十次课----函数
一、函数的定义:包括两个部分,分别是“函数头”和“函数体”
返回值类型 函数名(形式参数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.子函数放到其他文件可以吗?复习声明