第十章函数程序设计二.docx
《第十章函数程序设计二.docx》由会员分享,可在线阅读,更多相关《第十章函数程序设计二.docx(23页珍藏版)》请在冰点文库上搜索。
第十章函数程序设计二
第十章:
函数程序设计
(二)
实验时间:
2009年5月4日实验地点:
实验人:
专业:
班级:
实验题目:
函数程序设计
(二)
实验目的:
掌握递归函数的使用;更好区分各种变量类型。
实验过程:
例子:
例7.6用弦截法求方程x3-5x2+16x-80=0的根。
#include
floatf(floatx)
/*定义f函数,以实现f(x)=x3-5x2+16x-80*/
{floaty;
y=((x-5.0)*x+16.0)*x-80.0;
return(y);
}
floatxpoint(floatx1,floatx2)
/*定义xpoint函数,求出弦与x轴交点*/
{floaty;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return(y);
}
floatroot(floatx1,floatx2)
/*定义root函数,求近似根*/
{inti;
floatx,y,y1;
y1=f(x1);
do
{x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)/*f(x)与f(x1)同符号*/
{y1=y;
x1=x;}
else
x2=x;
}while(fabs(y)>=0.0001);
return(x);
}
main()/*主函数*/
{
floatx1,x2,f1,f2,x;
do
{
printf(“inputx1,x2:
\n”);
scanf(“%f,%f”,&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf(“arootofequationis%8.4f”,x);
}
***例7.9hanoi(汉诺)塔问题
voidmove(charx,chary)
{
printf(“%c---->%c\n”,x,y);
}
voidhanoi(intn,charone,chartwo,charthree)
/*将n个盘从one座借助two座,移到three座*/
{
if(n==1)move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
intm;
printf(“inputthenumberofdiskes:
”);
scanf(“%d”,&m);
printf(“Thesteptomoving%3ddiskes:
\n”,m);
hanoi(m,′a′,′b′,′c′);
}
例7.10有两个数组a、b,各有10个元素,将它们对应地逐个相比(即a[0]与b[0]比,a[1]与b[1]比……)。
如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次为不同的值),则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。
main()
{intlarge(intx,inty);/*函数声明*/
inta[10],b[10],i,n=0,m=0,k=0;
printf(“enterarraya:
\n”);
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“\n”);
printf(“enterarrayb:
\n”);
for(i=0;i<10;i++)
scanf(“%d”,&b[i]);
printf(“\n”);
for(i=0;i<10;i++)
{if(large(a[i],b[i])==1)n=n+1;
elseif(large(a[i],b[i])==0)m=m+1;
elsek=k+1;}
printf(“a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]
if(n>k)printf(“arrayaislargerthanarrayb\n”);
elseif(nprintf(“arrayaissmallerthanarrayb\n”);
else printf(“arrayaisequaltoarrayb\n”);
}
large(intx,inty)
{intflag;
if(x>y)flag=1;
elseif(x elseflag=0;
return(flag);
}
例7.11有一个一维数组score,内放10个学生成绩,求平均成绩。
floataverage(floatarray[])
{inti;
floataver,sum=array[0];
array[2]=array[2]+100;
for(i=1;i<10;i++)
sum=sum+array[i];
aver=sum/10;
return(aver);
}
main()
{floatscore[10],aver;
inti;
printf(“input10scores:
\n”);
for(i=0;i<10;i++)
scanf(“%f”,&score[i]);
printf(“\n”);
aver=average(score);
printf(“averagescoreis%5.2f”,score[2]);
printf(“averagescoreis%5.2f”,aver);
}
例7.13
用选择法对数组中10个整数按由小到大排序。
所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。
共比较9轮。
voidsort(intarray[],intn)
{inti,j,k,t;
for(i=0;i {k=i;
for(j=i+1;j if(array[j] t=array[k];
array[k]=array[i];
array[i]=t;}}
main()
{inta[10],i;
printf(“enterthearray\n”);
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
sort(a,10);
printf(“thesortedarray:
\n”);
for(i=0;i<10;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
比较:
1)对于n个元素,原汁原味的”冒泡排序”算法要做的比较次数是固定的:
(n -1)*n/2次的比较。
交换次数呢?
如果一开始就是排好序的数据,则交换次数为0。
一般情况下为3*(n-1)*n/4;最惨时(逆序)为3* (n-1)*n/2。
2)同冒泡排序一样,选择排序的外层循环要进行n-1次,而内层为n/2次,所以总比较次数为:
(n-1)*n/2。
交换次数最好时为:
3*(n-1),最坏时为n^2/4+3*(n-1)。
例7.14有一个3×4的矩阵,求所有元素中的最大值。
解此题的算法是:
先使变量max的初值为矩阵中第一个元素的值,然后将矩阵中各个元素的值与max相比,每次比较后都把”大者”存放在max中,全部元素比较完后,max的值就是所有元素的最大值。
max_value(intarray[][4])
{inti,j,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)max=array[i][j];
return(max);
}
main()
{inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf(“maxvalueis%d\n”,max_value(a));
}
例7.15有一个一维数组,内放10个学生成绩,写一个函数,求出平均分,最高分和最低分。
floatMax=0,Min=0;/*全局变量*/
floataverage(floatarray[],intn)/*定义函数,形参为数组*/
{inti;
floataver,sum=array[0];
Max=Min=array[0];
for(i=1;i {if(array[i]>Max)Max=array[i];
elseif(array[i]sum=sum+array[i];
}
aver=sum/n;
return(aver);
}
main()
{floatave,score[10];
inti;
for(i=0;i<10;i++)
scanf(“%f”,&score[i]);
ave=average(score,10);
printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n”,Max,Min,ave);
}
例7.16外部变量与局部变量同名。
inta=3,b=5;/*a,b为外部变量*/
max(inta,intb)/*a、b为局部变量*/
{intc;
c=a>b?
a:
b;
return(c);
}
main()
{inta=8;/*a为局部变量*/
printf(“%d”,max(a,b));
}
例7.17考察静态局部变量的值。
f(inta)
{autointb=0;自动变量当执行第二次时b=0;
staticintc=3;静态变量当执行第二次时c=4
b=b+1;
c=c+1;
return(a+b+c);
}
main()
{inta=2,i;
for(i=0;i<3;i++)
printf(“%d”,f(a));
}
例7.18打印1到5的阶乘值。
intfac(intn)
{staticintf=1;
f=f*n;
return(f);
}
main()
{inti;
for(i=1;i<=5;i++)
printf(“%d!
=%d\n”,i,fac(i));
}
例7.20用extern声明外部变量,扩展程序文件中的作用域。
intmax(intx,inty)/*定义max函数*/
{intz;
z=x>y?
x:
y;
return(z);
}
main()
{externA,B;/*外部变量声明*/即让程序到该程序外去找相应的AB的值
printf(“%d”,max(A,B));
}
intA=13,B=-8;*/定义外部变量*/
例7.21用extern将外部变量作用域扩展到其他文件。
本程序的作用是给定b的值,输入A和m,求A×b和Am的值。
文件file1.c中的内容为:
intA;/*定义外部变量*/
main()
{intpower(int);/*对调用函数作声明*/
intb=3,c,d,m;
printf("enterthenumberaanditspowerm:
\n");
scanf("%d%d",&A,&m);
c=A*b;
printf("%d*%d=%d\n",A,b,c);
d=power(m);
printf("%d*%d=%d",A,m,d);
}
文件file2.c中的内容为:
externA;/*声明A为一个已定义的外部变量*/
power(intn);
{inti,y=1;
for(i=1;i<=n;i++)
y*=A;
return(y);
}
例7.22有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。
用外部函数实现。
File1.c(文件1)
main()
{externenter_string(charstr[80]);
externdelete_string(charstr[],charch);
externprint_string(charstr[]);
charc;
charstr[80];
enter_string(str);
scanf("%c",&c);
delete_string(str,c);
print_string(str);
}
file2.c(文件2)
#include
enter_string(charstr[80])/*定义外部函数*/
{gets(str);}
file3.c(文件3)
delete_string(charstr[],charch)
{inti,j;
for(i=j=0;str[i]!
='\0';i++)
if(str[i]!
=ch)
str[j++]=str[i];
str[j]='\0';}
file4.c(文件4)
print_string(charstr[])
{printf("%s",str);
}
总结:
static与extern在单文件程序与多文件程序中的应用。
补充:
选择题
1.若有以下函数定义:
intfun()
{
staticintk=0;
return++k;
}
以下程序段运行后屏幕输出为(D)
inti;
for(i=1;i<=5i++)
fun();
printf(“%d”,fun());第六次调用
A.0B.1C.5D.6
2.以下程序运行后屏幕输出为(D)
#include〈stdio.h〉
inta=2,b=3;
intmax(inta,intb)
{
intc;
c=a>b?
a:
b;
return(c);
}
main()
{
inta=4;
printf(“%d”,max(a,b));
}
A.2,3B.2C.3D.4
看程序:
1、关于static,观察运行结果
#include
voidfactorial()
{
staticlongn=1;
staticintm=1;
printf(“NO.%d%d!
is%d\n”,m,m,n);
m++;
n*=m;
}
main()
{
intk=1;
while(k++<=10)factorial();
}自增自减运算符比关系运算符高级循环九次
2、关于extern,观察结果
#include
main()
{
autointm=0;
doublex=1.001;
externinttimes;
settimes();
for(;mprintf(“x=%f”,x);
}
inttimes;
settimes()
{
times=10;
}
3、关于变量的作用域
#include
chara[]=“generala”,b[]=“localb”;
main()
{
voidx();
chara[]=“locala(0)”;
x();
printf(“main:
%sand%s\n”,a,b);locala(0)localb
}
voidx()
{
chara[]=“locala
(1)”,c[]=“localc
(1)”;
{
charc[]=“localc
(2)”;
printf(“%s,%sand%s\n”,a,b,c);locala
(1),localb,localc
(2)
}
printf(“x():
%s,%sand%s\n”,a,b,c);locala
(1),localb,localc
(1)
}
4、嵌套调用的例子
#include
main()
{
doublecal_e(intn);
intn;
printf(“pleaseinputapositivenumber”);
scanf(“%d”,&n);
printf(“eis%lf\n”,cal_e(n));
}
doublecal_e(intn)
{
doublefac_v(intn);
doublee=1;
while(n)e+=fac_v(n--);循环语句
return(e);
}
doublefac_v(intm)
{
doublev=1.0;
while(m)v/=m--;循环语句
return(v);
}
5、实参是二维数组名,形参是一维数组
doublefmax(doublearray[],intarrlen)
{
doublet;
inti;
t=array[0];
for(i=1;i{printf(“%d,%f\n”,i,array[i]);
if(treturn(t);
}
main()
{intk;
doublea[4][5]={{1,1},{2,2,2},{3,3,3,3},{4,4,4,4,4}};
k=printf(“themaxis%f\n”,fmax(a,20));k?
printf(“%d”,k);}
6、实参与形参是数组名
main()
{
intinverse(charstr[]);
charstr[100];
printf(“inputstring:
”);
scanf(“%s”,str);abcdestrlen(str)=5
inverse(str);
printf(“inversestring:
%s\n”,str);
}
intinverse(charstr[])
{
chart;
inti,j;
for(i=0,j=strlen(str);i{t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
}
7、二维数组的应用
voidmain()
{inti,j,s=0,l,v[3],a[5][3];
printf(“inputscore\n”);
for(i=0;i<3;i++)
{for(j=0;j<5;j++)
{scanf(“%d”,&a[j][i]);111112222233333
s=s+a[j][i];
}
v[i]=s/5;v[0]=1v[1]=2v[2]=3
s=0;
}
l=(v[0]+v[1]+v[2])/3;
printf(“math:
%d\nclanguag:
%d\ndbase:
%d\n”,
v[0],v[1],v[2]);
printf(“total:
%d\n”,l);
}
8、利用递归函数,实现如下运算:
1(n=0)
f(n,x)=n(n=1)
((2*n-1)*n*f((n-1),x)-(n-1)*f((n-2),x))/n(n>1)
编制程序如下:
main()
{inti,x,n;
floatp(int,int);
printf(“\ninputn&x\n”);
scanf(“%d%d”,&n,&x);
printf(“n=%d,x=%d\n”,n,x);
for(i=0;i<=n;i++)
printf(“P%d(%d)=%6.2f\n”,i,x,p(i,x));
}
floatp(intn,intx)
{
if(n==0)
return
(1);
elseif(n==1)
return(x);此处的x代表主函数中的x
elsereturn(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n);
}
第九章预处理命令
选择题:
1.若有定义:
#definePI3,则表达式PI*2*2的值为(A)
A.12B.4C.3D.不确定
2.以下叙述中,正确的是(A)
A、宏展开不占用运行时间,只占用编译时间
B、预编译处理命令行必须以分号结束
C、一个源程序只能有一个预编译处理命令行
D、使用带参数的宏定义时,应该说明每个参数的数据类型
3、以下的叙述中不正确的是(C)
A、宏展开不占用运行时间,只占用编译时间
B、宏名无类型
C、宏名必须用大写字母表示
D、预处理命令行都必须以#号开始
4.以下叙述中,正确的是(B)
A."#define PRICE=30"定义了30等价的符号常量PRICE
B.预编译处理命令行都必须以"#"开头
C.宏名只能是含大写字母和数字字符
D.在程序的一行上可以书写几个有效的宏定义
5.下面程序的输出结果是(C)
#include〈stdio.h〉
#defineONE1
#defineTWOONE+1
#defineTHREETWO+1
voidmain()
{
printf(“%d\n”,THREE-ONE);
}
A.产生错误,B.1C.2