實(shí)驗(yàn)5 ?函數(shù)定義、聲明與調(diào)用
任務(wù)1 ?函數(shù)的定義和聲明
1.預(yù)測(cè)下面程序的輸出,并上機(jī)運(yùn)行驗(yàn)證結(jié)果。(結(jié)果:21)
#include <stdio.h>
func(int a,int b)
{
??int c;
??c=a+b;
??return c;
}
main(?)
{
??int x=6,y=7,z=8,r;
??r=func((x--,y++,x+y),z--);
??printf("%d\n",r);
}
2.分析推測(cè)下面程序的輸出,并上機(jī)運(yùn)行驗(yàn)證結(jié)果。(結(jié)果:12)
#include <stdio.h>
unsigned fun26(unsigned num)
{
??unsigned k=1;
??do
??{ k*=num%10;num/=10; }
??while(num);
??return ?k;
}
main(?)
{
??unsigned n=26;
??printf("%d\n",fun26(n));
}
3.求出以下程序的運(yùn)行結(jié)果,并描述程序所完成的功能。
(結(jié)果:s=16。功能是:求x的n次冪即2的4次冪。)
#include <stdio.h>
main(?)
{
??int power(int x,int n);
??int x=2,n=4;
??printf("\ns=%d",power( x,n));
}
int power(int x,int n)
{
??int i,p=1;
??for(i=1;i<=n;i++)
????p=p*x;
??return(p);
}
4.上機(jī)調(diào)試下面計(jì)算兩個(gè)整數(shù)之和的程序,記錄系統(tǒng)給出的出錯(cuò)信息,指出出錯(cuò)原因并予以改正。
正確代碼為:
#include <stdio.h>
int sum( int a,int b) ?//函數(shù)不能嵌套定義,所以將sun函數(shù)拉到main函數(shù)外,同
{ ??????????????????????????時(shí)形參的每個(gè)參數(shù)前都必須要有類型
?
??{
??????return (a+b);
??}
main(?)
{
int x,y;
scanf("%d,%d",&x,&y);
??printf("%d\n",sum(x,y)); ?//形參與實(shí)參的個(gè)數(shù)要一致,所以將加號(hào)改成逗號(hào)。
?
}
?
5.上機(jī)調(diào)試下面判斷n是否是素?cái)?shù)的程序,函數(shù)fun中有邏輯錯(cuò)誤,調(diào)試并改正。
正確代碼為:
#include <stdio.h>
fun(int n)
{
??int k,yes=1;
??for(k=2;k<=n/2;k++)
????if(n%k==0) ?{yes=0; break;} ??//反證法證明,找到一個(gè)就跳出,否則會(huì)被后面覆蓋
????else ?yes=1;
??return ?yes;
}
main(?)
{
??int n;
??scanf("%d",&n);
??if(fun(n?)) ????//將main函數(shù)中的函數(shù)調(diào)用fun()改成fun(n),因?yàn)閷?shí)參的個(gè)數(shù)應(yīng)與形參對(duì)應(yīng)
????printf("%d:yes!\n",n);
??else
????printf("%d:no!\n",n);
}
6.下面程序中,函數(shù)fun的功能是根據(jù)形參m計(jì)算公式T=1/1!+1/2!+1/3!+…+1/m!的值,上機(jī)調(diào)試,請(qǐng)改正程序中的錯(cuò)誤。當(dāng)從鍵盤輸入10時(shí),給出程序運(yùn)行的正確結(jié)果(按四舍五入保留10位小數(shù))。
正確代碼為:(輸入10時(shí)的結(jié)果:1.7182818011)
#include <stdio.h>
main(?)
{?double fun(int m); ?//先調(diào)用再定義,且不是能缺省的int型,請(qǐng)加上函數(shù)說明。
??int m;
??printf("\n input ?m:");
??scanf("%d",&m);
??printf("\n t=%12.10lf \n",fun(m));
}
double fun(int m)
{
??double fac,t=0.0;
??int i=1,j;
??for(i=1;i<=m;i++)
??{
????fac=1.0;
????for(j=1;j<=i;j++) ?fac=fac*j; ?//邏輯有誤,改為:for(j=1;j<=i;j++) ?fac=fac*j;這樣才表示求i!,原程序行是求i的m次方。
????t+=1.0/fac;
??}
??return t;
}
任務(wù)2 ?函數(shù)的嵌套調(diào)用
1.跟蹤調(diào)試下面程序,注意函數(shù)調(diào)用的過程中形參、實(shí)參的關(guān)系。記錄并分析結(jié)果;將形參a,b對(duì)應(yīng)改為x,y,使之與實(shí)參變量同名,記錄并分析結(jié)果。
#include <stdio.h>
main(?)
{
??int t,x=2,y=5;
??int swap(int,int);
??printf("(1) in main: x=%d,y=%d\n",x,y);
??swap(x,y);
??printf("(4) in main: x=%d,y=%d\n",x,y);
}
swap(int a,int b)
{
??int t;
??printf("(2) in swap: a=%d,b=%d\n",a,b);
??t=a;
??a=b;
??b=t;
??printf("(3) in swap: a=%d,b=%d\n",a,b);
}
結(jié)果:
(1) in main: x=2,y=5
(2) in swap: a=2,b=5
(3) in swap: a=5,b=2
(4) in main:?x=2,y=5
將形參a,b對(duì)應(yīng)改為x,y 結(jié)果:
(1) in main: x=2,y=5
(2) in swap: x=2,y=5
(3) in swap: x=5,y=2
(4) in main: x=2,y=5
結(jié)論:無論實(shí)參、形參是否同名,交換的只是子函數(shù)(swap)中兩個(gè)變量的值。主函數(shù)中的x,y的值沒有變。
2.若輸入2、3,求以下程序的運(yùn)行結(jié)果,分析函數(shù)嵌套調(diào)用的執(zhí)行過程。
#include <stdio.h>
long sum(int a,int b);
long factorial(int n);
main(?)
{
??int n1,n2;
??long a;
??scanf("%d,%d",&n1,&n2);
??a=sum(n1,n2);
??printf("a=%ld",a);
}
long sum(int a,int b)
{ ?
??long c1,c2;
??c1=factorial(a);
??c2=factorial(b);
??return(c1+c2);
}
long factorial(int n)
{ ??
??long rtn=1;
??int i;
??for(i=1;i<=n;i++)
????rtn*=i;
??return(rtn);
}
(結(jié)果為:a=8。程序功能:求n1!+n2! 即:2!+3?。?/span>
3.運(yùn)行下面程序,寫出運(yùn)行結(jié)果。
#include "stdio.h"
main(?)
{
??int i=5;
??void palin(int n);
??printf("please input 5 characters: ");
??palin(i);
??printf("\n");
}
void palin(int n)
{
??char next;
??if(n<=1)
??{
????next=getchar(?);
????printf("\n\0: ");
????putchar(next);
??}
??else
??{
?????next=getchar(?);
?????palin(n-1);
?????putchar(next);
??}
}
(程序功能:實(shí)現(xiàn)將從鍵盤輸入的5個(gè)字符逆序輸出。如輸入:abcde.輸出:edcba)
?
4.寫出下面程序的輸出結(jié)果。
#include "stdio.h"
int abc(int u,int v);
main (?)
{
??int a=24,b=16,c;
??c=abc(a,b);
??printf("%d\n",c);
}
??int abc(int u,int v)
??{
????int w;
????while(v)
????{ w=u%v; u=v; v=w;}
????return u; ?
??}
(程序功能:求兩數(shù)的最大公約數(shù)即24,16的最大公約數(shù)。結(jié)果:8)
?
實(shí)驗(yàn)6 ?函數(shù)遞歸調(diào)用、變量的存儲(chǔ)類型及編譯預(yù)處理
任務(wù)1 ?函數(shù)的遞歸調(diào)用
1.fact(j-1)*j
2.gcd(n,m%n)
???m<n
3.//for(j=0;j<=n-i;j++)
//printf("");//刪除這兩行,因?yàn)轫敻褫敵?,不要空行了?/span>
y==1||y==x
??z=c(x-1,y-1)+c(x-1,y)
4.程序代碼如下:
#include<stdio.h> ????????????????????????
fib(int n) ??????????????????????????????????????
{ ???????????????????????????????????????????????????????
int f; ????????????????????????????????????????
????if(n==1||n==2) ?????????????????????????????
f=1; ?????????????????????????????????????????????
else ?????????????????????????????????????????
f=fib(n-1)+fib(n-2);
return(f); ??????????????????????????????
}
main()
{
int n,i,s=0;
printf("Input n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
???s=s+fib(i);
???????printf("n=%d,s=%d\n",n,s);
??}
任務(wù)2 ?變量的存儲(chǔ)類型與編譯預(yù)處理
1.t1=4,t2=12,b=100
???a=2,b=4
2.(1):1 ??(2):2 ??(3):11 ??(4):3 ??(5):2
3.7 ????8 ????9
4.Y=7
5.Y=3
6.12
???7
7.程序代碼如下:
#include "stdio.h"
#define MAX(A,B) (A)>(B)?(A):(B)
#define ZMAX(A,B,C) MAX(MAX(A,B),C)
main()
{ ?int a,b,c,t;
???printf("input a,b,c:");
???scanf("%d,%d,%d",&a,&b,&c);
???t=ZMAX(a,b,c);
???printf("max of a,b,c:%d\n",t);
}