6.1循环结构 课件(共31张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源下载
  1. 二一教育资源

6.1循环结构 课件(共31张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源简介

(共31张PPT)
C 语言程序设计
2023
翻转课堂实用教程
第6章 循环结构
6.1
简单循环结构
6.2
嵌套循环结构
6.1 简单循环结构
6.1.1 while、do-while
和for循环知识点
1、while循环
流程图:
注意
语句格式:
while(表达式)
{
循环体(语句块);
}
执行描述:
(1)计算while后面的表达式值,如果值为真,则执行步骤(2),否则跳出循环体,继续执行该结构后面的语句。
(2)执行循环体语句;
(3)重复执行步骤(1)。
循环的结束由while后面的表达式控制,循环体中必须有改变循环控制变量值的语句,使循环倾向于结束,否则出现死循环,无法结束。
循环体如果有一条以上的语句,应该用大括号括起来,如果只有一条语句,大括号可以省略。
循环四要素:循环控制变量初始值、循环条件的设置、循环语句的编写和循环控制变量的变化。
1、while循环
例如:用while语句编写程序实现,求1~100的累计和。
程序代码:
算法设计:
main()
{
int i=1, sum=0;
while(i<=100){
sum+=i;
i++;
}
printf("%d\n",sum);
return 0;
}


流程图:
1、定义两个整型变量;
2、两个变量初始化(循环控制变量初始值);
3、while语句(设置循环条件);
4、求和(环体语句的编写);
5、被加数变化(循环控制变量的变化);
6、输出总和。
演示运行过程
注意:while 循环的整体思路
设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。
6.1.1 while、do-while
和for循环知识点
2、do-while循环
流程图:
注意
语句格式:
do
{
循环体(语句块);
} while(表达式);
执行描述:
(1)执行循环体语句。
(2)计算while后面的表达式值,如果值为真,则执行步骤(2),否则跳出循环体,继续执行该结构后面的语句。
(3)重复执行步骤(1)。
while(i<=100);最后的分号“;”必须要有。
2. while循环和do-while各有特点,实际编程中使用while循环较多。
2、do-while循环
例如:用do-while语句编写程序实现,求1~100的累计和。
程序代码:
#include
int main()
{
int i=1, sum=0;
do{
sum+=i;
i++;
}while(i<=100);
printf("%d\n", sum);
return 0;
}
流程图:
6.1.1 while、do-while
和for循环知识点
3、for循环
流程图:
注意
语句格式:
for(初始值;条件;增量)
{
循环体;
}
执行描述:
(1)计算初始值(只执行一次)。
(2)判断条件,如果值为真,则执行步骤(3),否则跳出循环体,继续执行 该结构后面的语句。
(3)执行循环体语句。
(4)计算增量(使循环条件逐渐变得“不成立”,以便结束循环);
(5)重复执行步骤(2)。
1. 循环体如果有一条以上的语句,应该用大括号括起来,如果只有一条语句,大括号可以省略。
2. for语句中的表达式可以省略任意一个,也可以都省略,但“;”不能省略。
6.1.1 while、do-while
和for循环知识点
例如:用for语句编写程序实现,求1~100的累计和。
程序代码:
算法设计:
int main()
{
int i, sum=0;
for(i=1; i<=100; i++){
sum+=i;
}
printf("%d\n",sum);
return 0;
}
流程图:
1、定义两个整型变量;
2、求和变量初始化;
3、For语句(设置初始值、条件和增量);
4、求和(循环体语句的编写);
5、输出总和。
代码分析:
(1)执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum的值为1),再计算 i++。
(2)第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。(3)重复执行步骤 2),直到第101次循环,此时 i 的值为101,i<=100 不成立,所以结束循环。。
4、while、do-while和for循环的相互转换
6.1.1 while、do-while
和for循环知识点
注意:循环语句的选择:主要考虑因素-循环控制方式
(1)事先给定循环次数,首选 for
(2)通过其他条件控制循环,考虑 while或 do-while
if(循环次数已知)
使用 for 语句
else /* 循环次数未知 */
if (循环条件在进入循环时明确)
使用 while 语句
else /* 循环条件需要在循环体中明确 */
使用 do-while 语句
5、break和continue语句
语句格式:break;
语句功能:
(1)break关键字
注意:
使程序运行时中途退出switch结构或者一个循环体
(1)break语句不能用在除了switch语句和循环语句以外的任何其他语句。
(2)在嵌套循环结构中,break语句只能退出包含break语句的那层循环体。
例如:编写程序实现,输入一个整数判断此数是否为素数。
算法设计:
定义两个整型变量;
输入数据;
for语句(设置初始值、条件和增量);
判断是否能整除;
输出结果。
(1)break关键字
例如:使用 while 循环计算1加到100的值。
程序代码:
#include
int main()
{
int i=1, sum=0;
while(1){ //循环条件为死循环
sum+=i;
i++;
if(i>100) break;
}
printf("%d\n", sum);
return 0;
}
#include
int main()
{
int i,a;
scanf("%d",&a);
for(i=2;i<=a-1;i++)
{
if(a%2==0)
break;
}
if(i<=a-1)
printf("该数不是素数!\n");
else
printf("该数是素数!\n");
return 0;
}
程序代码:
break跳出死循环
5、break和continue语句
语句格式:continue;
语句功能:
(2)continue关键字
注意:
提前结束本次循环,跳过continue语句下面未执行的语句,继续进行下一次循环
1. continue语句通常和if语句连用,只能提前结束本次循环,不能使整个循环终止。
2. continue语句只对循环起作用。
3. continue语句在for语句中结束本次循环,但for语句中的增量仍然执行。
例如:编写程序,输出1~100之间不能被7整除的数。
算法设计:
1、定义一个整型变量;
2、for语句(设置初始值、条件和增量);
3、判断如果能被7整除,则continue执行下一次循环,否则输出。
int main(),
{ int i;
for(i=1;i<=100;i++)
{
if(i%7==0)
continue;
printf("%d ",i); 3
}
代码:
程序运行时,当i是1-6时,都不能被7整除,输出1-6的值,
当i=7时,能被整除,执行continue语句,结束当前循环,直接进入下一次循环。
执行说明:
break与continue的区别
6.1.2 简单循环案例分析
案例6.1.1统计一行字符的个数(while)
案例6.1.1程序代码:
问题分析:
#include
int main()
{
int n=0;//统计字符个数
printf("Input a string:");
while(getchar()!='\n')
n++;
printf("Number is: %d\n", n);
return 0;
}
1、从键盘输入多少字符不固定,因此无法用for循环实现。2、键入一行字符,当回车时字符输入结束,所以可以把getchar()!='\n'作为循环的判定条件,用while语句实现。
要求:从键盘输入一串字符(输入回车符时结束),统计字符的个数
案例6.1.1运行结果:
Input a string:I am a Chinese.↙
Number is: 15
思考:
把上题改成用do-while语句实现,代码该如何改写?
6.1.2 简单循环案例分析
案例6.1.2 统计大写字符(do-while)
案例6.1.2程序代码:
算法设计:
#include
int main(){
char ch;
int num=0;
printf("输入字符串:");
do
{
ch=getchar( );
if(ch>='A'&& ch<='Z')
num++;
}while(ch!='\n');
printf("有%d个大写字母。\n",num);
return 0;
}
(1)设置变量ch存放输入的字符;计数器变量num存放大写英文字母的个数
(2)输入字符ch
若ch是大写英文字母,计数器num+1
重复上述操作,直到输入换行符为止
(3)输出大写英文字母个数
要求:从键盘输入一串字符(输入回车符时结束),统计其中大写英文字母的个数。
案例6.1.2运行结果:
输入字符串:Tomorrow is Tuesday .
有2个大写字母。
6.1.2 简单循环案例分析
案例6.1.3输入一批体育考生的身高,打印最高身高是多少(单位cm)?
案例6.1.3程序代码:
算法设计:
int main()
{
double mark, max,length;
printf("Enter length:");
scanf ("%lf", &length); /* 读入第一个身高值 */
max = length; /* 假设第一个身高值最大 */
while (length >= 0){
if(max < length )
max = length ;
scanf ("%lf", &length );
}
printf("Max = %.2f\n", max);
}
1. 定义max存储最大值,length存储身高;
2. 读入第一个成绩身高值赋给length;
3. max=length,假设第一个数是最高身高;
4. while(length>0),进入循环体, if(max < mark) ,
max = mark ;再接收下一个身高值;
5. 直到循环结束,打印max的值。
要求:在键盘输入一批学生的身高,当输入-1是表示输入结束,求出最大身高值。
案例6.1.3运行结果:
Enter length:160.5 176.3 180.4 185.7 -1
Max = 185.70
求身高最矮的值?
6.1.2 简单循环案例分析
案例6.1.4 把一个整数的每一位数分离出来并输出(while)
案例6.1.4程序代码:
问题分析:
#include
int main()
{
int x=0,item;
scanf ( "%d", &x );
while ( x != 0 ){
item = x %10;
x = x/10 ;
printf ( "%d ", item );
}
return 0;
}
当接收到一个多位数的整数时,这个整数是整体被接收的,当需要用到其中的某一位数时,需要把整数的每一位分离开来。因为不知道接收整数的位数,不能用for循环。
要求:在键盘输入一批学生的身高,当输入-1是表示输入结束,求出最大身高值。
案例6.1.4运行结果:
6789↙
9 8 7 6
输入的12345,分离步骤如下:
12345 % 10 = 5 12345 / 10 = 1234
1234 % 10 = 4 1234 / 10 = 123
123 % 10 = 3 123 / 10 = 12
12 % 10 = 2 12 / 10 = 1
1 % 10 = 1 1 / 10 = 0 结束
所以得到:循环体:x%10 x=x/10
循环结束条件 x==0
6.1.2 简单循环案例分析
案例6.1.5打印所有的“水仙花数”(分离每位整数的应用)。
案例6.1.5程序代码:
问题分析:
#include
int main()
{
int n,i,j,k;// 百位数i、十位数j和个位数k
for(n=100;n<1000;n++)
{
k=n%10;
j=n/10%10;
i=n/100;
if(n== i*i*i+j*j*j+k*k*k) printf("%d\n",n);
}
return 0;
}
(1)该题需要先生成三位数:设变量n为三位数,使用for语句,即for (n=100;n<1000;n++){…}即可。 (2)在循环体中,对每一个n,分离出其百位数i、十位数j和个位数k,那么当条件“n==i*i*i+j*j*j+k*k*k”满足时n即为所求的三位数。
所谓的“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如:153=1^3+3^3+5^3。
案例6.1.5运行结果:
153
370
371
407
6.1.2 简单循环案例分析
案例6.1.6打印Fibonacci序列的前20个数:1,1,2,3,5,8,13,… (for),每5个数据一行。
案例6.1.6 程序代码:
问题分析:
#include
int main()
{
int x1 = 1,x2 = 1,x,i;
printf ("%5d%5d", x1, x2 ); /* 输出头两项,每个数据占5位 */
for ( i = 3; i <= 20; i++ ){ /* 循环输出后18项 */
x = x1 + x2; /* 计算新项 */
printf("%5d", x );
if(i%5==0) //输出5个数据后,换行到下一行输出
printf("\n");
x1 = x2;
x2 = x; /* 更新x1和x2 */
}
}
此类题一般要先观察前3-5个数的规律,然后根据规律写出一般的表达式作为循环体的内容,再确定好循环条件即可编程了。。
所谓的“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如:153=1^3+3^3+5^3。
案例6.1.5运行结果:
本题中,经观察发现,前两个数和等于后面的数。随着数的后移,数在变化,设x1 ,x2表示前两个数,x表示x2后面的那个数,它们的规律如下:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
6.1.2 简单循环案例分析
案例6.1.7兔子繁衍问题(Fibonacci序列的应用)
案例6.1.7 程序代码:
问题分析:
#include
int main()
{ int x1,x2,month,N,x=0;
scanf("%d",&N);
x1=1; x2=1;
if(N<2)
month=1;
else
{ month=2;
while(x<=N){
x=x1+x2;
x1=x2;
x2=x;
month++;
}
}
printf("%d\n",month);
}
第1、2月是初始的兔子数,第三个月又生了一对兔子,第5个月时新出生的一对兔子达到3个月,又可以生兔子了,因此数据是5,第6个月时,有三对兔子可以生小兔子了,以此类推。
问题描述:一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对(N从键盘输入)?
输入:在一行中给出一个不超过10000的正整数N
输出:在一行中输出兔子总数达到N最少需要的月数
案例6.1.5运行果:
表6-1-1 兔子繁殖数据表
30↙
9
6.1.3 简单循环课堂练习题
课堂练习题6.1.1:用格里高利公式求π的近似值
本题要求编写程序,计算序列部分和 1 - 1/3 + 1/5 - 1/7 + ... 直到最后一项的绝对值小于给定精度eps。
课堂练习题6.1.2:输出2到n之间的全部素数
本题要求输出2到n之间的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
课堂练习题6.1.3:找出一批学生的最高分
本题要求编写程序,找出最高分。输入在一行中给出一系列非负整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
课堂练习题6.1.4:简单的猜数字游戏
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”)、小了(“Too small”),还是相等(“Lucky You!”)。如果猜到,则结束程序。如果超过7次都没有猜到,则提示“Game Over”,并结束程序。
提示: 随机数的产生用下面的2个函数: srand (time(0)); //初始化随机函数
mynumber = rand () % 100 + 1; /* 随机产生一个1~100之间的被猜数 */
这两个函数在time 头文件中,因此程序需要加上# include 这个语句。
6.2 嵌套循环结构
所谓嵌套(Nest),就是一条语句里面还有另一条语句
6.2.1 嵌套循环知识点
注意:
while语句和for语句可以相互嵌套。
外层循环执行一次,内层循环执行一轮(即执行完自己的循环)。
3. 内层循环控制可以直接引用外层循环的相关变量,但不要轻易改变外层循环控制变量的值。
例如:输出九九乘法表
问题分析:
要求:编写程序输出以下形式的乘法“九九表”
6.2.1 嵌套循环知识点
(1)乘法表第1行的变化规律:
for(j=1;j<=9;j++)
printf(“%d*%d=%4d”,1,j,1*j);
(2)乘法表第2行的变化规律:
(3) 在上述循环语句外面再加上一个循环(即构成双重循环),就可输出所要求的“九九表”。
流程图:
例如:输出九九乘法表
程序代码:
#include
main( )
{
int i,j;
/*外循环控制变量i,控制被乘数变化*/
for(i=1;i<=9;i++)
{
/*内循环控制变量j 控制乘数变化*/
for(j=1;j<=9;j++)
printf("%d*%d=%-4d",i,j,i*j);
printf("\n"); /*换行*/
}
}
注意:双重循环执行过程
(1)先执行外循环,当外循环控制变量i取初值1后,执行内循环(j从1变化到9),
(2)在内循环执行期间,i的值始终不变;内循环结束后,到了外循环,i的值增为2,然后再执行内循环,……如此下去,直到外循环控制变量i超过终值,整个双重循环就执行完毕。
(3)内层 for 每循环一次输出一条数据,外层 for 每循环一次输出一行数据。
思考:
如果把内循环语句改为:
for(j=1;j<=i;j++)
printf(“%d*%d=%-4d”,i,j,i*j);
将会输出什么形式的乘法“九九表”?
6.2.2 循环嵌套案例分析
案例6-2-1 编写打印3*3矩阵的程序,打印出for 嵌套执行的流程
案例6-2-1程序代码:
案例6-2-1,运行结果:
算法设计:
#include
int main()
{
int i, j;
for(i=1; i<=3; i++){ //外层for循环
for(j=1; j<=3; j++){ //内层for循环
printf("i=%d, j=%d\n", i, j);
}
}
printf("\n");//打印完一行后换行
}
问题分析:打印3*3矩阵,需要一个循环控制行,另一个循环控制列,因此需要嵌套循环。因为行列固定,用for循环即可.
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
i=3, j=1
i=3, j=2
i=3, j=3
定义i控制行,j控制列;
控制行的循环for(i=1; i<=4; i++);
内嵌控制列的循环for(j=1; j<=4; j++);
打印行列的变化值;
直到循环结束.
注意:
上例中,for 循环嵌套,外层循环和内层循环交叉执行,外层 for 每执行一次,内层 for 就要执行三次。
外层 for 每次循环时,都必须等待内层 for 循环完毕(也就是循环3次)才能进行下次循环。虽然 i 是变量,但是对于内层 for 来说,每次循环时它的值都是固定的。
6.2.2 循环嵌套案例分析
案例6-2-2 编写程序打印下列图案:
案例6-2-2程序代码:
#include
int main()
{
int i,j;
for(i=1;i<=6;i++)
{
for(j=1;j<=20-i;j++) /*控制输出空格个数*/
printf(" ");
for(j=1;j<=2*i-1;j++) /*控制输出*号*/
printf("*");
printf("\n"); /*换行*/
}
}
问题分析:
(1)该图案共有6行,打印时需要一行一行进行,设正在处理的行为第i行,则i从1~6;
(2)每行的字符与所在的行有关,设j表示第i行第j个字符,则j从1~2*i-1;
(3)设定每行字符的起始位置:设第1行起始位置为第20列,则第1行‘*’之前有19个空格,第i行‘*’之前有20-i个空格。
*
***
*****
*******
*********
***********
思考:
如果打印下示图案,程序该如何修改
6.2.2 循环嵌套案例分析
案例6-2-3 组合问题
案例6-2-3程序代码:
#include
int main()
{
int i,j,k,n;
n=5;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(i!=j&&i!=k&&j!=k&&iprintf("%3d%3d%3d\n",i,j,k);
}
下面以n=5,r=3为例,求出所有符合上述要求的5个数中3个数的组合。设:i,j,k为组合中的三个数,它们可能的取值均为1~5;i,j,k应要求满足:
问题描述:找出n个自然数(1,2,……,n)中r(r问题分析:
(1)每一个组合中的三个数字不能相同,即i≠j≠k;
(2)任何两组数所包含的数不能相同,例如(1,2,3)和(3,2,1)只能取其中一组,为此约定:前一个数应小于后一个,则有:i案例6.2.3运行结果:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
6.2.2 循环嵌套案例分析
案例6-2-3程序代码优化:
#include
int main()
{
int i,j,k,n;
n=5;
for(i=1;i<=n-2;i++)
for(j=2;j<=n-1;j++)
for(k=3;k<=n;k++)
if(i!=j&&j!=k&&iprintf("%3d%3d%3d\n",i,j,k);
}
注意:
(1)在循环结构的程序设计中,对此类问题的求解通常使用穷举法。
(2)穷举法是一种重复性算法,其基本思想是:对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。
(3)尽量减少循环次数以提高程序运行效率。
启示:从循环结构想到的
(1)要想使循环能正确的执行,编程者需要设计好循环条件和循环体等。但一旦做好这些,计算机就能帮我们做复杂的运算和任务了,这就是先苦后甜。
(2)我们经过努力才考上大学,这也是先苦后甜,但大学毕业并不是循环的终止条件,而是前期准备,只有在大学打好坚实的专业基础,在走上工作岗位才能轻松的工作(执行循环);
(3)循环过程是不断累积增加的过程,我们的工作也需要不断的进步,如果把我们的循环终止时间设定为一生,我们岂不是每天都在进步了?
6.2.3 循环嵌套练习题
课堂练习题6.2.1:计算阶乘和
对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。输入在一行中给出一个不超过10的正整数N。
课堂练习题6.2.2:输出三角形字符阵列
本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。
课堂练习题6.2.3:穷举问题-搬砖
某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?
【微视频6.1】for循环语句—工作日向上的力量
【微视频6.2】地球自转与公转-嵌套循环
谢谢观看

展开更多......

收起↑

资源预览