函数(模块化编程)
函数是程序实现模块化编程的基本单元,一般函数是某一中特定功能的语句集合。
如果说工厂是一个程序,那么函数就是该工厂的部门。
每个部门都有它特定的工序(功能)。
1.一个程序中是由一个或多个源文件组成。
好比编写一个大型网络游戏,代码不是100行1000行,那是上万,上亿行,那就不可能靠一个源文件来储存,而是分成若干个源文件,在由若干个源文件组成一个C程序。
这样便于分别编辑,分别编译,提高调试效率。一个源文件可以被多个C语言共用。
2.一个源文件是由一个或多个函数组成。一个源文件是一个编译单位,在编译时是一个源文件作为单位来编译,而不是以函数作为编译单位。
3.C程序是从main函数开始的,main函数以后可以调用函数,而函数不可调用main函数,因为mian函数是系统调用的。
4.所有的函数都平行,平等的,定义是分别定义的,是互相独立,函数不能嵌套定义(就是在例外的函数内定义)。但是可以相互调用。但不调用main函数。
从我们的角度来看有两种函数
1.标准函数(库函数),由系统提供。
如果把系统看社会,那么人就是一个程序,而库函数就社会提供给我们的一些服务。如:银行,派出所。
2.自定义函数。
就是我们自己定义的函数,也就是你自己开福利店(自定义函数)了,为别人(程序)服务。(不过是要钱的,呵呵)
从函数的角度来看有四种。
有返回值 无返回值
有形参 无形参
有返回值,有参数:int a(int x,int y);
无返回值,无参数:void a(void);
函数的作用:
1.代码优化,防止重复代码。提高开发效率。
2、实现模块编程
什么是模块化编程?就像我们写一篇文章一样,要分大段落,小段落。编程也一样。
函数的声明与定义
函数是声明确定了一个函数的接口(入口),告诉编译器该函数的函数名,返回类型,以及形参列表中的形参个数和顺序。
函数的定义则是建立了一个函数的功能,包含了声明的所以信息。
函数的声明是由:返回值类型 函数名 形参列表组成。
int max(int x,int y);//声明一个返回值为int型的函数
函数的定义是由:函数的声明 返回值类型 函数名 (形参列表) 函数体(函数操作)组成。
int max(int x, int y)//可以理解为函数头
{
/*函数体*/
函数操作;
return 语句;
}
int 函数的返回类型,也是函数的出口。
max 函数名,也是函数的标识符,其命名规则与变量一样。
(int x, int y); 小括号内是形参列表,
int x, int y 形参,表示该函数有两个为int型的形参。也是函数的入口。
函数与模块化编程
函数名对应模块名。
返回值对应模块出口。
形参对应模块入口。
函数操作对应模块功能。
函数的调用
跟库函数的调用方式是大致相同的。
函数的标准调用如下:
函数名(实参列表);
1.函数名指的的被调用的函数的名称。
2.实参要和形参对应,如:形参有两个,那么实参必须也是两个
3.无参函数调用不可省略小括号。如:print();
4.调用时确保形参和实参的类型是一类的,否则编译器会自动进行强制转换,如果转换失败,那么,这个函数调用就是错误的。
举例:
#include <stdio.h>
int max(int x,int y)
{
if(x > y)
return x;
else
return y;
}
int main(void)
{
int i = 10;
double f = 9.2;
int z[3] = {0};
max(i,f);//正确。double 类型可以转换成功
max(i);//错误,实参只有一个,而max函数声明的形参是两个。实参和形参不匹配。
max(i,z);//错误,z是数组,转换失败。
max(i,f,z);//错误,实参有三个,而max函数声明的形参是两个,多出一个,不匹配。
return 0;
}
嵌套调用
就是在一个函数中调用另一个函数
#include <stdio.h>
void func_1(int i)
{
printf("———————\n");
printf("开始-func_1\n");
printf("操作-func_1\n");
printf("结束-func_1\n");
printf("———————\n");
}
void func_2(int i)
{
printf("************\n");
printf("开始-func_2\n");
printf("操作-func_2\n");
func_1(i);//在func_2函数中调用func_1函数
printf("结束-func_2\n");
printf("************\n");
}
int main(void)
{
int i = 0;
printf("+++++++++++++\n");
printf("开始-mian\n");
printf("操作-mian\n");
func_2(i);//在main函数中调用func_2函数.
printf("结束-mian\n");
printf("+++++++++++++\n");
return 0;
}
函数的递归
可分直接递归和间接递归
直接递归:
就是调用自己本身,函数A 调用 函数A
间接递归
函数A 调用 函数B 调用 函数A
我能理解他的概念(其实跟循环差不多)
但是我就是不理解他的执行方式和控制递归的结束。
菜鸟请求指点。或推荐点资料给我。谢谢
函数的应用
1.使用函数实现打印数组和转置数组。
#include <stdio.h>
#define N 3
void print(int array_1[N][N])
{
int i = 0;
int j = 0;
for(i = 0;i < N;++i)
{
for(j = 0;j < N;++j)
printf("%d\t",array_1[i][j]);
printf("\n");
}
}
void turn(int array_2[N][N])
{
int i = 0;
int j = 0;
int t = 0;
for(i = 0;i < N;++i)
{
for(j = i + 1;j < N;++j)
{
t = array_2[j][i];
array_2[j][i] = array_2[i][j];
array_2[i][j] = t;
}
}
}
int main(void)
{
int array[N][N] = {1,2,3,4,5,6,7,8,9};
printf("翻转前:\n");
print(array);
printf("翻转后:\n");
turn(array);
print(array);
return 0;
}
2.验证形参和实参的关系。
#include <stdio.h>
int a(int x,int y)
{
int t = 0;
t = x;
x = y;
y = t;
printf("a\n");
printf("x = %d\ny = %d\n",x,y);
}
int main(void)
{
int i = 10;
int j = 8;
a(i,j);
printf("main\n");
printf("i = %d\nj = %d\n",i,j);
return 0;
}
运行结果:
a
x = 8
y = 10
main
i = 10
j = 8
请按任意键继续. . .
为什么没有转换i 和 j的值呢?
因为形参跟实参是不相等的,不是同一个存储空间,
当程序执行函数时程序会为函数中的变量分配存储空间。
当函数结束时,这些变量也不存在了。
3.使用函数实现在数组中查找一个数。查找成功返回该数的位置,失败返回0
#include <stdio.h>
int a(int x,int y)
{
int t = 0;
t = x;
x = y;
y = t;
printf("a\n");
printf("x = %d\ny = %d\n",x,y);
}
int main(void)
{
int i = 10;
int j = 8;
a(i,j);
printf("main\n");
printf("i = %d\nj = %d\n",i,j);
return 0;
}
4.使用函数实现删除字符串的一个元素。
#include <stdio.h>
#include <string.h>
#define N 100
int Delete(char str1[N],int Dec,int len1)
{
int i = 0;
int head = 0;
for(i = 0;i < len1;++i)
{
if(Dec == str1[i])
break;
}
head = i;
while(str1[head] != '\0')
{
str1[head] = str1[head + 1];
++head;
}
}
int main(void)
{
int i = 0;
int len = 0;
char c = 0;
char str[N];
len = strlen(str);
printf("请输入一个字符串:");
gets(str);
printf("请输入你删除的字符:");
scanf("%c",&c);
Delete(str,c,len);
printf("输出删除后的字符串:\n");
puts(str);
return 0;
}
5.编写一个函数,要求输入一个判断是否为质数(只可以跟1和自身整除)。
#include <stdio.h>
int judge(int num)//判断
{
int i = 0;
for(i = 2;i < num;++i)
{
if(0 == num % i)//可以被>num 的整除,证明不是质数
return 0;
}
if(i == num)
return 1;
}
int main(void)
{
int i = 0;
int num_1 = 0;
printf("请输入一个数:\n");
scanf("%d",&num_1);
if( 0 == judge(num_1) )
printf("N0!\n");
else
printf("YES!\n");
return 0;
}
6.编写一个函数,判断一个字符在字符串出现的次数,如果不出现,则返回0.
#include <stdio.h>
#include <string.h>
#define N 100
int inquiry(char str_1[N],char c1,int len_1)
{
int i = 0;
int count = 0;
for(i = 0;i < len_1;++i)
{
if( c1 == str_1[i] )
++count;
}
return count;
}
int main(void)
{
char c = 0;
char str[N];
int t = 0;
int len = 0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
printf("请输入你要查询的字符:");
scanf("%c",&c);
printf( "出现的次数为[%d].\n",inquiry(str,c,len) );
return 0;
}
函数(模块化编程)
函数是程序实现模块化编程的基本单元,一般函数是某一中特定功能的语句集合。
如果说工厂是一个程序,那么函数就是该工厂的部门。
每个部门都有它特定的工序(功能)。
1.一个程序中是由一个或多个源文件组成。
好比编写一个大型网络游戏,代码不是100行1000行,那是上万,上亿行,那就不可能靠一个源文件来储存,而是分成若干个源文件,在由若干个源文件组成一个C程序。
这样便于分别编辑,分别编译,提高调试效率。一个源文件可以被多个C语言共用。
2.一个源文件是由一个或多个函数组成。一个源文件是一个编译单位,在编译时是一个源文件作为单位来编译,而不是以函数作为编译单位。
3.C程序是从main函数开始的,main函数以后可以调用函数,而函数不可调用main函数,因为mian函数是系统调用的。
4.所有的函数都平行,平等的,定义是分别定义的,是互相独立,函数不能嵌套定义(就是在例外的函数内定义)。但是可以相互调用。但不调用main函数。
从我们的角度来看有两种函数
1.标准函数(库函数),由系统提供。
如果把系统看社会,那么人就是一个程序,而库函数就社会提供给我们的一些服务。如:银行,派出所。
2.自定义函数。
就是我们自己定义的函数,也就是你自己开福利店(自定义函数)了,为别人(程序)服务。(不过是要钱的,呵呵)
从函数的角度来看有四种。
有返回值 无返回值
有形参 无形参
有返回值,有参数:int a(int x,int y);
无返回值,无参数:void a(void);
函数的作用:
1.代码优化,防止重复代码。提高开发效率。
2、实现模块编程
什么是模块化编程?就像我们写一篇文章一样,要分大段落,小段落。编程也一样。
函数的声明与定义
函数是声明确定了一个函数的接口(入口),告诉编译器该函数的函数名,返回类型,以及形参列表中的形参个数和顺序。
函数的定义则是建立了一个函数的功能,包含了声明的所以信息。
函数的声明是由:返回值类型 函数名 形参列表组成。
int max(int x,int y);//声明一个返回值为int型的函数
函数的定义是由:函数的声明 返回值类型 函数名 (形参列表) 函数体(函数操作)组成。
int max(int x, int y)//可以理解为函数头
{
/*函数体*/
函数操作;
return 语句;
}
int 函数的返回类型,也是函数的出口。
max 函数名,也是函数的标识符,其命名规则与变量一样。
(int x, int y); 小括号内是形参列表,
int x, int y 形参,表示该函数有两个为int型的形参。也是函数的入口。
函数与模块化编程
函数名对应模块名。
返回值对应模块出口。
形参对应模块入口。
函数操作对应模块功能。
函数的调用
跟库函数的调用方式是大致相同的。
函数的标准调用如下:
函数名(实参列表);
1.函数名指的的被调用的函数的名称。
2.实参要和形参对应,如:形参有两个,那么实参必须也是两个
3.无参函数调用不可省略小括号。如:print();
4.调用时确保形参和实参的类型是一类的,否则编译器会自动进行强制转换,如果转换失败,那么,这个函数调用就是错误的。
举例:
#include <stdio.h>
int max(int x,int y)
{
if(x > y)
return x;
else
return y;
}
int main(void)
{
int i = 10;
double f = 9.2;
int z[3] = {0};
max(i,f);//正确。double 类型可以转换成功
max(i);//错误,实参只有一个,而max函数声明的形参是两个。实参和形参不匹配。
max(i,z);//错误,z是数组,转换失败。
max(i,f,z);//错误,实参有三个,而max函数声明的形参是两个,多出一个,不匹配。
return 0;
}
嵌套调用
就是在一个函数中调用另一个函数
#include <stdio.h>
void func_1(int i)
{
printf("———————\n");
printf("开始-func_1\n");
printf("操作-func_1\n");
printf("结束-func_1\n");
printf("———————\n");
}
void func_2(int i)
{
printf("************\n");
printf("开始-func_2\n");
printf("操作-func_2\n");
func_1(i);//在func_2函数中调用func_1函数
printf("结束-func_2\n");
printf("************\n");
}
int main(void)
{
int i = 0;
printf("+++++++++++++\n");
printf("开始-mian\n");
printf("操作-mian\n");
func_2(i);//在main函数中调用func_2函数.
printf("结束-mian\n");
printf("+++++++++++++\n");
return 0;
}
函数的递归
可分直接递归和间接递归
直接递归:
就是调用自己本身,函数A 调用 函数A
间接递归
函数A 调用 函数B 调用 函数A
我能理解他的概念(其实跟循环差不多)
但是我就是不理解他的执行方式和控制递归的结束。
菜鸟请求指点。或推荐点资料给我。谢谢
函数的应用
1.使用函数实现打印数组和转置数组。
#include <stdio.h>
#define N 3
void print(int array_1[N][N])
{
int i = 0;
int j = 0;
for(i = 0;i < N;++i)
{
for(j = 0;j < N;++j)
printf("%d\t",array_1[i][j]);
printf("\n");
}
}
void turn(int array_2[N][N])
{
int i = 0;
int j = 0;
int t = 0;
for(i = 0;i < N;++i)
{
for(j = i + 1;j < N;++j)
{
t = array_2[j][i];
array_2[j][i] = array_2[i][j];
array_2[i][j] = t;
}
}
}
int main(void)
{
int array[N][N] = {1,2,3,4,5,6,7,8,9};
printf("翻转前:\n");
print(array);
printf("翻转后:\n");
turn(array);
print(array);
return 0;
}
2.验证形参和实参的关系。
#include <stdio.h>
int a(int x,int y)
{
int t = 0;
t = x;
x = y;
y = t;
printf("a\n");
printf("x = %d\ny = %d\n",x,y);
}
int main(void)
{
int i = 10;
int j = 8;
a(i,j);
printf("main\n");
printf("i = %d\nj = %d\n",i,j);
return 0;
}
运行结果:
a
x = 8
y = 10
main
i = 10
j = 8
请按任意键继续. . .
为什么没有转换i 和 j的值呢?
因为形参跟实参是不相等的,不是同一个存储空间,
当程序执行函数时程序会为函数中的变量分配存储空间。
当函数结束时,这些变量也不存在了。
3.使用函数实现在数组中查找一个数。查找成功返回该数的位置,失败返回0
#include <stdio.h>
int a(int x,int y)
{
int t = 0;
t = x;
x = y;
y = t;
printf("a\n");
printf("x = %d\ny = %d\n",x,y);
}
int main(void)
{
int i = 10;
int j = 8;
a(i,j);
printf("main\n");
printf("i = %d\nj = %d\n",i,j);
return 0;
}
4.使用函数实现删除字符串的一个元素。
#include <stdio.h>
#include <string.h>
#define N 100
int Delete(char str1[N],int Dec,int len1)
{
int i = 0;
int head = 0;
for(i = 0;i < len1;++i)
{
if(Dec == str1[i])
break;
}
head = i;
while(str1[head] != '\0')
{
str1[head] = str1[head + 1];
++head;
}
}
int main(void)
{
int i = 0;
int len = 0;
char c = 0;
char str[N];
len = strlen(str);
printf("请输入一个字符串:");
gets(str);
printf("请输入你删除的字符:");
scanf("%c",&c);
Delete(str,c,len);
printf("输出删除后的字符串:\n");
puts(str);
return 0;
}
5.编写一个函数,要求输入一个判断是否为质数(只可以跟1和自身整除)。
#include <stdio.h>
int judge(int num)//判断
{
int i = 0;
for(i = 2;i < num;++i)
{
if(0 == num % i)//可以被>num 的整除,证明不是质数
return 0;
}
if(i == num)
return 1;
}
int main(void)
{
int i = 0;
int num_1 = 0;
printf("请输入一个数:\n");
scanf("%d",&num_1);
if( 0 == judge(num_1) )
printf("N0!\n");
else
printf("YES!\n");
return 0;
}
6.编写一个函数,判断一个字符在字符串出现的次数,如果不出现,则返回0.
#include <stdio.h>
#include <string.h>
#define N 100
int inquiry(char str_1[N],char c1,int len_1)
{
int i = 0;
int count = 0;
for(i = 0;i < len_1;++i)
{
if( c1 == str_1[i] )
++count;
}
return count;
}
int main(void)
{
char c = 0;
char str[N];
int t = 0;
int len = 0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
printf("请输入你要查询的字符:");
scanf("%c",&c);
printf( "出现的次数为[%d].\n",inquiry(str,c,len) );
return 0;
}