您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > while-循环语句
循环结构程序设计安庆四中丁贤友while循环语句格式:while布尔表达式do循环体;功能:(1)计算布尔表达式的值;(2)若布尔表达式的值为true,则转(3),否则,转(5);(3)执行循环体;(4)转(1);(5)循环结束,执行循环体后面的语句。while循环语句的执行过程说明:(1)在进入循环体之前测试布尔表达式的值,若最初的值为false,则根本不进入循环体。(2)为了使循环能终止,循环体中一定要有影响布尔表达式的操作,否则该循环将陷入死循环。(3)循环体只能是一条简单的语句或一条复合语句。例如:s:=0;i:=1;while(i=4)dobegins:=s+i;i:=i+1;end;begin和end括起来的就是while循环语句的循环体。while循环语句的应用【例4‐8】输入一串以“?”为结束标志的字符,统计其中字母和数字的个数。问题分析:很明显,本题是一个计数问题:重复读入字符,根据字符的类别,进行统计。但是,输入多少个字符呢?题目中没有明确说明,只说明了结束输入的标记。由于这个重复操作的次数未知,不适于应用for循环语句了。而解决未知次数的循环是while循环语句所擅长的,因此本题应用while循环语句来解决。算法描述:(1)计数器初始化:字母个数zm←0,数字个数sz←0;(2)读入一个字符给ch;(3)当该字符ch不是“?”时,重复操作:①若ch是字母,则字母个数加1∶zm←zm+1,②若ch是数字,则数字个数加1∶sz←sz+1,③读入一个新字符给ch;(4)输出统计结果zm和sz;(5)结束。programexam4_8;varch∶char;zm,sz∶integer;beginzm∶=0;sz∶=0;read(ch);//在循环外读入第一个字符,使while的条件能正常判断whilech<>'?'dobeginif((ch>='a')and(ch<='z'))or((ch>='A')and(ch<='Z'))thenzm∶=zm+1//输入的是字母elseif(ch>='0')and(ch<='9')thensz∶=sz+1;//输入的是数字read(ch);//继续读入字符end;writeln('Thenumberoflettersis:',zm);writeln('Thenumberoffiguresis:',sz);end.【例4‐9】求两个正整数m和n的最大公约数。问题分析:最大公约数(greatestcommondivisor,简写为gcd)是指几个数共有的因数之中最大的一个,例如8和12的最大公约数是4,记作gcd(8,12)=4。辗转相除法的算法思想是:对于给定的两个正整数,用较大的数除以较小的数,若余数不为零,则将余数和较小的数构成一对新数,继续进行上面的除法,直到大数被小数除尽,这时较小的数就是原来两个数的最大公约数。算法描述:(1)计算被除数m除以除数n的余数r;(2)当r≠0时,重复下面操作:①m←n;②n←r;③r←mmodn;(3)输出最大公约数n;(4)结束。程序设计:programexam4_9;varm,n,r∶integer;beginwrite('Pleaseinputm,n:');readln(m,n);r∶=mmodn;//r取m和n的余数whiler<>0do//辗转相除beginm∶=n;n∶=r;r∶=mmodn;end;writeln('Thegreatestcommondivisoris:',n);end.【例4‐10】设计问题4‐3的程序。programexam4_10;varn∶integer;score,tot,min,max∶real;beginwriteln('Pleaseinputthescores,andendtheinputbyprint-1!');n∶=0;//初始化人数tot∶=0;//初始化分数,先存放总分,最后除以人数,即得平均分min∶=maxint;//初始化最低分max∶=-1;//初始化最高分read(score);whilescore<>-1do//当输入非-1时,重复统计beginn∶=n+1;//人数加1tot∶=tot+score;//分数累加ifmin>scorethenmin∶=score;//更新最低分ifmax<scorethenmax∶=score;//更新最高分read(score);end;Ifn=0thenwriteln('Notinputatall!')elsebeginwriteln('Thenumberofstudentswhotaketheexamis',n);writeln('Theaveragescoreis',tot/n∶0∶2);//由总分生成平均分writeln('Amongthem,');writeln('theminscoreis',min∶0∶2);writeln('themaxscoreis',max∶0∶2);end;end.while循环语句与for循环语句应用的互换【例4‐11】将下面用for循环语句编写的程序改写成等效的应用while循环语句的程序。vari∶integer;beginfori∶=1to10dowriteln(i);end.算法描述:(1)初始化i←1;(2)当i≤10时,重复操作;①输出i,②i←i+1;(3)结束。程序设计:programexam4_11;vari∶integer;begini∶=1;//对应for循环的初值while(i<=10)do//对应于for循环的终值beginwriteln(i);//对应于for循环的循环体i∶=i+1;//while语句中所必须的改变布尔表达式值的操作end;end.【例4‐12】用while循环语句判断一个整数n(n1)是否为质数。问题分析:在例4‐4中已经用for循环语句解决了判断n是否质数的问题。当时我们用2至n-1作为因数,重复了n-1次操作。但是这个循环次数只对质数是必须的,对于非质数,发现第一个因数,就应该结束循环,因为只要有一个1和n之外的因数,就足以证明n不是质数,不必再做判断了。于是,判断i是否是n的因数的操作只在下面两个条件同时成立时进行就足够了:(1)没出现整除;(2)i小于等于sqrt(n)。一旦不满足条件(1),退出循环,n不是质数;而不满足条件(2)时,n一定是一个质数。算法描述:(1)读入n;(2)如果n=2,直接输出Yes,否则①设定因数的初始值i←2,②当i≤sqrt(n)且nmodi≠0时,重复操作:i←i+1,③若nmodi=0,则输出No,否则输出Yes;(3)结束。programexam4_12;Varn,i∶integer;beginreadln(n);ifn=2then//单独处理2writeln(’Yes')elsebegin//下面判断大于2的数是否质数i∶=2;while(nmodi<>0)and(i<=sqrt(n))doi∶=i+1;ifnmodi=0thenwriteln('No')//由于整除而退出,说明n不是质数elsewriteln('Yes');//一直没有整除,说明n是质数end;end.例:输入若干个字符,它的终止符是“#”,计算输入的字符中字母’a’出现的次数(包括大小写)。例:求输入的一个整数的各位数字之和例:求两个自然数m,n的最小公倍数。(6)超市收银是一个很有趣的流程:扫描顾客购买的每一种商品的条形码,屏幕会显示该商品的价格,全部扫描结束,按确认键,屏幕上将显示顾客应付的总金额。现在,请你编写一个程序模拟这个收银过程。我们假定输入0,表示扫描结束。假定商品条形码与价格的对应关系如表所示:输入:以空格分隔的条形码编号,以0结束。输出:结账金额(保留2位小数)。
本文标题:while-循环语句
链接地址:https://www.777doc.com/doc-3614040 .html