目录
局部变量:在每个函数中的所定义的变量就是局部变量,指在所在函数起作用。
-
为什么要用到函数
避免代码冗长
模块化的设计思路
按功能划分,每个函数代表一个功能,而函数的名字要体现函数的功能含义,类似变量标识符 y = f(x)
-
函数的三要素
函数的要先定义再使用。
定义(三要素):函数名、参数列表、返回值。
-
函数的封装和调用
无参函数和有参函数
Void函数不需要return
//定义无参函数
void Wellcome()
{
puts("=====================");
puts("HeLL World!");
puts("=====================");
}
//形式参数,需要包含变量类型,变量名
int getDataFromX(int x)
{
int y;
y = 2*x;
return y;
}
int add (int x,int z)
{
int y;
y = x+z;
return y;
}
void setA()//空函数
{
}
int main ()
{
int x,y,z;
setA();
Wellcome();
puts("请输入一个整数:");
scanf("%d",&x);
y = getDataFromX(x); //函数调用
printf ("x=%d y=%d\n",x,y);
puts("请输入一个整数:");
scanf("%d",&x);
puts("请再输入一个整数:");
scanf("%d",&z);
y = add(x,z);
printf ("%d+%d=%d\n",x,z,y);
return 0;
}
-
形式参数和实际参数
也就是形参和实参
形参是指定义函数时用到的变量,实参是指在调用函数时所使用的变量或常量;
生命周期,指形参被调用到调用结束时的周期
传递参数,传递的是值。形参和实参值相同,地址空间不同。
-
局部变量:
-
在每个函数中的所定义的变量就是局部变量,指在所在函数起作用。
-
三步运算符:例: temp = x>y? x:y;
-
函数的嵌套
-
函数的递归
#include <stdio.h>
#include <stdlib.h>
unsigned int getReson (int x)//long int 长整型也是4个字节 unsigned无符号整型
{
unsigned int y;
if (x > 16){
printf("越界\n");
exit(-1);
}
if (x == 1){
y = 1;
}else {
y = getReson(x-1) * x;
}
return y;
}
int main ()
{
//递归函数,一边用于求阶乘或其他特殊情况
int x;
unsigned int y;
printf ("请输入你要计算的阶乘:");
scanf("%d",&x);
y = getReson(x);
printf("%d的阶乘是:%ld\n",x,y);
return 0;
}
-
数组与函数
数组与函数的结合目前实际应用不大,着重数组名当成实际参数。
void printfArry(int a[],int len)//形参中不存在数组的概念,即便中括号定义了数组的大小也没用
//传递的是数组的首地址,再操作系统中用8个字节(32位)表示一个地址
//数组是传递地址,而其他不是传递地址而是数值传递
{
int i;
for (i=0;i<len;i++){
printf("%d ",a[i]);
}
putchar('\n');
}
int main ()
{
int len;
int arry[]={1,2,3,7,45,5};
len = sizeof(arry)/sizeof(arry[0]);
printfArry (arry,len);
printfArry (&arry[0],len);//两种写法都可以,第一种写法数组名代表整个地址的首地址,第二种直接使用数组的首地址。
return 0;
}
-
二维数组与函数
合法写法:int a[3][4]
int a[][4]
不合法写法:int a[][]
定义二维数组的函数时,必须计算二维数组中一维数组中元素的个数
#include <stdio.h>
void initArry (int arry[][4],int hang,int lie)
{
int i,j;
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
printf("请输入第%d行,第%d列的数:",i+1,j+1);
scanf("%d",&arry[i][j]);
}
}
puts("\n done\n");
}
void printfArry (int arry[][4],int hang,int lie)
{
int i,j;
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
printf("%d ",arry[i][j]);
}
putchar('\n');
}
}
int getArryOfMax(int arry[][4],int hang,int lie)
{
int i,j;
int max;
max = arry[0][0];
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
if(max <arry[i][j]){
max = arry[i][j];
}
}
}
return max;
}
int main ()
{
//二维数组与函数
//求二维数组3 * 4 中的最大值
int arry[3][4];
int max;
initArry(arry,3,4);
printfArry(arry,3,4);
max = getArryOfMax(arry,3,4);
printf("二维数组中最大值是:%d",max);
return 0;
}
全局变量
作用范围:整个.c文件
在函数外直接定义变量称为全局变量,放在函数与函数之间,只作用于后面的函数。
#include <stdio.h>
int max;
int min;
float getAvr(int scores[],int len)
{
int i;
int sum = 0;
max = min = scores[0];
for(i=0;i<len;i++){
sum += scores[i];
if(max < scores[i]){
max = scores[i];
}
if(min > scores[i]){
min = scores[i];
}
}
return (float)sum/len;
}
int main ()
{
//全局变量
int scores[]={11,21,35,49,59,68,78,89,99,100};
float avr;
avr = getAvr(scores,sizeof(scores)/sizeof(scores[0]));
printf("最大值是%d,最小值是%d,平均分是:%.2f",max,min,avr);
return 0;
}
函数小练习
函数与冒泡排序法
#include <stdio.h>
void initNum(int a[],int len)
{
int i;
for (i=0;i<len;i++){
printf("请输入第%d个数:",i+1);
scanf("%d",&a[i]);
}
puts("输入完毕");
}
void printfNum(int a[],int len)
{
int i;
printf("你输入的数为:");
for (i=0;i<len;i++){
printf("%d ",a[i]);
}
putchar('\n');
}
void paiXu (int a[],int len)
{
int i,j;
int temp;
for (i=0;i<len-1;i++){
for(j=0;j<len-1-i;j++){
if(a[j]<a[j+1]){
temp = a[j];
a[j] =a[j+1];
a[j+1] = temp;
}
}
}
}
void getPaiXu (int a[],int len)
{
int i;
printf("从大到小排序为:");
for (i=0;i<len;i++){
printf("%d ",a[i]);
}
}
int main ()
{
int num[5];
int i;
initNum(num,5);
printfNum(num,5);
paiXu(num,5);
getPaiXu(num,5);
}
函数与简单排序法
#include <stdio.h>
void initArry(int arry[],int len)
{
int i;
for(i=0;i<len;i++){
printf("请输入第%d个数:",i+1);
scanf("%d",&arry[i]);
}
}
void printfArry(int arry[],int len)
{
int i;
printf("你输入的数是:");
for(i=0;i<len;i++){
printf("%d ",arry[i]);
}
}
void maxToMin(int arry[],int len)
{
int i,j;
int temp;
for (i=0;i<len-1;i++){
for(j=i+1;j<len;j++){
if(arry[i]<arry[j]){
temp = arry[j];
arry[j] =arry[i];
arry[i] = temp;
}
}
}
for(i=0;i<len;i++){
printf("%d ",arry[i]);
}
}
void getMaxToMin(int arry[],int len)
{
int i;
printf("从大到小排序为:");
for(i=0;i<len;i++){
printf("%d ",arry[i]);
}
}
int main ()
{
int arry[5];
initArry(arry,5);
printfArry(arry,5);
maxToMin(arry,5);
getMaxToMin(arry,5);
return 0;
}
补充
ASCⅡ码