/**************************************************
第七章函数
函数可以相互调用
一个函数可以被一个或者多个函数调用任意多次
函数不能嵌套定义
函数分类:
(用户角度)
1.标准函数:由系统提供
2.自定义函数
(函数形式)
1.无参数函数
形式:
类型标识符 函数名(){声明部分 语句部分}
2.有参数函数:参数传递数据
形式:
类型标识符 函数名(形式参数){声明部分 语句部分}
空函数
类型标识符 函数名(){}
形参:定义函数处的参数,不调用不占空间
实参:调用函数处的参数,可是变量,常量,表达式,调用时实参赋值给形参,实参不会因形参改变而改变
函数之间传递数据
1.参数
2.返回值
3.全局变量
函数的返回值是通过函数中的return语句获得,返回值和函数定义类型相同
函数不加类型,默认整型处理
*/
/*
void main(){
void printstar();//对函数printstar声明
void print_message();//对函数print_message函数声明
printstar();//调用
print_message();//调用
printstar();//调用
}
void printstar(){
printf("******************************************\n");
}
void print_message(){
printf("hoe do you do!\n");
}
*/
/*
void main(){
int max(int x,int y);//函数声明
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);//实参
printf("max is %d",c);
}
int max(int a,int b){//形参,定义时必须指定类型
if(a>b){
return a;
}else{
return b;
}
//int z;
//z= a>b?a:b;
//return z;
}
*/
/*
void main(){
float max(float x,float y);//函数声明
float a,b;
int c;
scanf("%f,%f",&a,&b);
c=max(a,b);//实参
printf("max is %d",c);
}
float max(float x,float y){//形参,定义时必须指定类型
float z;
z= x>y?x:y;
return z;
}
*/
/**************************************************
//参数求值的顺序
void main(){//stdcall自右向左
int f(int a,int b);
int i=2,p;
p=f(i,++i);
printf("%d\n",p);
}
int f(int a,int b){
int c;
if(a>b) c=1;
else if(a==b) c=0;
else c=-1;
return c;
}
*/
/*
函数调用方式
1.函数语句:直接调用
2.函数表达式:c=2*max(a,b);
3.函数参数:m=max(a,max(b,c));
*/
/**************************************************
//对被调用函数作声明
void main(){
float add(float x,float y);
float a,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f\n",c);
}
float add(float x,float y){
float z;
z=x+y;
return z;
}
*/
/**************************************************
实现x的y次方
*/
/*
void main(){
int pow1(int x,int y);
int a,b,c;
scanf("%d,%d",&a,&b);
c=pow(a,b);
printf("%d的%d次方是%d",a,b,c);
}
int pow1(int x,int y){
int i;
int z;
for(i=0;i<y;i++){
z=z*x;
}
//while(y){z*=x;--y;}
return z;
}
*/
/**************************************************
实现求根号
*/
/*
void main(){
int sqrt1(int x);
int a,b,c;
scanf("%d",&a);
c=sqrt(a);
if(c==-1){
printf("不存在");
}else{
printf("根号下%d是%d",a,c);
}
}
int sqrt1(int x){
int i;
int z;
for(i=0;i<x;i++){
if(i*i==x){
return z;
}else{
return -1;
}
}
}
*/
/**************************************************
统计输入的各个数字,空白符(空格、制表符、换行符)以及其他字符
*/
/*
void main(){
int blank=0,other=0,i=0,j,num[10]={0};//关键初始值都必须为0
char c;
while((c=getchar())!='*'){//f6:EOF
if(c==' '||c=='\t'||c=='\n'){blank++;}
else if((c>='0')&&(c<='9')){++num[c-'0'];}//0对应的asc码为48
else{other++;}
}
printf("%d,%d\n",blank,other);
for(j=0;j<10;j++){
printf("%d出现%d\n",j,num[j]);
}
}
*/
/**************************************************
//函数的嵌套调用
void main(){
a();
}
a(){
b();
}
b(){
return;
}
*/
/**************************************************
计算s=2的平方的阶乘+3的平方的阶乘
*/
/*
void main(){
int a,b,c;
int jc(int x);
printf("输入两个数");
scanf("%d,%d",&a,&b);
c=jc(a*a)+jc(b*b);
printf("%d",c);
}
int jc(int x){
int z=1,i;
for(i=1;i<=x;i++){
z=z*i;
}
return z;
}
*/
//递归,递归中必须有一个退出的条件,是效率低下的算法
/*
void main(){
int a,b,c;
int jc(int x);
printf("输入两个数");
scanf("%d,%d",&a,&b);
c=jc(a*a)+jc(b*b);
printf("%d",c);
}
int jc(int x){
int z;
if(x==1||x==0){
z=1;
}else{
z=x*jc(x-1);
}
return z;
}
*/
/**************************************************
//思路:1将 n-1个盘子先放到B座位上
// 2.将A座上地剩下的一个盘移动到C盘上
// 3、将n-1个盘从B座移动到C座上
//函数声明
void move(char x, char y);
void hannuo(int n,char one ,char two,char three)
{//将n个盘从one座借助two转移到three
void move(char x,char y);
if(n==1)move(one, three);
else
{
hannuo(n-1,one ,three,two);
move(one,three);
hannuo(n-1,two,one,three);
}
}
void move(char x,char y)
{
printf("%c--->%c",x,y);5r
}
void main()
{
int n;
printf("input your number");
scanf("%d",&n);
hannuo(n,'A','B','C');
return 0;
}
*/
/**************************************************
数组作为函数参数的两种形式
1.把数组元素(下标变量)作为实参使用
2.把数组作为函数的形参和实参使用,类型必须相同,是地址传递,传首地址
形参数组不定义长度
*/
/**************************************************
判别一个整数数组a[10]={1,2,3,4,-1,-2,-3,-4,2,3}中各种元素的值,若大于0则输出该值,若小于等于0则输出0值
*/
/*
void main(){
int a[10]={1,2,3,4,-1,-2,-3,-4,2,3},i;
void test(int x);
for(i=0;i<10;i++){
test(a[i]);
}
}
void test(int x){
if(x>0){
printf("%d",x);
}else{
printf("%d",0);
}
}
*/
/*
void test(int b[10]);
void main(){
int a[10]={1,2,3,4,-1,-2,-3,-4,2,3};
test(a);
}
void test(int b[10]){
int i;
for(i=0;i<10;i++){
if(b[i]>0){
printf("%d",b[i]);
}else{
printf("%d",0);
}
}
}
*/
/**************************************************
一维数组score,内放10个学生成绩,求平均值
*/
/*
void main(){
int a[10]={1,2,3,4000,-1,-2,-3,-4,2,3};
int averages(int b[10]);
printf("%d",averages(a));
}
int averages(int b[10]){//形参数组不定义长度
int total=0,i;
for(i=0;i<10;i++){
total=total+b[i];
}
return total/10;
}
*/
/**************************************************
局部变量(形参也是局部变量)和全局变量(函数外部定义的变量,有效范围从定义开始到结束)
主函数定义的变量也只在主函数有效
不同函数中可以使用相同名字的变量
可以在程序块/分程序/符合语句中定义变量,只在其内部有用
*/
/**************************************************
输入正方形的长宽高l,w,h。求体积记忆三个变电面积
*/
/*
void main(){
int l,w,h,v,s1,s2,s3;
printf("输入正方形的长宽高");
scanf("%d,%d,%d",&l,&w,&h);
v=l*w*h;
s1=l*w;
s2=l*h;
s3=w*h;
printf("体积:%d,面1:%d,面2:%d,面3:%d",v,s1,s2,s3);
}
*/
/*
int s1,s2,s3;//结束后销毁
void main(){
int l,w,h,v;//调用完销毁
printf("输入正方形的长宽高");
scanf("%d,%d,%d",&l,&w,&h);
v= vs(l,w,h);
printf("体积:%d,面1:%d,面2:%d,面3:%d",v,s1,s2,s3);
}
int vs(int l,int w,int h){
int v;
v=l*w*h;
s1=l*w;
s2=l*h;
s3=w*h;
return v;
}
*/
/**************************************************
10个学生,求扣积分,最高分,最低分
*/
/*
int ave=0,max=0,min=0;
void main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
void qiu(int b[10]);
qiu(a);
printf("%d,%d,%d",ave,max,min);
}
void qiu(int b[10]){
int total=0,i;
for(i=0;i<10;i++){
total=total+b[i];
if(max<b[i]){max=b[i];}
if(min>b[i]){min=b[i];}
}
ave=total/10;
}
*/