一、函数的作用:
1、复用性(可充用性):提高效率,减少代码量。
2、功能分解:降低开发成本,对于开发人员,便于分工合作。
二、函数分类(函数名最好与系统的函数名区分开)
函数之间可以相互调用,但不允许嵌套使用,不允许调用main函数,main函数是由系统调用的。
所有函数必须先定义后使用;
C语言规定在所有的参数前必须有类型说明符来说明参数类型。
#include <stdio.h>
#include <math.h>
int Max(int a, int b)
{
int m;
m = a > b ? a : b;
return m;
}
int main()
{
int i=8, j=3,k;
k = Max(i, j);
printf("%d\n", k);
strcpy();//拷贝函数
sqrt();//平方根函数
fabs();//绝对值函数
return 0;
}
空函数
三、统计用户输入的年月日是一年的第几天
1、函数调用:函数名+实参列表(max(8,3)),函数调用不需要写出函数类型。
2、函数调用可以是某个表达式的一部分。函数在调用是实参向形参传递的,
3、实参向形参的传递是“值传递”即形参做任何修改实参的值不会变。
4、无类型
void fn(int a, int b)
{
int m;
m = a < b ? a : b;
printf("%d\n", m);//不写这行的话返回随机值
}
5、如果函数没有返回类型,默认返回int型,,注意和无类型区分开。
6、函数的声明。只包含首部加分好。
void fn();
int Max(int a, int b);
7、主调函数进入被调函数是保护现场,被调函数进入主调函数是恢复现场
int main()
{
int i = 3, j = 7, k = 1, m = 8, n;
n = i * j + Max(k, m);//i*j放哪去了?大部分运算都有中间运算结果。这些结果放在寄存器里。//内存中专门有个东西存放这些,栈区也有变量(默认不是很大,VS2013默认1MB,存放的东西不能太大否则溢出)。
//寄存器:是电脑中的一块特殊的存储器,这块存储器物理上位于cpu里面,理论上说是电脑中存取速度最快的存储设备。
//手机中的存储器:RAM(随机存储器)是内存和ROM硬盘(只读存储器)
printf("%d\n", n);
return 0;
}
int IsLeapYear(int y)
{
return y % 100 != 0 && y % 4 == 0 || y % 400 == 0;
}
int IsLegalDate(int y, int m, int d)
{
int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int ret = 1;
if (IsLeapYear(y))
{
DOM[1] += 1;
}
if (year<1900 || year>2099)
{
ret= 0;
}
if (month<1 || month>12||
d<1||d>DOM[m-1])
{
ret = 0;
}
return ret;
}
int GetNMonthDays(int y, int m)
{
int ret = 0;
int DOM[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
DOM[1] += IsLeapYear(y) ? 1 : 0;
for (int i = 0; i < m; ++i)
{
ret += DOM[i];
}
return ret;
}
int main()
{
int y, m, d;
int sum;
printf("请输入日期:");
while (!IsLegalDate(y, m, d))
{
printf("输入日期不合法,请重新输入:");
fflush(stdin);//清空缓冲区,比如你输入1o8,1给了y,第二个输入不合法已经终止,但是它还留在缓冲区里面,导致一直不合法,造成死循环。
scanf("%d,%d,%d\n", &y, &m, &d);
}
sum += GetNMonthDays(y,m-1);
sum += d;
printf("%d\n", sum);
return 0;
}
四、函数的递归(解决分治问题&