C语言之函数

目录

为什么要用到函数

函数的三要素

函数的封装和调用

形式参数和实际参数

局部变量:在每个函数中的所定义的变量就是局部变量,指在所在函数起作用。

三步运算符:例: temp = x>y? x:y;

函数的嵌套

函数的递归

数组与函数

二维数组与函数

合法写法:int a[3][4]

全局变量

函数小练习

函数与冒泡排序法

函数与简单排序法

补充


  • 为什么要用到函数

避免代码冗长

模块化的设计思路

按功能划分,每个函数代表一个功能,而函数的名字要体现函数的功能含义,类似变量标识符 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Ⅱ码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值