一、循环结构(Iteration Structure)的概述
1.目的
为了解决含有重复处理内容的问题,必须采用循环语句(Loop Statement)来编程实现。
2.类型
(1) 当型循环结构word/media/image1_1.png
(2)直到型循环结构word/media/image1_1.png
二、循环语句
1.while语句
①功能:实现当型循环结构。
②形式
while(表达式){
循环体
}
③特点:先判断后执行。
④举例:(累加和问题)编程计算整数1~100的和。
int i ; //循环变量
int sum = 0 ; //累加和清0
i = 1 ; //循环变量i赋初值
while( i <= 100){
sum = sum + i ; //循环变量累加到sum中
i = i + 1; //改变循环变量i的值
}
2.do-while语句
①功能:实现直到型循环结构。
②形式
do{
循环体
}while(表达式); //注意最后的分号
③特点:先执行后判断。
④举例:修改上例。
/*利用do-while语句编程实现整数1~100的和。*/
int i ; //循环变量
int sum = 0 ; //累加和清0
i = 1 ; //循环变量i赋初值
do{
sum = sum + i ; //循环变量累加到sum中
i = i + 1; //改变循环变量i的值
}while(i<=100);//注意最后的分号
3.for语句
①功能:实现当型循环结构。
②形式
for(表达式1;表达式2;表达式3){
循环体
}
③特点:先判断后执行;使用频率最高。
④举例:修改上例。
/*使用for语句编程计算整数1~100的和。*/
int i ; //循环变量
int sum = 0 ; //累加和清0
for( i = 1 ; i <=100 ; i++ ){//第一个表达式完成循环变量i赋初值;第三个表达式实现改变循环变量i的值
sum = sum + i ; //循环变量累加到sum中
}
4.几种循环语句的比较
①由于while语句和for语句均实现当型循环结构,两者是完全等价的。
for(表达式1;表达式2;表达式3){
循环体;
}
表达式1 ;
while(表达式2){
循环体;
表达式3;
}
②for语句适合循环次数事先已知的情况;而while语句和do-while语句适合循环次数事先未知的情况。
③当第一次进入循环时条件就不满足,while语句和do-while语句就不等价。除此情况外,while语句和do-while语句均等价。
三、程序举例
1.循环次数已知的累加和问题
①编程实现计算100以内偶数的和。
/*方法一:使用for语句*/
sum = 0 ;
for( i = 2 ; i <=100 ; i = i + 2 ){
sum = sum + i ;
}
/*方法二:使用while语句*/
sum = 0 ;
i = 2 ;
while( i <=100 ){
sum = sum + i ;
i = i + 2 ;
}
/*方法三:使用do-while语句*/
sum = 0 ;
i = 2 ;
do{
sum = sum + i ;
i = i + 2 ;
}while(i <= 100) ;
第159页课后习题4.10、4.11、4.12、4.13属于循环次数已知,计算累加和的问题。参考代码
注意:计算累加和时,需要累加和变量清0。
2.循环次数已知的累乘积问题
①编程计算n!=1*2*3*4*……*n的值。(课本第107页例题4.10)
要想解决这个问题,需要用到“递推”的程序设计方法。也就是说,求n!时,先求1!,用1!*2得到2!,用2!*3得到3!,以此类推,直到利用(n-1)!*n得到n!为止,问题即可解决。
/*方法一:利用for语句实现。*/
int i , n ;
long int p = 1 ;
scanf("%d" , &n) ;
for( i = 1 ; i <= n ; i++ ){
p = p * i ;
}
printf("%d!=%ld\n", n , p );
/*方法二:利用while语句实现。*/
int i , n ;
long int p = 1 ;
scanf("%d" , &n) ;
i = 1 ;
while( i <= n ){
p = p * i ;
i = i + 1 ;
}
printf("%d!=%ld\n", n , p );
/*方法三:利用do-while语句实现。*/
int i , n ;
long int p = 1 ;
scanf("%d" , &n) ;
do{
p = p * i ;
i = i + 1 ;
}while( i <= n) ;
printf("%d!=%ld\n", n , p );
第159页课后习题4.14属于循环次数已知,计算累乘积的问题。参考代码
注意:计算累乘积时,需要累乘积变量置1。
3.循环次数未知的累加和(累乘积)问题
①word/media/image1_1.png
这也是累加求和的问题,但不同的是,这里的循环次数是预先未知的,而且累加项以正负交替的规律出现。实现方法,累加项通式term=sign/n表示。其中,sign按+1,-1,+1,-1,……交替变化,可用sign=-sign实现,sign的初值为1;n按1,3,5,7,……变化,可用n=n+2实现,n的初值为1;统计累加项数只有设置一个计数器变量count即可,初值为0。
详细算法描述和代码实现参见课本第112页例题4.12。
注意:①能够正确得到累加项或累乘项通式。
②计算累加和问题时注意清0,计算累乘积问题时注意置1。
③注意累加项或累乘项是否满足循环终止条件的判断。
第159页课后习题 4.15,4.16,4.17 属于循环次数未知,计算累加和的问题。参考代码
4.循环结构和选择结构的综合应用
(1) 猜数字游戏升级版:编程实现猜数字游戏,要求所猜数字为1~10之间的整数,游戏者只有三次机会,猜数字游戏过程中会根据游戏者所猜数字的大小给出一定的信息提示,增强游戏的趣味性。
#include
#include
#include
main(){
int magic ; //计算机“想”的数
int guess ; //人猜的数
int count ;
srand(time(NULL)); //标准库函数srand()为函数rand()设置随机数种子
magic = rand() % 10 +1; //生成1-10之间的整数
//=====利用do-while循环完成猜数字游戏======
count = 0 ; //计算器清零
do{
printf("请您输入您要猜的整数:(1-10之间)\n");
scanf("%d",&guess); //读入人猜的数
count++ ;
//判断计算机“想”的数与人猜的数的大小
if(guess > magic){
printf("猜错了!Too big!\n");
}else if(guess < magic){
printf("猜错了!Too small!\n");
}else{
printf("猜对了!\n");
printf("您猜的数字为:%d\n",guess);
}
}while( guess!=magic && count <=3 ); //判断循环终止条件,最多三次机会
}
(2)从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”,否则输出“No!”。(参见课本第127页例4.19)
判断素数的方法:由于素数是指除了能被1和它本身整除外,不能被其他任何整数整除的数。(1不是素数。2是最小的素数。)
把m作为被除数,把i=2~(m-1)依次作为除数,判断被除数m与除数i相除的结果,若都除不尽,即余数都不为0,则说明m是素数。反之,只要有一次能除尽(余数为0),则说明m存在一个1和它本身以外的另外一个因子,它不是素数。
/*方法一*/
#include
main(){
int number ;
int i ; //===========定义循环变量i=====
int flag = 1 ;//======定义素数标识,初始为1=====
printf("please input a number :\n");
scanf("%d",&number); //=====从键盘输入一个整数===
for( i = 2 ; i<=number-1 && flag ; i++){ //查看从2至number-1之间所有整数是否整除number
if(number % i == 0){
flag = 0 ; //如果能整除number,则说明number不是素数,存在因子,故素数标识改为0
}
}
printf("\n");
if(flag) //========素数标识为1,输出是素数,否则输出不是素数==========
printf("YES====>%d is a prime number!\n",number);
else
printf("NO====>%d is not a prime number!\n",number);
}
改进:为了减少循环次数,用数学的方法可以证明:只需用2~sqrt(m)之间的数去除m,即可得到正确的判定结果。
/*方法二:目的使用sqrt()*/
#include
#include
main(){
int number ;
int i ; //===========定义循环变量i=====
int flag = 1 ; //======定义素数标识,初始为1=====
int k ;
printf("please input a number :\n");
scanf("%d",&number); //=====从键盘输入一个整数===
k= (int)sqrt(number);
for( i = 2 ; i<=k && flag ; i++ ){ //查看从2至sqrt(number)之间所有整数是否整除number,与方法一相比,减少了循环次数
if(number % i == 0){
flag = 0 ; //如果能整除number,则说明number不是素数,存在因子,故素数标识改为0
}
}
printf("\n");
if(flag) //========素数标识为1,输出是素数,否则输出不是素数==========
printf("YES====>%d is a prime number!\n",number);
else
printf("NO====>%d is not a prime number!\n",number);
}
(3) 从键盘任意输入一个正整数,编程实现:若该整数不是素数,则打印它所有因子;否则,打印“没有因子,是素数”的提示信息。(参见课本第131页例4.20)
#include
main(){
int number ;
int i ;
int flag = 1 ;
printf("please input a number :\n");
scanf("%d",&number); //=====从键盘输入一个整数===
for( i = 2 ; i<=number-1 ; i++){ //查看从2至number-1之间所有整数是否整除number
if(number % i == 0){
flag = 0 ; //如果能整除number,则说明number不是素数,存在因子,故素数标识改为0
printf("%d\t" , i ) ; //依次输出因子
}
}
printf("\n");
if(flag)
printf("%d没有因子,是素数。\n",number);
}
¥29.8
¥9.9
¥59.8