第四章 循环程序设计 循环程序 多重循环 程序设计实例 作业 练习

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
“八皇后”问题 崔萌萌 吕金华.
Loops.
《高等数学》(理学) 常数项级数的概念 袁安锋
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第一章 程序设计入门.
C语言程序设计 第五章 选择结构程序设计.
高级语言程序设计 主讲人:陈玉华.
由C程序结构所知,一个完整的C语言程序是由一个且只能有一个main()函数(又称主函数)和若干个其他函数组合而成的。而前面各章仅学习main()函数的编程,本章将介绍其他函数的编程,包括其他函数的定义、调用、参数传递及变量的作用域等。
C#程序设计基础 $5 流程控制.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
第 四 章 循环结构 while语句 do {} while 语句 break和continue语句
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
循环结构 NEAU ACM-ICPC TEAM 主讲人:NEAU_ACM_Team.
C程序设计.
If … else 選擇結構 P27.
第五章 选择结构程序设计 一、关系运算符和表达式 1、关系运算符 在程序中经常需要比较两个量的大小关系, 以决定程序下一步
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
程式撰寫流程.
走进编程 程序的顺序结构(二).
中国科学院软件研究所 计算机科学国家重点实验室 张文辉
Introduction to the C Programming Language
算法的基本概念.
1. 說明一個一維整數陣列passwd,下標範圍0至49 2. 在屏幕顯示 "Enter password"
C语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
期中考试成绩分布 《程序设计》-2017年秋.
第五章 循环结构的C程序设计 5.1 while循环语句 5.2 do-while循环语句 5.3 for循环语句 5.4 多重循环
計數式重複敘述 for 迴圈 P
第五章 习题课 电子信息与计算机科学系 曾庆尚.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第4章 PHP流程控制语句.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
Introduction to the C Programming Language
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
指標
第1章 绪论(二) 教学目标 理解算法的特性及评价标准 掌握算法时间复杂度和空间复杂度的分析方法 1/
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
《计算机应用基础》 第9章 程序设计基础(二).
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第2章 数据类型、运算符与表达式 本章要点: 基本数据类型 常量和变量 算术运算符和算术表达式 关系运算符和关系表达式
习 题 课(作业).
Introduction to the C Programming Language
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
程序设计基础.
第七章  数 组.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
五 循环结构程序设计 厦大附中信息技术.
第一次上機考參考答案 僅供參考,同學可自行再想更好的方法..
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
Presentation transcript:

第四章 循环程序设计 循环程序 多重循环 程序设计实例 作业 4.10 4.32 4.20 4.1 4.14 4.18 4.25 练习 4.10 4.32 4.20 4.1 4.14 4.18 4.25 练习 4.2 4.3 4.5 4.9 4.11 4.23 4.24 4.26 4.31

§4.1 计算平均成绩—循环程序 例4.1 某评估单位要对学生的学习情况进行评估,需要计算每个学生的平均学习成绩。编程序,从终端逐次输入一个学生n门课程的成绩,计算并输出他的平均成绩。

循环程序有: 先判断条件的循环 这就是循环程序 后判断条件的循环 同样问题还可以描述成先判断条件的循环 本程序是后判断条件的循环 #include <stdio.h> #define n 40 void main(void){ float sum ; int k , m; k=1; sum=0; do { printf("pleace input a achievement :"); scanf("%d",&m ); sum = sum + m; k = k+1 ; } while ( k <= n ) ; printf("average achievement : %5.2f\n" , sum/n ); } sum=0; k=1; 读入一科成绩 → m sum =sum+m; k = k+1 ; 开始 k <= n 结束 F T 输出 sum / n 这就是循环程序 运行结果演示 同样问题还可以描述成先判断条件的循环 本程序是后判断条件的循环

sum=0; k=1; 读入一科成绩 → m sum =sum+m; k = k+1 ; 开始 k <= n 结束 F T 输出 sum / n

C 有三种不同的重复性语句, 它们是 需要弄清楚的 while 语句── 先判断条件的循环; do 语句── 后判断条件的循环; for 语句── 先判断条件的循环。 需要弄清楚的 循环控制方式是什么? 控制条件是什么? 重复执行部分(称为"循环体")是什么?

§4.1.1 后判断条件的循环 其中: ● e是条件; ● S是语句,是要重复执行的操作。 §4.1.1 后判断条件的循环 其含义是: 1) 执行语句列S 2) 计算条件表达式e, 3) 若e的值为true,转向步骤1)再次执行语句S; 否则转向步骤4)结束循环。 4)循环结束,向后执行其后继操作。 其中: ● e是条件; ● S是语句,是要重复执行的操作。 例4.1程序是后判断条件的循环程序,后判断条件的循环在流程图中表示成类似如下左图形式,PAD表示形式如下述右图。 S e T do-while e S

sum=0; k=1; 读入一科成绩 → m sum =sum+m; k = k+1 ; 开始 k <= n 结束 F T 输出 sum / n do-while k<=n sum=0; k=1; 读入一科成绩 → m sum =sum+m; k = k+1 ; 输出 sum / n 开始 结束

后判断条件的循环用do语句描述 一般形式 do S while ( e );

例4.2 计算数列的ak=1/(k*(k+1)) 的前 n 项和 #include "stdio.h" void main ( ){ int n,k ; float sum ; printf ("please input n :"); scanf("%d",&n); sum = 0 ; k = 1 ; do { sum + = 1.0/(k*(k+1)); k++ ; } while ( k<=n ); printf("average achievement: %f\n",sum); } sum = 0 ; k = 1 ; do-while k<= n 结束 开始 输出 sum sum +=1/(k*(k+1)); k = k+1 运行结果演示

例4.3 编程序,输入一个年份,求该年以后的 n 个闰年 输入:年(yy) , 闰年数(n) do-while n > 0 yy = yy+4 开始 结束 求 yy 后第一个闰年 yy 是闰年 输出yy n= n-1

/*PROGRAM find leap year*/ #include "stdio.h" void main(){ int yy,n; printf("please input begin year:"); scanf("%d",&yy); printf("please input the number of the leap year:"); scanf("%d",&n); yy=(yy/4+1)*4; do{ if( (yy%4==0)&&(yy%100!=0)||(yy%400==0) ){ printf("year %d\t",yy); n--; } yy=yy+4; }while(n>0); 运行结果演示 例子举一九○○年开始的三个闰年

例4.4 编程序,解方程 2X3+0.5X2-X+0.093=0 变换方程为:X = 2X3 + 0.5X2 + 0.093 若某个 X 代入右端后,计算结果正好是 X ,则这个 X 值就是方程的根

简单迭代法 等价变换 g (x) = 0 x = f (x) 采用迭代法方法求解x=f(x)方程的根 选定一个 x的初值 x0 ; 否则若 x1≠x0 则令 x0=x1 ,转向2 结束,停止计算 先讲数学上的迭代法的意义。

y=x 可以使用简单迭代的情况 f (x2) f (x) f (x1) f (x0) x0 x1 x2 x*

f (x) 不可以使用简单迭代的情况 y=x f (x0) f (x1) f (x2) x2 x1 x0 x*

简单迭代方法使用条件 对于方程x=f(x),当任意x(a, b) 存在0< L< 1,使 |f‘(x)|≤L<1 则方程x = f(x)在(a, b)上有唯一的根x* 且对任意初值x0 (a, b)时 迭代序列xk+1=f (xk) (k = 0, 1, …)收敛于x* 在实际工作中,决大部分计算都是近似计算,只要求 X1≈X0 即│X1 - X0│<ε使用条件

开始 X0 = 初值 X1 = f(X0) X0≈X1 结束 X0 = X1 T F X1 = 初值 do-while | X1-X0|>ε X0 = X1 X1 = f(X0) 开始 结束

#include "stdio.h" #include "math.h" #define eps 1e-6 void main(){ float x0,x1; x0=0.0; x1=0.0; do{ x0=x1; x1=2*x0*x0*x0 +0.5*x0*x0 +0.093; }while(fabs(x1-x0)>eps); printf("x=%f\n",x0); } 运行结果演示

§4.1.2 先判断条件的循环 开始 开始 sum=0; sum=0; k=1; k=1; 读入一科成绩 → m F sum =sum+m; §4.1.2 先判断条件的循环 sum=0; k=1; 读入一科成绩 → m sum =sum+m; k = k+1 ; 开始 k <= n 结束 F T 输出 sum / n 开始 sum=0; k=1; F k <= n T 输出 sum / n 读入一科成绩 → m sum =sum+m; 结束 k = k+1 ;

其中: ● e是条件; ● S是语句,是要重复执行的操作。 先判断条件的循环程序模式 其含义是: 1) 计算条件表达式e, F while e S 其含义是: 1) 计算条件表达式e, 2) 若e的值为true,转向步骤3)继续循环; 否则转向步骤5)结束循环。 3) 执行语句S 4)转向步骤1) 5)循环结束,向后执行其后继操作。 其中: ● e是条件; ● S是语句,是要重复执行的操作。

先判断条件的循环用WHILE语句描述 一般形式 while ( e ) S

运行结果演示 #include <stdio.h> #define n 40 void main(void){ float sum ; int k , m; k=1; sum=0; while ( k<=n ) { printf("pleace input a achievement :"); scanf("%d",&m ); sum = sum + m; k = k+1 ; } printf("average achievement : %5.2f\n" , sum/n ); while k<=n sum=0; k=1; 读入一科成绩 → m sum =sum+m; k = k+1 ; 输出 sum / n 开始 结束 运行结果演示

例6.6 编程序,按公式求自然对数底 e 的近似值 由于不能进行无穷项的计算,所以只能进行近似计算,当余项 余项计算可利用前后项之间的递推关系

e=1 ; n=1; r=1 ; while r > eps e=e+r ; 开始 结束 r=r*1/n ; n=n+1;

#include "stdio.h" #define eps 1e-5 void main( ) { int n ; float e,r ; e=1.0; n=1; r=1.0; while ( r>eps ) { e=e+r; n=n+1; r=r/n; } printf (" e=%f\n",e) ; 运行结果演示 e=1.0; n=1; r=1.0; e=2.0; n=2; r=0.5; e=2.5; n=3; r=0.1667; e=2.6667; n=4; r=0.0417; ……..

例4.7 编程序,统计以100为结束符的整数输入流中 -1 、0 、+1 的出现次数并输出 例4.7 编程序,统计以100为结束符的整数输入流中 -1 、0 、+1 的出现次数并输出 while num != 100 i=0; j=0; k=0; 输出 i,j,k 开始 结束 输入一个数 → num i++ j++ k++ num -1 1

运行结果演示 #include <stdio.h> #define n 100 void main(void){ int i , j , k , num ; i=0; j=0; k=0; printf("pleace input a integer :"); scanf("%d",&num ); while ( num != n ) { switch (num) { case -1 : i++; break; case 0 : j++; break; case 1 : k++; } printf("number of -1 : %d\n" , i ); printf("number of 0 : %d\n" , j ); printf("number of 1 : %d\n" , k ); 运行结果演示

++和-- v0 – 1 一元 --v v0 后缀 v-- v0 + 1 ++v v++ 运算后表达式值 运算后v的值 类别 表达式

§4.1.3 for 语句 e=1.0; e=1.0; n=1; n=1; for ( r=1.0; r>eps; r=r/n ){ while ( r>eps ) { e=e+r; n=n+1; r=r/n; } e=1.0; n=1; for ( r=1.0; r>eps; r=r/n ){ e=e+r; n=n+1; }

for语句最经常被用于描述循环次数已知循环 sum = 0 ; k = 1 ; while( k<=n ) { sum = sum + 1.0/(k*(k+1)) ; k++ ; } sum = 0 ; for ( k=1 ; k<=n; k++ ) sum = sum + 1.0/(k*(k+1)) ;

一般形式 for ( e1; e2 ; e3) S e1——初值表达式 用于设置该循环开始的一些初值 e2——终值表达式 用于控制循环结束

执行与PAD图 e1 e2 S e3 F 结束 for ( e1 ; e2 ;e3 ) S

例4.8 编程序求向量内积。由终端输入两个n维向量X,Y. 计算其内积XY 。 for( i=1;i<=n ;i++) scanf("%f%f", &xi, &yi ) 开始 结束 输出 xy xy = xy + xi*yi

printf("pleace input n:\n"); scanf("%d",&n); xy = 0; #include "stdio.h" void main ( ){ int n,i ; float xy,xi,yi ; printf("pleace input n:\n"); scanf("%d",&n); xy = 0; for (i=1;i<=n;i++ ) { printf("pleace input xi 、yi :\n"); scanf("%f%f", &xi, &yi ) ; xy = xy + xi * yi ; } printf("xy=%f\n", xy); 运行结果演示

例4.9 编程序,画函数 y=f(x)=e-x sin(2πX)在[0,2]区间上的图形 X

Y X

* +1 -1 40列 y x 40行 区间〔0,2〕分为40行,则图像显示40行,每行相当于x值0.05 * y 区间〔0,2〕分为40行,则图像显示40行,每行相当于x值0.05 Y值在〔-1,+1〕间,则把Y的0点在屏幕中央40列,第20列代表-1,60列代表+1,每列代表y值0.05 40行 x

x = 0; for(i=1 ;i<=40; i++) 开始 结束 计算 y = f(i*0.05) 确定 y 坐标,在相应位置印 *

#define dx 0.05 #define dy 0.05 #define pi 3.14159265 #define y0 40 #define endx 40 void main( ) { int n , i ,j ; float x , y ; x = 0 ; for ( i=0; i<=endx; i++ ) { y = exp(-x) * sin( 2 * pi * x ) ; n = y0+ (int)( y/dy ) ; for (j=0;j<=n;j++) printf(" "); printf("*\n"); x = x + dx ; } 运行结果演示

比较两种循环 S e F while e S S e T 循环体执行的次数,还有循环体内必须有改变e值的操作 do-while e S

§4.2 多重循环 例4.10 打印99表 打印前 9 行 打印底行 开始 结束 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81 * 1 2 3 4 5 6 7 8 9

打印底行 * 1 2 3 4 5 6 7 8 9 打印底行 结束 for (i=1;i<=9;i++) 印 i 印 *

打印前9行 打印前9行 结束 打印第 i 行 for (i=1;i<=9;i++) 1 1 2 2 4 3 3 6 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81

打印第i行 行号 本行数值 6 6 12 18 24 30 36 6 6 12 18 24 30 36 9 9 18 27 36 45 54 63 72 81 9 9 18 27 36 45 54 63 72 81 打印第i行 结束 打印行标 i for(j=1;j<=i;j++) 打印 i*j

打印第i行 行号 本行数值 6 6 12 18 24 30 36 6 6 12 18 24 30 36 9 9 18 27 36 45 54 63 72 81 9 9 18 27 36 45 54 63 72 81 打印第i行 结束 打印行标 i for(j=1;j<=i;j++) 打印 i*j

例4.10 打印99表 打印行标 i for(j=1;j<=i;j++) 打印 i*j for (i=1;i<=9;i++) 开始 打印行标 i for(j=1;j<=i;j++) 打印 i*j for (i=1;i<=9;i++) 打印前 9 行 打印第 i 行 for (i=1;i<=9;i++) 印 i 印 * 打印底行 结束

#include "stdio.h" void main(){ int i,j; for(i=1;i<10;i++){ printf("%4d",i); for(j=1;j<=i;j++) printf("%4d",i*j); printf("\n"); } printf("%4c",'*'); for(i=1;i<10;i++) 运行结果演示 各种循环程序的循环体都可能是个结构语句。如果一个循环结构的循环体仍然是一个循环,便构成循环嵌套,称多重循环。 该程序中含有循环套循环的结构

for (j=i/2;j>=2;j--) 打印100以内素数 for (i=2;i<=100;i++) 开始 结束 打印 i i为素数 i为素数? 返回 flag flag = false for (j=i/2;j>=2;j--) flag = true i%j == 0 拿例子讲解整个过程比如6以内的素数

开始 flag = true for (i=2; i<=100; i++) flag = false for (j=i/2; j>=2; j--) i%j == 0 打印 i 结束 flag

#include "stdio.h" void main( ) { int i ,j ; bool flag; for ( i = 2 ;i <= 100 ; i++ ) { flag=true; for ( j = i / 2 ; j > 2 ; j-- ) if ( i % j == 0 ) flag=false ; if ( flag ) printf("%5d\n" , i ) ; } 运行结果演示

多重循环程序编写要点 内外循环控制条件不要互相冲突 for ( i = 2 ;i <= 100 ; i++ ) { flag=true; for ( i = i / 2 ; i >= 2 ; i-- ) if ( i % j == 0 ) flag=false ; if ( flag ) printf("%5d\n" , i ) ; }

§4.3 程序设计实例 打印数列 求两数最大公因数 阶乘求和 "百钱百鸡"问题 打印字符方阵

例4.12 打印数列 编程序,输出如下序列的前 50 项。 该序列的第一项为 0 第二项为 1 以后的 奇数项为其前两项之和 例4.12 打印数列 编程序,输出如下序列的前 50 项。 该序列的第一项为 0 第二项为 1 以后的 奇数项为其前两项之和 偶数项为其前两项之差。

项数 1 2 3 4 5 6 7 8 9 1 1 u v w 1 1 u v w 1 1 u v w 1 1 u v w 1 1 2 u v w

k<=50 开始 u=0 v=1 k=3 k=k+1 w=v-u k为偶数 w=v+u 输出w u=v v=w 结束 输出u ,v

#include "stdio.h" void main( ) { int u,v,w,k ; u=0 ; v=1 ; printf ( "%5d\n%5d\n",u,v); k=3 ; do { if ( k%2 == 0 ) w=v-u; else w=v+u; printf ( "%12d\n",w); u=v ; v=w ; k=k+1 ; }while ( k<=50 ) ; } 运行结果演示

k<=50 开始 u=0 v=1 k=3 k=k+1 w=v+flag*u flag=-flag 输出w u=v v=w 结束 输出u ,v flag=1

#include "stdio.h" void main( ) { int u,v,w,k ; int flag; u=0 ; v=1 ; printf ( "%5d\n%5d\n",u,v); k=3 ; flag = 1 ; do { w = v + flag*u; flag = -flag ; printf ( "%5d\n",w); u=v ; v=w ; k=k+1 ; }while ( k<=50 ) ; } 运行结果演示

例4.13 求两数最大公因数 编程序,输入两个正整数u 、v ,用欧几里德辗转相除法求它们的最大公因数并输出 欧几里德辗转相除法 例4.13 求两数最大公因数 编程序,输入两个正整数u 、v ,用欧几里德辗转相除法求它们的最大公因数并输出 欧几里德辗转相除法 u % v → R1 v % R1 → R2 R1 % R2 → R3 R2 % R3 → R4 … … … … Rn-1 % Rn → Rn+1=0 Rn 为正整数u 、v的最大公因数

14 % 18 → 14 u v r 18 % 14 → 4 u v r 14 % 4 → 2 u v r 4 % 2 → u v r 2

开始 结束 r=v r!=0 r=u%v u=v v=r 输出u 输入u、v #include "stdio.h" void main( ) { int u,v,r ; printf("pleace input u 、v:"); scanf("%d%d",&u,&v); r=v ; while ( r!=0 ) { r = u%v ; u = v ; v = r ; } printf ( "gcd(u,v) = %5d\n"u ); 运行结果演示

例4.14 阶乘求和 编程序,输入正整数N 计算r1!+r2!+...+rn! 并输出, N=r1r2...rn 例如 N=1234 例4.14 阶乘求和 编程序,输入正整数N 计算r1!+r2!+...+rn! 并输出, N=r1r2...rn 例如 N=1234 求1!+2!+3!+4!

开始 r=N%10 N=N/10 输入N S=0 N!=0 S=S+r! 输出S 结束

r!=1*2*3*……*r r! P=1 P=P*u u=1 u<=r u=u+1 P

开始 r=N%10 N=N/10 输入N S=0 P=1 N!=0 u=1 P=P*u u<=r 输出S u=u+1 S=S+P 结束

#include "stdio.h" void main( ) { int N,S,P,u,r ; printf("pleace input N:"); scanf("%d",&N); S=0 ; while ( N!=0 ) { r = N%10 ; N = N/10 ; P=1; u=1; while ( u<=r ) { P=P*u ; u=u+1 ; } S=S+P; printf ( “r1!+r2!+...+rn! = %5d\n”,S ); 所有计算连乘积的程序都使用一个积单元,有类似本题目的程序模式。其中: P是积单元; 开始进入循环之前积单元P必须置“1”; 在循环体内,每循环一次向积单元乘入一项; 最后循环结束,积单元中的值即为所求之积。 运行结果演示 本章已经编写过多个求和的程序,所有计算和的程序都使用一个和单元,有类似本题目的模式。其中: S是和单元; 开始进入循环之前和单元S必须清“0”; 在循环体内,每循环一次给和单元加上一项; 最后循环结束,和单元中的值即为所求之和。

例4.15 "百钱百鸡"问题 鸡翁一, 值钱五; 鸡母一,值钱三; 鸡雏三, 值钱一。百钱买百鸡; 问鸡翁、母、雏各几何。 例4.15 "百钱百鸡"问题 鸡翁一, 值钱五; 鸡母一,值钱三; 鸡雏三, 值钱一。百钱买百鸡; 问鸡翁、母、雏各几何。 设:设买x只公鸡,买y只母鸡,买z只鸡雏 5x + 3y + z/3 = 100 /* 百钱 */ x + y + z = 100 /* 百鸡 */

开始 结束 for ( x=1; x<=20; x++) 输出x,y,z x ,y ,z 满足方程 for ( y=1; y<=33; y++) for ( z=3; z<=99; z=z+3)

运行结果演示 #include "stdio.h" int x , y , z ; void main( ) { for ( x = 1 ; x <= 20 ; x++ ) for ( y = 1 ; y <= 33 ; y++ ) for ( z = 3 ; z <= 99 ; z=z+3 ) if ( x+y+z == 100 && 5*x+3*y+z/3 == 100 ) printf("result = %5d %5d %5d\n" , x , y ,z ) ; }

#include "stdio.h" int x , y , z ; void main( ) { for ( x = 1 ; x <= 20 ; x++ ) for ( y = 1 ; y <= 33 ; y++ ){ z = 100-x-y ; // 求鸡雏数z,百鸡 if ( 5*x+3*y+z/3 == 100 && z%3==0 ) // 百钱 printf("result = %5d %5d %5d\n" , x , y ,z ) ; } 运行结果演示

例4.16 打印字符方阵 x 打印一行 打印一行 打印前 6 行 for(x=‘A’;x<=‘F’;x++) 打印后5行 例4.16 打印字符方阵 x A B C D E F G H I A B C D E F G H I A B C D E F G H I A B B B C D E F G H I A B C D E F G H I A B C C C C C D E F G H I A B C D E F G H I A B C D D D D D D D E F G H I A B C D E F G H I A B C D E E E E E E E E E F G H I A B C D E F G H I A B C D E F F F F F F F F F F F G H I A B C D E F E F G H I A B C D E E E E E E E E E F G H I A B C D E D E F G H I A B C D D D D D D D E F G H I A B C D C D E F G H I A B C C C C C D E F G H I A B C B C D E F G H I A B B B C D E F G H I A B A B C D E F G H I A B C D E F G H I A for(x=‘A’;x<=‘F’;x++) 打印一行 打印前 6 行 打印一行 for(x=‘E’;x>=‘A’;x--) 打印后5行

结束 开始 打印前段 打印中段 打印后段 打印回车 A B C D E F G H I A B C D E F G H I A B C D E F G H I A B B B C D E F G H I A B C D E F G H I A B C C C C C D E F G H I A B C D E F G H I A B C D D D D D D D E F G H I A B C D E F G H I A B C D E E E E E E E E E F G H I A B C D E F G H I A B C D E F F F F F F F F F F F G H I A B C D E F E F G H I A B C D E E E E E E E E E F G H I A B C D E D E F G H I A B C D D D D D D D E F G H I A B C D C D E F G H I A B C C C C C D E F G H I A B C B C D E F G H I A B B B C D E F G H I A B A B C D E F G H I A B C D E F G H I A 打印前段 打印中段 开始 结束 打印后段 打印回车

y x C D E F G H I A B D E F G H I A B C E F G H I A B C D for(y=x;y<=‘I’;y++) 打印 ’ □y’ for(y=‘A’;y<x;y++)

x A B B B C C C C C D D D D D D D 开始 打印:(5-(x-‘A’))*2个空格 结束 打印:(5-(x-‘A’))*2个空格 打印:2*(x-‘A’)+1个□x

y x C D E F G H I A B D E F G H I A B C E F G H I A B C D for(y=x+1;y<=‘I’;y++) 打印 ’ □y’ for(y=‘A’;y<=x;y++)

for ( y=x; y<=’I’;y++) 打印:□y for ( y=’A’; y<=x-1;y++) 开始 for ( x=’A’; x<=’F’; x++) 打印:(5-(x-‘A’))*2个空格 打印:2*(x-‘A’)+1个□x for(y=x+1;y<=‘I’;y++) 打印 ’ □y’ for(y=‘A’;y<=x;y++) 打印回车

for ( y=x; y<=’I’;y++) 打印:□y for ( y=’A’; y<=x-1;y++) for ( x=’E’; x>=’A’; x--) 打印:(5-(x-‘A’))*2个空格 打印:2*(x-‘A’)+1个□x for(y=x+1;y<=‘I’;y++) 打印 ’ □y’ for(y=‘A’;y<=x;y++) 结束 打印回车

#include "stdio.h" char x , y ; int i ; void main( ) { for ( x=’A’;x<=’F’;x++){ // 前六行 for ( y=x; y<=’I’;y++) printf ( " □ %c", y); for ( y=’A’; y<x; y++) printf ( " □ %c", y); for( i=1;i<=(5-(x-‘A’))*2); i++) printf ( " □ "); for( i=1;i<=2*(x-‘A’)+1;i++) printf ( " □ %c", x); for( i=1;i<=(5-(x-‘A’))*2); i++) printf ( " □ "); for ( y=x+1; y<=’I’;y++) printf ( " □ %c", y); for ( y=’A’; y<=x;y++) printf ( " □ %c", y); printf ( "\n"); }

for ( x=’E’;x>=’A’;x--){ // 后五行 for ( y=x; y<=’I’;y++) printf ( "□%c", y); for ( y=’A’; y<=x-1;y++)printf ( "□%c", y); for( i=1;i<=(5-(x-‘A’))*2); i++) printf ( "□"); for( i=1;i<=2*(x-‘A’)+1;i++) printf ( "□%c", x); for ( y=x+1; y<=’I’;y++) printf ( "□%c", y); for ( y=’A’; y<=x;y++) printf ( "□%c", y); printf ( "\n"); } 运行结果演示

本章小结 后判断条件循环 do while 语句 先判断条件循环 while语句 for语句 重点 使用编写循环结构程序解决实际问题