第十章函数程序设计二.docx

上传人:b****2 文档编号:2164253 上传时间:2023-05-02 格式:DOCX 页数:23 大小:23.75KB
下载 相关 举报
第十章函数程序设计二.docx_第1页
第1页 / 共23页
第十章函数程序设计二.docx_第2页
第2页 / 共23页
第十章函数程序设计二.docx_第3页
第3页 / 共23页
第十章函数程序设计二.docx_第4页
第4页 / 共23页
第十章函数程序设计二.docx_第5页
第5页 / 共23页
第十章函数程序设计二.docx_第6页
第6页 / 共23页
第十章函数程序设计二.docx_第7页
第7页 / 共23页
第十章函数程序设计二.docx_第8页
第8页 / 共23页
第十章函数程序设计二.docx_第9页
第9页 / 共23页
第十章函数程序设计二.docx_第10页
第10页 / 共23页
第十章函数程序设计二.docx_第11页
第11页 / 共23页
第十章函数程序设计二.docx_第12页
第12页 / 共23页
第十章函数程序设计二.docx_第13页
第13页 / 共23页
第十章函数程序设计二.docx_第14页
第14页 / 共23页
第十章函数程序设计二.docx_第15页
第15页 / 共23页
第十章函数程序设计二.docx_第16页
第16页 / 共23页
第十章函数程序设计二.docx_第17页
第17页 / 共23页
第十章函数程序设计二.docx_第18页
第18页 / 共23页
第十章函数程序设计二.docx_第19页
第19页 / 共23页
第十章函数程序设计二.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第十章函数程序设计二.docx

《第十章函数程序设计二.docx》由会员分享,可在线阅读,更多相关《第十章函数程序设计二.docx(23页珍藏版)》请在冰点文库上搜索。

第十章函数程序设计二.docx

第十章函数程序设计二

第十章:

函数程序设计

(二)

实验时间:

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(n

printf(“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(;m

printf(“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(t

return(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2