函数
1.1函数的作用
- 避免重复代码的编写
- 使程序模块化
1.2简单函数示例
include<stdio.h>
void starbar(void);//函数在调用前需要进行声明,也可以放在main()的内部。(**函数原型**)
/*主程序部分*/
int main(void)
{
starbar();//**函数调用**
printf("姓名:A");
printf("年龄:18");
printf("升高:180");
printf("体重:52");
starbar();//**函数调用**
return 0;
}
/*函数的定义*/
// 输出40个 *
void starbar(void)
{
int count;
for(count=1;count<=40;count++)
putchar('*');
putchar('\n');
}
-
函数原型:告知编译器 starbar()的函数类型
-
函数调用:导致该函数的执行
-
函数的定义:支出函数确切的功能
-
任何程序在使用函数之前都必须声明该函数的类型
void starbar(void);
第一个 void 指的是函数的类型;它的意思是函数没有返回值。
括号内的 void 表示不接受任何参数
分号(” ;“)的作用是表示这是函数的声明,不是函数的定义
-
函数定义的时候 void starbar(void) 没有分号
-
函数内部定义的变量属于***局部变量***,只在函数内部有用
-
函数可以和主函数写在一个文档中容易编译,也可以写成两个文档方便其它主函数进行调用,函数和主程序写成两个文件时,还需要写一个 名称 . h 声明文件作为头文件,在函数文件和主程序中进行 声明 调用 名称 . h ;名称 . h 中包含 #define 定义的常量 以及函数的声明 ,常量是在两个文件中都使用到的,这样,在主程序和函数文件前加上 #include " 名称 . h" 即可调用声明文件
文件一,主程序文件;main.c
include<stdio.h> include"name.h" //声明文件 int main(void) { return; }
文件二,函数文件;fun.c
include<stdio.h> include"name.h" //声明文件 void fun1(void) { return; } int fun2(int) { return; } float fun3(int) { return; }
文件三,声明文件,state.h
/*声明文件,state.h*/ #define AAA 1 #define BBB 2 #define CCC 3 void fun1(void); void fun2(void); void fun3(void);
1.3 函数参数
在上一个程序中,我们调用的函数并没有输入参数,下面进行一个简单地改进;
要求是我们可以控制输出的字符数的 数量 和 字符 的类型。
include<stdio.h>
include<string.h>
#define NAME "abcdefg"
#define ADDRESS "101 bbbBBB palze"
#define PLACE "APPLE, china ,2022"
#define SPACE " "
void show_n_char(char ch,int num);//函数在调用前需要进行声明,也可以放在main()的内部。(**函数原型**)
/*主程序部分*/
int main(void)
{
int spaces;
show_n_char("*",40);//**函数调用**
putchar("\n");
show_n_char(SPACE,12);
printf("%s\n",NAME);
spaces = (40-strlen(ADDRESS))/2;
show_n_char(SPACE,spacs);//**函数调用**
printf("%s\n",ADDRESS);
show_n_char(SPACE,(40-strlen(PLACE))/2);
printf("%s\n",PLACE);
show_n_char("*",40);//**函数调用**
putchar("\n");
return 0;
}
/*函数的定义*/
void show_n_char(char ch,int num)
{
int count;
for(count=1;count<=num;count++)
putchar(ch);
}
函数定义由一下语句实现
void show_n_char(char ch,int num)
使用了 ch 和 num 两个参数,并分别定义了他们的参数类型为 char 和 num ,称为形式参量,即 形参
由于该函数没有返回值,所以函数类型为 void
1.4 有返回参数的函数
int imin(int a,int b)
{
int min;
min = ( a<b ? a : b);
return min ;
}
return 指明其后面的表达式即为返回值,上面的函数还可以简化为一下形式:
int imin(int a,int b)
{
return ( a<b ? a : b);
}
由于返回值是一个 int 类型 ,所以函数类型定义为 int
函数的类型指的是返回值的类型
1.5 递归
1.5.1 递归的概念
一个函数调用其本身,这种调用的过程称为递归-----其执行效率没有循环高
1.5.2 递归程序示例
/*递归举例*/
#include<stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("level &d :n location %p\n",n,&n);/*1*/
if(n<4)
up_and_down(1+n);
printf("level &d :n location %p\n",n,&n);/*2*/
}
在主程序中,当调用 up_and_down() 时,将 1 传入函数,此时执行/1/语句输出 level 1 ;
此时满足 if 执行条件,再一次调用up_and_down (),称为第一级,将1+1输入函数,输出level 2;
在第一级中,此时输入值为2,仍然满足 if 执行条件,再一次调用up_and_down (),称为第二级,将2+1输入函数,输出level 3;
在第二级中,此时输入值为3,仍然满足 if 执行条件,再一次调用up_and_down (),称为第三级,将3+1输入函数,输出level 4;
在第三级中,此时输入值为4,不满足 if 执行条件,此时执行/2/,输出level 4,并返回上一级;
在第二级中,此时输入值为3,if 语句完成执行,开始执行/2/,输出level 3,并返回上一级;
在第一级中,此时输入值为2,if 语句完成执行,开始执行/2/,输出level 2,并返回上一级;
首次 if 语句已经执行结束,此时输入值为1,开始执行/2/,输出level 1 ,执行结束
注意:递归函数中必须含有可以终止递归调用的语句
/*递归求阶乘*/
long fact(int n)
{
long ans;
if(n>0)
ans=n*fact(n-1);
else
ans=1;
return ans;
}
/*递归将十进制转换成二进制*/
include<stdio.h>
void to_binary(int n);
int main(void)
{
unsigned long number;
printf("请输入要转换成二进制的数,结束请输入任何非数字字符\n");
while(scanf("%ul",&number)==1)
{
printf("%ul的二进制数是",number);
to_binary(number);
printf("请输入要转换成二进制的数,结束请输入任何非数字字符\n");
}
printf("bye!");
return 0;
}
void to_banary(int n)
{
int r;
r=n%2;
if(n>=2)
to_banary(n/2);
printf('0'+r);
return;
}
1.6 指针简介
地址运算符 & ,后面跟一个变量名时,& 给出该变量的地址
间接运算符 *** ,后面跟一个 指针名 或者 一个 地址 的时候, * 给出储存在被指向地址中的数值
int bah=5;
int *ptr;
ptr = &bah ;
val = *ptr ;
ptr 指向 bah 的地址;
val 获取地址中的数值
指针声明表示如下:
int * pi; /*pi是指向一个整数变量的指针*/
char * pc; /*pc是指向一个字符变量的指针*/
float * pf , * pg ; /*pf 和 pg 是指向一个浮点变量的指针*/
用指正进行通过函数交换两个数
#include<stdio.h>
void interchange(int *u,int *v);
int main(void)
{
int x=5,y=10;
printf("原始数据x=%d,y=%d\n",x,y);
interchange(&x,&y);
printf("现在的数据x=%d,y=%d\n",x,y);
return 0;
}
void interchange(int *u,int *v)
{
int temp;
temp = *u;
*u=*v;
*v=temp;
}