C++实验六 函数

更新时间:2024-05-29 15:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验名称:实验六 函数

班级 学号 姓名

实验地点 完成日期 成绩

(一)实验目的与要求

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;

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(变量作函数实参)

程序2(数组名作函数实参)

2. 写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。

本程序应当准备以下测试数据:17、2、1。分别输入数据,运行程序并检查结果是否正确。

3. 编写转换函数,将十进制整数n(-2^31<=n<=2^31-1)转换成k(2<=k<=16)进制数。字母请使用大写。(HLOJ 8001)

(五)收获与体会

在做第一题的时候,那时候直接把程序复制进去,再建立程序的过程中,不断的提示错误,后来是在老师的提醒下才成功的,然后看到结果后思索了下,就想明白了。在做第二题的时候,由于之前做过求素数的问题,所以就套用下函数的格式之类的就能做了,没有编程上的问题。在做第三题的时候,是在老师的提示下,知道了进制转换的原理才做出来的。

做了这次的实验报告,有一点值得肯定的是,对于函数有更加深刻的了解。尤其是第一题让我明白了变量作函数实参和数组名作函数实参的区别。这几题做下来最大的感受还是让我觉得做题的思路和题目所用的原理是编程的基础。尤其是第三题,如果你连进制转换是怎么来的都不知道的话那谈何编程呢。

本文来源:https://www.bwwdw.com/article/cfy6.html

Top