函数01 day10
十:函数
一:语法
类型标识符(看return返回是什么类型的) 函数名(形式参数)//函数头{ 函数体 //声明部分 //语句部分}
函数模型:函数–
本质上是一个功能模块:完成特定功能,实现数据处理
输入—>函数(处理)—>输出
实现函数:
函数头 (1).类型说明符 //函数处理完数据后,结果的类型-----返回值类型
(2).函数名 //主要体现函数的功能
(3).形式参数(形参) //用来接收要处理的数据
函数体
(4).具体实现函数功能的代码
int add(int a,int b)
{int sum;sum = a + b;return sum;
}int main(int argc, const char *argv[])
{int ret;ret = add(1,2);printf("sum = %d\n",ret);return 0;
}
二:返回值
1.函数返回值,如果不需要,设计为空void
,此时函数代码不需要return
2.默认为int
3.返回值类型和设计的类型应保持一致
4.函数实现的位置,可以放在main
之前/之后,
之前:相当于定义的同时也声明了
之后:使用之前一定要做声明 函数声明:把函数头复制,最后加上分号;
如果把定义函数放在main
函数里面 //可以,不标准
5.可以返回逻辑结果
int main(int argc, const char *argv[])
{int ret;int a,b;scanf("%d %d",&a,&b);int max(int a,int b);//4.函数声明实例ret = max(a,b);printf("max = %d\n",ret);return 0;
}int max(int a,int b)
{int z;if(a>b){z = a;}else{z = b;}return (z);
}
int jud_Ryear(int year)
{return (year%100 != 0 && year%4 == 0)||year % 400 == 0 ;//5.带出逻辑结果
}
int main(int argc, const char *argv[])
{int year;scanf("%d",&year);if(jud_Ryear(year) == 1){printf("yes\n");}else{printf("no\n");}return 0;
}
#include <stdio.h>int isLeapYear(int year)
{return year % 100 != 0 && year % 4 == 0 || (year % 400 == 0);
}int getMonthDays(int y, int m)//数组形式
{int days = 0;int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};return m==2 ? months[m-1] + isLeapYear(y) : months[m-1];
}int main(void)
{int year = 0;int month = 0;printf("Input a year and month: ");scanf("%d%d", &year, &month);printf("%d\n", getMonthDays(year, month));return 0;
}
三:函数综合练习(函数嵌套)
#include<stdio.h>//判断素数int isPrimeNum(int n)
{int i = 0;int ret = 1;for(i=2;i<n;i++){if(n%i == 0){ret = 0;break;}}return ret;
}void PrintNUm()
{for(int j=2;j<=100;j++){if(isPrimeNum(j) == 1){printf("%d ",j);}}
}int main(int argc, const char *argv[])//主调函数
{PrintNUm();//被调函数putchar('\n');//同上 return 0;
}
#include<stdio.h>//判断回文数int judNum(int n)
{int k = 0;int t = 0;int m = n;while(n){k = n%10;t = t*10 + k;n = n/10;}return t == m;}void printNum()
{for(int i=1;i<=1000;i++){if(judNum(i) == 1){printf("%d ",i);}}
}int main(int argc, const char *argv[])
{printNum();putchar('\n');return 0;
}
四:函数实现的本质
1.是借助于栈的结构,实现了函数的层层的嵌套调用
2.函数的调用关系:可以实现层层嵌套调用
3.栈 (内存) //栈本身是一种数据结构特点:先进后出FILO(First In Last Out)
//栈实际对应的是一块内存空间
4.a.out
----运行之后–>加载到内容 //典型的c程序在内存上被划分了5个区域
5.五个部分:
栈–特点:先进先出 //局部变量—空间会开在栈上—变量特点:自动申请,自动释放
//栈的大小–默认8M
堆–特点:空间很大用于存放大的数据 堆区空间–手动申请,手动释放
全局区(静态区):存放全局变量和静态变量
字符串常量区:"hello"
//字符串常量
代码区:就是程序的负责执行的代码指令
unsigned char ch [1024 * 1024 * 7];// 8MBunsigned char ch[1024 * 1024 * 8];//正好是8MB,但加上函数调用开销、返回地址等信息,就会超限
五:嵌套调用(递归)
1.直接递归
void func1
{printf("func1-----\n");func1();
}
2.间接递归
void func1()
{printf("func1-----\n");void func2();func2();
}
void func2()
{printf("func2-----\n");
}
3.递归是一种特殊的循环 //递归因为栈空间有限,即使没有结束条件,也不会死循环
int sum(int n)
{if(n == 1){return 1;}else{return sum(n-1) + n;//递归思路:从后往前看,看向上一次操作,累次}
}int main(int argc, const char *argv[])
{int n = 0;scanf("%d",&n);int ret = sum(n);printf("%d\n",ret);
int fb(int n)//斐波那契数列
{if(n == 1||n == 2){return 1;}else{return fb(n-2) + fb(n-1);}
}