实验4循环结构程序设计 4.1基本的循环程序设计 【实验目的】 1.掌握循环程序设计的基本概念: 2.熟练掌握用while、do-while和for语句实现循环的方法: 3.能够用循环实现一些常用的基本算法: 4.学习如何调试程序。 【相关知识点】 1.for循环语句一般格式 for循环语句的一般格式为: for(表达式1;:表达式2:表达式3) 循环体语句 示例: int i,sum=0; for(i=1;i<=10;i++) { sum=sum+1; printf("%d",sum); 该示例是求1+2+3+…+10之和。 for语句的执行步骤如下: (1)求解表达式1: (2)求解表达式2,若其值为非0(逻辑真),则执行循环体语句,然后执行第(3)步。 若其值为0(逻辑假),则结束循环,转到第(5)步: (3)求解表达式3: .59-
实验 4 循环结构程序设计 4.1 基本的循环程序设计 【实验目的】 1. 掌握循环程序设计的基本概念; 2. 熟练掌握用 while 、do-while 和 for 语句实现循环的方法; 3. 能够用循环实现一些常用的基本算法; 4. 学习如何调试程序。 【相关知识点】 1. for 循环语句一般格式 for 循环语句的一般格式为: for(表达式 1;表达式 2;表达式 3) 循环体语句 示例: int i,sum=0; for(i=1;i<=10;i++) { sum=sum+i; } printf("%d",sum); 该示例是求 1+2+3+……+10 之和。 for 语句的执行步骤如下: (1) 求解表达式 1; (2) 求解表达式 2,若其值为非 0(逻辑真),则执行循环体语句,然后执行第(3)步。 若其值为 0(逻辑假),则结束循环,转到第(5)步; (3) 求解表达式 3; - 59 -
(4)转向(2)继续执行: (5) 循环结束,执行for语句下面的一个语句。 一般表达式1用于对循环变量赋初值,表达式2为循环条件,通常是关系表达式或逻 辑表达式,也可以是数值表达式或字符表达式,不管表达式2是什么类型,只要其值为非0, 就执行循环体。表达式3用于循环变量值,使得循环条件能够趋于结束,在上述示例中为 i+,使得最终i>10,循环结束,执行for语句下面的语句: printf("%od".sum): 值得注意的是,for语句中的表达式1、表达式2和表达式3都可以省略,用于构成循 环体算法。 2.while循环语句一般格式 while循环语句一般格式为: while(表达式) 循环体语句 示例: int i=1,sum=0; while(i<=10) sum=sum+i; i计+, } 该示例是计算1到100的和。当循环条件表达式为非0值时,执行while语句中的循环体 语句。当循环体语句包含一条以上的语句时,要用花括号{}括起来构成复合语句。在循环体 中应该有使循环体趋于结束的语句,在上述示例中,循环结束的条件是“<=10”,ⅰ的初始值 是1,因此在循环体中必须包含有使i增值以最终导致“>10”的语句,这里使用的是“i+,” 语句来达到此目的。如果无此语句,则i的值始终不变,循环永不会结束。 3.do-while循环语句一般格式 do-while循环语句一般格式为: do -60-
(4) 转向(2)继续执行; (5) 循环结束,执行 for 语句下面的一个语句。 一般表达式 1 用于对循环变量赋初值,表达式 2 为循环条件,通常是关系表达式或逻 辑表达式,也可以是数值表达式或字符表达式,不管表达式 2 是什么类型,只要其值为非 0, 就执行循环体。表达式 3 用于循环变量值,使得循环条件能够趋于结束,在上述示例中为 i++,使得最终 i>10,循环结束,执行 for 语句下面的语句: printf("%d",sum); 值得注意的是,for 语句中的表达式 1、表达式 2 和表达式 3 都可以省略,用于构成循 环体算法。 2. while 循环语句一般格式 while 循环语句一般格式为: while(表达式) 循环体语句 示例: int i=1,sum=0; while(i<=10) { sum=sum+i; i++; } 该示例是计算 1 到 100 的和。当循环条件表达式为非 0 值时,执行 while 语句中的循环体 语句。当循环体语句包含一条以上的语句时,要用花括号{ }括起来构成复合语句。在循环体 中应该有使循环体趋于结束的语句,在上述示例中,循环结束的条件是“i<=10”,i 的初始值 是 1,因此在循环体中必须包含有使 i 增值以最终导致“i>10”的语句,这里使用的是“i++;” 语句来达到此目的。如果无此语句,则 i 的值始终不变,循环永不会结束。 3. do-while 循环语句一般格式 do-while 循环语句一般格式为: do - 60 -
{循环体语句} while(表达式)方 示例: int i=1.sum=0: do sum=sum+1; itt, }while(i<=10); 先执行一次指定的循环体语句,然后判断循环条件表达式,当表达式的值为非0(逻辑真) 时,返回重新执行循环体语句,如此反复,直到循环条件表达式的值等于0(逻辑假)为止, 此时循环结束。 do-while语句与while语句的区别是,do-while循环语句的循环体无条件地执行一次,然 后再判断循环条件表达式。 4.break语句和continue语句 break语句的一般形式为: break: break语句除了可以用于switch语句之外,还可以用来从循环体内中跳出循环体,即提前 结束循环,转向执行循环体下面的语句。 示例: float radius ,area,pi=3.14; for(radius=1;radius<=10;radius++) area=pi*radius*radius: if(area>100)break; printf("radius-%f area=%f\n",radius,area); } 该示例是计算半径radius从1变化l0时的圆面积,直到面积area大于100为止。从上面 的for循环可以看到,当area>lO0时,执行break语句,循环提前结束,即不再继续执行其余 -61-
{ 循环体语句 } while(表达式); 示例: int i=1,sum=0; do { sum=sum+i; i++; } while(i<=10); 先执行一次指定的循环体语句,然后判断循环条件表达式,当表达式的值为非 0(逻辑真) 时,返回重新执行循环体语句,如此反复,直到循环条件表达式的值等于 0(逻辑假)为止, 此时循环结束。 do-while 语句与 while 语句的区别是,do-while 循环语句的循环体无条件地执行一次,然 后再判断循环条件表达式。 4. break 语句和 continue 语句 break 语句的一般形式为: break; break 语句除了可以用于 switch 语句之外,还可以用来从循环体内中跳出循环体,即提前 结束循环,转向执行循环体下面的语句。 示例: float radius ,area,pi=3.14; for(radius=1; radius<=10; radius++) { area=pi* radius*radius; if(area>100) break; printf("radius=%f,area=%f\n", radius,area); } 该示例是计算半径 radius 从 1 变化 10 时的圆面积,直到面积 area 大于 100 为止。从上面 的 for 循环可以看到,当 area>100 时,执行 break 语句,循环提前结束,即不再继续执行其余 - 61 -
的几次循环。 continue语句的一般形式为: continue; continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下 一次是否执行循环的判定。 continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循 环语句的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。 示例: int i,sum=0; for(i=1;i<100;i+) ifi%3=0) continue; sum=sum+i; } 该示例是计算100以内不能被3整除的数之和。当i能被3整除时,执行continue语句, 结束本次循环(即跳过sum=sum+i语句),只有i不能被3整除时执行sum=sum+i,语句。 【实验任务】 一、读程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误,针对基本的循环结构程序设计这部分,主 要有如下问题: 1)不能正确表达循环体: 2)没有正确修改循环变量的值,导致循环结束条件不成立而不能结束循环: 3)循环变量或其他循环体中用到的变量没有正确赋初值: 4)break语句与continue语句使用混淆。 针对上面出现的问题,查找下面程序中存在的问题,并改正调试。 1.打开c:lc-programming4pg4101.cpp,该程序有一个小问题,请修改,使程序能正确运 .62-
的几次循环。 continue 语句的一般形式为: continue; continue 语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下 一次是否执行循环的判定。 continue 语句和 break 语句的区别是:continue 语句只结束本次循环,而不是终止整个循 环语句的执行。而 break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。 示例: int i,sum=0; for(i=1;i<100;i++) { if(i%3==0) continue; sum=sum+i; } 该示例是计算 100 以内不能被 3 整除的数之和。当 i 能被 3 整除时,执行 continue 语句, 结束本次循环(即跳过 sum=sum+i;语句),只有 i 不能被 3 整除时执行 sum=sum+i;语句。 【实验任务】 一、读程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误,针对基本的循环结构程序设计这部分,主 要有如下问题: 1) 不能正确表达循环体; 2) 没有正确修改循环变量的值,导致循环结束条件不成立而不能结束循环; 3) 循环变量或其他循环体中用到的变量没有正确赋初值; 4) break 语句与 continue 语句使用混淆。 针对上面出现的问题,查找下面程序中存在的问题,并改正调试。 1.打开 c:\c-programming\4\pg4101.cpp,该程序有一个小问题,请修改,使程序能正确运 - 62 -
行。修改后的程序以pg4101_ok.cpp保存。该源程序内容如下: #include<stdio.h> void main(void) int i; for(i=l;i<ll;i++); { printf("本信息将被显示l0次!n")方 } 了提示:如何发现问题? 编译、链接该程序后,使用工具栏上的按钮或者快捷键F10命令,启用单步运行程序, 这时调试窗口的变量观察区会自动出现,当单步运行到 for(i=1;i<1l;i+)方 语句时,循环变量i一次就变为11,也就是for语句执行了10次,而下面设置的循环句 printf("本信息将被显示l0次!n"); 却没有被执行,从中发现问题,原因是for认为括号之后的分号“:”,即空语句为循环体。 改正程序后的运行结果示例如图4.1.1所示。 "C:lc-programming\4\Debug\pg4101_ok.exe" 回☒ 本信夏将被显示1次: 本信 将被显示1次: 本信息将被显示1次: 本信夏,将被显示1次: 本信息 将被显示1次: 本信息将被显示10次: 本信息将被显示1次: 本信息,将被显示1次: 本信息 将被显示10次: 本信息将被显示1次: Press any key to continue 图4.1.1pg4101_ok.cpp的运行结果 2.打开c:lc-programming4pg4102.cpp,该程序是从键盘上输入一批学生的成绩,以负数 作为数据输入结束的标识。输入结束后计算其中及格的人数。请修改,使程序运行得到正确 的结果。修改后的程序以pg4102 ok.cpp保存。该源程序内容如下: -63-
行。修改后的程序以 pg4101_ok.cpp 保存。该源程序内容如下: #include<stdio.h> void main(void) { int i; for(i=1;i<11;i++) ; { printf("本信息将被显示 10 次!\n"); } } 提示:如何发现问题? 编译、链接该程序后,使用工具栏上的 按钮或者快捷键 F10 命令,启用单步运行程序, 这时调试窗口的变量观察区会自动出现,当单步运行到 for(i=1;i<11;i++); 语句时,循环变量 i 一次就变为 11,也就是 for 语句执行了 10 次,而下面设置的循环句 printf("本信息将被显示 10 次!\n"); 却没有被执行,从中发现问题,原因是 for 认为括号之后的分号“;”,即空语句为循环体。 改正程序后的运行结果示例如图 4.1.1 所示。 图 4.1.1 pg4101_ok.cpp 的运行结果 2.打开 c:\c-programming\4\pg4102.cpp,该程序是从键盘上输入一批学生的成绩,以负数 作为数据输入结束的标识。输入结束后计算其中及格的人数。请修改,使程序运行得到正确 的结果。修改后的程序以 pg4102_ok.cpp 保存。该源程序内容如下: - 63 -