实验四_循环结构程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何来确定循环条件表达式呢?
当题中没有明确给定时,以字符输入函数getchar()接收回车符('\n')作为循环结束条件。
#include "stdio.h"
void main()
{ char c;
while((c=getchar())!='\n' )
{ if(c>='a'&&c<='z')
c=c-32;
假设变量t表示项,t的初始值为1,则第n项的表达式为:t=t*n。
递推算法,采用循环语句。
#include <stdio.h>
void main()
{
long i,n,sum=0,t=1;
for(i=1;i<=10;i++)
{
t=t*i;
sum=sum+t;
}
printf("1!+2!+...+l0!=%ld",n,sum);
do
循环体语句
while(条件表达式);
do-while循环语句的执行过程:
S1:执行循环体语句;
S2:计算条件表达式的值,并判断其值是真值(非0值),还是假值(0值),若为真值,返回执行步骤S1,否则执行步骤S3;
S3:退出循环,执行do-while语句的后继语句。
循环结构在程序设计时,需清楚四个部分,循环控制变量的初值、循环条件的判断、循环体语句(需要重复操作的语句)和改变循环控制变量的变化值。
判断一个数是否是素数,可分两步实现:
第1步,逐一验证除1和它本身之外数能否整除该数。若该数为m,则验证从2开始至m-1为止的所有数能否整除该数。
第2步,得出结论。由第1步可知若其中有一个数能整除该数,则该数不是素数,否则是素数。
将问题的所有可能的情况逐一验证,直到找到解或将全部可能的情况都测试为止的算法,称为穷举法。穷举法是程序设计中常用的算法之一。穷举算法特点是算法简单,但运行时所花费的时间量大。
{
scanf("%d",&a);
if (max<a) max=a;
i++; /*i为循环控制变量,统计输入数的个数*/
}
printf("The max value is:%d\n",max);
}
编写源程序三,程序文件名ex4_12.c:
#include<stdio.h>
void main()
{
int a,max,i;
scanf("%d",&m);
for(i=2;i<=m-1;i++)
if(m%i==0) break;
if(i<m) printf("NO\n");
else printf("YES\n");
}
第一次运行程序:
输入测试数据:23
程序运行结果:YES
第二次运行程序:
输入测试数据:145
程序运行结果:NO
在实际生活中常说重复执行某项工作多次,或重复执行某项工作,达到某种要求为止。如果需要重复执行某些操作,在程序设计就要用到循环结构。
C语言中提供了三种循环语句:for语句、while语句和do-while语句。
1.for语句是常用的一种循环语句,它的一般格式:
for(表达式1;表达式2;表达式3)
循环体语句
编写源程序二,程序文件名ex4_11.c。
#include<stdio.h>
void main()
{
int a,max,i;
scanf("%d",&a);
max=a; /*将输入的第一个数作为最大数*/
i=2; /*前面已经输入过一个数,因此i的初值从2开始*/
while (i<=10) /*循环9次*/
printf("%f ",sum);
}
输入测试数据:20
程序运行结果:s=0.583333
小结:
1.求满足能被5或9整除的所有自然数的条件表达式:i%5==0||i%9==0
2.求分数之和时,一定要考虑整型除整型的情况。源程序中变量i为整型,所以倒数1/i,在具体编程时可处理为1.0/i或1/(float)i的形式。
elseprintf("NO\n");
【4.3】编程实现:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。程序文件名ex4_3.c。
分析:本程序的关键问题求和,则采用累加算法,该算法采用循环结构。
算法思想,引入一个和变量sum,一个加数变量b,求和表达式为,sum=sum+b;累加算法就是重复执行求和表达式sum=sum+b的过程。细化问题,该求和表达式要执行多少次,或满足何条件就不再执行;每次执行时b如何变化。
}
printf("The max value is:%d\n",max);
}
输入测试数据:21 765 78 9 456 89 76 32 90 76
程序运行结果:The max value is:765
循环结构的三种循环语句可以相互转换,也就是说选择任意一种循环语句能实现的循环结构,同样可以用其余两种循环语句实现。即用for语句可以实现的循环,用while或do-while同样可以实现。当给定了循环次数,首选for循环语句,若循环次数不明确,需要通过某条件控制循环时,首选while或do-while循环语句。while语句与do-while语句的区别是,while是先判断,后执行,而do-while是先执行,后判断。
【4.4】编程实现,计算 的值。程序文件名:ex4_4.c。
分析:原题为求1+2!+…+10!。程序设计的核心是累加。观察第n-1项与第n项,可知第n-1项与第n项的关系为:n!=(n-1)!*n。由此该程序设计,可采用递推算法。
递推算法是计算机数值计算中的一个重要算法,算法思想是给定一个已知条件,根据前后项的关系,由前项推后项。
穷举法在程序设计中,主要采用循环语句和选择语句,循环语句用于控制穷举所有可能的情况,也可以说是对所有可能进行验证的范围,而选择语句判断当前设定的条件是否满足的状态解。
采用穷举法编程实现判断整数m是否是素数。程序设计的循环语句控制验证范围,1到m-1。选择语句的条件就是判断该数能否被1到m-1的数整除,若验证有一个数能整除该数,就立刻中断循环退出验证过程。
由此循环语句退出,一种可能是所有的可能都验证完退出,即从2到m-1的所有数都验证完,没有一个数能整除数m,其结论是数m是素数;另一种可能是其中一个数能整除该数,则循环语句中断退出,其结论是数m不是素数。
#include <stdio.h>
void main( )
{
int m,i;
printf("Please enter a integer\n");
【4.1】编程实现,从键盘输入10个整数,求出它们的最大数。程序文件名ex4_1.c。
分析:在上次实验,编程实现了求两个整数的最大数,现将问题扩展到20个数,算法思想是一样的。
求任意n个整数的最大(小)数的常用算法:
定义两个变量,一个变量max(min)存放最大(小)数,另一个变量a存放输入的一个整数。
S1:首先对max赋初值。通常将输入的第一个数赋给最大(小)数,即max=a(min=a);
S2:输入下一个数,并赋给a;
S3:max与a进行比较,若a大于max的值,将a的值赋给max;
S4:返回S2。
依次循环(重复执行),直到20个数都一一进行了比较,max变量中最后存储的数就是最大值。
而重复进行的“工作”,就是循环结构的循环体。
scanf("%d",&a);
max=a;
i=2;
do
{
scanf("%d",&a);
if (max<a) max=a;
i++;
}
while (i<=10);
printf("The max value is:%d\n",max);
}
小结:
1.无论选择哪种循环语句,循环体若由两条以上的语句,必须用花括号括起来,组成一条复合语句。C程序约定,循环体默认只有一条语句。
解决的两个关键问题:
1.max的初值如何给定?常采用的方法是,把输入的第一个数赋给max变量。
2.采用循环结构时,如何控制循环次数?因要从10个数中求最大值,但第一数已赋给max,因此max与剩下的9个数进行比较,所以循环9次。
本题已确定了循环次数,通常采用for循环语句。
编写源程序一,程序文件名ex4_1.c。
while (条件表达式)
循环体语句
while循环语句的执行过程:
S1:计算条件表达式的值,并判断其值是真值(非0值),还是假值(0值),若为真值,执行步骤S2,否则执行步骤S4。
S2:执行循环体;
S3:返回S1;
S4:退出循环,执行while语句的后继语句。
3.do-while循环语句,它的一般格式:
实验四程序设计-循环结构程序设计
4.1
1.理解循环条件、循环体以及循环的执行过程
2.掌握及正确使用for、while和do-while语句实现循环程序设计
3.掌握break,continue语句正确使用
4.掌握双循环结构的程序设计
5.掌握相关算法(累加、素数、最值、穷举法等)
4.2
结构化程序设计的三大结构:顺序结构、选择结构和循环结构。
2.无论何种循环语句,其执行特点是:循环条件为真,继续执行循环体,循环条件为假,退出循环。
【4.2】编程实现,判断一个正整数是否是素数,若是输出“YES”,否则输出“No”。程序文件名ex4_2.c。
分析:所谓素数(质数)就是除1和它本身之外没有其他因子的数。换句话说只能被1和它本身整除的数就是素数(质数)。
else
if(c>='A'&&c<='Z')
c=c+32;
putchar (c);
}
}
输入测试数据:ABCd#$GTabc23
程序运行结果:abcD#$பைடு நூலகம்tABC23
小结:
1.循环条件表达式(c=getchar())!='\n',依据运算符的优先级,圆括号最优先,先运算c=getchar(),从键盘上接收一个字符,赋予变量c,然后再判断变量c的值是否不等于'\n',若是条件为真,执行循环体,否则退出循环。
for循环语句的执行过程:
S1:计算表达式1的值;
S2:计算表达式2的值,并判断其值是真值(非0值),还是假值(0值)。若为真值,执行步骤S3,反之执行步骤S5;
S3:执行循环体语句;
S4:计算表达式3的值;返回步骤S2;
S5:结束循环(退出循环);继续执行for语句之后的后继语句。
2.while循环语句,它的一般格式:
#include<stdio.h>
void main()
{
int a,max,i;
scanf("%d",&a);
max=a; /*将输入的第一个数作为最大数*/
for(i=1;i<10;i++) /*循环9次*/
{
scanf("%d",&a);/*输入待比较的数*/
if (max<a) max=a;/*输入的数与max的值进行比较*/
分析:本题的关键问题之一,如何判断一个字符是小写字母还是大写字母,或者是数值字符等。
关键问题之二,如何实现大小写字母的转换。
关键问题之三,如何用getchar()实现从键盘输入任意一串字符。
前两个问题在实验三中已谈过,本次实验解决问题三。字符输入函数getchar()每次只能输入一个字符,换句话,每次只能从键盘接收一个字符,若要接收一串字符,需采用循环语句。
具体问题具体分析。由题意,求自然数的倒数之和,倒数可考虑为1/i。循环次数为n。
#include <stdio.h>
voidmain( )
{
int i,n;
float sum=0.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
if(i%5==0||i%9==0)
sum+=1.0/i;
小结:
1.验证m是否是素数的范围:2到m-1或2到m/2或2到 。
2.在验证过程中,当有一个数能整除数m,则其后的数就不必验证,可由break语句中断该循环。
3.break语句只能用在switch语句和循环语句,在循环语句中使用break语句时,通常和if语句连用,其含义是满足某个条件时,退出循环。
4.当循环退出时,循环控制变量i的值,决定了数m到底是不是素数。当i<m时,说明执行循环体时由break语句中断而退出循环,即m能被i整除,m不是素数,反之,当i>=m时,m是素数。
5.选择结构if-else可以有多种变数,程序并非唯一的。
如,if-else也可修改为:
if(i>=m)printf("YES\n");
}
程序运行结果:1!+2!+...+10!=4037913
小结:
1. 由于求阶乘的整数值比较大,所以数据类型常用长整型。
2. 采用递推算法时,一定有注意初始值的给定。
【4.5】编程实现,从键盘输入任意一串字符,以回车键结束。该字符串中的字符若是小写字母转换为大写字母,若是大写字母转换为小写字母,其它字符原样输出。程序文件名ex4_5.c。
相关文档
最新文档