第五章 循环结构程序设计
- 格式:doc
- 大小:217.50 KB
- 文档页数:23
第5章循环结构程序设计习题解答1.输入n个整数,求这n个数之中的偶数平均值,并输出。
#include<stdio.h>void main(){int n,i,x,k=0,s=0;printf("Input a number(n):");scanf("%d",&n);printf("Input %d numbers:",n);for(i=0;i<n;i++){scanf("%d",&x);if(x%2==0){s+=x;k++;}}s/=k;printf("average=%d\n",s);}2.输入一串字符,直到输入一个星号*为止,统计(输出)其中字母个数和数字字符个数。
#include<stdio.h>void main(){int n=0,m=0;char c;printf("Input a string character:");do{scanf("%c",&c);if(c>='0'&&c<='9')n++;else if(c>='A'&&c<='Z'||c>='a'&&c<='z')m++;}while(c!='*');printf("number_char=%d\n",n);printf("letter_char=%d\n",m);}3.从键盘输入一正整数n,计算该数各位数字之和并输出。
例如,输入数是5246,则计算5+2+4+6=17并输出。
#include<stdio.h>void main(){int n,r,m=0,s=0;printf("Input a number(int):");scanf("%d",&n);do{r=n%10;s=s+r;n/=10;if(m==0)printf("%d",r);//加式中的第1项不带“+”elseprintf("+%d",r);m++;}while(n>0);printf("=%d\n",s);}4.输入一个字符串,将其中的大写字母改为小写字母,小写字母改为大写字母,然后输出。
【教材】《C语言程序设计(第2版)》清华大学出版社,黄保和,江弋编著。
2011年10月第二版。
ISBN:978-7-302-26972-4。
售价:35元。
【答案版本】本习题答案为2012年2月修订版本。
一、选择题1. 设有程序段”int k=10; while(k=0) k=k-1;”,则下面叙述正确的是D)循环体语句一次也不执行。
A. while循环执行10次B. 循环是无限循环C. 循环体语句执行一次D. 循环体语句一次也不执行2. 设有程序段”int x=0,s=0;while(!x!=0) s+=++x; printf(“%d”,s);”则A)运行程序段后输出1。
A. 运行程序段后输出1B. 程序段执行无限次C. 运行程序段后输出0D. 程序段中的控制表达式是非法的3. 下面循环语句中,错误的是D) int a=1,b=2;do b-- while(b= =0);。
A. int a=1,b=2; while(b--);B. int a=1,b=2; do a++; while(a==b);C. int a=1,b=2; while(a=3);D. int a=1,b=2; do b-- while(b==0);4. 已知”int i=5;”,下列do…while循环语句的循环次数为C) 5。
do{ printf(“%d\n”,i--); } while(i!=0);A. 0B. 1C. 5D. 无限5. 循环语句”for(int i=0,j=10; i==j; i++,j--)”的循环次数是A) 0。
A. 0B. 5C. 10D. 无限6. 下述有关break语句的描述中,不正确的是C) break语句用于if语句的内嵌语句内,它结束该if语句。
A. break语句用于循环体内,它将结束该循环B. break语句用于开关语句,它结束该开关语句C. break语句用于if语句的内嵌语句内,它结束该if语句D. break语句在一个循环体内可使用多次7. 下面关于循环语句的描述中,错误的是B)循环体内必须同时出现break语句和continue 语句。
教案讲稿第五章循环结构程序设计[旧课复习]:复习内容:1.多分支选择结构语句2.选择结构的嵌套复习目的:学生回顾多分支选择结构的实现语句和嵌套语句的使用复习时长:大约8分钟[新课导入]:导入方式:以日常生活中的实例让学生理解什么是循环结构导入目的:增强学生的理解能力导入时长:大约7分钟[新课讲授]:重点:Do…Loop和For…Next循环语句的使用难点:多重循环语句的使用方法:运用多媒体辅助教学,采用讲授法和案例教学法5.1循环语句循环结构是专门用于实现有规律的重复性操作的算法结构,是结构化程序设计的3种基本结构之一。
所谓循环,是指在一定的条件下多次重复执行一组语句。
循环结构由两部分组成。
(1)循环体:即要重复执行的语句序列。
(2)循环控制部分:指定循环条件来控制重复次数的语句。
正常情况下,循环次数必须是有限的。
5.1.1 Do…Loop语句若事先不知道循环次数,只知道循环结束条件,可以使用Do…Loop循环。
Do…Loop循环语句有前测型循环和后测型循环两种语法结构。
1. 前测型Do…Loop循环前测型循环是先判断条件,根据条件成立与否决定是否执行循环体,这种情况下,循环体有可能一次都不被执行。
前测型循环有两种语法格式:格式1(当型前测型):Do While〈条件〉[〈语句列1〉][ Exit Do ][〈语句列2〉]Loop格式2(直到前测型):Do Until 〈条件〉[〈语句列1〉][ Exit Do ][〈语句列2〉]Loop说明:(1)当VB执行Do While…Loop循环时,先判断指定的条件,若条件为True,执行循环体,条件为False时退出循环;当执行Do Until…Loop循环时,先判断指定的条件,若条件为False,执行循环体,条件为True时退出循环。
(2)〈条件〉是条件表达式,为循环的条件,其值为True或False。
如果省略条件即条件为Null,则条件会被当作False。
第5章循环结构程序设计一、单项选择题1.在C语言中,下列说法中正确的是()。
A) do-while语句构成的循环不能用其它语句构成的循环来代替。
B) do-while语句构成的循环只能用break语句退出。
C) do-while语句构成的循环在while后的表达式非零时结束循环。
D) do-while语句构成的循环,在while后的表达式为零时结束循环。
2. break语句不能出现在语句中()A) switch B)for C) while D) if…else3.对于break语句和continue语句的说法错误的是()A) break语句不能用于循环语句和switch语句之外的任何其他语句中。
B) break和continue也可以用于if语句中C) continue语句只结束本次循环,而不是终止整个循环的执行。
D) break语句是结束整个循环过程,不再判断执行循环的条件是否成立。
4. 语句while(!y);中的表达式!y等价于A)y==0 B)y=1 C)y=!0 D) y==15. 若有“int a=1,x=1;”,则循环语句“while(a<10) x++; a++;”的循环执行()。
A)无限次B)不确定次C)10次D)9次6. 有以下程序段int k=0while(k) k++;则while循环体执行的次数是A) 无限次B) 有语法错,不能执行C) 一次也不执行D) 执行1次7. 下列循环语句中有语法错误的是( )A while(x=y) 5;B while(0) ;C do 2;while(x= =b);D do x++ while(x= =10);8. 当运行时输入:abcd$abcde ,下面程序的运行结果是。
#include<stdio.h>main(){char c;while(putchar(getchar())!='$');printf("end");}A)abcd$abcde B)abcd$end C)abcdend D)abcd$abcdeend 9. 以下程序段( )x=-1;do { x=x*x; }while(x>0);A) 是死循环B) 循环执行一次C) 循环执行二次D) 有语法错误10. 下面程序段执行后的结果为: ( )int sum=0, n=10;do { sum=sum+n;n++; }while(n<10);printf(“%d,%d”,sum,n);A. 0, 10 B) 10, 11C) 0, 11 D) 以上结果都不对12. 循环“for(i=0,x=1;i=10&&x>0;i++);”的循环执行()。
第五章循环结构程序设计循环结构是结构化程序设计的三种基本结构之一,也是最重要、最常用的一种基本结构。
其特点是:在给定条件成立时,反复执行某程序段,直到给定条件不成立时为止。
给定的条件称为循环条件,反复执行的程序段称为循环体。
根据开始或结束循环的条件不同,在C 语言中可以用如下语句实现循环:1. 用goto语句和if语句构成循环。
2. 用while循环语句。
3. 用do-while循环语句。
4. 用for循环语句。
5.1 语句标号、goto语句及用goto语句构成的循环1.语句标号语句标号就是给程序中的某一个语句定义的标识符,标号可以是任意合法的标识符,但在语句标号和它所标识的语句之间必须加一个冒号作为分隔符。
C程序中的任何一个可执行语句之前都可以加上语句标号。
例如:stop:printf(“END\n”);通常,语句标号只是用作goto 语句的转向目标。
如:goto stop;如果程序中没有用goto语句改变程序的执行顺序,也就没有必要出现语句标号。
2.goto语句goto语句称为无条件转向语句,goto语句的一般形式为:goto 语句标号;goto语句的作用是把程序的执行转移到语句标号所在的位置,但这个语句标号必须与此goto语句在同一个函数之内。
goto语句不符合结构化程序设计的原则,因为无条件转向使得程序的结构没有规律、可读性差。
对于初学者来说应尽量避免使用goto语句,但如果使用goto语句能够大大地提高程序的执行效率,也可以使用。
3.用goto语句构成的循环结构goto语句通常与if语句配合构成条件转移语句,用来实现构成循环或跳出循环等功能。
例5.1统计从键盘输入的一行字符的个数。
#include <stdio.h>main(){int n= 0;char ch;printf("input a string\n");loop: ch= getchar();n++;if(ch!='\n') /*字符'\n'是结束从键盘输入字符串的标志*/goto loop;n=n-1; /*不要统计字符'\n'*/printf("%d",n);}当用户从键盘上输入一个字符后,先执行n++进行计数,然后判断该字符是否为'\n'字符,若该字符不是'\n'字符,则转移至loop构成循环;否则不执行goto语句,程序在输出n的值后结束。
例5.2 从键盘输入一组数据,以0作为结束输入数据的标志,求这组数据之和。
#include <stdio.h>main(){int number, sum=0;loop: scanf("%d", &number);sum+=number;if(number!=0)goto loop;printf("The total sum is %d\n", sum);}5.2 while语句和用while语句构成的循环由while语句构成的循环也称”当”循环,while循环的一般形式如下:while(表达式)循环体语句while语句的执行过程是:先计算while后一对圆括号中的表达式的值,当表达式的值为非0时,便执行循环体语句,之后再计算该表达式的值,由此构成循环,直到有一次求得表达式的值为0时才结束循环,并继续执行循环体语句之外的后续语句。
如图5.1所示。
例如,用while语句改写例5.1的程序,统计从键盘输入的一行字符的个数。
#include <stdio.h>main(){int n=0; char ch;printf("input a string:\n");ch= getchar();while(ch!='\n'){n++;ch= getchar();}printf("%d",n);}图5.1 while循环流程图说明:(1)while语句中的表达式一般是关系表达式或逻辑表达式,但也可以是其它合法的C表达式,只要表达式的值为真(非0)即可继续循环。
(2)循环体语句可以是一条简单的可执行语句;也可以是由多个语句用{}括起来后构成的复合语句。
(3)应该注意在循环体语句中包含能够使循环趋于结束的操作,以避免出现死循环。
例5.3编写程序,求1+2+3+…+100的值。
这是一个求100个数的累加和问题。
所加的加数从1变化到100,因此我们可以在循环体中设计一个整型变量i,使它的初值为1,每循环一次使i的值增1,一直循环到i的值超过100为止,用这个办法就解决了所需的加数问题。
要解决求累加和的问题,还要再设计一个变量sum用来存放这100个数的和值,先求0+1的和并将其放在sum中,然后把sum中的数加上2再存放在sum中,依次类推。
在这里,sum累加的过程要放在循环体中,由计算机来判断所加的数是否已经超过100。
程序流程图如图5.2所示。
main(){int i, sum;i=1; sum=0;while(i<=100){sum= sum + i ;i++;}printf("sum=%d\n", sum);}程序运行结果为:sum=50505.3 do-while 语句用do-while 语句构成的循环由do-while 语句构成的循环称为”直到型”循环,do-while 语句的一般形式为:do循环体语句while(表达式);do-while 语句的执行过程是:先执行循环体语句,再求表达式的值,若表达式的值为非0,则再执行循环体语句,由此构成循环,直到表达式的值为0时结束循环。
如图5.3所示。
do-while 语句和while 语句的区别在于do-while 是先执行循环体语句,后判断循环条件,因此do-while 至少要执行一次循环体;而while 是先判断后执行,如果条件不满足,则一次循环体语句也不执行。
while 语句和do-while 语句一般都可以相互替代。
例如,我们可以用do-while 语句改写例5.3的程序,求1+2+3+…+100的值。
main()图5.2 例5.3程序流程图图{ int i, sum;i=1;sum=0; do { sum= sum + i ;i++; } while(i<=100) ; printf("sum=%d\n", sum);}程序运行结果为: sum=5050说明:(1) do-while 语句在while(表达式)后一定要有一个分号,它是do-while 语句的结束标志。
(2) 图5.4右图为用N-S 流程图描述的直到型循环结构,其循环结束条件的描述方法与C 语言的do-while 语句的循环条件的判断方法稍有不同,编程时应作适当地转换。
如上例中的“直到i>100”时结束循环和程序中的“ i<=100”时继续执行循环是同一个概念的不同表述形式。
5.4 for 语句和用for 语句构成的循环for 语句是C语言提供的功能更强,使用更广泛的一种循环语句。
其一般形式为:for (表达式1;表达式2;表达式3)循环体语句for 循环的执行过程是:(1) 计算”表达式1”。
(2) 计算”表达式2”;若其值为非零,转至步骤(3);若其值为零,则转至步骤(5)。
(3) 执行一次循环体语句。
(4) 计算”表达式3”;然后转向步骤(2),构成循环。
(5) 结束循环,执行for 循环之后的语句。
如图5.5所示。
图5.4 用do-while 语句实现例5.3的程序流程图图5.5 for循环语句的流程图根据for循环的执行过程,通常用“表达式1”来给循环变量(即用来控制循环次数的变量)赋初值或做一些进入循环之前的初始工作;用“表达式2”来作为判断循环是否结束的条件;用“表达式3”来修改循环变量的值,使得循环能够趋于结束。
从语法上来讲,for语句中的三个表达式都可以是任意合法的C表达式,各表达式之间用”;”隔开,并且这三个表达式都是任选项,都可以省略。
例如我们可以用f or循环语句将例5.3 的程序改写为如下几种形式,它们都能正确地求出1+2+3+…+100的值。
main() /*程序1 */{int i, sum;for (i=1,sum=0; i<=100; i++)sum= sum + i ;printf(“sum=%d\n”, sum);}main() /*程序2 */{int i=1, sum=0;for ( ; i<=100; i++)sum= sum + i ;printf(“sum=%d\n”, sum);}main() /*程序3 */{int i=1, sum=0;for ( ; i<=100; ){sum= sum + i;i++ ;}printf(“sum=%d\n”, sum);}main() /*程序4 */{int i=1, sum=0;for ( ; ; ){sum= sum + i++ ;if(i>100)goto pend;}pend: printf(“sum=%d\n”, sum);}说明:(1) for语句中的表达式可以部分或全部省略,但两个”;”不可省略。
如果“表达式2”被省略了,程序会因为缺少条件判断而陷入死循环,虽然可以在循环体内使用goto语句或break语句跳出循环,但实际编程时最好还是不要采用这种形式的for语句。
(2) 循环体语句可以是一条语句,也可以是用{}括起来的复合语句,甚至还可以是只有一个分号的空语句,例如上例中的for语句也可以改写成如下形式:for (i=1; i<=100; sum= sum + i++ );(3)表达式1和表达式3都可以是逗号表达式,这种用法经常出现在有2个循环变量变化的情形。
如:for (i=1,sum=0; i<=100; sum= sum + i,i++ );for (i=1,j=10; i<=j; i++,j-- )s=i+j;(4) 注意在循环体语句之前不能有分号,如果将上例中的for语句写成如下两种形式:for (i=1; i<=100; i++ );for (i=1; i<=100; i++ )或sum= sum + i;;sum= sum + i;则循环体语句是只有一个分号的空语句。
而语句sum= sum + i;则成为循环结构之外的一条语句,只是在退出for循环之后才被执行了一次。
(5)while循环和do-while循环常称为条件循环,即根据条件来决定是否继续执行循环。