实验四模块化设计思想和函数
实 验(实训)报
项 目 名 称 实验四 函数
所属课程名称 C语言程序设计
项 目 类 型 验 证 性
实验(实训)日期
班 级
学 号 姓 名 指导教师 马 雪 英
浙江财经学院教务处制 告
一、实验(实训)概述:
【实验目的】
1. 熟悉定义函数的方法;验证函数实参与形参的对应关系、值传递;函数重载.
2. 理解全局变量和局部变量、动态存储和静态存储变量。
3. 学会使用预编译命令
【实验要求】
1. 正确使用函数进行程序设计;
2. 正确运用实参与形参进行参数传递。
【基本原理】
见第四章课件
【实施环境】(使用的材料、设备、软件)
Visual C++ 6.0
二、实验(实训)内容:
实验任务一 用DEBUG跟踪程序流程,回答问题
第1题
【考查知识点】
函数调用、参数传递、调试
【项目内容】
用辗转相除法求最大公约数,并利用最大公约数求最小公倍数。
已经有如下正确的程序了,请为该程序建立控制台工程,然后按照要求进行测试和调试。 #include
using namespace std;
int main()
{
int gcd(int,int);
int lcm(int,int,int);
int m,n,g,l;
cin>>m>>n;
g=gcd(m,n);
cout
l=lcm(m,n,g);
cout
return 0;
}
int gcd(int u,int v)
{
}
int lcm(int u,int v,int h)
{
return(u*v/h);
}
【方案设计】
请根据课件中关于辗转相除法的相关内容,理解辗转相除法的执行过程。并画出gcd函数的流程图。
int t,r; if (v>u) { t=u; u=v; v=t; } while ((r=u%v)!=0) { u=v; v=r; } return(v);
【实验(实训)过程】(步骤、记录、数据、程序等)
(1) 测试:请拟5组数据,比如m=100,n=105等等,运行上面的程序,初步测试该程序是否正确。对每组数据,写出程序的输出结果,判断输出结果是否正确。 回答:
(2)调试:对下面每组数据,通过调试,给出每个步骤后,m、n(或u、v)变量的值。
提示1:调试方法,在cin语句处插入一个断点,进行调试,如下图所示。然后单步运行(step over),输入两个数据m和n。
提示2:当运行到g=gcd(m,n);这条语句处时,点击调试工具条上的Step Into按钮,进入到gcd函数中进行调试。
1) m=18, n=33
main函数中:
m的值是:
n的值是:
gcd函数中:
u v
进入到gcd时:
执行完if语句后:
第一次while循环执行之后:
第二次while循环执行之后:
…
main函数中:
gcd函数的返回值是:
赋值后变量g的值是:
赋值后变量l的值是:
1) m=10, n=16
main函数中:
m的值是:
n的值是:
gcd函数中:
u v
进入到gcd时:
执行完if语句后:
第一次while循环执行之后:
第二次while循环执行之后:
…
main函数中:
gcd函数的返回值是:
赋值后变量g的值是:
赋值后变量l的值是:
【结论】(结果、分析)
无
第2题
【考查知识点】
函数调用、参数传递、调试
【项目内容】
教材课后习题7。写一个函数验证著名的哥德巴赫猜想:任一个不小于 6 的偶数可以表示为两个素数之和。如6=3+3,8=3+5,10=3+7,…。在主函数中输入一个不小于6的偶数n,然后调用函数godbaha,在godbaha函数中再调用prime函数,prime函数的作用是判别一个数是否为素数。在godbaha函数中输出以下形式的结果: 34=3+31
已经有如下正确的程序了,请为该程序建立控制台工程,然后按照要求进行测试和调试。
#include
#include
using namespace std;
int main()
{
int godbaha(int);
int n;
cout
cin >>n;
godbaha(n);
return 0;
}
int godbaha(int n)
{
int prime(int);
int a,b;
for(a=3;a
{
if(prime(a))
{
b=n-a;
if(prime(b))
cout
}
}
return 0;
}
int prime(int m)
{
int i,k=sqrt(m);
for(i=2;i
{
if(m%i==0) break;
}
if (i>k) return 1;
else return 0;
}
【方案设计】
为该程序建立控制台工程。
【实验(实训)过程】(步骤、记录、数据、程序等)
(1)测试:请运行该程序,输入几个大于6的偶数,初步判断该程序的正确性。给出你测试的结果
回答:
(2) 调试:观察函数调用过程。回答下面的问题。
提示1:在main函数的cin语句处设置断点(如下图所示),进行调试,输入n的值为20。
提示2:当运行到godbaha(n);这条函数调用语句时,点击调试工具天上的Setp Into按钮,进入到godbaha函数内部进行调试。
重点观察godbaha函数中for循环执行过程中a、prime(a)、b、prime(b)这四个表达
式的值。
a prime(a) b prime(b)
第1次for循环后:
第2次for循环后:
第3次for循环后:
第4次for循环后:
第5次for循环后:
…
【结论】(结果、分析)
无
实验任务二 给出程序,记录编译、连接错误,并进行调试与运行。
(或者为程序填空题,简答题等)
第1题
【考查知识点】
函数的定义及调用、素数的判定、while循环的使用
【项目内容】
读入一批正整数(以零或负数表示结束),输出其中的素数。函数prime(m)用于判断m是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
提示:读入一批正整数(以零或负数表示结束)的含义是,在一次运行过程中,可以连续进行判断,每输入一个正整数,回车,判断该正整数是否为素数,再输入下一个数,判断。直到输入的数为0或者为负数时,结束判断。
#include
#include
using namespace std;
int main()
{
int x;
int prime(int m);
cin >>x;
while( (1) )
{
if(prime(x)) cout
else cout
cin >>x;
}
return 0;
}
int prime(int m)
{
int k,n,res;//res为0表示不是素数,为1表示是素数 if(m==1) return 0;
res=1;
n=(int)sqrt(m);
for(k=2;k
{
if(m%k==0)
{
(2) ;
break;
}
}
return (3);
}
(1) A、x=0 C、x0
(2) A、res=1 B、res=0 C、res=-1 D、res=2
(3) A、1 B、res C、0 D、-1
【方案设计】
(1) 请填写你选择的答案。
(2) 选择好答案后,为完整的程序建立控制台工程
【实验(实训)过程】(步骤、记录、数据、程序等)
(1) 如果你选择正确的话,那么输入以下数据,正确的运行过程是: 45
not prime
51
not prime
89
prime
7
prime
请测试你的程序是否正确
【结论】(结果、分析)
提示:
请记录该程序的运行过程:输入输出。比如:
123 456(表示输入,如果没有输入,则没有这一行)
a+b=579 (输出)
并尽可能对程序的执行结果进行分析。 □
第2题 问答题
【考查知识点】
带默认参数的函数
(1) 在带有默认参数的函数中,指定默认值的参数必须放在形参表列中的最右端,否则出错。为什么???
回答:
(2) 在使用带默认参数的函数时,应当在什么时候给出参数的默认值,在定义时还是在声明时?
回答:
(3) 一个函数不能既作为重载函数,又作为有默认参数的函数。为什么?
回答:
实验任务三 给出程序,要求给出程序运行结果、回答问题,或者设计测试数据等。
第1题
【考查知识点】
自动变量、静态局部变量、函数定义及调用、参数传递
【项目内容】
05~06学年《程序设计基础》课程期末考试 四 程序分析 第1题
#include
using namespace std;
int f(int a)
{
auto int b=0;
static int c=3;
b=b+1;
c=c+1;
return a+b+c;
}
int main()
{
int a=2,i;
for(i=0;i
cout
cout
return 0;
}
【方案设计】
为该程序建立控制台工程。
【实验(实训)过程】(步骤、记录、数据、程序等)
(1) 请给出程序的输出结果
回答:
(2) 请分析每次函数调用后b和c的值分别是多少
f函数中:
b c
第一次执行完函数f中的语句后:
第二次执行完函数f中的语句后:
第三次执行完函数f中的语句后:
(3) 请根据这道题,总结静态局部变量的含义。
回答:
【结论】(结果、分析)
无
第2题
【考查知识点】
求余、取整数各位上数字的方法、函数定义及调用
【项目内容】
下面的程序是实现:输入一个正整数,统计该正整数的各位上数字中,0出现了几次,1出现了几次,…。如没有出现,则不输出该位数字的信息。
#include
using namespace std;
int f(int number, int digit)
{
int count=0;
while(number!=0)
{
if(number%10==digit)
count++;
number=number/10;
}
return count;
}
int main()
{
unsigned int num;
cin >>num;
for(int i=0; i
if(f(num,i)!=0)
cout
return 0;
}
【方案设计】
为该程序建立控制台工程。
【实验(实训)过程】(步骤、记录、数据、程序等)
(1) 请拟5个正整数,尽量大一点,但不要超出unsigned int所表示的范围。然后运行程序,输入每个正整数,记录各自的输出。
回答:
(2) 请分析f函数中while循环的功能,并画出流程图。
while(number!=0)
{
if(number%10==digit)
count++;
number=number/10;
}
【结论】(结果、分析)
无
实验任务四 根据题目说明,编程实现并进行程序调试
第1题
【考查知识点】
函数的的定义及调用
【项目内容】
《C++程序设计及习题及参考答案》P70页,第45题。
编写程序:任意输入3个整数,找出其中的最大值。用函数maximum()找出3个数中的最大值,主函数输入三个数并输出最大值。
提示:3个整数是在main函数中通过键盘输入的,然后调用maximum函数求出这三个数中的最大值并输出。maximum函数的功能是接受从main函数传过来的3个数,求出最大值后,返回给main函数。
【方案设计】
提示:请在此粘贴你的完整程序。□
【实验(实训)过程】(步骤、记录、数据、程序等)
提示:请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手) ,请参照实践指导第4章和附录A,对程序的错误进行修改并记录。□
回答:
【结论】(结果、分析)
提示:
请记录该程序的运行过程:输入输出。比如:
123 456(表示输入,如果没有输入,则没有这一行)
a+b=579 (输出)
并尽可能对程序的执行结果进行分析。 □
第2题
【考查知识点】
函数的的定义及调用、3个数的排序
【项目内容】
编写程序:任意输入3个整数,然后对这三个整数按从小到大的顺序进行排序。在主函数中输入三个数,用函数sort()对这3个数进行排序。
提示:因为return语句只能返回一个值,因此在sort函数中对这3个整数排好序后,是不能把这3个数都返回到main函数的,因此只能在sort函数中进行输出。
【方案设计】
提示:请在此粘贴你的完整程序。□
【实验(实训)过程】(步骤、记录、数据、程序等)
提示:请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手) ,请参照实践指导第4章和附录A,对程序的错误进行修改并记录。□
回答:
【结论】(结果、分析)
提示一:
请记录该程序的运行过程:输入输出。比如:
123 456(表示输入,如果没有输入,则没有这一行)
a+b=579 (输出)
并尽可能对程序的执行结果进行分析。 □
提示二:
请多拟几组数据,验证你的程序时候正确。 □
回答:
第3题
【考查知识点】
库函数的调用、输出格式控制
【项目内容】
2005年秋浙江省高等学校计算机等级考试试卷(二级C),试题五 程序设计题 第2题 输出一张平方根表(如下表所示),x是整数,取值范围是[5,100],请调用库函数sqrt()计算平方根。
x sqrt(x)
5 2.24
6 2.45
… …
100 10.00
【方案设计】
提示:请在此粘贴你的完整程序。□
【实验(实训)过程】(步骤、记录、数据、程序等)
提示:请如实记录你在实验过程中出现的错误(如发现错误无法解决,请举手) ,请参照实践指导第4章和附录A,对程序的错误进行修改并记录。□
回答:
成绩:
指导教师签名:批阅日期: 【结论】(结果、分析) 无 三、指导教师评语及成绩: 评语: