目录
一.简明函数
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};