C语言是面向过程(以模块(函数)为单位)
函数:就是一个功能模块(完成某个功能的过程:完成排序)
1、函数分类:自定义函数 系统函数
2、系统函数:就是由系统提供的功能(模块) printf
3、自定义函数:
返回值 函数名(形参)
{
函数体;//模块的过程
return 返回值表达式;
}
3.1调用函数:执行“一次”函数的过程
函数名(); 注:函数必须定义 *函数表达式
结果:
注:1函数必须存在 2形参必须匹配
1、无返回值 无形参
void 函数名(void)
{
return ; //返回一个空语句,并函数结束
}
2、有返回值(结果:数据) 无形参
返回值类型 函数名(void)
{
函数体;
return;
}
3、有返回值 有形参
返回值 函数名(形参1,形参2,形参3)
{
函数体;
}
形参变量:就是在函数形参列表中定义的变量
实参:调用函数时传递的值
形参:
1、变量作形参:
整型:
1、主函数:系统开始运行时程序的入口函数。
变量:****
1、定义变量:类型 变量名; (分配空间)
2、引用变量:引用变量内容
作用域:能被引用的范围(全局,局部)
1、全局: 在函数外定义的变量
作用域:从定义开始,到本文件结束。
2、局部:在函数内定义的变量(形参变量,函数内定义变量)
作用域:只在函数内
注:在同一作用域内不允许出现同名现象;
生存周期:空间从分配开始,到运行结束。
1、“栈”区(动态区):当函数运行开始,空间被申请,当函数运行结束,空间被释放。
定义变量: [auto] [有无符号] 类型 变量名; (只能在函数内) ; 形参变量
2、静态区:程序运行开始时空间被申请,程序运行结束时,空间被释放。
全局变量。 静态局部变量 ; static 类型 变量名
3、堆区(程序员区)
函数的调用:
#include<stdio.h>
/*
* 函数:求整形形参之间的和
* 返回值:和
*/
int add(int a,int b)
{
int sum=a+b;
return sum;
}
/*
* 函数名:show
* 功能:打印数组内容
* 返回值:无
*/
void show(int num[100],int ilen) //ilen元素的个数 s代表数组
{
int i=0;
for(i=0;i<ilen;i++)
{
printf("%d\n",num[i]);
}
}
void main()
{
//调用函数:
int result = add(1,2);
printf("%d\n",result);
//定义数组:
int buf[100] = {1,2,3,4,5,6};
show(buf,6);
}
动态变量与静态变量:
#include<stdio.h>
#include<unistd.h>
/*
int* fun()
{
int a = 200;
return &a;
}
*/
//统计人数:每访问时,就调用一次calc函数
int num= 0 ;
void calc()
{
//auto int num = 0; //空间被释放频繁
static int num = 0;
num++;
printf("当前人数为:%d\n",num);
}
void main()
{
//生命周期:从空间被申请,空间被释放
/* auto int a = 100; //动态变量:
int* result = fun();
sleep(2);
printf("%d\n",*result);
*/
//访问:
calc();
calc();
//num = 0; //不希望外界访问
calc();
}
习题:
定义一个函数:求某数字(3位数)是否是水仙花(每一位数的立方=本身)
153=1^3+5^3+3^3
#include<stdio.h>
void fun(int x)
{
int i=0,a,b=0;
int c = x;
for(i=0;i<3;i++)
{
a = x%10;
b = b + a*a*a;
x = x/10;
}
if(b==c)
{
printf("是水仙花数!");
}
else
{
printf("不是水仙花数!");
}
}
void main()
{
fun(153);
}
习题:
定义一个函数:判定某个整型数组中是否存在某个值
int findKey(int buf[100],int ilen,int key)//buf数组源,ilen元素个数,key查找关键值
{ }
#include<stdio.h>
void findKey(int buf[100],int ilen,int key)
{
int i =0,a,j;
for(i=0;i<ilen;i++)
{
if(buf[i]==key)
{
printf("存在%d",key);
j = 1;
break;
}
}
if(j!=1)
{
printf("不存在%d",key);
}
}
void main()
{
int buf[100] = {1,4,3,7,6,5,2,8,9};
findKey(buf,9,1);
}
习题:
定义一个函数:求输入的“字符串”是否是回文 "abcdcba"
#include<stdio.h>
void fun(char buf[10])
{
int i=0,j=0;
while(buf[i]!='\0')
i++;
for(;j<=i/2;j++)
{
if(buf[j]==buf[i-j-1])
{
if(j==(i-1)/2)
{
printf("yes\n");
return;
}
}
else
{
printf("no\n");
return;
}
}
}
void main()
{
char buf[10] = "abcdcba";
fun(buf);
}
习题:
定义一个函数:求某年/月/日是否是星期几?
功能:求星期
返回值:[0-6] 0-周日 1周一 2周二 ...
函数名:int weekday(int year,int month,int day);
算法:(基姆拉尔森)Weekday=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7
#include<stdio.h>
int weekday(int y,int m,int d)
{
int w = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return w+1;
}
void main()
{
int y=2018,m=7,d=15;
printf("这天是星期:%d\n",weekday(y,m,d));
}
习题:
定义一个函数:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
#include<stdio.h>
void main()
{
double sn = 100;
double hn = sn/2;
int i = 0;
for (i = 2;i<=10;i++){
sn = sn + hn * 2;
hn = hn / 2;
}
printf("第%d次落地经过%f米",i-1,sn);
}