1、作业,1. 输入两个正整数,求其最大公约数和最小公倍数。方法:求最大公约数用辗转相除法;最小公倍数=2数的积除以最大公约数3 3 3 2. 输出水仙花数,例1531 + 5 + 3,小 结,第六章 循环结构,在语言中,可用以下语句实现循环: (1)用goto语句和if语句构成循环。 (2)用while语句。 (3)用do-while语句。 (4)用for语句。,第六节 循环嵌套 第七节 几种循环的比较 第八节 break 、continue语句 第九节 程序举例,例6.4 求1100的累加。,#include int main()int i, sum; i=1;sum =0;while (i=
2、100) sum =sum+ i;i+; printf( “sum=%dn”, sum);return 0;,#include int main() int i, sum; i=1;sum =0;dosum =sum+ i;i+; while (i=100); printf( “sum=%dn”, sum);ruturn 0;,先判后做,先做后判,第五节 for 语句 语法格式为: for(表达式1; 表达式2;表达式3)语句; ,表达式1; while(表达式2)语句;表达式3;,for(表达式1; 表达式2;表达式3) 语句 ;,最常用形式的表达: for(初值; 条件;增值) 语句;,f
3、or ( 表达式1 ; 表达式2 ; 表达式3 )语句;,表达式1,;,表达式3,;,这个分号 不能移走,这个分号 不能丢掉,for的变化:,说明: 1、for语句的表达式是任意可选的。但是分号不能省略!,例1:for( ; i=100;i+) sum=sum+i;,i=1;,例2:,for(i=1; ;i+) if ( sum 100 ) break;sum=sum+i; ,退出循环,例3:for(i=1; i=100; ) sum=sum+i;,例3:for(i=1; i=100; ) sum=sum+i;i+;,2、表达式1和表达式3可以是逗号表达式。,例4:for ( i=0 , j=
4、100 ; i=j ; i+ , j-) k=i+j;,3、表达式2一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式。,例6:for (;(c=getchar()!=n ;) printf(“%c”,c);,敲Enter键才进入缓冲区!,例5: for( k = 1; k - 4; k+)s = s + k; 当 k 的值等于4时终止循环。,数值表达式,computer,第六节 循环嵌套,一、循环语句的循环体内,包含另一个完整的循环结构。 二、构成多重循环。 三、for、while、do-while语句互相嵌套。,其中最重要的嵌套结构应该是循环套选择: while(条件1)语句1;
5、if(条件2)语句2;else语句3;语句4; 例如:作业 P140.8 求水仙花数。,For(初值;条件;增值),第八节 break 、continue语句,功能 (1)break:强行结束循环,用于跳出循环和switch结构。 (2)continue:用于结束本次循环。,最有代表性的循环算法:穷举与迭代,1、穷举:对问题的所有可能状态一一测试,直到求解。,循环控制的办法:计数法与标志法。 计数法,先确定循环次数,然后逐次测试,完成测试次数后,循环结束。 标志法,是达到某一目标后,使循环结束。,例6.13:百钱买百鸡(二重穷举算法),算经:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡
6、,问鸡翁、母、雏各几何?,(1)基本解题思路这是有名的不定方程问题:cocks+hens+chicks=1005*cocks+3*hens+chicks/3=100,cocks:鸡翁数 hens:鸡母数 chicks:鸡雏数,由题知三个变量取值范围: cocks: 019中的整数 hens: 0 33 中的整数 chicks: 0 100中的整数依次取cocks值域中的一个值,然后求其余两数,看是否符合题意。,S1: cocks=0; S2: while(cocks=19) S2.1: 找满足题意的hens,chicks; S2.2: cocks加1,S2.1.1: hens=0; S2.1.
7、2: while(hens=33)S2.1.2.1: 找满足题意的chicks;S2.1.2.2: hens加1;,S2.1.2.1: chicks=100-cocks-hens;if (5*cocks+3*hens+chicks/3.0)=100printf(“%d %d %dn”,cocks,hens,chicks);,main() int hens,chicks , cocks=0;while(cocks=19) hens=0;while (hens=33) chicks=100-cocks-hens;if (5.0*cocks+3.0*hens+chicks/3.0=100.0)pri
8、ntf(“%d %d %dn”,cocks,hens,chicks);hens=hens+1;cocks=cocks+1; ,0 25 75 4 18 78 8 11 81 12 4 84,2、迭代:是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。,著名意大利数学家Fibonacci曾提出一个有趣的问题:设有一对新生兔子,从第三个月开始它们每个月都生一对免子。按此规律,并假设没有免子死亡,一年后共有多少对免子?,与迭代有关的因素:初值 迭代公式 迭代次数,例6.14:求菲波那契(Fibonacci)数列,该数列的生成方法为:f1=1,f2=1,fn=fn-1+fn-2(n=3)
9、,即从第3个数开始,每个数等于前2个数之和。,N-S图:,赋初值,迭代公式,迭代次数,属于固定次数的循环,main() int f1=1,f2=1; /*定义并初始化数列的头2个数*/ int i; /*定义并初始化循环控制变量i*/ for(i=1; i=6; i+ ) /*1组2个,6组12个月*/ printf(“%12d%12d”, f1, f2); /*输出当前的2个数*/ if(i%2=0) printf(“n”); /*输出2次(4个数),换行*/ f1 += f2; /*计算下2个数*/ f2 += f1; ,运行结果:1 1 2 35 8 13 2134 55 89 144,
10、四、一种典型结构-含有无条件转移的循环,格式: while(条件1)语句1;if(条件2)语句2;break;else语句3continue;,由于这种结构的重要性,我们几乎可以把它看作是一种基本结构。,功能:该结构是在循环结构内套了一个选择结构,在选择结构内出现了无条件转移。而无条件转移的目标与循环结构相关。 1、break和continue是无条件转移 2、break和continue出现在循环体内 3、break 指向出口 continue 指向入口,算法设计要点:1、显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。2、判断某数m是否是素数的算法:根据素数的定义,
11、 m 被 2 m 之间的每一个数除,如果都不能被整除,则表示该数是一个素数。判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现。,例6.15:输出100200之间的全部素数。,【例6.10】 求100200之间的全部素数。,#include #include int main ( ) int m, i, k;printf (“输入一个整数:“);scanf (“%d“, ,for ( m = 101; m 200; m = m + 2 ) ,if ( i k ) printf (“%6d“, m ); ,分析:判断m是否为素数,#include main() int i,
12、m, k,n=0; for(m=101; m= k+1 ) /*整数m是素数:输出,计数器加1*/ printf(“%6d”,m); n+; if(n%10=0) printf(“n”); /*每输出10个数换一行*/ ,101 103 107 109 113 127 131 137 139 149151 157 163 167 173 179 183 191 193 197199,例6.16:用一元换成一分、两分、五分的所有兑换方案,main() int i,j,k,m=0;for(i=0;i=0)printf(“%2d,%2d,%2d”,i,j,k);m=m+1;if(m%5=0) pri
13、ntf(“n”); ,第七章 数 组,第一节 概述 第二节 一维数组的定义和引用 第三节 二维数组的定义和引用 第四节 字符数组与字符串,第一节 概 述,一、引 入,排序问题,两个数排序?,if ( a b ) t = a; a = b; b = t; ,三个数排序?,if ( a b ) t = a; a = b; b = t; if ( a c ) t = a; a = c; c = t; if ( b c ) t = b; b = c; c = t; ,四个数排序?,if ( a b ) t = a; a = b; b = t; if ( a c ) t = a; a = c; c =
14、t; if ( a d ) t = a; a = d; d = t; if ( b c ) t = b; b = c; c = t; if ( b d ) t = b; b = d; d = t; if ( c d ) t = c; c = d; d = t; ,100个数排序?,!?,小儿科!,小 case!,有点儿,基本类型的变量的存储特点是:,例如: x = 4.2; y1 = 0;y2 = -2 * x;,简单变量,每个变量单独存储,各变量之间独立存放, 无任何联系.,二、构造类型的基本概念由简单类型构造而成的,称为构造类型。构造类型的每一个分量是一个变量,可以是一个简单类型或者构造类
15、型构造类型的分量的使用方法与简单变量相同构造类型的分量占用相邻的存储空间 对于构造类型的变量,重点是访问其分量的方法,例如:int a10; float b34;struct student int num;char name20;char sex;int age;char addr30;student1, student2;,数组,结构体,1、有序数据的表示 例如:,测量球的直径:需要多次测量,求平均值按学号排列的成绩表线性方程组的系数矩阵,三、 数组中几个重要概念,这些数据都是由具有相同类型的若干个分量按一定顺序排列组成的。, 数组定义:是指一组同类型数据的有序集合。 数组表示方法:数组中
16、的元素可以用统一的数组名和下标来唯一的确定。 例: age1, age2, age3 注意: 同一数组中的所有元素必须属于同一数据类型。,标识符,第一节 一维数组的定义和引用一、一维数组的定义方法:类型说明符 数组名常量表达式;, 类型说明符:是指数组元素的数据类型。 数组名:与变量名一样,必须遵循标识符命名规则。, 常量表达式: 又称数组长度,它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。 例 int a5; char c10;,元素个数,注意:a5 不能用!,例 y4*M+1;,符号常量,注意:C语言中不允许动态定义数组。 例:int n;scanf(“%d”,二、一维数组元
17、素的引用:数组元素的引用形式如下: 数组名下标,整型常量或整型表达式,例如:a0 = a5 + a7 - a2*3, 引用方式:先定义,后使用。 同样有三部曲:定义,初始化赋值,引用。 C规定:只能引用数组元素,而不能引用整个数组。,说明:,例7.1:数组元素的引用,int main() int i,a10;for (i=0;i=0;i-)printf(“%d”,ai);return 0; ,运行结果: 9876543210,数组元素的下标常用循环变量来控制,三、一维数组的初始化定义:指在定义数组时对各元素赋以初始值。 初始化格式: 数据类型 数组名常量表达式初值表例: char c7=c,
18、, l, a, n, g, u;int a=1,3,5,7,9; (全体赋初值),缺省,int a5=1,3,5; (部分初始化),char c7=c, , l, a, n, g, u;c0 c1 c2 c3 c4 c5 c6,int a=1,3,5,7,9; (全体赋初值)a0 a1 a2 a3 a4,int a5=1,3,5; (部分初始化)a0 a1 a2 a3 a4,int d5= 0 , 0 , 0 , 0 , 0 ;或int d5= 0 ;d0 d1 d2 d3 d4,static int e5; a0 a1 a2 a3 a4,int a5; a0 a1 a2 a3 a4,随机数!
19、 长度不定!,例7.2:求菲波那契(Fibonacci)数列,该数列的生成方法为:f0=1,f1=1,fi=fi-2+fi-1(i=2),即从第3个数开始,每个数等于前2个数之和。,N-S图:,四、一维数组的举例,int main() int f1=1,f2=1; int i; for(i=1; i=6; i+ ) printf(“%12d%12d”, f1, f2); if(i%2=0) printf(“n”); f1 += f2; f2 += f1; return 0;,int main() int i;int f12=1,1;for(i=2;i12;i+)fi=fi-2+fi-1;for
20、(i=1;i13;i+) if(i%4=0) printf(“n”);printf(“%12d”,fi);return 0; ,算法简单 多占内存,算法复杂 少占内存,经典,#define N 30 int main() int i,sum=0,high=0,score;float average;printf(“input everyones score.n”);for(i=0;ihigh)high=score;average=(float)sum/N;printf(“average=%dn”,average);printf(“high=%dn”,high);return 0; ,例7.3:
21、统计全班某门功课期末考试的平均分数 和最高分数(设全班人数为30人),用简单变量实现,用数组实现分析:定义一个整形数组score30,存放全班每位同学的分数用for循环读入分数,并求出总分和平均分定义变量high存入当前得到的“最高分”,每得到一个分数都要与high的值比较,若比high大,则放入high中,这样最后high的值一定是最高分,#define N 30 main() int i,sum=0,high=0,scoreN;float average;printf(“input everyones score.n”);for(i=0;ihigh)high=scorei;average=
22、(float)sum/N;printf(“average=%dn”,average);printf(“high=%dn”,high); ,思考: 找出n个数中超出平均值的那些数?,for(high=0,i=0;ihigh)high=scorei; ,#define N 30 int main() int i,sum=0,high=0,score;float average;printf(“input everyones score.n”);for(i=0;ihigh)high=score;average=(float)sum/N;printf(“average=%dn”,average);pr
23、intf(“high=%dn”,high);return 0; ,用简单变量实现,对n个整数从小到大排序。 冒泡法的基本思想:通过相邻两个数之间的比较和交换,使数值较小的数逐渐从底部移向顶部,就像水底的气泡一样逐渐向上冒,故而得名。,例7.3:冒泡法排序,重要算法,9 8 5 4 2 0,9 8 5 4 2 0,8 9,5 9,4 9,2 9,0 9,9,9,8 5 4 2 0 9,5 8,4 8,2 8,0 8,8,8,4 2 0 5 8 9,5,5,2 0 4 5 8 9,4,4,0 2 4 5 8 9,2,2,结果,开始,0 2 4 5 8 9,共循环多少次? 每次循环进行了多少次比较? 如果有n个数,则要进行n-1趟比较。 在第j趟比较中要进行n-j次两两比较。,#include #define N 6 int main ( ) int aN+1; int i , j, t ;printf (“input %d numbers:n“, N);for ( i = 1; i ai+1 ) t = ai; ai = ai+1; ai+1 = t; printf (“the sorted numbers:n“);for ( i = 1; i = N; i+) printf (“%d “, ai );printf (“n“);return 0; ,作业: P141 12 14,