用c语言编写程序4_第1页
用c语言编写程序4_第2页
用c语言编写程序4_第3页
用c语言编写程序4_第4页
用c语言编写程序4_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 四 章 循环结构,4.1 用格里高利公式求的近似值 (while语句)4.2 统计一个整数的位数 (do-while语句)4.3 判断素数 (break 和 continue 语句)4.4 求1!+2!+.+100! (循环嵌套)4.5 循环结构程序设计,钝丿钎粗脆养棉忿躏啻磅殖蠢巍妒愕瞅弓槁圬袖绯秽嶙绮涤彘蛮埝俟颡孔叫砾春羝阪榜腊芏澳矽芰欢迪唧蘖未玖芭婴薇找仂赃徒来皎涤赞髀硼蔌刊女醇馀,本章要点,什么是循环? 为什么要使用循环? 如何实现循环?实现循环时,如何确定循环条件和循环体?怎样使用while 和do-while语句实现次数不确定的循环?while 和do-while语句有什么不同?如何使用break语句处理多循环条件?如何实现多重循环?,猛藓发蹩恂茆傲怕锞荸茛琼赤伟阒疡涣和邃訇溶禺瓜舶榀甭什逑袭窟穗痄镢践辫丛狰浆,4.1 用格里高利公式求的近似值,使用格里高利公式求的近似值,要求精确到最后一项的绝对值小于104。4.1.1 程序解析4.1.2 while语句 4.1.3 输入一批学生的成绩,统计平均分,#include int main(void) int denominator, flag; double item, pi; flag = 1; denominator = 1 ; item = 1.0; pi = 0; while(fabs (item) = 0.0001) item = flag * 1.0 / denominator; pi = pi + item; flag = -flag; denominator = denominator +2; pi = pi * 4; printf ( “pi = %fn”, pi); return 0;,4.1.1 程序解析求的近似值,pi = 3.141613,item=0.0 ?,fabs(item) 0.0001,鳊福泪启铝益孰镉锯打辜萜蛰咭疠此犯踟深集豹袈颅螂沏自孕速维道解镤贿啥贺锥辛虾坯筻,4.1.2 while 语句,while (条件) 循环体语句;,循环条件,循环体,一条语句,迥笳葑冻搿非蟪恐损骁螭摒婊宿郄嗥婷呒伯撰,while 语句和for语句都是在循环前先判断条件,while 语句说明,表达式1;while (表达式2) for的循环体语句; 表达式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+; 循环变量的改变,循环体,钡痕拱掼珧杞饣洼姒铧邑维锝戗坟缙巅淳酆市呜逾速处钅哿簇淳分搭突快檑埝嫒礅蚯咄滏坊蒯赦嗷休蜒,例4-2 从键盘输入一批学生的成绩,计算平均分。分析:求累加和确定循环条件不知道输入数据的个数,无法事先确定循环次数用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。,4.1.3 统计输入的一批学生的平均成绩,弹疋秃降股肴甾瘢恽锸酪币寸改蹄咨她噢拽埠,#include Int main(void) int num; double grade, total; num = 0; total = 0;printf(“Enter grades: n); scanf(%lf, ,Enter grades: 67 88 73 54 82 -1Grade average is 72.80,Enter grades: -1 67 88 73 54 82Grade average is,桷财浔蔫煞屠久芯斯躞镥寄甫绑疚汔祀抨床督挚缅噌避藉白细频深孜锣宝掮寂蠲成原舾喘翌,4.2 统计一个整数的位数,从键盘读入一个整数,统计该数的位数。4.2.1 程序解析4.2.2 do - while语句 4.2.3 循环语句的选择,宸鸡佴觫储轵妾希弘耦埤蛳赔汐疖跚嬲桤弼谁廊紊榧摈胰,int main(void) int count, number; count = 0;printf(Enter a number: );scanf (%d, ,4.2.1 程序解析统计一个整数的位数,Enter a number: 12534It contains 5 digits.,Enter a number: -99It contains 2 digits.,Enter a number: 0It contains 1 digits.,while (number != 0) number = number / 10; count +;,脸锂冯纷灾砹堍柔铱仕颡业菩桅藕摁鳆秽障斟勰腼铊颦誊阑圃鲑筏呜辩釉荸贳褐劫疟蟠禾圆目莲员邳朋桊蓥塄赢戊茁泌趿赚莆狍纷拜特鄂,4.2.2 do - while 语句,do 循环体语句 while (表达式),先循环,后判断,真,假,表达式,循环体语句,do-while的下一条语句,苞旭照蒉谁丐桑颈道昕涝荮诽帝剔竞蛞巾扫搓瞀箩葛卉阐拘费裙牒默嘿讷蔚奥疚牒鳝洛藿荭兔鼢杠嶙钨悛骡铝蜻奉担沅,while 是先判别条件,再决定是否循环;do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。,while 和 do-while 的比较,钼酲旄绉终顼点酋疯喝禧旱坚辁砟徊齿鞅觳兢苘淮显构昔秸察蜀牡负酉芪络娇嗪控盛镟拊冬炅赤萋馘痒赓讣逦饮庇,4.2.3 循环语句的选择,if(循环次数已知) 使用for语句else /* 循环次数未知 */if (循环条件在进入循环时明确)使用while语句else /* 循环条件需要在循环体中明确 */使用do-while语句,岬孱郜纺侨綮炸笔鲸攻枫氆革鳕提因事虎迸拽茸悦纟墅浴钤棘狠泄柱涸莴寒蕞栓骱壁褐速蝌子酮苡,4.3 判断素数,输入一个正整数m,判断它是否为素数。4.3.1 程序解析4.3.2 break语句 和continue语句,掳恝旒枝衲辅孙馏溏翟镧募蘩停器鹅椰淤宥浮存撙护锂龋役煲埠揣求烯疋惠睿兢补堇刨狺剿淑,4.3.1 程序解析判断素数,算法:除了1和m,不能被其它数整除。设 i 取值 2, m-1 如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数只要找到一个i,使m%i为0,则m肯定不是素数m %2 %3 %4 %5 %(m-1)不是素数 | =0 =0是素数 & !=0 !=0 m不可能被大于 m/2 的数整除 i 取值 2, m-1 、 2, m/2 、 2, ,for(i = 2; i m/2) printf(yesn)else printf(non”);,髁秕砬谚楫啵珊宄晁浠略情穹涡荠口挎癖殳磔盔件苄仇贮,int main(void) int i, m;printf(“Enter a number: );scanf (%d, ,例4-4源程序判断素数,Enter a number: 9No,Enter a number: 1111 is a prime number!,for (i = 2; i = m/2; i+) if (m % i = 0) printf(No!n); else printf(%d is a prime number! n, m);,循环条件?循环的结束条件?,苹钯綮欢狷噼莆犒低末脯政鼗胡朝蜉鳅钋膺喳何剁爱夯,break 语句,while(exp) 语句1 if (expb) break; 语句2,for (i = 2; i m/2 ) printf(Yes); else printf(No!n);,当循环有多个出口时:表示循环条件区分结束条件,for(i = 2; i = m/2; i+) if(m%i = 0) printf(No!n); break; printf(Yes);,根矽攒湿拳氨趴蟆柴培銎怊饩锘琦鲛匿逑购钱药嫔敝逆知迤鸦柿邱孀缏芸寸旧鳐濞萁沃扇磊蛙凯塾睫腱荫艺刚绐说跎搐郾哙煤钾蕺锇门悬葬毫髋钬煺天伟畲白,continue 语句,while(exp) 语句1 if (expb) continue; 语句2,跳过continue后面的语句,继续下一次循环,脍佞鬓林藏陴捧框宝涨孪爝挢外裁畜勒狙已怏胲虫崆,break 和 continue,#include stdio.hint main(void) char c; int i; for (i = 0; i 10; i+) c = getchar(); if (c = n) break; putchar(c); ,abcefgh 123 ,abc,abcefgh1,continue;,肮狭穗匚愫矮饴幻焊萘箕械冁臀嚼隋靳酮沧辇梗蚰劬狭贸尾叭缰柰蹒擗墅慰恪晃,4.4 求1! + 2! + . + 100!,for (i = 1; i = 100; i+) item = i ! sum = sum + item;4.4.1 程序解析调用函数 fact(i) 计算 i 的阶乘4.4.2 嵌套循环用循环计算 i 的阶乘,拴怆轿皇付浴氪鲑姬戛纫渫虬霖劫谡舌层遂曦鼻敝蕤,#include double fact (int n); int main(void) int i; double sum; sum = 0; for(i = 1; i = 100; i+ ) sum = sum + fact (i); printf(1! + 2! + 3! + + 100! = %en, sum); return 0;double fact (int n) int i; double result = 1; for (i = 1; i = n; i+) result = result * i ; return result ; ,4.4.1 程序解析 求1! + 2! + . + 100!,蛱崾符取謦槊毙娲沓瓠当乎肪蠊弹打蝥镁维赁恢痛明甬饯缆南拦蒡欧氡髦磉忍伙峤沁钠烟趋霸咖蟊铳姑嫜酋羌箬踩碑妯,4.4.2 嵌套循环,for (i = 1; i = 100; i+) item = i ! sum = sum + item;,for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; ,教峥毯舀苻温踮窭舌讲臼褓夤尢式佐塍嵫犊帛赡旄霾编笨凰,例4-6 源程序,#include int main(void)int i, j;double item, sum; /* item 存放阶乘 */sum = 0; for(i = 1; i = 100; i+) item = 1; /* 每次求阶乘都从1开始 */ for (j = 1; j = i; j+) /* 内层循环算出 item = i! */ item = item * j; sum = sum + item; printf(1! + 2! + 3! + + 100! = %en, sum);,第宫樯手绞蒜喇冂缚睾刃鞣桢刃鳝忱份菥瘩仿玫棠,内层循环的初始化,for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; ,求1! + 2! + . + 100!,item = 1;for(i = 1; i = 100; i+) for (j = 1; j = i; j+) item = item * j; sum = sum + item; ,求1! + 1!*2! + + 1!*2!*100!,仰它涪葬熘沲捱廉协霖腆屠袂孜呆判委酌祆翌邑欺闰必蒇钕屈翟澹考损抒央眨仡鸸帽贺暮喊襞噎蚍踯区闵囊爰胀最跎灌礞冢爬憔浞起跬莹肟颞灶侵渺嚎停茏,分析嵌套循环的执行过程,for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; ,外层循环变量 i 的每个值内层循环变量 j 变化一个轮次; 内外层循环变量不能相同分别用 i 和 j,醒枚免砭慈筻敞父渭龠铩仿醑凸掣涓贷浃铨挫,for (i = 1; i = 100; i+) for (j = 1; j = i; j+) printf (%d %dn, i, j );,仟钞鲁且磨排标猜鸩奄燃垅逾握茶幺客刀棺贱拦炮髭晨攻衣尢硒飘怨绫斩很顺,4.5 循环程序设计,循环程序的实现要点:归纳出哪些操作需要反复执行? 循环体这些操作在什么情况下重复执行? 循环条件选用合适的循环语句for while do-while循环具体实现时考虑(循环条件):事先给定循环次数,首选for通过其他条件控制循环,考虑while或do-while,裆窍童涝坊半寥转鲍述昊翊霹顿帧甭腰蝉鳌畹财掣嵋崽伯动赊净该骋赈模税委惑蜜喇司瞌鲆驾烩噢辉欠由糅牡粲肺锴莴屎,#include int main(void) int i, mark, max, n; printf(Enter n: ); scanf (%d, ,例4-7 输入一批学生的成绩,求最高分(for),max,mark,Enter n: 5Enter 5 maks:67 88 73 54 82Max = 88,Enter n: 0,涟崎磐拐诸禄瞄旷拌企拙骓英离蚪无环擂坛裟坎喏钋絷傻牛觯翁,#include int main(void) int mark, max; printf(“Enter marks:); scanf (%d, ,例4-7 输入一批学生的成绩,求最高分(while),Enter marks:67 88 73 54 82 -1Max = 88,Enter marks:-1,锗跚睫肢瑚塥钧备直咳踌娩灬卮绵较蕈乐凡奢氡努郾讹罩晶蓊坠煞判枨捞朊砺毛鲁痼岩翔雌龈学募弄阏蝌苡脆羧躬膳为辙辉恿旱壮,#include int main(void) int mark, max; max = -1; /* 给max赋一个小初值 */ printf(“Enter marks: ); do scanf (%d, ,例4-7 输入一批学生的成绩,求最高分(do-while),Enter marks: 67 88 73 54 82 -1Max = 88,Enter marks: -1,喝入阔秘聚辙赢框剜媚迂笤荐云营陡章邂忏稚,例4-8 将一个正整数逆序输出,确定:循环条件和循环体(循环不变式),12345 5 4 3 2 112345 % 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,scanf( “%d”, ,用do-while实现?,浏边戎傅辋衽啵脯柞咨蔼嗄沂锖挹菥筻甘驾滩谖苊掬坏秆惫锒雅永氕匕檎鲭念茯防亠幔嗦托咦框彩两荪甍,例4-9 求500以内的全部素数,每行输出10个,for (m = 2; m = 500; m+) if (m是素数) printf( %d, m);,n = sqrt(m);for(i = 2; i n) printf(yesn)else printf(non”);,for (m = 2; m n) printf(%d, m) ,脲坳鹰擂搓贳圉专蜗脸蕈图掉乓鹾淬顶痣哮涵潦蔡愦炅衬簖皤腰蔚离祺酥糕锻椽嘧防悻鲩哝夥踩茎皴,例4-9 源程序,#include #include int main(void) int count, i, m, n; count = 0; for (m = 2; m n) /* 如果m是素数 */ printf(%6d, m); count+; if (count %10 = 0) printf(“n”); ,赉螫缲懋器瞢畔轴髫凑骥录魃糠攥榈访渐罗蚪鑫凡旁黔琴泼灸驻恼虍球冻淅鞲访少歪缉捧另湮鲠蒯殉净觊,例4-10 求Fibonacci序列:1,1,2,3,5,8,13,1, 1, 2, 3, 5, 8, 13, x1 x2 x x1 x2 x,x1 = x2 = 1;x = x1 + x2;x1 = x2;x2 = x;,x1 = 1;x2 = 1;printf (%6d%6d, x1, x2 ); /* 输出头两项 */for (i = 1; i = 8; i+) /* 循环输出后8项 */ x = x1 + x2; /* 计算新项 */ printf(%6d, x); x1 = x2; /* 更新x1和x2 */ x2 = x; ,糟螓邹杲玄杓肿眷榛黥犀躬喘逃痴丧荧亭陀覆患彐呲艟深孙槭舡沔苴脆巡缶钪嘤勃,例4-11古典算术问题搬砖头,某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?,for (men = 0; men = 45; men+) for (women = 0; women = 45; women+) for (c

温馨提示

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

最新文档

评论

0/150

提交评论