实验5 函数定义、声明与调用
任务1 函数的定义和声明
1.预测下面程序的输出,并上机运行验证结果。(结果: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.分析推测下面程序的输出,并上机运行验证结果。(结果: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.求出以下程序的运行结果,并描述程序所完成的功能。
(结果: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.上机调试下面计算两个整数之和的程序,记录系统给出的出错信息,指出出错原因并予以改正。
正确代码为:
#include <stdio.h>
int sum( int a,int b) //函数不能嵌套定义,所以将sun函数拉到main函数外,同
{ 时形参的每个参数前都必须要有类型
{
return (a+b);
}
main( )
{
int x,y;
scanf("%d,%d",&x,&y);
printf("%d\n",sum(x,y)); //形参与实参的个数要一致,所以将加号改成逗号。
}
5.上机调试下面判断n是否是素数的程序,函数fun中有逻辑错误,调试并改正。
正确代码为:
#include <stdio.h>
fun(int n)
{
int k,yes=1;
for(k=2;k<=n/2;k++)
if(n%k==0) {yes=0; break;} //反证法证明,找到一个就跳出,否则会被后面覆盖
else yes=1;
return yes;
}
main( )
{
int n;
scanf("%d",&n);
if(fun(n )) //将main函数中的函数调用fun()改成fun(n),因为实参的个数应与形参对应
printf("%d:yes!\n",n);
else
printf("%d:no!\n",n);
}
6.下面程序中,函数fun的功能是根据形参m计算公式T=1/1!+1/2!+1/3!+…+1/m!的值,上机调试,请改正程序中的错误。当从键盘输入10时,给出程序运行的正确结果(按四舍五入保留10位小数)。
正确代码为:(输入10时的结果:1.7182818011)
#include <stdio.h>
main( )
{ double fun(int m); //先调用再定义,且不是能缺省的int型,请加上函数说明。
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;
}
任务2 函数的嵌套调用
1.跟踪调试下面程序,注意函数调用的过程中形参、实参的关系。记录并分析结果;将形参a,b对应改为x,y,使之与实参变量同名,记录并分析结果。
#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);
}
结果:
(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对应改为x,y 结果:
(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
结论:无论实参、形参是否同名,交换的只是子函数(swap)中两个变量的值。主函数中的x,y的值没有变。
2.若输入2、3,求以下程序的运行结果,分析函数嵌套调用的执行过程。
#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);
}
(结果为:a=8。程序功能:求n1!+n2! 即:2!+3!)
3.运行下面程序,写出运行结果。
#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);
}
}
(程序功能:实现将从键盘输入的5个字符逆序输出。如输入:abcde.输出:edcba)
4.写出下面程序的输出结果。
#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;
}
(程序功能:求两数的最大公约数即24,16的最大公约数。结果:8)
实验6 函数递归调用、变量的存储类型及编译预处理
任务1 函数的递归调用
1.fact(j-1)*j
2.gcd(n,m%n)
m<n
3.//for(j=0;j<=n-i;j++)
//printf("");//删除这两行,因为顶格输出,不要空行了。
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);
}
任务2 变量的存储类型与编译预处理
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);
}