实验十一 函数(2)
班级______________姓名___________指导老师_____________成绩___________
第_____________机房___________号机器 时间:________________________
实验目的:1,进一步掌握函数的定义和调用。
2,掌握函数的嵌套调用。
3,了解函数的递归调用。
4,重点掌握数组作函数参数。
实验要求:每次实验前,学生要先预习实验内容,写出分析结果或程序,经实验指导老师检查后,上机运行、调试程序,得出最终正确结果。
实 验 内 容
一、读程序
要求:读懂程序,写出分析结果;上机运行程序,得到运行结果,比较之。
1,
# include <stdio.h>
f(int b[ ],int m,int n)
{ int i,s=0;
for(i=m;i<n;i=i+2) s=s+b[i];
return s;
}
main()
{ int x,a[ ]={1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
}
分析结果
运行结果
2,
# include <stdio.h>
char cchar(char ch)
{
if(ch>=’A’&&ch<=‘Z') ch=ch-‘A'+‘a';
return ch;
}
main()
第一部分 C语言程序设计上机指导
·59·
·59·
{ int i=0;
char s[ ]="ABC+abc=defDEF";
while( s[i] )
{ s[i]=cchar(s[i]);
i++;
}
printf("%s\n",s);
}
分析结果
运行结果
3,
#include <stdio.h>
func1(int i);
func2(int i);
char st[]="hello,friend!";
func1(int i)
{ printf("%s",st[i]);
if(i<3){i+=2;func2(i);}
}
func2(int i)
{ printf("%s",st[i]);
if(i<3){i+=2;func1(i);}
}
main()
{ int i=0; func1(i); printf("\n");}
分析结果
运行结果
4,
#include <stdio.h>
sort(int a[ ],int n)
{ int i,j,t ;
for( i=0 ;i<n-1 ; i++ )
for( j=i+1; j<n ; j++)
if(a[i]<a[j])
{ t=a[i]; a[i]=a[j] ; a[j]=t ; }
}
main()
{ int aa[10]={1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i=0;i<10;i++) printf("%d,",aa[i]);
printf('\n');
}
分析结果
运行结果
C语言程序设计上机指导与同步训练
·60·
·60·
5,
#include <stdio.h>
long f( int g)
{ switch(g)
{ case 0:return 0;
case 1,
case 2,return 1; }
return ( f(g-1)+ f(g-2));
}
main ( )
{ long int k;
k = f(9);
printf("\nk= %d\n",k);
}
分析结果
运行结果 k=34
6,
#include <stdio.h>
int f(int b[ ][4])
{ int i,j,s=0;
for(j=0;j<4;j++)
{ i=j;
if(i>2) i=3-j;
s+=b[i][j];
}
return s;
}
main( )
{ int a[4][4]={{1,2,3,4},{0,2,4,5},{3,6,9,12},{3,2,1,0}};
printf(“%d\n”,f(a) );
}
分析结果
运行结果
二、完成程序
要求:根据要求,分析给出的上下语句,填写程序。
1,以下程序调用findmax函数返回数组中的最大值,在下划线处应填入正确内容。
# include <stdio.h>
findmax(int a[5],int n)
{ int i;
int s ;
for(i=1,s=a[0]; i<n; i++)
if ( ) s = a[i];
第一部分 C语言程序设计上机指导
·61·
·61·
return(a); }
main()
{ int x[5]={12,21,13,6,18};
printf("%d\n",findmax(x,5));
}
2,mystrlen函数的功能是计算字符串的长度,并作为函数值返回。请填空,并配写主调函数。
#include <stdio.h>
int mystrlen(char str[ ])
{ int i;
for(i=0; ____________!=‘\0';i++);
return(_______);
}
main ( )
{
_______________;
____________________;
_______________________;
}
3,以下程序中函数 reverse 的功能是将 a 所指数组中的内容进行逆置,请填入正确
内容。
#include <stdio.h>
reverse(int a[ ],int n)
{ int i,t;
for(i=0;i<n/2;i++)
{ t=a[i];______________;_______________;}
}
main()
{ int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;
reverse(b,10);
printf("\n");
for(i=0;i<10;i++)
printf("%d,",b[i]);
for(i=6;i<10;i++) s+=b[i];
printf("\n%d\n",s);
}
4,通过函数求f(x)的累加和,其中f(x)=x
*
x+1。
#include <stdio.h>
int SunFun(int n) ;
ont F( int x) ;
main()
{
printf("The sum=%d\n",SunFun(10));
}
SunFun(int n)
{
C语言程序设计上机指导与同步训练
·62·
·62·
int x,s=0;
for(x=1;x<=n;x++) s+=F( ____________ );
return s;
}
F( int x)
{ return (___________);}
三、调试程序
要求:分析下列程序是否正确,如有错,错在哪儿?应如何改正?如正确,运行结果如何?上机调试之。
1,以下程序是将字符串中所有指定字母由小写转换成大写字母。
ss(char s[ ],char t)
{ int i=0;
while(s[i])
{ if(s[i]==t) s[i]=t-‘a’+‘A’;
i++;
}
}
main()
{ char str1[100]=“abcddfefdbd”,c=‘d’;
ss(str1[0],c);
printf(“%s\n”,str1);
}
运行结果,正确
错误所在,错误
应改为,
2,函数sstrcmp()的功能是对两个字符串进行比较。当s数组中字符串和t数组中字符串相等时,返回值为0;当s数组中字符串大于t数组中字符串时,返回值大于0;当s数组中字符串小于t数组中字符串时,返回值小于0(功能等同于库函数strcmp())。
#include <stdio.h>
int sstrcmp(char s[ ],char t[])
{ int i=0,j=0 ;
while(s[i]&&t[j]&& s[i]== t[j] ) ;
return s[i]-t[j];
}
main()
{ int x;
char s1[50],s2[50];
scanf("%s%s",s1,s2);
x= sstrcmp(s1,s2);
printf("\n%d\n",x);
}
第一部分 C语言程序设计上机指导
·63·
·63·
运行结果,正确
错误所在,错误
应改为,
3,以下程序通过调用子函数,实现将a数组中的两元素值交换;b数组中两元素值不交换。
swap1(int c[ ])
{ int t;
t=c[0];c[0]=c[1];c[1]=t;
}
swap2(int c0,int c1)
{ int t;
t=c0;c0=c1;c1=t;
}
main( )
{ int a[2]={3,5},b[2]={3,5};
swap1(a[0]) ;
swap2(&b[0],&b[1]);
printf(“%d %d %d %d\n”,a[0],a[1],b[0],b[1]);
}
运行结果,正确
错误所在,错误
应改为,
4,以下程序的功能是用递归方法计算学生的年龄,已知第一位学生年龄最小,为 10
岁,其余学生一个比一个大2岁,求第10位学生的年龄。
main()
{ int age( int n) ;
int n =10;
printf (,Age is %d\n”,age (n);
};
int age(int n);
{ int c;
c = age (n-1)+2 ;
return ( c ) ;
}
运行结果,
正确
错误所在,错误
应改为,
C语言程序设计上机指导与同步训练
·64·
·64·
四、写程序
1,函数 delete 的作用是删除有序数组 a 中的指定元素 x,主调函数中调用g16833g2489
m=delete(a,n,x ); 其中n 为删除g2081数组元素的个数,请写g1998删除delete函数内容。
2,g13546写一个函数Sum,计算g1231一g17767入的g6984数的g2520位数字g1055和,在主函数中g17767入g16825g6984数,
并g17767g1998g2520位数字g1055和。
3,g13546写一个函数,g1363g17767入的一个字符串g6365g2465序g4396g6930,在主函数中g17767入和g17767g1998字符串。
4,g17767入3g12193g1147g2709的4个g7388的g19156g18339,用函数求g8611g12193g2842g2709的g5191g3355g19156g18339,并g17767g1998。