第四章 正式上课
小故事:
军训结束后,逸凡和同学们开始正式上课了。拿到校历一看,发现本学期一共21周,前4周军训,第5至20周上课,第21周考试。上课时,一周24节课,其中周一6节课,大学英语,高等数学,思想道德修养与法律基础;周二4节课,信息技术基础,体育;周三6节课,大学英语,高等数学,中国近现代史纲要;周四4节课,信息技术基础,大学语文;周五4节课,大学英语,线性代数。
一、初次接触
当用C语言来完成上课任务时,我们可以用前面学习的方法按顺序先输出第5周上课任务,然后输出第6周上课任务,依次类推。但是,静下心来一想,每周上课的课程是一样的,仅仅周数在不停的变化,说明我们上课任务是重复的。对于相同操作的重复执行问题需要有其他的解决方法。在C语言程序设计中往往采用重复执行一段代码的机制来解决重复操作问题。下面我们一起来学习循环语句。
例1:输出上课任务源程序如下:
#include<stdio.h>
void main()
{
int i;
printf("输出上课任务!/n");
printf("第1-4周军训/n");
for(i=5; i<=20; i=i+1)
{
printf("-------第%d周上课任务-------/n",i);
printf("星期一:大学英语,高等数学,思想道德修养与法律基础/n");
printf("星期二:信息技术基础,体育/n");
printf("星期三:大学英语,高等数学,中国近现代史纲要/n");
printf("星期四:信息技术基础,大学语文/n");
printf("星期五:大学英语,线性代数/n");
}
printf("第21周考试/n");
}
程序运行结果:
程序说明:本程序将相同的重复操作放在一起,采用for循环语句输出上课任务。
二、本章知识点
循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。本章主要介绍三种循环语句:for语句,while语句,do-while语句。
1.for语句
(1)for语句一般形式
for(循环变量赋初值;循环条件;循环变量增量) { 语句; } | for(从第5周开始;判断周数是否小于等于第20周;周数累加1) { 重复输出每周上课任务; } |
说明:循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值;循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用“;”分开。
(2)注意事项
1)for循环中的“循环变量赋初值”、“循环条件”和“循环变量增量”都是可选项, 即可以缺省,但“;”不能缺省。省略了“循环变量赋初值”, 表示不对循环控制变量赋初值,一般表示已经在for语句前面赋过初值。省略了“循环条件”和“循环变量增量”, 一般会在循环体中进行判断循环条件和调整循环变量,如果不做其它处理时便成为死循环。
2)如果循环变量i增量为1或-1,通常简写为i++,i--。i++相当于i=i+1,i—相当于i=i-1。 i=i+1表示从变量i所在的内存地址中取出i的值,加1,再送到i所在的内存地址中。
2.while语句
(1)while语句一般形式
while(表达式) { 语句; } | while(周数是否小于等于第20周) { 重复输出每周上课任务; } |
说明:表达式是循环条件,语句为循环体。其while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。它相当于for语句缺少“循环变量赋初值”和“循环变量增量”的情况,所以需要在循环体中控制循环变量增量。
例2:利用while语句输出上课任务源程序如下:
#include<stdio.h>
void main()
{
int i;
printf("输出上课任务!/n");
printf("第1-4周军训/n");
i=5;/* 循环变量赋初值*/
while(i<=20)
{
printf("-------第%d周上课任务-------/n",i);
printf("星期一:大学英语,高等数学,思想道德修养与法律基础/n");
printf("星期二:信息技术基础,体育/n");
printf("星期三:大学英语,高等数学,中国近现代史纲要/n");
printf("星期四:信息技术基础,大学语文/n");
printf("星期五:大学英语,线性代数/n");
i++;/*调整循环变量的值*/
/*也可以在while语句中调整循环变量的值,如while(i++<=20)*/
}
printf("第21周考试/n");
}
(2)注意事项
1)循环变量赋初值在使用 while语句之前进行。
2)while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。如果在while(1)循环体中没有控制循环变量增量的语句,则为死循环。
3)循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。
3.do-while语句
(1)do-while语句的一般形式为:
do 语句; while(表达式); | do 重复输出上课任务; while(周数是否小于等于第20周); |
说明:do-while循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此,do-while循环至少要执行一次循环语句。
例3:利用do-while语句输出上课任务源程序如下:
#include<stdio.h>
void main()
{
int i;
printf("输出上课任务!/n");
printf("第1-4周军训/n");
i=5;/* 循环变量赋初值*/
do
{
printf("-------第%d周上课任务-------/n",i);
printf("星期一:大学英语,高等数学,思想道德修养与法律基础/n");
printf("星期二:信息技术基础,体育/n");
printf("星期三:大学英语,高等数学,中国近现代史纲要/n");
printf("星期四:信息技术基础,大学语文/n");
printf("星期五:大学英语,线性代数/n");
i++;/*调整循环变量的值*/
/*也可以在while语句中调整循环变量的值,如while(i++<=20)*/
}
while(i<=20);
printf("第21周考试/n");
}
(2)注意事项
1)循环变量赋初值在do-while语句之前进行。
2)do-while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。如果在while(1)循环体中没有控制循环变量增量的语句,则为死循环。
3)循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。
4)do-while循环至少要执行一次循环语句,所以慎用。
4.几种循环语句的比较
(1)三种循环都可以用来处理同一个问题,一般可以互相代替。如果循环前能够确定循环的次数,则用for语句;否则使用while和do-while语句,其中,如果循环体至少要执行一次,则用do-while语句。
(2)while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。
(3)用while和do-while循环时,循环变量赋初值的操作应在while和do-while语句之前完成,而for语句可以在循环变量赋初值中实现循环变量的初始化。
三、模仿学习
例4:编写求出小于n的所有素数(质数)。
解题思路:(1)首先需要判断小于n的所有数是不是素数,这是一个重复任务。(2)判断一个数m是否为素数,最直接的做法是:用2、3、…,m-1去除m,如果其中有一个数能整除m,则m不是素数,否则,m为素数。
源程序如下:
#include<stdio.h>
void main()
{
int n;
int m;
int j;
printf("请输入一个正整数:/n");
scanf("%d",&n);
for(m=2;m<n;m++)
{
j=2;
/*用2到m-1的数去除m,如果其中有一个数能整除m,那么j肯定小于m*/
while(j<m && m%j!=0)
j++;
if(j==m)
printf("%d是素数/n",m);
}
}
思考:可以发现上面的程序的效率不高。首先,对于偶数不用判断,它们肯定不是素数;其次,判断m是否为素数,j不必循环到m-1,只要到sqrt(m)(函数sqrt()是求平方根)即可。因为小于或等于sqrt(m)的数不能整除m,那么大于sqrt(m)的数(小于m)肯定也不能整除m。
修改后的源程序如下:
#include<stdio.h>
#include<math.h>
void main()
{
int n;
int m;
int j;
int k;
printf("请输入一个正整数:/n");
scanf("%d",&n);
if(n<2) return;
printf("2是素数/n");
for(m=3; m<n; m+=2)
{
j=2;
k=(int)sqrt(m);/*将sqrt(m)赋给变量k*/
/*用2到k的数去除m,如果其中有一个数能整除m,那么j肯定小于等于k*/
while(j<= k && m%j!=0)
j++;
if(j>k)
printf("%d是素数/n",m);
}
}
程序运行结果:
程序说明:
(1)程序中m+=2,实际上相当于m=m+2,C语言中为了简便,采用这个方式。如m*=4,实际上是m=m*4,等等。
(2)程序中%表示求余数,比如8%3,其余数为2。