30天学会C语言: Day 12-自订函式

自订函式

自己定义函式有几个优点:

  1. 增加程序码的可读性:
    自己定义函式就像是帮这段程序码取一个名字(没错,一直在取名字),当其他人(或日後的自己)阅读这段程序码时,只要看到这段程序码的名字就能大概知道它的功能
  2. 缩短程序码:
    当某一段相同的程序码在程序中重复出现,可以把这段程序码写成自订函式,用到这段程序码的地方替换成函式的名称就可以让程序码更简短

语法

<回传型别> <函式名称>(<参数>){
	<执行内容>
	    ⋮
	<执行内容>
}

回传型别就是这个函式回传值的型别,如果没有回传值(例如单纯作做一些动作)可以省略或以 void 标示
如果函式没有参数时可以省略,或用 void 标示

下面的范例中,当输入的数不合条件,会呼叫自订函式 showErrorMessage()
showErrorMessage() 会执行 printf("Error!!!");

#include<stdio.h>
#include<stdlib.h>

void showErrorMessage(){
	printf("Error!!!");
}

int main(){
	int x;
	scanf("%d", &x);
	if(x>100 && x%2==0)
		printf("OK!")
	else
		showErrorMessage();
	
	return 0;
}

数值传递

函式的参数要写成 <型别> <参数名称>,有多个参数时用逗号分隔
在自订函式的区块中,参数可以像变数一样使用

下面范例中,函式 add() 有两个型别为 int 的参数,功能是在视窗上显示两者的和

#include<stdio.h>
#include<stdlib.h>

void add(int x, int y){
	printf("%d\n", x+y);
}

int main(){
	int a=10, b=20;
	add(a, b);
	
	return 0;
}

函式中的参数和变数不能有相同的名字,但不同函式中的参数和变数互不影响
也就是说在 main() 区块中没办法使用 add() 中的变数,main() 中的变数 aadd() 中的变数 a 是两个不同的变数

#include<stdio.h>
#include<stdlib.h>

void add(int x, int y){
	int a=x+y;
	printf("%d\n", z);
}

int main(){
	int a=10, b=20;
	add(a, b);
	int x=10, y=100;
	add(x, y);
	
	return 0;
}

回传

使用 return <回传值> 回传资料,另外 return 代表函式结束,不管後面还有没有内容,函式都会停止

回传值的型别不同,函式定义时标注的型别也要修改

#include<stdio.h>
#include<stdlib.h>

int add(int x, int y){
	int z=x+y;
	return z;
}

int main(){
	int x=10, y=20, a;
	a = add(x, y);
	printf("%d\n", a);
	
	return 0;
}

回传值可以是任何有值的东西,例如一个运算

#include<stdio.h>
#include<stdlib.h>

int add(int x, int y){
	return x+y;
}

int main(){
	int x=10, y=20;
	printf("%d\n", add(x, y));
	
	return 0;
}

或是一个数值

#include<stdio.h>
#include<stdlib.h>

float pi(){
	return 3.14;
}

int main(){
	float r;
	scanf("%f", &r);
	printf("Perimeter: %f\n", 2*pi()*r);
	
	return 0;
}

也可以是另一个函式的结果
下面范例中,fun() 会在 a 是偶数时呼叫 sum() 并将结果回传,是奇数时呼叫 factorial() 并将结果回传

#include<stdio.h>
#include<stdlib.h>

int sum(int x){
	int result=0;
	for(int i=1; i<=x; i++)
		result+=i;
	return result;
}

int factorial(int x){
	int result=1;
	for(int i=1; i<=x; i++)
		result*=i;
	return result;
}

int fun(int a){
	if(a%2==0)
		return sum(a)
	else
		return factorial(a)
}

int main(){
	int n;
	scanf("%d", &n);
	printf("%d\n", fun(n));
	return 0;
}

用数学的方式表示:

在函式的里面可以定义另一个函式
下面例子中的 pow() 会计算 mn 次方

#include<stdio.h>
#include<stdlib.h>

int fun(int x, int y, int a, int b){
	int pow(int m, int n){
		int result=1;
		for(int i=0; i!=n; i++)
			result*=m;
		return result;
	}
	return pow(x, a) + pow(y, b);
}

int main(){
	int x, y, i, j;
	scanf("%d%d%d%d", &x, &y, &a, &b);
	printf("%d\n", fun(x, y, i, j));
	return 0;
}

函式 f() 中的函式 g() 可以使用函式 f() 的参数

#include<stdio.h>
#include<stdlib.h>

int f(int x, int y){
	int g()
		return x*y;

	if(x==0)
		return 0;
	else
		return g();
}

int main(){
	int m, n;
	scanf("%d%d", &m, &n);
	printf("%d\n", f(m, n));
	return 0;
}

如果函式的定义在 main(),要在 main() 之前先宣告

#include<stdio.h>
#include<stdlib.h>

int add(int x, int y);

int main(){
	int x=10, y=20;
	printf("%d\n", add(x, y));
	
	return 0;
}

int add(int x, int y){
	return x+y;
}

<<:  [Day 28] Node thread pool 3

>>:  30天学会 Python: Day 12-人生苦短,使用 Python

Day24 用python写UI-聊聊Text(一)

今天放假好开心,睡超饱的ヾ(^▽^))), 但是还是要起床发文啦~ Text顾名思义就是可以输入文字...

{DAY 18} Pandas 学习笔记part.4

前言 今天要接续DataFrame的介绍 这篇文章会分成两个部分: 资料的删除 资料的新增 会利用k...

D05 / 为什麽不会填错资料? - Inline class, Scope  & DSL design in compose

今天大概会聊到的范围 slot api modifier scope inline classes...

用 zul 快速制作雏形系统

在软件开发过程中,最不确定的因素是「需求」。因为通常要做的系统是没人用过的新系统,常常使用者没看到系...

Day 0x7 UVa11417 GCD

Virtual Judge ZeroJudge Zerojudge 直接破图 题意 输入一数字 N...