在结构化程序设计中,函数是将任务进行模块划分的基本单位,通过函数,可以把一个复杂任务分解成易于解决的小任务,充分体现结构化程序设计有组到精,逐步细化的设计思想,一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,在C语言中子程序用函数实现。
//函数:定义函数的语法,函数返回类型,函数名,(形参列表) {函数体}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
float Trianglearea(float a, float b, float c);//函数的声明 计算三角形面积
float Trianglearea(float a, float b, float c)//被调用函数
{
float s = -1;//初始化
if (a + b >= c && a + c >= b && b + c >= a)
{
float p = (a + b + c) / 2;
float s = sqrt(p * (p - a) * (p - b) * (p - c));
}
return s;
}
int main()
{
float a, b, c;
float s;
scanf("%f %f %f", &a, &b, &c);
s = Trianglearea(a, b, c);
printf("面积是%f\n", s);
return 0;
}
函数按其是否系统预定义分为两类,按系统预定义的称为库函数或标准函数,如一些常用的数学计算函数,字符串处理函数,图形处理函数,标准输入输出函数,这些库函数都按功能分类,集中说明在不同的头文件中,用户只需在自己的程序中包含某个头文件,就可以直接使用该头文件中的函数,另一类是用户自定义函数,用户可以根据需要将某个具有相对独立性功能的程序定义为函数
自定义函数有:函数返回类型+函数名+形参列表+函数体构成;
int add_int(int a, int b);//函数的声明
int main()
{
int x = 10, y = 20;
int z = add_int(x, y);//函数的调用
printf("z=%d\n", z);
return 0;
}
int add_int(int a, int b)//函数的定义
{
int c = a + b;
return c;
}
形参:只能等到函数被调用时接受传递过来的数据,称为形参,形参是指函数名后括号中定义的变量,形式参数只有在函数被调用的过程中给予赋值(分配储存空间)。函数执行完成后形参变量就自动释放了,形式参数只在函数中可见(作用域)
实参:调用函数时给出的参数包含了实实在在的数据,所以称为实际参数,实参可以是常量,变量,表达式或者函数等等,无论实参是何种类型的量,在进行函数调用时他们都必须有确定的值,以便把这些值传送给形参。
实参和形参的功能是传递数据,发生函数调用时,实参的值会传递给形参,函数调用有限要进行参数传递,传递过程是先计算实参表达式的值,再将该值传递给对应的形参变量,一般情况下,实参和形参的个数和排列顺序一一对应,并且对应参数应类型匹配(赋值兼容),及实参的类型可以转化为形参的类型
编程的步骤:
1.需求分析,明确我们要处理什么问题,确定我们处理问题所需要的资源
2.算法设计(如何做一件事)根据所需的功能和我们拥有的资源,理清思路
排列出完成此功能的具体步骤,每一个步骤都应当是简单的,确定的,这一步也被称为逻辑编程
3.起一个函数名 确定函数的形参,就是调用此函数时传递的资源 确定函数的返回值 完成函数
**完成一个判断是否为闰年的函数
bool IsLeap(int year)
{
if ((year % 4 == 0 && year %100 !=0)||(year % 400 == 0))
{
return true;
}
else
{
return false;
}
}
int get_ym_day(int year, int month)
{
int day = 0;
switch (month)
{
case 1:case 3:case 5:case 7:case 8: case 10:case 12:
day = 31;
break;
case 4:case 6:case 9:case 11:
day = 30;
break;
case 2:
day = IsLeap(year) ? 29 : 28;
break;
}
int mian()
{
int year, month, day;
scanf("%d %d", &year, &month);
day = get_ym_day(year, month);
switch (day)
{
case -1:
printf("year input error : $d\n", year);
break;
case -2:
printf("mont input error :%d\n", month);
break;
default:
printf("year : %d month : %d day : %d\n", year, month, day);
}
return 0;
}
计算一个日期是一年中的第几天
#define YEARERROR -1
#define MONTHERROR -2
#define DAYERROR -3
int get_ymd_total(int year, int month, int day)
{
int total = 0;
if (year < 1)return YEARERROR;
if (month < 1 || month>12)return MONTHERROR;
if (day < 1 || day>get_ym_day(year,month))return DAYERROR;
for (int i = 0; i < month; i++)
{
total = total + get_ym_day(year, i);
}
return total + day;
}
int main()
{
int year, month, day;
int total = 0;
scanf("%d %d $d", year, month, day);
total = get_ymd_total(year, month, day);
switch (total)
{
case -1:
printf("input year error %d\n", year);
break;
case -2:
printf("input month error %d\n", month);
break;
case -3:
printf("input day error %d\n", day);
break;
default:
printf("year:%d month:%d day:%d total :%d", year, month, day, total);
}
}