第五章课后作业.docx
《第五章课后作业.docx》由会员分享,可在线阅读,更多相关《第五章课后作业.docx(23页珍藏版)》请在冰点文库上搜索。
第五章课后作业
第5章循环结构及其应用
学习目标:
掌握循环结构的应用场合,循环结构的设计,循环语句的用法,设计循环结构程序。
学习内容:
while循环,do-while循环,for循环,break语句,循环嵌套,循环结构程序设计方法。
5.1一个循环结构程序实例。
要在计算机屏幕上输出30个“*”,可以使用输出函数printf()一次完成,但是程序中要重复输入30次“*”。
其实同样的操作可以换一个思路完成,那就是让计算机重复30次输出一个“*”的工作,而输出一个“*”的工作很容易用printf()语句来实现。
【例5-1】输出30个“*”。
【编程思路】
(1)定义变量i,并赋初值为1,用i来进行计数器。
(2)使用循环结构重复执行输出一个“*”的过程。
(3)每次输出一个“*”,让计数器加1,当计数器超过30就停止重复工作。
【程序代码】
#include
main()
{
inti=1;
while(i<=30)
{
printf("*");
i++;
}
printf("\n");
}
提示:
本例中如果去掉语句i++;,就会出现死循环。
5.2实现循环结构的语句
C语言提供了三种实现循环结构的语句:
while语句、do-while语句和for语句。
虽然3个语句的语法规则不同,但在使用上很相似,一般情况下可以相互转换。
当然它们有各自的特点,在实际应用中还是要根据具体情况选择恰当的循环语句。
5.2.1while语句
while语句用于当型循环结构,其一般形式为:
while(表达式)
{
循环体语句
}
while语句的执行过程是:
首先计算表达式的值,若结果为“真”(非零),则执行循环体语句;然后再计算表达式的值,重复上述过程,直到表达式的值为“假”(零)时结束循环,流程控制转到while语句的下一条语句。
小测验:
根据while语句的执行过程,下面程序的输出结果为:
#include
main()
{
intx=0,n=0;
while(x<30)
{
x=(x+1)*(x+1);
n=n+1;
}
printf("n=%d\n",n);
}
【例5-2】显示1~10的平方。
【程序代码】
#include
main()
{
inti=1;
while(i<=10)
{
printf("%d*%d=%d\n",i,i,i*i);
i++;
}
}
使用while循环结构时应注意以下几点:
(1)while循环的特点是先判断条件后执行循环体语句。
(2)while循环中的表达式一般是关系表达式或逻辑表达式,也可以是其他任何合法的表达式。
(3)循环体语句可以是一个语句,也可以是多个语句,当只有一个语句时,外层的大括号可以省略,如果循环体是多个语句时,一定要用花括号“{}”括起来,以复合语句的形式出现。
(4)循环体内一定要有改变循环条件的语句,使循环趋于结束,否则循环将无休止地进行下去,即形成“死循环”。
【例5-3】求1到100的自然数之和,即计算sum=1+2+…+100.
【程序代码】
#include
main()
{
inti,sum=0;
i=1;sum=0;
while(i<=100)
{
sum+=i;
i++;
}
printf("sum=%d\n",sum);
}
小测验:
针对【例5-3】,思考下列问题:
(1)是否可以不给sum和i赋初值?
(2)是否可以将i++改成i=i+1?
(3)是否可以将i++放置在sum=sum+i之前?
(4)在循环结束后,i的值是多少?
(5)如果求1~100之间的奇数和,即计算sum=1+3+5+…+99,程序该如何修改?
(6)求sum=1-2+3-4+5-…-100,程序该如何修改?
5.2.3do-while语句
do-while语句属于直到型循环,其一般形式为:
do
{
循环体语句
}while(表达式);
例如:
下面是一个可以输出30个“*”的do-while语句:
i=1;
do
{
printf("*");
i++;
}while(i<=30);
do-while语句的执行过程是:
首先执行一次循环体语句,然后计算表达式(循环条件)的值,若结果为“真”(非零),返回执行循环体语句,重复上述步骤,知道表达式的值为“假”(零)时结束循环,流程控制转到while语句的下一条语句。
【例5-4】把【例5-3】(求1~100的和)用do-while语句改写。
【程序代码】
#include
main()
{
inti=1,sum=0;
do
{
sum=sum+i;
i++;
}while(i<=100);
printf("sum=%d\n",sum);
}
使用do-while循环结构是应注意以下几点:
(1)do-while循环结构的特点是先执行循环体后判断条件,因此不管循环条件是否成立,循环体语句都至少被执行一次。
这是他与while循环的本质区别。
(2)不论循环体是一个语句还是多个语句,花括号“{}”都不要省略。
(3)避免出现“死循环”。
(4)注意do-while循环最后的分号“;”不能省略。
【例5-5】求n!
,即求n的阶乘,n由键盘输入。
#include
main()
{
inti=1,n;
longs=1;
printf("pleaseinputn:
");
scanf("%d",&n);
do
{
s=s*i;
i++;
}while(i<=n);
printf("%d!
=%ld\n",n,s);
}
小测验:
针对【例5-5】,思考下列问题:
(1)为什么不给s赋初值0,而赋初值为1?
(2)为什么要把变量s定义为long?
(3)当输入的n值较大时,如20,程序会怎么样呢?
如何解决?
5.2.3for语句
for语句属于当型循环,其一般形式为:
for(表达式1;表达式2;表达式3)
{
循环体语句
}
例如:
下面是一个可以输出30个“*”的for语句:
for(i=1;i<=30;i++)
printf("*");
for语句的执行过程是:
(1)首先进行表达式1的计算。
(2)判断表达式2的值,若值为“真”(非零),则执行循环体语句,然后转(3)执行;若为“假”(零),循环结束。
(3)进行表达式3的计算,然后转至第
(2)步重复执行。
小测验:
根据for语句的执行过程,写出下面程序段的输出结果。
(1)for(i=1;i<=4;i++)
printf("%d\t",i);
(2)for(x=15;x>10;x-=2)
printf("%d\n",x);
【例5-6】把例5-3(求1~100的和)用for语句改写。
【程序代码】
#include
main()
{
inti,sum=0;
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
}
本例中for语句的3个表达式实现了程序中的3个功能,即循环变量赋初值、循环条件和循环变量递增,因此写法更简洁。
小测验:
针对上面实例,思考下列问题:
(1)如果将i=1放置在for循环之前,即在for循环外提前对循环变量赋初值,那么for语句该怎么书写?
(2)修改程序,计算1+3+5+……+99的值。
使用for语句时应注意以下几点:
(1)for循环相当于下面的while循环:
表达式1:
while(表达式2)
{
循环体语句
表达式3;
}
(2)for语句有3个表达式,它们之间由分号“;”分隔,不能更换成其他分隔符号。
(3)有时根据需要可以将for语句格式中的部分或所有表达式省略,比如可以写成如下形式:
for(;表达式2;表达式3)
{循环体语句}
例5-6中代码可以改写为:
inti=1,sum=0;
for(;i<=100;i++)
{
sum=sum+I;
}
for语句还可以写成其他多种形式,不过建议最好还是使用规范的语句形式。
由于经常用表达式1进行循环变量的赋初值,用表达式2控制循环结束,用表达式3控制循环变量的递增或递减,所以规范的for语句形式为:
for(循环控制变量赋初值;循环条件;循环控制变量增/减值)
{
循环体语句
}
【例5-7】把100~200之间的不能被3整除的数输出。
【程序代码】
#include
main()
{
intn;
for(n=100;n<=200;n++)
{
if(n%3!
=0)
printf("%d",n);
}
}
小测验:
(1)例5-7中输出的数据比较多,如果要求每行只输出10个数,程序应该如何修改?
(2)在所有的两位数中,个位数比十位数大的两位数有多少个?
是哪些数?
编写程序完成。
【例5-8】判断正整数m是不是素数,m由键盘输入。
【程序代码】
#include
main()
{
intm,i,flag=0;
scanf("%d",&m);
for(i=2;i<=m-1;i++)
{
if(m%i==0)
{
flag=1;
break;
}
}
if(flag==0)
printf("%d是素数!
\n",m);
else
printf("%d不是素数!
\n",m);
}
本例中用到了break语句。
在switch语句中我们已经接触过break语句,它的功能是跳出switch语句,那么在循环结构中使用break语句,其作用是跳出循环语句。
需要注意的是:
一般只有在switch结构和循环结构中使用break语句,其作用是跳出该结构。
小测验:
素数判断中能否不使用break语句?
【例5-9】程序预期输出半径为1~10的圆的面积,但是如果有面积值超过100时,则停止执行。
【程序代码】
#include
#definePI3.14
main()
{
intr;
floatarea;
for(r=1;r<=10;r++)
{
area=PI*r*r;
if(area>100)
break;
printf("半径为%d的圆面积为:
%f\n",r,area);
}
}
5.3循环嵌套
一个循环体内又包含了另一个完整的循环结构,这种循环称为循环的嵌套。
使用循环嵌套时,三种循环语句可以自身嵌套,也可以互相嵌套。
例如:
分析下面程序段,理解循环嵌套。
(1)for(k=1;k<=5;i++)
printf("*");
输出结果为:
*****
(2)for(i=1;i<=3;i++)
for(k=1;k<=5;k++)
printf("*");
输出结果为:
***************
显然,上面程序是for循环中又包含了一个for循环,属于两层循环结构。
外层循环用变量i控制,内循环用变量k控制,外循环i从1~3循环3次,外循环每执行一次,内循环k从1~5循环5次,所以输出结果为3*5=15个“*”。
(3)for(i=1;i<=3;i++)
{for(k=1;k<=5;k++)
printf("*");
printf("\n");
}
输出结果为:
*****
*****
*****
可以看出,上面程序段仍然输出15个“*”,不过因为加入了换行操作,输出的是3行5列的“*”方阵。
小测验:
如果要输出以下效果,循环该如何设计?
*
**
***
****
*****
【程序代码】
#include
main()
{
inti,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=i;j++)
printf("*");
printf("\n");
}
}
【例5-14】输出100~200之间(包括100和200)的所有素数。
【程序代码】
#include
main()
{
intm,i,flag,n=0;
for(m=100;m<=200;m++)
{
flag=0;
for(i=2;iif(m%i==0)
{
flag=1;
break;
}
if(flag==0)
{
printf("%d",m);
}
}
}
《C语言程序设计实验教程》
习题5
【课后作业2】《C语言程序设计实验教程》
page.102-103:
1,2,4
page.108:
(2)
page.109:
(5)
注意:
将作业放在一个文件名为“[2]学号+姓名”的word文档中后上交。
(数字2表示第2次大作业)
作业上交方式:
在机房的电脑上打开“计算机”,在地址栏输入:
ftp:
//10.120.87.100后回车,将word文档复制-粘贴到打开的窗口即可。