[流程管理课件]第四章流程控制(2)_循环结构

上传人:无*** 文档编号:112605540 上传时间:2022-06-23 格式:PPTX 页数:95 大小:475.79KB
收藏 版权申诉 举报 下载
[流程管理课件]第四章流程控制(2)_循环结构_第1页
第1页 / 共95页
[流程管理课件]第四章流程控制(2)_循环结构_第2页
第2页 / 共95页
[流程管理课件]第四章流程控制(2)_循环结构_第3页
第3页 / 共95页
资源描述:

《[流程管理课件]第四章流程控制(2)_循环结构》由会员分享,可在线阅读,更多相关《[流程管理课件]第四章流程控制(2)_循环结构(95页珍藏版)》请在装配图网上搜索。

1、4.3 循环结构4.3.1 for语句4.3.2 while语句4.3.3 do-while语句4.3.1 for语句例4-9:输入2个整数lower和 upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是lower, upper,每次增加1F。例如 输出:fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7输入:30 35一、 程序解析-温度转换表#include int main(void) int fahr, lower, upper; double celsius; printf(“输入最低值:); scanf(%d,

2、 &lower); printf(“输入最高值:); scanf(%d, &upper); printf(fahr celsiusn);/ 温度重复转换:华氏温度从lower开始,到upper结束,每次增加1F for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32); printf(%d %6.1fn, fahr, celsius); return 0; fahr = fahr+1Enter lower: 30Enter upper: 35fahr celsius 30 -1.1 31 -0.6

3、32 0.0 33 0.6 34 1.1 35 1.7例4-9中for语句的流程for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32); printf(%d %6.1fn, fahr, celsius); Enter lower: 30Enter upper: 35fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7到VC 中看看执行过程for(表达式1;表达式2;表达式3) 循环体语句实现C语句的重复执行二、 for语句循环语句3个表达

4、式、循环体语句个表达式、循环体语句!书写顺序和执行顺序不同书写顺序和执行顺序不同!表达式表达式1只执行一次只执行一次循环(控制)变量:for语句中,通过改变或判断某个变量的值来控制循环的执行for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); for语句中的循环变量赋初值赋初值判断其值判断其值改变其值改变其值for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 /

5、9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); 表达式1:给循环变量赋初值,指定循环的起点。fahr = lower表达式2:给出循环的条件,决定循环的继续或结束。fahr = upper表达式3:设置循环的步长,改变循环变量的值,从而可改变表达式2的真假性。fahr+语句:被反复执行的语句,一条语句。for语句的说明for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, cels

6、ius); for (fahr = lower ; fahr = upper; fahr = fahr + 1) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); 注意复合语句 和空语句 ;for (fahr = lower ; fahr = upper; fahr = fahr + 1); celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); !不要在!不要在for语句中随意加分号语句中随意加分号例4-10

7、 求 1+2+100抽取具有共性的算式:sum = sum + i sum初值为0,该算式重复100次,i从1变到100设i为循环变量,则:指定循环起点的表达式1:i = 1给出循环条件的表达式2:i = 100设置循环步长的表达式3:i+循环体语句:sum = sum + i;for(i=1; i=100; i+)sum =sum+i;三、 指定次数的循环程序设计/* 计算1 + 2 + 3 + + 100 */#include int main() int i, sum; sum = 0; /* 置累加和sum的初值为0 */ for ( i = 1; i = 100; i+ ) /* 循

8、环重复100次 */ sum = sum + i; /* 反复累加 */ printf( “sum = %dn”, sum); /* 输出累加和 */ return 0;源程序求 1+2+100for(i=1; i=100; i+) sum=0; sum=sum+i; 结果如何?结果如何?sum=5050/* 计算1 + 2 + 3 + + 100 */#include int main() int i, sum; sum = 0; for ( i = 1; i = 100; i+ ) sum = sum + i; printf( “sum = %dn”, sum); return 0;模仿练

9、习:求 1+1/2+1/3+ 1/100for(i=1; i=100; i+) sum=sum+1.0/i;int i;double sum;printf( “sum = %fn”, sum);在上例基础上改写:一般包含四个部分:l初始化:指定循环起点l给循环变量赋初值,如i = 1;l进入循环之前,设置相关变量的初值,如sum = 0。l条件控制:l只要i 100,循环结束。指定次数的循环程序设计输入一个正整数n,求前n项和,即循环n次/* 计算1 + 2 + 3 + + 100 */#include int main(void) int i, sum; sum = 0; for ( i =

10、 1; i = 100; i+ ) sum = sum + i; printf( “sum = %dn”, sum); return 0;例4-11 求 1+2+3+n for(i=1; i=n; i+) sum=sum+i;printf(“Enter n:); scanf(%d, &n); Enter n: 100Sum = 5050/* 计算1 + 2 + 3 + + n */#include int main() int i, sum; printf(“Enter n: ); scanf(%d, &n); sum = 0; for ( i = 1; i = n; i+ ) sum = s

11、um + i; printf( “sum = %dn”, sum); return 0;模仿练习: 求1+1/2+1/3+ 1/n /*求1+1/2+1/3+ 1/n*/#include int main() int i, n; double sum; printf(“Enter n: ); scanf(%d, &n); sum = 0; for ( i = 1; i = n; i+ ) sum = sum + 1.0/i; printf( “sum = %fn”, sum); return 0;求前n项和,即循环n次,每次累加1项。for (i = 1; i = n ; i+) sum =

12、sum + item (第i项)问题是第i项item如何计算(考虑与i的关系): item = 1.0 / (2 * i - 1)例4-12 求 1+1/3+1/5+ 的前n项和for (i = 1; i = n ; i+) item = 1.0 / (2 * i - 1);/* 计算第i项的值 */ sum = sum + item;/* 累加第i项的值 */思路一:求前n项和,即循环n次,每次累加1项。for (i = 1; i = n ; i+) sum = sum + item (第i项)问题是第i项item如何计算:分母总是比前一项大2 求 1+1/3+1/5+ 的前n项和思路二de

13、no=1;for (i = 1; i = n ; i+) item=1.0/deno; /*计算第i项的值 */ sum = sum + item;/* 累加第i项的值 */ deno=deno+2; /*计算下一项的分母 */#include int main(void) int i, n; double item, sum; printf(“Enter n: ); scanf (%d, &n);sum = 0 ; for ( i = 1; i = n; i+ ) item = 1.0 / (2 * i - 1); /* 计算第i项的值 */ sum = sum + item ; /* 累加

14、第i项的值 */ printf ( sum = %fn, sum); return 0;源程序求 1+1/3+1/5+的前n项和模仿练习:1、求 的前n项和,结果保留3位小数2、求的前n项和,结果保留3位小数3、求的前n项和,结果保留3位小数.116957453321.16113110171411.111917151311求前n项和,即循环n次,每次累加1项。for (i = 1; i = n ; i+) sum = sum + item (第i项)关键是第i项item的计算: 符号和前一项相反,分母比前一项大2 deno= deno + 2 flag = -flag item = flag

15、* 1.0 / deno 求 1-1/3+1/5- 的前n项和方法1:deno=1;flag=1;for (i = 1; i = n ; i+) item=flag*1.0/deno; /*计算第i项的值 */ sum = sum + item;/* 累加第i项的值 */ deno=deno+2; /*计算下一项的分母 */ flag=-flag; /计算下一项的符号方法2:flag=1;for (i = 1; i = n ; i+) item=flag*1.0/(2*i-1); /*计算第i项的值 */ sum = sum + item;/* 累加第i项的值 */ flag=-flag; /

16、计算下一项的符号#include int main() int deno, flag, i, n; double item, sum; printf(“Enter n: ); scanf (%d, &n); flag=1; deno =1;sum = 0 ; for ( i = 1; i = n; i+ ) item = flag * 1.0/ deno; /* 计算第i项的值 */ sum = sum + item ; /* 累加第i项的值 */ flag = -flag; /* 准备下一次循环 */ deno = deno +2; printf ( sum = %fn, sum); ret

17、urn 0;模仿练习 源程序例4-13 阶乘表product=1;for (i = 1; i = n ; i+) 计算i的阶乘;(前一项结果*i) 输出结果输入一个整数n,输出1-n的阶乘表:1 12 23 64 245.product=product * i;printf(“%d %dn”,product);#include int main(void) int i, n, product; printf(input n: n); scanf (%d, &n) ; product=1; /* 置阶乘product的初值为1 */ for ( i = 1; i = n; i+ ) /* 循环重

18、复n次*/ product = product * i ; /递推计算i的阶乘printf ( %d %dn, i, product ); return 0;例4-13 源程序1:结果用int型13以前的能正确计算,从14开始结果出错!超出int型的表达范围!#include int main(void) int i, n; double product; printf(input n: n); scanf (%d, &n) ; product=1; /* 置阶乘product的初值为1 */ for ( i = 1; i = n; i+ ) /* 循环重复n次,计算n! */ product

19、 = product * i ; /递推计算i的阶乘 printf ( %d %.0f n, i, product ); return 0;例4-13 源程序2:结果用double型21以前的可以正确计算,22以后都是近似结果!double型也不是万能的,只有16位有效数字!例4-14 n个数求和从键盘输入一个整数n和n个整数,输出这n个整数的和思路分析:(1)定义、初始化变量;读入整数n;(2)控制循环进行n次,循环内容: 读入一个整数a; 把a累加到sum上; (3)输出sum的值l#include lint main()l l int i,n,a,sum;l scanf(%d,&n);l

20、 sum=0;l for(i=1;i=n;i+)l l scanf(%d,&a);l sum=sum+a;l l printf(%dn, sum);l return 0;l例4-15 n个数求和 源程序循环变量不一定要在循环体内参与运算,本例中,循环变量i只起到控制循环次数的作用模仿练习:1、输入n,然后输入n个整数,输出这n个整数的最大值。思路分析(1) scanf(“%d”,&n);(2) scanf(“%d”,&a); max=a; /用第一个数作为max的初始值(3)控制循环再进行n-1次for(i=1;imax) max=a; /若当前整数a比max大,则更新max(4)输出max例

21、4-15 数列和l计算 的前20项和。357sin( ).3!5!7!xxxxx先找规律:后一项与前一项相比:符号如何变?分子如何变?分母如何变?解题思路(1)定义相关变量i, num(分子)、demo(分母),flag(符号),sum(累加和)(2)读入x(3)初始化: flag=1; num=x; demo=1; sum=0;(4)计算前20项for(i=1;i=20;i+) sum=sum+flag*num/demo; /计算当前项并累加 /为下一项做准备 flag=-flag; /符号取反 num=num*x*x; /计算下一项的分子 demo=demo*(2*i)*(2*i+1) ;

22、 /计算下一项分母(5)输出结果l#include lint main()l l int i,flag;l double x,num, demo,sum;l scanf(%lf,&x);l /初始化初始化l flag=1; num=x; demo=1;l sum=0;l for(i=1;i=20;i+)l l sum=sum+flag*num/demo; /计算当前项并累加计算当前项并累加l /为下一项做准备为下一项做准备l flag=-flag; /符号取反符号取反l num=num*x*x; /计算下一项的分子计算下一项的分子l demo=demo*(2*i)*(2*i+1) ; /计算下

23、一项分母计算下一项分母l l printf(%.3fn, sum);l return 0;l例4-14 数列和 程序模仿练习:1、求1! + 2! + . + 100!2、输入n和a,求a+aa+aaa+aaa(n个a),如当n=3,a=2时,2+22+222的结果为246提示 1:for (i = 1; i = 100; i+) 求出第i项item sum = sum + item;先找规律:后一项与前一项相比:求1! + 2! + . + 100!由i的阶乘如何求出i+1的阶乘? 提示2:输入n和a,求a+aa+aaa+aaa(n个a)(1) 首先初始化sum=0, term=0;(2)

24、每次循环:(i从1到n) 前一项乘10加a,得到当前项: term=term*10+a 累加当前项:sum=sum+term;例4-16: 统计输入的一批字符中各类字符的数量编程:输入10个字符,统计其中英文字母、数字字符和其他字符的个数。 思路分析:(1)定义相关变量i, letter, digit, other, ch,并初始化(2)控制循环进行10次 for(i = 1; i = 10; i+) (1)读入一个字符 (2)if(该字符是字母) letter增1 else if(该字符是数字) digit增1 else other增1 (3)输出letter, digit, other#i

25、nclude int main(void) int digit, i, letter, other; char ch; digit = letter = other = 0; printf(“Enter 10 characters: ); for(i = 1; i = a & ch = A & ch = 0 & ch = 9) /* 如果ch是数字字符 */ digit +; else other +; printf(letter=%d,digit=%d,other=%dn,letter,digit,other); return 0;input 10 characters: Reold 123

26、?letter=5, digit=3, other=2 多层缩进的书写格式多层缩进的书写格式使程序层次分明使程序层次分明 程序解析例4-17 查询自动售货机中商品的价格 假设自动售货机出售4种商品,薯片(crisps)、爆米花(popcorn)、巧克力(chocolate)和可乐(cola),售价分别是每份3.0、2.5、4.0和3.5元。在屏幕上显示以下菜单,用户可以连续查询商品的价格,当查询次数超过5次时,自动退出查询;不到5次时,用户可以选择退出。当用户输入编号14,显示相应商品的价格;输入0,退出查询;输入其他编号,显示价格为0。1 Select crisps2 Select popc

27、orn 3 Select chocolate4 Select cola 0 Exit思路分析:(1)定义相关变量choice, i, price;(2)控制循环执行5次for( i = 1; i = 5; i+) (1)用多个printf显示菜单 (2) 读入用户的选择choice (3)如果用户选择0,则用break终止循环 (4)用swtich语句根据用户的不同选择把不同的价格值赋给变量price (5)输出price#include int main() int choice, i; double price; for( i = 1; i = 5; i+) printf(1 Select

28、 crisps n); printf(2 Select popcorn n); printf(3 Select chocolate n); printf(4 Select cola n); printf(0 exit n); printf(Enter choice: ); scanf(%d, &choice); if(choice = 0) break; switch (choice) case 1: price=3.0; break; case 2: price=2.5; break; case 3: price=4.0; break; case 4: price=3.5; break; d

29、efault: price=0.0; break; printf(price = %.1fn, price); /for结束 printf(Thanks n); 此break用来终止for循环运行结果:1 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 ExitEnter choice: 1price = 3.01 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 ExitEnter choice: 7price = 0.01 Selec

30、t crisps2 Select popcorn 3 Select chocolate4 Select cola 0 ExitEnter choice: 0Thanks上机作业l1、输入n,输出1+2+3+n的结果l2、输入n(n10),输出1*2*3*n的结果l3、输入n,输出1+1/2+1/3+1/n的结果,结果保留2位小数l4、输入n,输出1+1/3+1/5+1/n的结果,结果保留2位小数l5、输入n,输出1-1/3+1/5-1/n的结果,结果保留2位小数l6、输入n,然后输入n个整数,输出n个整数的和7、输入n,然后输入n个整数,输出n个整数的最大值8、输出1-100的自然对数表,对数

31、保留4位小数 n n的对数 1 0.0000 2 0.6931 .9、输入10个字符,统计其中数字字符(0-9)个数。10、四则运算,要求能实现多次计算,但最多不超过5次。程序运行后首先提示输入两个实数,然后显示菜单: 1、相加2、相减3、相乘4、相除5、退出然后读入用户的选择,根据用户选择输出相应的结果4.3.2 while语句例4-18:使用格里高利公式求的近似值,要求精确到最后一项的绝对值小于104。11114357不知道循环次数!循环结束的条件是:最后一项的绝对值小于104#include int main(void) int deno, flag; double item, pi;

32、flag = 1; deno = 1 ; item = 1.0; pi = 0; while(fabs (item) = 0.0001) item = flag * 1.0 / deno; pi = pi + item; flag = -flag; deno = deno+2; pi = pi * 4; printf ( “pi = %fn”, pi); return 0;一、 程序解析求的近似值pi = 3.141613 item=0.0 ?fabs(item) 0.0001二、 while 语句while (条件) 循环体语句; 真真假假while下一条语句下一条语句表达式表达式循环体语句

33、循环体语句循环条件循环条件循环体循环体一条语句一条语句课堂练习:以下程序段的运行结果?l(1)l i=0;lwhile(i5)ll printf(i=%dn,i);l i+;li=0i=1i=2i=3i=4请用请用for循环改写这个程序段循环改写这个程序段:for( i=0; i5; i+) printf(i=%dn,i);课堂练习:以下程序段的运行结果?l(2)li=k=1;lwhile(i5)llk+=i;lprintf(i=%d,k=%dn,i,k);li=1,k=2i=1,k=3i=1,k=4i=1,k=5i=1,k=6死循环!死循环!i5永真永真课堂练习:以下程序段的运行结果?l(3

34、)li=0;lwhile(i=4)ll printf(*n);l i+=2;l*死循环!死循环!无论无论i值在循环体中如何变化,值在循环体中如何变化,i=4 为永真为永真是死循环。是死循环。课堂练习:以下程序段的运行结果?l(4)li=0;lwhile(i=4)ll printf(i=%dni);l i+=2;l无输出无输出进入循环时首先测试进入循环时首先测试 i=4 的值为假,结束循环。的值为假,结束循环。循环体一次也不执行,无输出。循环体一次也不执行,无输出。while 语句和for语句都是在循环前先判断条件while 语句说明表达式表达式1;while (表达式表达式2) for的循环体

35、语句的循环体语句; 表达式表达式3;把把for语句改写成语句改写成while语句语句for(表达式表达式1; 表达式表达式2; 表达式表达式3) 循环体语句循环体语句while 和 for 的比较for (i = 1; i = 10; i+) sum = sum + i; i = 1; 循环变量赋初值循环变量赋初值while (i = 10) 循环条件循环条件 sum = sum + i; i+; 循环变量的改变循环变量的改变循环体循环体小练习:思路分析:(1)累加变量sum初始化为0 循环变量i初始化为1(2)while(i=n),做 把i累加到sum上; i自增1 (3)输出suml用wh

36、ile语句实现: 求1+2+.+n关于for语句的三个表达式for(表达式表达式1; 表达式表达式2; 表达式表达式3) 循环体语句循环体语句中的三个表达式都可缺省,但两个分号不能缺省。for (i = 1; i = n; i+) sum = sum + i; i = 1;for ( ; i = n; i+) sum = sum + i; i = 1;for ( ; i n)break; 退化为相当于while语句循环条件为永真,相当于while(1)需要在循环体中设置出口例4-19 从键盘输入一批学生的成绩,计算平均分。输入负数表示输入结束。分析:l求累加和l确定循环条件l不知道输入数据的个

37、数,无法事先确定循环次数l用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。三、用while语句进行程序设计思路分析: (1)定义变量i, num(计数),score, total; (2)读入一个成绩score; (3)while(score大于0),做 把成绩累加到total上; 人数num增1; 读下一个学生成绩; (4)if(人数num大于0) 输出平均成绩total /num else 输出平均成绩为0#include Int main(void) int num; double score, total; num = 0; total = 0;printf(

38、“Enter score: n); scanf(%lf, &score); /* 输入第1个数*/while (score = 0) /* 输入负数,循环结束 */ total = total + score; num+; scanf (“%lf”, &score);if(num != 0) printf(“Average is %.2fn, total /num);else printf( Average is 0n); return 0;Enter grades: 67 88 73 54 82 -1Grade average is 72.80Enter grades: -1 67 88 7

39、3 54 82Grade average mark is模仿练习:从键盘输入一批学生的成绩,输出最高分。输入负数表示输入结束。4.3.3 do - while 语句do 循环体语句 while (表达式)先执行一次循环先执行一次循环后判断后判断真真假假表达表达式式循环体语句循环体语句do-while的下一条语句的下一条语句l while 是先判别条件,再决定是否循环;l do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。while 和 do-while 的比较真真假假表达式表达式循环体语句循环体语句do-while的下一条语句的下一条语句真真假假while的下一条语句的

40、下一条语句表达式表达式循环体语句循环体语句循环语句的选择如果循环次数已知 使用for语句如果 循环次数未知 如果循环条件在进入循环时明确使用while语句 如果循环条件需要在循环体中明确 使用do-while语句例4-20 辗转相处法求最大公约数辗转相除法求m和n的最大公约数gcd(m,n)例:求24和15的最大公约数,过程如下:m n 余数r24 15 915 9 69 6 36 3 0当余数为0时,n=3就是最大公约数例:求54和36的最大公约数,过程如下:m n 余数r54 36 1836 18 0当余数为0时,n=18就是最大公约数解题思路(1)假定mn(如果mn,则二者互换)(2)

41、求余数r=m%n(3)用(n, r)代替(m, n) (把n赋给m, 把r赋给n)(4)若r不为0,则返回第(2)步 若r为0,m即所求 do(2) 求余数r=m%n (3)用(n, r)代替(m, n) (把n赋给m, 把r赋给n)while(r!=0)m即所求在这一步,若r为0,n即所求在这一步,把n赋给m了所以,m即所求l#include lint main()l lint m,n,r,temp;lscanf(%d%d,&m,&n);l if (mn) /如果mn:while(n != 0) r = m % n; m = n ; n=r; 循环结束时,m即最大公约数 小练习:l用do_w

42、hile语句求1+2+n 4.3.4 流程转向语句l1.break语句语句利用break语句能够强制结束循环,转到后续语句执行。l2.continue语句语句中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。l3.return语句语句 return语句的用途是结束本函数,将控制返回到它的调用处。例4-21 判断素数l输入一个正整数m,判断它是否为素数。定义:除了1和m,不能被其它数整除。例如: 判断13769是否是素数如何判断?尝试用2、3、4、5、13738去除有两种可能情况:(1)尝试完所有数,均不能整除m,则m是素数(2)尝试到某一个数i,能整除m,可得出结论

43、m不是素数,不用再往下尝试分析:编程实现:逐个尝试2, m-1,看能不能整除m。设 i 取值 2, m-1 l如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数l只要找到一个i,使m%i为0,则m肯定不是素数分析、缩小范围:m不可能被大于 m/2 的数整除 i 取值 2, m/2 再进一步分析:m 若不是素数,必有一个因数在2, 即若m不能被 2, 的数整除,m必为素数mm实现思路:(1)flag=1; /是否为素数的标志,1代表素数,0代表非素数 k=sqrt(m);(2)尝试2.k for(i = 2; i = k; i+) if(m是i的倍数) 则m不是素数,

44、flag=0; break; 否则,做下一次循环,尝试下一个整数 (3)若flag=1,则m是素数,否则,m不是素数只要有一个i能整除m,就可以得到m不是素数的结论,提前结束循环主要代码:k=sqrt(m);flag=1; /1代表素数,0代表非素数for(i = 2; i = k; i+) if(m % i = 0) flag=0; break; if(flag=1) printf(yesn)else printf(non”);Break语句用于提前结束循环continue与与breakl例子:输出1-999,遇到7的倍数则跳过lfor(i=1;i=999;i+)lif(i%7=0) con

45、tinue; printf(“%d ”,i);遇到7的倍数,立即执行下一次循环输出:1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 if(i%7!=0)printf(“%d ”,i);continue与与breakfor(i=1;i100 | score0) printf(“输入错误”); return 0; g=score/10; switch(g) . return 0;4.3.5 多重循环 后一项似乎不能有前一项递推得到!每一项的值都需要用循环计算!解题思路:(1)输入n,累加变量sum初始化为0;(2)控制循环进行n次 for(i=1;i=n;i+) (

46、3)计算第i项的值item,即ii (4)sum=sum+item; (5)输出sum item需要用循环计算,即把i累乘i次:item=1; /累乘变量初始化for(j=1; j=i; j+) item=item*i;#includeint main() int i, j, n, sum,item; /* item 存放阶乘 */scanf(%d,&n);for (sum=0, i=1; i=n; +i) item=1; /* 每次都初始化为1 */ for(j=1; j=i; j+) /* 内层循环算出 item = ii */ item=item*i;sum=sum+item;print

47、f(sum=%dn,sum);return 0;逗号表达式for (sum=0, i=1; i=n; +i)这里是一个逗号表达式,其中的各表达式按顺序执行,逗号表达式也有值,其值是最后一个表达式的值a=3;b=(a=2*a, a*a)则b的值为:36执行过程如下:先执行赋值表达式:把6赋给a,再计算a*a即36作为逗号表达式的值a=3;b=(2*a, a*a)则b的值为:9执行过程如下:先计算第一个表达式:值为6再计算a*a即9 作为逗号表达式的值到vc中试试for (sum=0, i=1; i=n; +i) item=1; for(j=1; j=i; j+) item=item*i;sum=

48、sum+item;注意内层循环的初始化item=1; for (sum=0, i=1; i=n; +i) for(j=1; j=i; j+) item=item*i;sum=sum+item;右边的程序会有什么问题?分析一下,到VC中试试【例例4.23】用如下的格式输出乘法九九表1234567891 1234567892468101214161939121518212427416202428323655550354045636624854749566386472981每个整数占4列:%4d解题思路(1)输出表头行: 1 2 3 4 5. 用循环实现: printf(“*”); for(i=1;

49、 i=9; i+)printf(“%4d”,i); 输出一个回车 (2)控制循环进行9次,输出9行 for(i=1;i=9;i+) (3)输出一个i值; (4)空i-1个位置,即4*(i-1)个空格,用循环实现 (5)输出i*i, (i+1)*i, (i+2)*i的值,用循环实现 for(j=1; j=4*(i-1); j+) printf(“ “);for(j=i; j=9; j+) printf(“%4d“,i*j );l#include lint main()l lint i,j;lprintf(“%4c”,*); / printf(“ *);lfor (i=1;i=9;i+)l pri

50、ntf(%4d,i);lprintf(n);lfor (i=1;i=9;+i) /输出19行l /输出第i行l printf(“%4d”,i); /每行第一列的i值lfor (j=1; j=4*(i-1); j+) /输出i-1个空位置l printf( );lfor (j=i; j=9; j+) /输出i+19与i的乘积l printf(%4d,i*j);lprintf(“n”); /每行一个回车ll例例4.23 源程序源程序输出第一行另一种写法:for (i=1;i=9;+i) /输出第i行 printf(%4d,i);for (j=1; j=i) printf(%4d,i*j); els

51、e printf( ); printf(n);如果列号大于等于行号,输出乘积,否则输出4个空格模仿练习:九九乘法表(下三角)* 1 2 3 4 5 6 7 8 91 12 2 43 3 6 94 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 814.3.6 循环结构程序设计应用例4.24 1张100元兑换成100张零钞: 将一张面值为100元的人民币等值换成5元、1元和0.5元的零钞,要求每种零钞不少于1张,且总张数为

52、100张,一共有哪几种组合?(书本例4.20有错)枚举的基本思想l根据问题的描述和相关的知识,为相关变量分别确定一个大概的取值范围。在这个范围内对变量依次取值,判断所取的值是否满足数学模型中的条件,直到找到(全部)符合条件的值为止。这种解决问题的方法称作“枚举”。如本题:5元钞张数 i 的取值范围:1-201元钞张数 j 的取值范围:1-1005角钞张数 k的取值范围:1-200l枚举是用计算机求解问题最常用的方法之一,常用来解决那些通过公式推导、规则演绎的方法不能解决的问题。枚举方法一:for(i=1;i=20;i+) for(j=1;j=100;j+) for(k=1;k=200;k+)

53、if( i+j+k=100 & i*5+j+0.5*k=100) printf(“%3d%3d%3dn”, i, j, k);问题:各循环变量之间并不是相互独立的改进:可不用第三重循环,而用k=100-i-j直接确定k的值算法改进1:lfor(i=1;i=20;i+)l for(j=1;j=100;j+)l l k=100-i-j;l if(i*5 + j + 0.5*k=100)l printf(“%3d%3d%3dn”, i, j, k);l 上一算法的问题:各循环变量之间并不是相互独立的改进:可不用第三重循环,而用k=100-i-j直接确定k的值算法改进2:l要注意减小搜索的空间l当5元

54、钞的个数为i时,1元钞的搜索范围为:1 100-ilfor(i=1;i=20;i+)l for(j=1;j=100-i;j+)l l k=100-i-j;l if(i*5 + j + 0.5*k=100)l printf(“%3d%3d%3dn”, i, j, k);l 枚举时需要注意的问题1、建立简洁的数学模型。数学模型中变量的数量要尽量少,它们之间相互独立。这样问题解的搜索空间的维度就小。反应到程序代码中,循环嵌套的层次少。2、减小搜索的空间如,本题中,5元钞的张数i不可能大于201元钞的张数j不可能大于100-ilfor(i=1; i=20; i+)l for(j=1; j2求解过程分析

55、1 1fib1 fib22fib3fib3=fib1+fib2fib1 fib2更新fib1,fib2fib3=fib1+fib23fib3更新fib1,fib2fib1 fib25fib3fib1=fib2=1;for(i=3;i=20;i+) fib3=fib1+fib2; 输出fib3; /用(fib2, fib3)更新fib1,fib2 fib1=fib2; fib2=fib3;l#include l#define N 20lint main()llint fib1,fib2,fib3, i;lfib1=1;fib2=1;lprintf(%8d%8d,fib1,fib2);lfor(i=3;i=N;i+)llfib3=fib1+fib2;lfib1=fib2;lfib2=fib3;lprintf(%8d,fib3);lif(i%4=0) printf(n);llreturn 0;l例4.25 源程序

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!