C语言循环实验报告 -

更新时间:2023-09-15 09:31:01 阅读量: 资格考试认证 文档下载

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

实验名: 循环结构 实验目的

1、掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环 的次数。 2、了解条件型循环结构的基本测试方法。 3、掌握如何正确地控制计数型循环结构的次数 4、了解对计数型循环结构进行测试的基本方法 5、了解在嵌套循环结构中,提高程序效率的方法

二、实验内容

(一)) 题目 1

1、题目内容描述

1、下面是一个计算 e 的近似值(使误差小于给定的δ)的程序。 main() {

double e=1.0,x=1.0,y,detax; int i=1;

printf(“\\n please input enter a error:”); scanf(“%lf”,&detax); y=1/x;

while(y>=detax) { x=x*I; y=1/x; e=e+y; ++i; }

printf(“.10lf”,e); }

2、实验步骤

(1)阅读上面的程序,写出程序所依据的计算公式。

(2)当输入的 detax 各是什么值时,能分别使程序按下面的要求运行: .不进入循环; .只循环一次; .只循环两次; .进入死循环(程序将永远循环下去)。 为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?

(3)原程序中 while 语句中的 y>=detax,分别换成 y>detax,y=detax,y

(4)把原程序中 while 语句之前的 y=1/x 语句去掉,观察程序的运行将会发生什么样 的变化。 假如不知道机器内的程序实际上是怎么写的,输入什么样的 detax 就能测试出少了上述 这条语句。

(5)若把原程序中的++i 换成 i++,观察程序的运行发生了什么变化? 假如不知道这条语句到底是怎么写的,输入什么样的 detax 就能测试出这条语句写错了.

1

(6)把原程序中的 while 结构改写成 do—while 结构,再分别按上述的(2)、(3)两步进 行实验。

2、输入和输出信息描述及数据类型确定; (1)、输入数据

序号 输入数据描述 1 e,x,y,detax 2

i

(2)输出数据

序号 输出数据描述 1

E

3、程序源代码(填写程序调试正确后的代码) #include int main() {

double e,x,y,detax; int i; e=1.0; x=1.0; i=1.0;

printf(\ scanf(\ y=1/x;

while(y>=detax) {

x=x*i; y=1/x; e=e+y; ++i; }

printf(\ return 0; }

7、程序调试 错误错误信息(列出出错语句以及出错序号 提示) 1 2 3

格式不对

数据类型 double int 数据类型 double

是否解决 是

解决方法 手动调整

在main()前加上int

将double e=1.0,x=1.0,y,detax;int i=1; 改为double e,x,y,detax;int i;e=1.0;x=1.0;i=1.0;

将printf(“\\n please input enter a error:”);改为printf(\

warning: return type defaults 是 to 'int' [-Wreturn-type]|

error: stray '\\243' in program| 是 error: stray '\\273' in program| D:\\程序\\e近似值\\main.c||In function 'main'

error: stray '\\241' in program|

4

5 6 7

error: stray '\\241' in program| 是 error: 'I' undeclared (first use in this function)| c|19|error: stray '\\241' in

是 是

2

将scanf(“%lf”,&detax);改为 将I改为i

将printf(“.10lf”,e);改为

program|

8

c|20|warning: control reaches 是 end of non-void function [-Wreturn-type]|

printf(\在后一个大括号前加上return 0;

8、测试与结果分析

(1)、测试数据与结果 测试测试用例选取原序号 因 1 2 3

不循环 循环一次 循环两次

测试输入

数据 2 1 0.7 0

测试输出结果 1.0000000000 2.5000000000 2.5000000000 无

是否正确 是 是 是 是

结果分析

死循环

(2)、相关问题回答 答:e=1+1/2+1/6…+1/i!

(1)阅读上面的程序,写出程序所依据的计算公式。

(2)当输入的 detax 各是什么值时,能分别使程序按下面的要求运行: .不进入循环; .只循环一次; .只循环两次; .进入死循环(程序将永远循环下去)。 为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?

答:大于1不进入循环,等于1只循环一次,大于0.5小于1只循环两次,等于0进入死循环(程序将永远循环下去)。应增加printf(“i=%d”,i-1);

(3)原程序中 while 语句中的 y>=detax,分别换成 y>detax,y=detax,y

答:y>detax ,输入不小于1时不进行循环,输出1;输入小于1时则会进行循环。y=detax,当输入为0时,y被赋值为0,直接结束循环;当输入不为0,则进入死循环。y

(4)把原程序中 while 语句之前的 y=1/x 语句去掉,观察程序的运行将会发生什么样 的变化。 假如不知道机器内的程序实际上是怎么写的,输入什么样的 detax 就能测试出少了上述 这条语句。 答:输入1.

(5)若把原程序中的++i 换成 i++,观察程序的运行发生了什么变化? 假如不知道这条语句到底是怎么写的,输入什么样的 detax 就能测试出这条语句写错了.

(6)把原程序中的 while 结构改写成 do—while 结构,再分别按上述的(2)、(3)两步进 行实验。 答:(2)步与原来while相同。(3)步当有的输入条件不符合判断条件时,仍会先进行一次循环后结束,而while则直接结束。

#include int main() {

double e,x,y,detax; //定义变量

int i;

e=1.0; //赋值 x=1.0; i=1.0;

printf(\

scanf(\输入detax

3

y=1/x; do {

x=x*i; y=1/x; e=e+y; ++i;

}

while(y>=detax); //执行do…while循环 printf(\输出 printf(\}

(二)) 题目 2 1、题目内容描述

下面是一个用以计算 的 C 程序。 main() {

int i ,j; long sum=0;

for(i=1,i<=20,i++) for(j=1;j<=3;j++) sum=sum+(i+1)*(i+1)*(j+2) printf(“sum is :%d\\n”,sum); }

2、 实验步骤

(1)将上述程序中的和分别做什么样修改,能使程序按如下要求运行: .不循环; .外循环 1 次,不进入内循环; .外循环,内循环各 1 次; .外循环 1 次,内循环 2 次;外循环 2次, 内循环 1 次; .外循环 19 次,内循环 3 次; .外循环 20 次,内循环 2 次; .外循环 21 次,内循环 3 次。 (2)试修改程序,以便能知道控制表达式 i=1;j<=20;i++ 和 j=1;j<3;j+= 各执行了多少次? (3)内循环与外循环的控制表达式进行对换,观察程序的执行结果有无变化,并且观 察对换后的外循环与内循环控制表达式执行的总次数有无变化? (4)将(3)中程序写为 main() {

int i,j,k; long sum=0; for (j=1.j<=3.j++) { k=j+2;

for(i=1;i<=20;i++)

sum=sum+(i+1)*(i+1)**k; }

printf(“sum is :%d\\n”,sum); }

观察程序的执行结果有无变化? (5)将(3)中程序改写为

4

main() {

int I,j,m,n; long sum=0; for(j=1;j<=3;j++) {

m=j+2;

for(I=1;j<=20;I++) {

n=I+1; sum=sum+m*m*k; }

}

printf(“sum is :%d\\n”,sum); }

观察程序的执行结果有无变化?

(6)在(5)的程序中,若将外循环控制表达式分别做如下修

改: .j=1;j<3;j++ .j=1;j=3;j++ .j=1;j>=3;j++ .j=1;j>3;j++ .j=1;j<=3;j-- .j=1;j>3;j-- .j=1;j<3;j++ .j=0;j<=3;j+= .j=0;j<3;j++ j=1;j<=3;j++ j=1;j<3;++j 观察程序的执行结果有无变化

2、输入和输出信息描述及数据类型确定; (1)、输入数据 序号 1 2 序号 1

3、程序源代码(填写程序调试正确后的代码) #include main() { }

4、程序调试 错误序号

错误信息(列出出错语句以及出错提示)

是否解决 5

解决方法

int i ,j; long sum=0;

for(i=1;i<=20;i++)

for(j=1;j<=3;j++)

sum=sum+(i+1)*(i+1)*(j+2);

输入数据描述 I,j sum

输出数据描述 sum

数据类型 int long int 数据类型 Long int

(2)输出数据

printf(\

1 2 3 4 5 6

|6|warning: value computed is not used 是 [-Wunused-value]|

|2|warning: return type defaults to 'int' [-Wreturn-type]|

|9|error: expected ';' before 'printf'| 是 |9|error: stray '\\241' in program| |10|warning: control reaches end of non-void function [-Wreturn-type]| |9|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]|

否 是 是 是

将for(i=1;i<=20;i++)改为for(i=1;i<=20;i++) 在main()前加上int

sum=sum+(i+1)*(i+1)*(j+2)后面加上分号 将printf(“sum is :%d\\n”,sum);改为printf(\加上return 0;

(2)、相关问题回答

(1)将上述程序中的和分别做什么样修改,能使程序按如下要求运行: .不循环; .外循环 1 次,不进入内循环; .外循环,内循环各 1 次; .外循环 1 次,内循环 2 次;外循环 2次, 内循环 1 次; .外循环 19 次,内循环 3 次; .外循环 20 次,内循环 2 次; .外循环 21 次,内循环 3 次。 答:外循环1次,不进入内循环:改为for(i=1,i=1,i++) for(j=1;j>3;j++) .外循环,内循环各1次: 改为for(i=1;,i=1;i++) for(j=1;j=1;j++) .外循环1次,内循环2次:改为for(i=1;i=1;i++) int j =1;for(;j<=2;j++) .外循环2次, 内循环1次: 改为for(i=1;i<=2;i++) for(;j<2;j++)

.外循环19次,内循环3次: 改为for(i=1;i<=19;i++) int j=1; for(;j<=3;j++) .外循环20次,内循环2次:改为 for(i=1;i<=20;i++) int j=1; for(;j<=2;j++) .外循环21次,内循环3次: 改为for(i=1;i<=21;i++) int j=1; for(;j<=3;j++)

(2)试修改程序,以便能知道控制表达式 i=1;j<=20;i++ 和 j=1;j<3;j+= 各执行了多少次?

答:添加printf(\分别执行60和20次。

(3)内循环与外循环的控制表达式进行对换,观察程序的执行结果有无变化,并且观 察对换后的外循环与内循环控制表达式执行的总次数有无变化?

答:无,次数外循环3次,内循环60次,内循环不变,外循环次数改变 (4)将(3)中程序改写观察程序的执行结果有无变化? 无。 (5)将(3)中程序改写 观察程序的执行结果有无变化? 无。 (6)在(5)的程序中,若将外循环控制表达式分别做如下修改:

j=1;j<3;j++ .j=1;j=3;j++ .j=1;j>=3;j++ .j=1;j>3;j++ .j=1;j<=3;j-- .j=1;j>3;j-- .j=1;j<3;j++ .j=0;j<=3;j+= .j=0;j<3;j++ j=1;j<=3;j++ j=1;j<3;++j 观察程序的执行结果有无变化 答:(1).j=1;j<3;j++ 结果23170(2)j=1;j=3;j++结果死循环(3)j=1;j>=3;j++结果0

.(4)j=1;j>3;j++结果 0(5)j=1;j<=3;j—结果死循环(6)j=1;j>3;j— 结果不运行(7)j=1;j<3;j++ 结果23170(8)j=0;j<=3;j+=结果有错(9)j=0;j<3;j++结果29790(10)j=1;j<=3;j++结果39720 .(11)j=1;j<3;++j结果23170。

(三)、题目 3 1、 题目内容描述

绘制等腰空心梯形,下底和高都为输入变量n,n=5时,打印图形如右:

6

2、程序源代码(填写程序调试正确后的代码)

#include

int main() {

int i,x,n,j; //定义变量 printf(\ scanf (\输入格式 for(i=n;i>=1;i--) {

for(j=0;j

printf(\当j小于n-i时循环输出空格 for(x=1;x<=2*i+n-2;x++) {

if(x>1&&x<2*i+n-2&&(i!=n)&&(i!=1))

printf(\若满足条件则打印空格

if(x==1||x==2*i+n-2||i==1||i==n)

printf(\若满足则打印* }

printf(\换行 } return 0; }

3、测试与结果分析 (1)、测试数据与结果 测试

测试用测试输入测试输出结果

是否

序号 例选取数据

正确原因

1

6

正确

2

8

正确

7

结果分

3 13 正确

(四)题目4 1、题目内容描述

想一个1~100之间的数,猜对: right,猜错:wrong并提示大小。(1)最多猜10次猜多个数,(不对就猜下一个数

6、程序源代码(填写程序调试正确后的代码) 猜十次:

#include

#include //预处理magic #include //时间函数

int main() {

int magic,number,i; //定义变量 i=1;

srand(time(NULL));

magic = rand() % 100 + 1; //产生随机数 for (i=1;i<=10;i++) {

printf(\请输入你猜的数字:\\n\

scanf (\输入number if (number

printf(\数字略小\\n\若小于则输出该语句 else if(number>magic)

printf(\数字略大\\n\若大于则输出该语句 else if(number==magic) {

printf(\你猜对了\\n\

break; //正确则输出你猜对了,停止循环 }

} if(i==10)

printf(“你已经猜错十次,游戏结束\\n”); //十次都猜错则输出该语句 return 0;

8

2)10次猜} 猜多个

#include

#include //预处理magic #include //时间函数

int main() {

int magic,number,i; //定义变量 i=0; char reply; do {

srand(time(NULL));

magic = rand() % 100 + 1; //产生随机数 for (i=0;i<=10;i++) //进入循环。猜十次 {

printf(\请输入你猜的数字:\\n\

scanf (\输入number if (number

printf(\数字略小\\n\若小于则输出该语句 else if(number>magic)

printf(\数字略大\\n\若大于则输出该语句 else if(number==magic)

{

printf(\你猜对了\\n\

break; //正确则输出你猜对了,停止循环 } }

printf(\你要继续玩吗?(Y/N or y/n)\

getchar(); //清除回车符

}

while (reply == 'Y'||reply == 'y'); //用do… while循环处理已知结束条件 printf(\游戏结束\\n\

return 0; }

以上两个程序因数据过大,故没有写测试用例,但我已经试过无误。

9

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

Top