一、实验目的和要求 (1)掌握正确的函数定义与调用,需要时会正确使用函数声明。会正确设置形式参数,理解参数传递及程序的执行流程。 (2)理解各种不同存储类别变量的生命期与作用域 (3)进一步熟悉调试器的使用,会利用调试器进行查错改错,会跟踪程序运行的每一步,观察变量的变化情况。 二、实验环境(实验设备)
硬件: 微型计算机
软件: Microsoft Visual C++6.0
三、实验原理及内容 实验题目(1)编程序exp4_2.c,先定义一个函数,其原型为:void DrawPic(int n,char c);功能为:打印一个n行的由字符c组成的等腰三角形(方法可参考主教材例4.11)。主函数中给出3次调用,分别打印出由7行’*’、11行’@’、20行’$’组成的等腰三角形。尽量使图形居中打印。通过修改与n对应的实参值,观察n最大值可以取到多少,再超过将无法正确输出等腰三角形。 实验解答: ① 源程序exp4_2.c的代码是:
#include<stdio.h>
int main()
{
int i, j;
for (i = 1;i <= 7;i++)
{
for (j = 1;j <= 7 - i;j++)
{
printf(" ");
}
for (j = 1;j <= 2 * i -1;j++)
{
printf("c");
}
printf("\n");
}
return 0;
}
② 多次运行程序,输入不同的数据,得到不同结果,请填写下表
期望得到的结果 | 你所使用的调用语句 | 程序的输出结果是否与期望相符 |
---|
7行’*’相符 | for (i = 1;i <= 7;i++)printf(“c”); | 相符 | 11行’@’ | for (i = 1;i <= 11;i++)printf("@"); | 相符 | 20行’$’ | for (i = 1;i <= 20;i++)printf("$"); | 相符 | 最长的一行正好顶屏幕两边,图形符号为’#’ | for (i = 1;i <= 95;i++)printf("#"); | 相符 | 无法正确显示的图形 | for (i = 1;i <= 95;i++) | 相符 |
实验题目(2)编程序exp4_5.c,验证歌德巴赫猜想:2000以内的正偶数(不包括2)都能够分解为两个质数之和,即验证歌德巴赫猜想对2000以内的正偶数成立。(算法提示:将整数分解为两部分,然后判断出分解出的两个整数是否均为质数。若是,则满足题意并输出;否则重新进行分解和判断。(其中,判断一个整数是否为质数部分用函数实现,其余功能是否用函数实现自行决定)。 实验解答: ① 源程序exp4_5.c的代码是:
#include<stdio.h>
int judge_prime(int n)
{
int i;
for (i = 2;i <n ;i+=2)
{
if (n % i==0)
break;
}
if (i >= n)
return 1;
else
return 0;
}
int main()
{
int n;
scanf_s("%d", &n);
for (int i = 3;i<n;i++)
{
if (judge_prime(i) == 1 && i % 2 == 1 && judge_prime(n - i) == 1 && (n - i) % 2 == 1)
{
printf("%d=%d+%d\n",n,i,n-i);
break;
}
}
return 0;
}
② 多次运行程序,输入不同的数据,请填写下表
你输入的数据 | 你程序的输出结果 |
---|
1000 | 3+997 | 6 | 3+3 | 8 | 3+5 | 10 | 5+5 |
实验题目(3)用调试器观察实验教材程序exp4_8.c的运行过程,并记录各种变量在每一步执行时的变化情况,填写下表(如果某一步该变量不在作用域内,请在表格中注明)
跟踪点 | 全局变量a | f的形参a | f的自动局部变量b | f的静态局部变量c | 主函数的i |
---|
int i; | 1 | | | | | 第1次for行 | | | | | -858993460 | a = a+2; | 1 | | | | 0 | printf行 | | 3 | | | 0 | 第1次f函数左括号处 | | 3 | | | | auto int b = 2; | | 3 | -858993460 | | | static int c = 3; | | 3 | 2 | 3 | | a = a+1; | | 3 | 2 | 3 | | b = b+1; | | 4 | 2 | 3 | | c = c+1; | | 4 | 3 | 3 | | return (a+b+c); | | 4 | 3 | 4 | | 第1次f函数右括号处 | | 11 | 3 | 0 | | 第2次for行 | | | | | 0 | a = a+2; | 3 | | | | 1 | printf行 | 5 | | | | 1 | 第2次f函数左括号处 | | 5 | | | | auto int b = 2; | | 5 | -858993460 | | | static int c = 3; | | 5 | 2 | -858993460 | | a = a+1; | | 5 | 2 | 4 | | b = b+1; | | 6 | 2 | 4 | | c = c+1; | | 6 | 3 | 4 | | return (a+b+c); | | 6 | 3 | 5 | | 第2次f函数右括号处 | | 14 | 5 | 1 | | 第3次for行 | | | | | 1 | a = a+2; | 5 | | | | 2 | printf行 | 7 | | | | 2 | 第3次f函数左括号处 | | 7 | | | | auto int b = 2; | | 7 | -858993460 | | | static int c = 3; | | 7 | 2 | -858993460 | | a = a+1; | | 7 | 2 | 5 | | b = b+1; | | 8 | 2 | 5 | | c = c+1; | | 8 | 3 | 5 | | return (a+b+c); | | 8 | 3 | 6 | | 第3次f函数右括号处 | | 17 | 7 | 2 | | 第4次for行 | | | | | 2 | 主函数的return 0;处 | 7 | | | | |
实验题目(4):编程序exp4_7.c,用递归方法实现求解两个整数的最大公约数,并与迭代方法作比较。 实验解答: ①程序exp4_7.c代码如下:
#include<stdio.h>
int GCD(int m, int n);
int main()
{
int b, x, y;
printf("请输入两个正整数:");
scanf_s("%d,%d", &x, &y);
b = GCD(x, y);
printf("最大公约数为%d\n", b);
return 0;
}
int GCD(int m, int n)
{
if (!(m % n))
return n;
else
return(GCD(n, m % n));
}
② 多次运行程序,输入不同的数据,请填写下表 你输入的数据 你程序的输出结果
36,18 18
24,16 8
36,6 6
44,24 4
|