4.1 自定义函数
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无参数无返回值的函数
void printline (void); void value (void); main() { printline(); value(); printline(); } void printline(void) { int i; for (i=1;i<=35;i++) printf("%c",‘*'); printf("\n"); } void value(void) { int year,period; float inrate, sum, principal; scanf("%f %f %d", &principal, &inrate, &period); sum= principal; for (year=1; year<=period; year++) sum=sum*(1+inrate); printf("\n%8.2f %5.2f %5d %12.2f\n", principal, inrate, period, sum); }
模块化程序设计 模块化程序设计是应用于软件系统设计与开发的一 种策略。它可以把大型程序组织成小而独立的程序 段,称之为模块。 是一种对问题求解的“分而治之”的方法。 当模块经过标识和设计后,可以组织成一种自顶向 下的分层结构。在C语言中,每个模块就是一个函数 C ,负责完成单个任务。 与函数有关的三个元素:函数的定义、调用、声明 。
有参数无返回值的函数
void printline (char ch); void value (float principal, float inrate, int period); main() { int period; float inrate, principal; scanf ("%f %f %d", &principal, &inrate, &period); printline ('-'); value (principal, inrate, period); printline ('-'); } void printline (char ch) { int i; for (i=1;i<=35;i++) printf ("%c", ch ); printf ("\n"); }
函数的声明 int mul (int m, int n); 等价于 int mul (int, int); int mul (int a, int b); mul (int, int); 当函数既无参数,又无返回值时,应写为: void display (void);
函数声明所在的位置决定了在程序中其它函数是否 可以使用它。 函数声明可以放在程序中的如下两个地方:
4.1 自定义函数
函数的定义、调用、声明 函数的类型、返回值 函数的嵌套与迭代 字符串与数组在函数中的使用 变量的作用域、可见性、生存期
概述
问题:
程序越来越长。难于理解且可读性下降。 重复代码增多,某段程序可能被执行多次。 某一问题中的代码,无法在其它同类问题中再用,必须重复原来的设 计编码过程。
无参数但有一个返回值的函数
int get_number(void); main() { int m = get_number(); } int get_number(void) { int number; scanf (“%d”, &number); return number; }
返回多个值的函数 return 只能返回一个值,如果需要从函数中获得更 多信息,需要使用指针传递的方式,使用地址运算 符&和间接运算符*,将在后面章节介绍。
有参数有返回值的函数
void printline (char ch, int len); value (float principal, float inrate, int period); main() { int period; float inrate, principal, amount; scanf ("%f %f %d", &principal, &inrate, &period); printline ('-', 52); amount = value (principal, inrate, period); printf("\n%8.2f %5.2f %5d %12.2f\n", principal, inrate, period, amount ); printline ('-', 52); } } void printline (char ch, int len) { int i; for (i=1;i<=len;i++) printf ("%c", ch ); printf ("\n"); } value (float principal, float inrate, int period) { int year; float sum; sum= principal; for (year=1; year<=period; year++) sum=sum*(1+inrate); return (sum);
调用示例 mul mul mul mul mul mul (10, 5); (m, 5); (10, n); (m, n); (m+5, 10); (10, mul (m, n));
返回一个值的函数可以像其它变量一样使用在表达 式中 printf (“%d\n”, mul(p,q)); y = mul (p, q) / (p + q); if (mul (m, n) > total) printf(“Large”); mul (a, b) = 15;/*函数不能用在赋值语句的左边 函数不能用在赋值语句的左边*/ 函数不能用在赋值语句的左边
void value (float principal, float inrate, int period) { int year; float sum; sum= principal; for (year=1; year<=period; year++) sum=sum*(1+inrate); printf("\n%8.2f %5.2f %5d %12.2f\n", principal, inrate, period, sum); }
函数的调用 使用函数名 实参列表 函数名+实参列表 函数名 实参列表进行调用 实参和形参必须在数据类型、顺序、数量 数据类型、 数据类型 顺序、数量上相匹配 多个实参必须使用逗号分隔开 例: main() { int y; y = mul (10, 5); printf (“%d\n”, y); }
函数的类型 库函数
printf scanf
自定义函数
main 其它需要自己开发的函数
自定义函数可以成为C程序库的一部分,因此C可以 自己不断扩充。 无论是库函数还是自定义函数,一旦设计和封装好 以后,就可以看做是一个“黑盒子”,我们给它一 些参数,它就会给我们反馈回一些结果。
多函数程序 void printline(void) { int i; for (i = 1; i < 40; i++) printf(“*”); printf(“\n”); } main() { printline(); }
函数的声明 与变量一样,所有函数在使用前需要声明,函数声 明又叫做函数原型 函数原型。 函数原型 函数声明由4部分组成函数类型(Βιβλιοθήκη 回值) 函数名 参数列表 终止分号
形式如下: 函数类型 函数名(参数类型 参数列表); 例: int mul (int m, int n);
函数的声明 声明中的参数名是可选的(即可以不写) 如果函数没有形参,那么参数列表可以写作(void) 如果函数的返回值是int型的,则返回值类型是可选 的(即可以不写) 如果无返回值,那么返回值类型必须是void 当声明类型与函数定义中的类型不匹配时,会产生 编译错误。 良好的编程风格是在main函数前面的全局声明区间 中声明函数原型
函数的类型 根据是否有参数、是否有返回值,可以将函数分为 以下几种类型 无参数无返回值的函数 有参数无返回值的函数 有参数有返回值的函数 无参数但有一个返回值的函数 返回多个值的函数
无参数无返回值的函数 函数没有参数时,不从调用函数接收任何数据;函 数没有返回值时,调用函数不会从被调用函数接收 任何数据 不返回值的函数不能用在表达式中,只能作为一个 单独的语句 不返回任何值时,return语句是可选的。实际上, return 函数的闭括号就表示该函数运行结束,控制权返回 给调用函数
函数的定义
函数返回值类型名 函数名(类型名 形参1,类型名 形参2…) /* 头部 */ { /* 函数体*/ 局部变量声明部分 函数语句部分 返回语句部分 }
函数的定义
举例: void printline(int a, int b) { int i; for (i = 0; i < a; i++) printf(“_”); for (i = 0; i < b; i++) printf(“_”); printf(“\n”); return; } 说明: 不要在函数头末尾使用分号 形参列表中,变量之间用逗号分隔开,最后用括号括起来 参数变量的声明不能组合在一起 没有参数可以使用void,也可以为空
返回值及其类型 返回语句的形式如下: return 表达式; 或 return (表达式);或 return ; return的作用:退出函数,并带回函数值。 例: int mul(int x, int y) { int p; p = x * y; return (p); }
返回值及其类型 默认情况下,函数的返回值类型是int类型 如果函数头中使用类型描述符,可以强制转换返回 值的数据类型 例: int product (void) { return (2.5 * 3.0); }
函数的嵌套
计算
a b−c
有参数有返回值的函数 当没有显式地指定函数的返回类型时,将默认的返 回整型值。因此,若计算的值是浮点型时,小数部 分会被截除 当有必要接收特殊的数据类型时,就需要显式地指 定返回类型
计算x的y次幂
double power (int x, int y); main () { int x, y; printf("请输入x和y\n"); scanf ("%d %d", &x, &y); printf (“x的y次幂等于%f\n", power (x, y)); } double power (int x, int y) { double p=1.0; if (y>=0) while(y--) p*=x; else while(y++) p/=x; return p; }
函数是一种机制,能够有效地分解复杂的描述,控制程序规 模和复杂性。需要抽象成函数的程序段:
功能独立、具有独立逻辑意义的程序段 重复出现的代码段
函数机制提供的好处:
便于自顶向下在模块化程序设计 函数可以被多次调用,使我们的工作可以在别人的基础上继续,而不 必重新开始 通过在适当的地方使用函数,可以减短源程序的长度 更容易定位和隔离有错误的函数
(1)所有函数(包括main函数)之前。此时,这种声明对 程序中的所有函数都是可用的。 (2)函数定义中。这种声明主要是被包含它的函数使用 。
如果没有函数声明,C将假设函数的返回类型是 整型,参数的类型与形式定义相匹配。
形参与实参 在函数原型和定义中的参数称为形参,在函数调用 中的参数称为实参 调用语句中的实参可以是常量、变量或表达式 若使用变量作为实参,变量在函数调用之前必须已 经赋值 形参与实参在类型、顺序、数量上必须严格匹配 类型、 类型 顺序、数量上必须严格匹配, 但是名称不需要匹配 名称不需要匹配 C语言中实参和形参之间数据传递的方式叫“值传递 ”,数据只能从实参单向传递给形参。 实参多于形参,多余的实参将被丢弃。若实参少于 形参,未匹配的的形参将被初始化为垃圾值。