实验名称:实验六 函数
班级 学号 姓名
实验地点 完成日期 成绩
(一)实验目的与要求
1.掌握高级语言中定义和使用函数的方法; 2.掌握通过“值传送”调用函数的方法; 3. 掌握函数的嵌套调用和递归函数的设计方法;
4.进一步练习阅读检查与调试修改高级语言程序的方法。 (二)实验内容
1.调试运行如下二程序,分析调用函数前后程序1中a,b这二个变量的值是否发生改变?为什么?程序2中数组a的二个元素的值是否发生改变?为什么? 程序1(变量作函数实参)
int main( ) {
int a=3,b=6;
printf(\n\exchange1(a,b);
printf(\n\return 0; }
void exchange1(int x,int y) { int t; t=x;x=y;y=t;
printf(\n\}
程序2(数组名作函数实参) int main( ) {
void exchange2(int x[2]); static int a[2]={3,6};
printf(\n\ exchange2(a);
printf(\n\return 0; }
void exchange2(int x[2]) { int t;
t=x[0];x[0]=x[1];x[1]=t;
printf(\n\}
2. 写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。
本程序应当准备以下测试数据:17、2、1。分别输入数据,运行程序并检查结果是否正确。
3. 编写转换函数,将十进制整数n(-2^31<=n<=2^31-1)转换成k(2<=k<=16)进制数。字母请使用大写。(HLOJ 8001) (三)实验具体步骤
1.调试运行如下二程序,分析调用函数前后程序1中a,b这二个变量的值是否发生改变?为什么?程序2中数组a的二个元素的值是否发生改变?为什么? 程序1(变量作函数实参)
int main( ) {
int a=3,b=6;
printf(\n\exchange1(a,b);
printf(\n\return 0; }
void exchange1(int x,int y) { int t; t=x;x=y;y=t;
printf(\n\}
程序2(数组名作函数实参) int main( ) {
void exchange2(int x[2]); static int a[2]={3,6};
printf(\n\ exchange2(a);
printf(\n\return 0; }
void exchange2(int x[2]) { int t;
t=x[0];x[0]=x[1];x[1]=t;
printf(\n\}
答:在调用函数前后程序1中a,b二变量的值没有改变。因为变量作函数实参的时候,是实参a,b将值赋给了形参x,y,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递。程序2中数组a的二元素的值有发生改变。因为用数组名做函数实数时,向形参传递的是数组首元素的地址。
2. 写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。
本程序应当准备以下测试数据:17、2、1。分别输入数据,运行程序并检查结果是否正确。
解题思路:
首先,通过分析题目,自己定义一个函数来判别素数,如果是,则输出“YES”,否则输出“NO”,然后在下面把自己定义的函数写出来,进行for循环,如果n可以整除1和它本身以外的任意一个比它小的数,那么它不是素数,特别要注意的是,当n=1时,要注明1不是素数。
关键代码: int main() { int prime(int); int n; while(scanf(\ { if(prime(n)) printf(\
else printf(\ } return 0; }
int prime(int n) { int flag=1,i; for(i=2;i<=n/2&&flag==1;i++) if(n%i==0) flag=0; if(n==1) flag=0; return(flag); }
3. 编写转换函数,将十进制整数n(-2^31<=n<=2^31-1)转换成k(2<=k<=16)进制数。字母请使用大写。(HLOJ 8001)
解题思路:
首先要先搞懂进制转换的原理,先对给予的数进行短除取余直到零,然后把余数倒着写出来,此外,特别要注意的是,对于10、11、12、13、14、15等需要用大写字母A、B、C、D、E、F进行代换。
关键代码: int main() { int exchange(int n,int k); int T,t,n,k; scanf(\ for(t=0;t int exchange(int n,int k) { int i,j=0; int a[1000]; if(n<0) { } n=-n; printf(\} if(n==0) printf(\while(n>0) { a[j]=n%k; n=n/k; j++; } for(i=j-1;i>=0;i--) { if(a[i]==10) printf(\ else if(a[i]==11) printf(\ else if(a[i]==12) printf(\ else if(a[i]==13) printf(\ else if(a[i]==14) printf(\ else if(a[i]==15) printf(\ else printf(\} printf(\return 1; (四)实验结果 1.调试运行如下二程序,分析调用函数前后程序1中a,b这二个变量的值是否发生改变?为什么?程序2中数组a的二个元素的值是否发生改变?为什么? 程序1(变量作函数实参) int main( ) { int a=3,b=6; printf(\n\exchange1(a,b); printf(\n\return 0; } void exchange1(int x,int y) { int t; t=x;x=y;y=t;