1、c语言程序设计教程林芳易云飞版第五章循环结构例题练习题详解例1/* 题目:计算n的阶乘! 设计:狼影 时间:2012-03-05 19:59*/* 注意!下面所求数的阶乘不能超过31,要请求更大数的阶乘!请参照第二个阶乘函数! 哈!第二个能看懂的就看啊!思想是用数组来保存数据,然后在输出数组中的数!(下面对它做了充分的解释,祝你能看懂哈!)*/*第一个函数*/# if 1# include main() int n, i; unsigned long sum = 1; /请求用户输入数据,不能超过12,所以为了避免溢出出错,在下面限制了数的大小 printf(请输入要求什么数的阶乘n); sc
2、anf(%d, &n); /限制数的大小 if(n12) printf(你输入错误!n); if(n=0 |n = 1) printf(此数的阶乘为1n); /求当n大于一时的阶乘! if(n1 & n=12) for(i = 2; i零时,说明有进位; 正确输出(要逆序输出数组,从右向左); 例如:7!= 5040 假如每位数组元素保留3位数 则在数组中7!的表示法为 40 / 5(为了方便看每位数组元素用/隔开) 由上知数组逆序输出,因为产生的进位都会加到数组的下一位; 由上可以看到 如果按上面的逆序输出得到的是540,少了一个零,为了保证零的不缺失,所以输出时 除了最高位的都要用 03d
3、%保证三位,不足三位的在左边补零 。(最高位用不到补零,如果补上的话就成了005040这样不符合我们的常规看法,当然这样也不错)*/# if 0# include main() unsigned long a10000=0; int n, i, j, k, carry, val; do /为了下一次计算的正确,必须循环一次初始化一次 val = 0; a0 = 1; /请求用户输入要求数的阶乘 printf(请输入要求阶乘的数:输入结束!n); scanf(%d, &n); /判断输入的值是不是合法 n必须大于等于0 if(n0) printf(输入错误!n); continue; /当n等于
4、一或等于0时 0 1的阶乘都为1,当用户输入0时,输出0的阶乘,并退出dowhie(n!=0)循环; else if(n=1 | n=0) printf(%d!=1n ,n); /当n大于一的情况 else for(i = 2; i=n; i+)/此循环来控制从2乘到n for(j = 0; j=val; j+)/此循环来控制数组中的每个元素都乘以2-n aj *= i; for(k = 0; k0)/如果产生的进位大于零,就是有进位,就把下标加一 val+; /将数组逆序输出 printf(%5d, aval); aval = 0;/为了保证下次的计算,数组元素要清零 for(k = val
5、-1; k=0; k-) printf(%05d, ak);/%05d是为了保证数组元素是一个5位数,并且0 保证了不丢失数组元素中左边的零 ak = 0;/每输出一位, 每一位数组元素就清零 printf(n); while(n != 0); # endif/*根据上面所求的100和1000的阶乘结果*请输入要求阶乘的数:输入结束!100 933262154439441526816992388562667004907159682643816214685929638952175999932299156*9761565182862536979208272237582511852109168640
6、00000000000000000000000请输入要求阶乘的数:输入结束!1000 402387260077093773543702433923003985719374864210714632543799910429938512398629020*7424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463
7、075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365
8、024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921
9、510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540
10、265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929
11、023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024
12、186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889
13、086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14、000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000请输入要求阶乘的数:输入结束!00!=1 1Press any key to continue*/例2/* 题目:将键盘输入的一串字符显示在屏幕上,遇到字符*时终止(用while循环来实现) 设计;狼影 时间:2012-03-05 23:48*/* 哈! 在下面还有另一种实现方法,感兴趣的可以看看啊!(当然还有其他方法,在这就不
15、一一介绍啦,可以自己去发掘啊!)*/*第一种方法 用while来实现*/# if 0# include main() char ch; printf(请输入字符n); ch = getchar(); while(ch != *) printf(%c, ch);/* 1 ch = getchar();/* 2 printf(n);# endif/* *当把1放在2的上面的时候输出的结果如下*请输入字符sdssdssddd*sdddPress any key to continue/*当把1放在2的下面的时候输出结果如下*请输入字符sdsddsdsdsff*sdsff*Press any key
16、to continue*/*第二中方法*# if 1# include main() int ch; printf(请输入字符n);loop: /用goto语句实现循环 ch = getchar(); if(ch != *) printf(%c, ch); goto loop; # endif/* 请输入字符sfsesfseererssfd/*ssfd/Press any key to continue/*/例3 /* 题目:输入某门课程的若干名同学的成绩,以-1作为结束输入的标志,计算该门课程的平均成绩。 设计:狼影 时间:2012-03-06 10:10*/*先分析下课本上的例题, 哈!这
17、题有问题啊! 可以看下面改的代码,虽用while也能改,但用惯了dowhile()*/*可以自己尝试用while来改啊!*/# if 1# include main() int n = 0; float score, sum = 0; /要求用户输入成绩! printf(请输入成绩按-1结束n); scanf(%f, &score); /判断取值是不是合法,可惜只能判断一次 if (score=-1 | score0)/只能判断第一次输入的值,而不能在判断第二次,因此运算时会产生错误 while(score != -1)/问题:当在循环时,用户输入不是-1的负数时,会产生怎样的结果? 由下面的
18、第二部分可知;明显是错误的结果; sum += score; n+; scanf(%f, &score); /输出平均值,没有学生个数,总分,即使错了,用户也很难发觉 printf(平均值为%gn, sum/n); # endif/*第一部分*请输入成绩按-1结束23453456-1平均值为39.5Press any key to continue/*第二部分*请输入成绩按-1结束12 -4 -1平均值为4Press any key to continue*/*分析* 1 由上面的输出结果首先的问题是没有好的人机交互方式, 显得比较生硬; 2 由上面的第二部分看出,明显输出的是错误结果,当用户
19、误输入时,不会有提醒,直接算出错误结果;*/*下面是改的代码,大家给我找错误,告诉我啊 感激不尽!只有不断发现错误,才会进步的*/# if 0# include main() float score, average, sum = 0; int n = 0; /dowhile()来控制循环直到输入-1结束循环 do printf(请输入学生的成绩 按-1结束n); scanf(%f, &score); if(score-1 & score0)/判断用户输入值是不是合法 printf(你输入错误n); continue; else if(score = -1) printf(结束输入n); else sum += score;/计算总分 n+;/计数器,记载输入学生的个数 while(score != -1); /对总分。平均分的输出 if(n != 0)/如果n为0说明没有输入学生数据(或正确的学生数据),就不执行下面的语句 printf(你输入数据的个数为%dn, n); printf(你输入的成绩的总分为%gn,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1