C语言2:函数

目录

 一.简明函数

1.函数调用的示例:

2.形参实参区别

注:

 二.案例学习

1.案例1:两数取最大值函数,三目运算符

2.案例2:嵌套函数的使用,四个数取最大值

 3.案例3:递归函数求某数阶乘

 3.案例3:数组在函数中的调用(应用到‘一.2’中的知识)

4.案例4:函数调用二维数组,全局变量


 一.简明函数

1.函数调用的示例:

#include<stdio.h>

void printWelcome(){
	puts("=============");
	puts("Welcome!!!!!!");
	puts("=============");
}

int getDataFromX(int key){
	int data;
	data = key*key;
	return data;
}

int add(int x,int y){
	return x+y;
}

int main(){
	
	printWelcome();
	
	int x,y,z;
	
	puts("Please enter x,y = x*x");
	
	scanf("%d",&x);
	y = getDataFromX(x);
    //下面传入参数形式也可
    //y = getDataFromX(x+1);
	//y = getDataFromX(100);
	
	printf("x = %d,y = %d\n",x,y);
	
	puts("Please enter x and y, z = x + y");
	
	scanf("%d%d",&x,&y);
	printf("x = %d,y = %d,z = %d\n",x,y,add(x,y));
	
	return 0;
}

运行结果:

=============
Welcome!!!!!!
=============
Please enter x,y = x*x
5
x = 5,y = 25
Please enter x and y, z = x + y
13
67
x = 13,y = 67,z = 80

2.形参实参区别

#include<stdio.h>

//The diffierent between Formal and practical parameters.

int test(int x){
	printf("x = %d,address_of_x_in_test = %p\n",x,&x);
	return x;
}

int main(){
	int x,y;
	
	puts("Please enter x, y = x");
	scanf("%d",&x);
	y = test(x);
	
	printf("x = %d,address_of_x_in_main = %p\ny = %d,address_of_y = %p\n",x,&x,y,&y);
	return 0;
}

运行结果:

Please enter x, y = x
67
x = 67,address_of_x_in_test = 000000000061FDE0
x = 67,address_of_x_in_main = 000000000061FE1C
y = 67,address_of_y = 000000000061FE18

可见方法和主函数中x值虽然相等但是不相同,是不同的内存地址,

但是如果传入数组,就是相同的,并且可以两边同时修改。

注:

形参中不存在数组的概念,即使定义了数组大小也不行,数组名只会传入一个地址,数组首地址,8个字节表示一个地址。

 二.案例学习

1.案例1:两数取最大值函数,三目运算符

函数置于main函数之后会报错,所以增加一个前置一个原型作为函数声明:

float getMax(float x,float y);

三目运算符:

max = x>y ? x:y;

#include<stdio.h>

float getMax(float x,float y);

int main(){
	float x,y;
	
	puts("Please enter x and y");
	scanf("%f%f",&x,&y);
	
	printf("x = %f,y = %f,max = %f\n",x,y,getMax(x,y));
	return 0;
}

float getMax(float x,float y){
	float max;
	max = x>y ? x:y;
	return max;
}

2.案例2:嵌套函数的使用,四个数取最大值

#include<stdio.h>

int getMaxFromTwo(int x,int y){
	int max;
	max = x>y ? x:y;
	
	return max;
}

int getMaxFromFour(int a,int b,int c,int d){
	int max;
	max = getMaxFromTwo(a,b);
	max = getMaxFromTwo(max,c);
	max = getMaxFromTwo(max,d);
	
	return max;
}

int main(){
	int a,b,c,d;
	
	puts("Please enter a,b,c,d");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	
	printf("the biggest one is %d",getMaxFromFour(a,b,c,d));
	return 0;
}

 3.案例3:递归函数求某数阶乘

这里,使用int和long int都越界,只能算到16。

#include<stdio.h>
#include<stdlib.h>
//求某数阶乘,使用int和long int都越界,只能算到16
long int function(int n){
	long int result;
	
	if(n>=1){
		puts("越界");
		exit(-1);
	}
	
	if(n==1){
		result = 1;
	}
	else{
		result = function(n-1) * n;
	}
	
	return result;
}

int main(){
	int x;
	long int y;
	
	puts("Please enter x");
	scanf("%d",&x);
	
	y = function(x);
	printf("%d的阶乘是%ld",x,y);
	
	return 0;
}

 3.案例3:数组在函数中的调用(应用到‘一.2’中的知识)

需求,分别计算两个班级的平均分

注意:

函数中定义总分sum使用了

int sum = 0;

而不是

int sum;

因为计算完班级一总分,班级二再次调用此函数,sum值不会清零而是会在原值基础上继续叠加

#include<stdio.h>

float Average_function(int arr[],int len){
	int sum = 0;
	for(int i=0;i<len;i++){
		sum = sum + arr[i];
	}
	float Average_score = (float)sum/(float)len;

	return Average_score;
}

int main(){
	int classOne[10] = {54,96,54,87,32,51,99,11,47,66};
	int classTwo[5] = {54,25,76,35,87};
	
	int len1 = sizeof(classOne)/sizeof(classOne[0]);
	int len2 = sizeof(classTwo)/sizeof(classTwo[0]);
	
	float Average_score_ClassOne = Average_function(classOne,len1);
	float Average_score_ClassTwo = Average_function(classTwo,len2);
	
	printf("The average score of classOne is %f\n",Average_score_ClassOne);
	printf("The average score of classTwo is %f\n",Average_score_ClassTwo);
	
	return 0;
}

注:二维数组基本相同,只是需要注意格,数组是按照行数来进行存放的,所以必须指定列数。

4.案例4:函数调用二维数组,全局变量

#include<stdio.h>
//全局变量 Global variables
int min;
int max;
float average1;
float average2;
int score[10][2] = {{45,34},{62,98},{54,76},{31,59},{60,41},{88,99},{47,22},{55,84},{96,12},{74,96}};

//打印成绩单
void printScore(int Student,int Subject){
	for(int i = 0;i<Student;i++){
		printf("同学%d:",i+1);
		for(int j = 0;j<Subject;j++){
			printf("科目%d:%d分 ",j+1,score[i][j]);
		}
		putchar('\n');
	}
}

//得出两科总和成绩放到新的数组里
int sum_socre[10];

void SumScore(int Student,int Subject){
	for(int i = 0;i<Student;i++){
		for(int j = 0;j<Subject;j++){
			sum_socre[i] += score[i][j];
		}
		printf("同学%d总分:%d分",i+1,sum_socre[i]);
		putchar('\n');
	}
}

//求最高成绩函数,新增一个全局变量
int MaxScoreStudent;

int Max(int len){
	for(int i=0;i<len;i++){
		//max = max>sum_socre[i] ? max:sum_socre[i];
		if(max<sum_socre[i]){
			max = sum_socre[i];
			MaxScoreStudent = i + 1;
		}
	}
	return max;
}

//求最低成绩函数,新增一个全局变量
int MinScoreStudent;

int Min(int len){
	//先给min赋值,不然一直是0
	min = score[0][0] + score[1][0];
	for(int i=0;i<len;i++){
		//min = min<sum_socre[i] ? min:sum_socre[i];
		if(min>sum_socre[i]){
			min = sum_socre[i];
			MinScoreStudent = i + 1;
		}
	}
	return min;
}

//求单科平均成绩函数
void Average(int Student,int Subject){
	//这里不给sum赋值的话第一个值就随机大小了
	int sum[2] = {0};
	for(int j = 0;j<Subject;j++){
		for(int i=0;i<Student;i++){
			sum[j] += score[i][j];
			}
	}
	//printf("sum[0] = %d ,sum[1] = %d\n",sum[0],sum[1]);
	
	average1 = (float)sum[0]/(float)Student;
	average2 = (float)sum[1]/(float)Student;
	
	printf("科目1平均成绩%f\n科目2平均成绩%f\n",average1,average2);

}


int main(){
	int Student = sizeof(score)/sizeof(score[0]);
    int Subject = sizeof(score)/sizeof(score[0][0])/Student;
	
	puts("=============成绩单==============\n");
	printScore(Student,Subject);
	
	puts("=============总成绩==============\n");
	SumScore(Student,Subject);
	
	puts("==========最高最低成绩===========\n");
	printf("同学%d的总分最高:%d\n",MaxScoreStudent,Max(Student));
	printf("同学%d的总分最低:%d\n",MinScoreStudent,Min(Student));
	
	puts("==========单科平均成绩===========\n");
	Average(Student,Subject);
	
	return 0;
}

运行结果:

=============成绩单==============

同学1:科目1:45分 科目2:34分
同学2:科目1:62分 科目2:98分
同学3:科目1:54分 科目2:76分
同学4:科目1:31分 科目2:59分
同学5:科目1:60分 科目2:41分
同学6:科目1:88分 科目2:99分
同学7:科目1:47分 科目2:22分
同学8:科目1:55分 科目2:84分
同学9:科目1:96分 科目2:12分
同学10:科目1:74分 科目2:96分
=============总成绩==============

同学1总分:79分
同学2总分:160分
同学3总分:130分
同学4总分:90分
同学5总分:101分
同学6总分:187分
同学7总分:69分
同学8总分:139分
同学9总分:108分
同学10总分:170分
==========最高最低成绩===========

同学6的总分最高:187
同学7的总分最低:69
==========单科平均成绩===========

科目1平均成绩61.200001
科目2平均成绩62.099998

代码又臭又长,但是备注齐全,有几个要注意的点:

(1)C语言初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值!

    以下变量就只能写进main:不然报错 initializer element is not constant

    int Student = sizeof(score)/sizeof(score[0]);
    int Subject = sizeof(score)/sizeof(score[0][0])/Student;

(2)记得先给min赋值,不然怎么比较都是默认0最小

	//先给min赋值,不然一直是0
	min = score[0][0] + score[1][0];

且记录最高最低分的学生的序号时使用了全集变量,由于变量从0开始,所以给他们 +1 勿忘

(3)不给数组赋值的话第一个值就随机大小了,之前的知识遗漏

	//这里不给sum赋值的话第一个值就随机大小了
	int sum[2] = {0};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值