(3)函数程序段

//测试实现无返回值函数调用


#include<stdio.h>
swap(int,int);
int main()
{
int a,b;
a=2;
b=5;
swap(a,b);
printf("a=%d, b=%d\n",a,b);
return 0;
}
swap(int x,int y)


{
int t;
t=x;
x=y;
y=t;
printf("x=%d,y=%d\n",x,y);
}
--------------------------------------------------


//测试实现有返回值的函数调用




#include<stdio.h>
int factorial(int);//注意factorial(int)要写成factorial()的话编译出错,
                    //要注意说明的函数和下面定义的函数一致(返回值和参数)。
int main()
{
int i;
for(i=1;i<=5;++i)
printf("%d!is%d\n",i,factorial(i));
return 0;
}


int factorial(int n)


{
int value;
for(value=1;n>1;--n)
value*=n;
return (value);
}




-------------------------------------------------------------


//测试被调用函数有多个返回值(学生100分值转化为五级)
#include<stdio.h>
char stog(int);
int main()
{
int score=85;
char grade;
grade=stog(score);
printf("score %d is grade %c \n",score,grade);
return 0;
}
char stog(int s) //要注意这里的stog(int s) 不能写成stog(s)会因s没有定义而编译出错
{
//上面写成stog(s)在这里定义int s;也不行
if(s>94)
return 'A';
else if(s>84)
return 'B';
else if(s>69)
return 'C';
else if(s>59)
return 'D';
else  return 'F';
}


---------------------------------------------------------------


//测试下面函数调用fa()是函数调用有返回值,fb()是过程调用只是实现一个过程无返回值,结果是a=100,b的值是垃圾数据。
#include<stdio.h>
int fa();
fb();
int main()
{
int a,b;
a=fa();
b=fb();
printf("a=%d\nb=%d\n ",a,b);
return 0;


}
int fa() //注意这里写成fa()也是可以的系统默认为int型,因为返回值是int的函数(注意仅仅是int型,char不可以)
  //定义时可以不给出返回类型,如果返回不是int的函数,则必须在定义时给出类型说明。

{
int val;
val=100;
return val;
}
fb()
{
int val;
val=100;
}


========================================================================
//给一个256以内的数,求这个数的平方
#include<stdio.h>
square(int);
int main()
{
int i=2,j;
while(i<256)
printf("%d\n",j=square(i++));//注意这里的i++;
return 0;
}
square(int x)
{
return x*x;//返回值为return (x*x);也可以。
}


-------------------------------------------------------------------------------


//给一个256以内的数,求这个数的平方
//测试把float型数据赋给int型参数,那么float型数据的小数部分被截取,只有整数部分是有效地。
#include<stdio.h>
square(int);
int main()
{
float i=1.5,j;
while(i<256.0)
printf("%f\n",j=square(i++));
return 0;
}
 square(int x)
{
return x*x;
}


-------------------------------------------------------------------------------------------
//给一个256以内的数,求这个数的平方
//被调用函数说明时 返回类型 函数名(参数类型) 必须完整


//被调用函数说明在int main()之前,或在int main()函数中都可以
//被调用函数在int main()之前定义也可以
#include<stdio.h>
int square(int); //在这里说明可以
int main()
{
int  i=1,j;

while(i<256)
printf("%d\n",j=square(i++));
return 0;
}
int  square(int x)
{
return x*x;
}




+++++++++++++++++


//被调用函数在int main()函数中说明也可以
#include<stdio.h>


int main()
{
int  i=1,j;
int square(int); //在这里说明也可以
while(i<256)
printf("%d\n",j=square(i++));
return 0;
}
int  square(int x)
{
return x*x;
}
+++++++++++++++++++


//被调用函数在int main()之前定义也可以
#include<stdio.h>
int  square(int x)
{
return x*x;
}


int main()
{
int  i=1,j;

while(i<256)
printf("%d\n",j=square(i++));
return 0;
}
===================================================================================
函数的递归调用与嵌套循环的区别


#include<stdio.h>


void main()
{
printf("we are boy.\n");

}


+++++++++++++++++++++++++++++++++++++++++
#include<stdio.h>


int main()
{
printf("we are boy.\n");
return 0;

}
+++++++++++++++++++++++++++++++++
//main()函数自己调用自己,结果终止于系统空间耗尽之时
#include<stdio.h>
int main()
{
printf("we are boy.\n");
main();
return 0;

}
++++++++++++++++++++++++++++++++++++++++
//在main()函数中用for死循环,结果将永远不会停止
#include<stdio.h>
int main()
{
for(;;)
printf("we are boy.\n");

return 0;

}


虽然上面的的函数调用和for循环实现的输出一样,但它们还是有本质的区别,
函数调用占用空间比较大,因为每次调用都会给函数分配空间。而for只是循环系统不为它分配空间,
所以以后写程序能用for循环实现就尽量不要用函数调用,只有在用for循环非常麻烦的时候才用递归。
编写递归之前,应先给出递归的边界条件和递推公式。


===============================================================================
#####这里有不明白的地方


//用函数调用实现1-9数的阶乘
#include<stdio.h>
int factorial(int);
int main()
{
int n=0; //注意从0开始

while(n++<9)  //注意这里的n++
printf("%d的阶乘为%d\n",n,factorial(n));
return 0;
}


factorial(int n)
{
if(n==1)   //边界条件判断
return 1;
else 
return n*factorial(n-1);//递推公式
}
-------------------------------------------------------------------
//用函数调用实现汉诺塔问题
//测试的结果是如果A上有n个盘子,那么搬到C上共要2^n-1次
//汉诺塔问题只能用递归才能解决,循环和别的方法根本解决不了。
//边界条件是h(1)=1,递推公式是h(n)=2h(n-1)+1


#include<stdio.h>
hanoi(int ,char,char,char);
int i=1;    //全局变量 标注第几次搬动
int main()
{


hanoi(5,'A','B','C');
return 0;
}
hanoi(int n,char a,char b,char c)
{
if(n==1)
printf("%d---%c===>%c\n",i++,a,c);
else 
{
hanoi(n-1,a,c,b);  //注意对应参数
printf("%d---%c===>%c\n",i++,a,c);
hanoi(n-1,b,a,c);
}
}


--------------------------------------------------------------


//有20级楼梯,一次可以迈一级或二级,则爬完此楼梯有几种方法?
//下面程序用函数递归调用实现边界条件是n==1或n==2,递推公式为
//c(n)=c(n-1)+c(n-2)
#include<stdio.h>
int main()
{
int c(int);
printf("%d\n",c(20));
return 0;


}
c(int n)
{
if(n==1)
return 1;
if(n==2)
return 2;
else
return c(n-1)+c(n-2);
}


===================================================================


//测试局部变量使用
//测试全局变量使用
//测试变量的存储类型


//测试static变量的使用
//测试extern变量的使用
-------------------------------------------------
//测试局部变量使用


#include<stdio.h>
sub()
{
int a=6,b=7;
printf("sub:a=%d,sub:b=%d\n",a,b);//输出a=6,b=7,如果这个函数中a,b没赋值则输出垃圾数据。


}
int main()
{
int a=3,b=4;
printf("main:a=%d, main:b=%d\n",a,b);//输出a=3,b=4。


sub();
printf("main:a=%d,main:b=%d\n",a,b);//同样输出a=3,b=4。
return 0;


}
-------------------------------------------------
//测试全局变量使用


#include<stdio.h>
int a=3,b=4;
sub()
{
int a=6,b=7;
printf("sub:a=%d,sub:b=%d\n",a,b);//注意虽然前面定义a,b是全局变量但是这个函数sub()中定义了局部的a,b并赋值则覆盖全局的a,b
//输出结果为a=6,b=7,如果这个函数中a,b没赋值则输出垃圾数据。
return 0;


}
int main()
{


printf("main:a=%d, main:b=%d\n",a,b);//输出a=3,b=4。


sub();
printf("main:a=%d,main:b=%d\n",a,b);//同样输出a=3,b=4。
return 0;


}
----------------------------------------------------------


//测试局部变量使用 (在复合语句中定义变量)




#include<stdio.h>


int main()
{
int i;
for(i=1;i<=10;i++)
{
static char j='A';//如果这里没有static 则每次在这里都要初始化,则下面的输出j永远为A。
printf("%c---%d\n",j++,i);
}
/*printf("j=%c",j);  //则编译出错 j没定义。说明j在复合语句中定义其作用域只在复合语句中*/
return 0;
}


-------------------------------------------------------------


//测试static存储类型变量
#include<stdio.h>
int main()
{
void f(int);
int a=1,i;
for(i=0;i<3;i++)
f(a);
return 0;
}


void f(int a)
{
auto int b=1;
static int c=1;
b++;
c++;
printf("a=%d  b=%d  c=%d\n",a,b,c);
}


--------------------------------------------------------------


//测试extern存储类型变量
//它的作用域是变量的定义处开始,到本程序文件的末尾
//程序编译时,外部变量将被分配在静态存储区


#include<stdio.h>
int A=13,B=-8; //相当于extern int A=13,B=-8;在这里定义A,B。
int main()
{
int max(int,int);


//extern int A,B;
printf("A=%d,  B=%d\n",A,B);//编译成功,输出A,B的值为13,-8。


printf("%d\n",max(A,B));//输出值为13。
return 0;
}


int max(int x,int y)   //定义max函数
{
return (x>y?x:y);
}


--------------------------------
#include<stdio.h>


int main()
{
int max(int,int);


//extern int A,B;
printf("A=%d,  B=%d\n",A,B);//编译出错说A,B没有定义。


printf("%d\n",max(A,B));
return 0;
}
int A=13,B=-8; //相当于extern int A=13,B=-8;在这里定义A,B。
int max(int x,int y)   //定义max函数
{
return (x>y?x:y);
}


-------------------------------------------------




#include<stdio.h>


int main()
{
int max(int,int);


extern int A,B;//在同一文件中用extern声明外部变量,扩展外部变量的作用域。
//如果不做此声明,则外部变量A,B只能在声明它们之后的程序中引用。
printf("A=%d,  B=%d\n",A,B);//编译成功,因为上面有A,B的声明。
printf("%d\n",max(A,B));
return 0;
}
int A=13,B=-8;
int max(int x,int y)
{
return (x>y?x:y);
}
-----------------------------------------------------------


#include<stdio.h>


int main()
{
int i=1,max(int,int);//####这样说明max函数同时也定义i也可以。


extern int A,B;//在同一文件中用extern声明外部变量,扩展外部变量的作用域
for(;i<9;i++)
{
printf("A=%d,  B=%d\n",A,B);//编译成功,因为上面有A,B的声明。

printf("%d\n",max(A,B));
}
return 0;
}
int A=13,B=-8;
int max(int x,int y)
{
return (x>y?x:y);
}


---------------------------------------------------
//要严格区分变量的作用域,在函数中定义或说明,在复合语句中定义或说明,在函数外定义或说明。






#include<stdio.h>


int main()
{
int i=1,max(int,int);//####这样说明max函数同时也定义i也可以。



for(;i<9;i++)
{
extern int A,B;//在同一文件中用extern声明外部变量,扩展外部变量的作用域
printf("A=%d,  B=%d\n",A,B);//编译成功,因为上面有A,B的声明。
printf("%d\n",max(A,B));
}

printf("A=%d-------------B=%d\n",A,B);//编译出错A,B没定义,因为上面A,B的声明是在复合语句中的。
printf("%d\n",max(A,B));
return 0;
}
int A=13,B=-8;
int max(int x,int y)
{
return (x>y?x:y);
}


===============================================================================


main()函数带参数的使用:
//基本格式:main(int argc,char*argv[]) 参数名字可以改,但不改变类型
//用户输入几个参数(argc),各参数之间用空格和tab键隔开,空格不能做为参数内容若要把空格
//做为参数的内容应该把字符串放到一对双引号内,第二个参数char*argv[]是一个指向字符串的指针数组
//这个字符型指针的数组的每一个指针都指向一个字符串,
//在vc++中测试要在 工程-->设置-->调试-->程序变量中 输入几个字符串 
//也可以在DOS下测试
#include<stdio.h>
int main(int argc,char*argv[])
{
int i;
printf("%d\n",argc);
for(i=0;i<argc;i++)
printf("%s\n",argv[i]);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值