《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解.docx
《《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解.docx》由会员分享,可在线阅读,更多相关《《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解.docx(63页珍藏版)》请在冰豆网上搜索。
![《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解.docx](https://file1.bdocx.com/fileroot1/2023-4/28/d538fe47-c6a4-4ec7-99d8-d93e1ff75dbf/d538fe47-c6a4-4ec7-99d8-d93e1ff75dbf1.gif)
《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解
例1
/***********************************************************************************
题目:
计算n的阶乘!
设计:
狼影
时间:
2012-03-0519:
59
***************************************************************************************/
/*********************************************************************************
注意!
下面所求数的阶乘不能超过31,要请求更大数的阶乘!
请参照第二个阶乘函数!
哈!
第二个能看懂的就看啊!
思想是用数组来保存数据,然后在输出数组中的数!
(下面对它做了充分的解释,祝你能看懂哈!
!
)
*************************************************************************************/
/***********************第一个函数*******************************/
#if1
#include
main()
{
intn,i;
unsignedlongsum=1;
//请求用户输入数据,不能超过12,所以为了避免溢出出错,在下面限制了数的大小
printf("请输入要求什么数的阶乘\n");
scanf("%d",&n);
//限制数的大小
if(n<0||n>12)
printf("你输入错误!
\n");
if(n==0||n==1)
printf("此数的阶乘为1\n");
//求当n大于一时的阶乘!
if(n>1&&n<=12)
{
for(i=2;i<=n;i++)
{
sum*=i;
}
printf("%d!
=%d\n",n,sum);
}
}
#endif
/***********************************************************************************************
请输入要求什么数的阶乘
12
12!
=479001600
Pressanykeytocontinue
*************************************************************************************************
请输入要求什么数的阶乘
13
你输入错误!
Pressanykeytocontinue
****************************************************************************************************/
/**********************************************第二个函数利用数组求大数阶乘!
*******************************/
/*******************************************************************************************************
重点!
要将数组中的每一位元素都乘以2到n的数;
规范数组元素,看每位数组元素保留几位数;
在规范中,如何计算进位?
解决:
用数组元素整除位数加一的最小数例如:
保留3位,就要用数组元素整除1000;123/1000=0,进位为0
1234/1000=1,进位为1;
如何保证每位数组元素有一定的位数?
解决:
用数组元素整除位数加一的最小数求余如:
保留3位123%1000=123;1234%1000=234;
当有进位时,数组下标要加一;
如何判断有进位?
当当前的下标元素加一的数组元素>零时,说明有进位;
正确输出(要逆序输出数组,从右向左);
例如:
7!
=5040假如每位数组元素保留3位数则在数组中7!
的表示法为40/5(为了方便看每位数组元素用/隔开)
由上知数组逆序输出,因为产生的进位都会加到数组的下一位;
由上可以看到如果按上面的逆序输出得到的是540,少了一个零,为了保证零的不缺失,所以输出时除了最高位的都要用
03d%保证三位,不足三位的在左边补零。
(最高位用不到补零,如果补上的话就成了005040这样不符合我们的常规看法,当然这样也不错)
****************************************************************************************************/
#if0
#include
main()
{
unsignedlonga[10000]={0};
intn,i,j,k,carry,val;
do
{
//为了下一次计算的正确,必须循环一次初始化一次
val=0;
a[0]=1;
//请求用户输入要求数的阶乘
printf("请输入要求阶乘的数:
输入结束!
\n");
scanf("%d",&n);
//判断输入的值是不是合法n必须大于等于0
if(n<0)
{
printf("输入错误!
\n");
continue;
}
//当n等于一或等于0时01的阶乘都为1,,当用户输入0时,输出0的阶乘,并退出do{}whie(n!
=0)循环;
elseif(n==1||n==0)
printf("%d!
=1\n",n);
//当n大于一的情况
else
{
for(i=2;i<=n;i++)//此循环来控制从2乘到n
{
for(j=0;j<=val;j++)//此循环来控制数组中的每个元素都乘以2-n
{
a[j]*=i;
}
for(k=0;k<=val;k++)//用来规范数组中的元素,每个数组元素是一个5位数
{
carry=a[k]/100000;//carry为进位,要加到k+1位
a[k]%=100000;//每个元素保留5位数
a[k+1]+=carry;//将进位加到下一位
}
if(a[val+1]>0)//如果产生的进位大于零,就是有进位,就把下标加一
val++;
}
}
//将数组逆序输出
printf("%5d",a[val]);
a[val]=0;//为了保证下次的计算,数组元素要清零
for(k=val-1;k>=0;k--)
{
printf("%05d",a[k]);//%05d是为了保证数组元素是一个5位数,并且0保证了不丢失数组元素中左边的零
a[k]=0;//每输出一位,每一位数组元素就清零
}
printf("\n");
}while(n!
=0);
}
#endif
/*************根据上面所求的100和1000的阶乘结果**************************************
请输入要求阶乘的数:
输入结束!
100
933262154439441526816992388562667004907159682643816214685929638952175999932299
156********976156518286253697920827223758251185210916864000000000000000000000000
请输入要求阶乘的数:
输入结束!
1000
402387260077093773543702433923003985719374864210714632543799910429938512398629
020*********
74245040870737599188236277271887325197795059509952761208749754624970436014182780
94646496291056393887437886487337119181045825783647849977012476632889835955735432
51318532395846307555740911426241747434934755342864657661166779739666882029120737
91438537195882498081268678383745597317461360853795345242215865932019280908782973
08431392844403281231558611036976801357304216168747609675871348312025478589320767
16913244842623613141250878020800026168315102734182797770478463586817016436502415
36913982812648102130927612448963599287051149649754199093422215668325720808213331
86116811553615836546984046708975602900950537616475847728421889679646244945160765
35340819890138544248798495995331910172335555660213945039973628075013783761530712
77619268490343526252000158885351473316117021039681759215109077880193931781141945
45257223865541461062892187960223838971476088506276862967146674697562911234082439
20816015378088989396451826324367161676217916890977991190375403127462228998800519
54444142820121873617459926429565817466283029555702990243241531816172104658320367
86906117260158783520751516284225540265170483304226143974286933061690897968482590
12545832716822645806652676995865268227280707578139185817888965220816434834482599
32660433676601769996128318607883861502794659551311565520360939881806121385586003
01435694527224206344631797460594682573103790084024432438465657245014402821885252
47093519062092902313649327349756551395872055965422874977401141334696271542284586
23773875382304838656889764619273838149001407673104466402598994902222217659043399
01886018566526485061799702356193897017860040811889729918311021171229845901641921
06888438712185564612496079872290851929681937238864261483965738229112312502418664
93531439701374285319266498753372189406942814341185201580141233448280150513996942
90153483077644569099073152433278288269864602789864321139083506217095002597389863
55427719674282224875758676575234422020757363056949882508796892816275384886339690
99598262809561214509948717012445164612603790293091208890869420285106401821543994
57156805941872748998094254742173582401063677404595741785160829230135358081840096
99637252423056085590370062427124341690900415369010593398383577793941097002775347
20000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000
请输入要求阶乘的数:
输入结束!
0
0!
=1
1
Pressanykeytocontinue
**************************************************************************************/
例2
/************************************************************************
题目:
将键盘输入的一串字符显示在屏幕上,遇到字符‘*’时终止(用while循环来实现)
设计;狼影
时间:
2012-03-0523:
48
*********************************************************************************/
/**********************************************************************************************************************
哈!
在下面还有另一种实现方法,感兴趣的可以看看啊!
(当然还有其他方法,在这就不一一介绍啦,,可以自己去发掘啊!
!
)
******************************************************************************************************************/
/****第一种方法用while来实现****************************************/
#if0
#include
main()
{
charch;
printf("请输入字符\n");
ch=getchar();
while(ch!
='*')
{
printf("%c",ch);//*********1
ch=getchar();//**********2
}
printf("\n");
}
#endif
/*******************当把1放在2的上面的时候输出的结果如下**************
请输入字符
sds
sds
sddd*
sddd
Pressanykeytocontinue
//*********************************当把1放在2的下面的时候输出结果如下**********************
请输入字符
sdsd
dsd
sdsff*
sdsff*
Pressanykeytocontinue
***********************************************************************/
//***************第二中方法****************************
#if1
#include
main()
{
intch;
printf("请输入字符\n");
loop:
//用goto语句实现循环
ch=getchar();
if(ch!
='*')
{
printf("%c",ch);
gotoloop;
}
}
#endif
/************************************************************
请输入字符
sfse
sfse
er
er
ssfd/*
ssfd/Pressanykeytocontinue
/*************************************************************/
例3
/******************************************************************************
题目:
输入某门课程的若干名同学的成绩,以-1作为结束输入的标志,计算该门课程的平均成绩。
设计:
狼影
时间:
2012-03-0610:
10
**************************************************************************/
/*************************************先分析下课本上的例题,哈!
这题有问题啊!
可以看下面改的代码,虽用while也能改,但用惯了do{}while()*************/
/***********************可以自己尝试用while来改啊!
**********************************************/
#if1
#include
main()
{
intn=0;
floatscore,sum=0;
//要求用户输入成绩!
printf("请输入成绩按-1结束\n");
scanf("%f",&score);
//判断取值是不是合法,可惜只能判断一次
if(score==-1||score<0)
printf("错误数据\n");
if(score>0)//只能判断第一次输入的值,而不能在判断第二次,因此运算时会产生错误
{
while(score!
=-1)//问题:
当在循环时,用户输入不是-1的负数时,会产生怎样的结果?
由下面的第二部分可知;明显是错误的结果;
{
sum+=score;
n++;
scanf("%f",&score);
}
//输出平均值,没有学生个数,总分,即使错了,用户也很难发觉
printf("平均值为%g\n",sum/n);
}
}
#endif
/**************第一部分**************************
请输入成绩按-1结束
23
45
34
56
-1
平均值为39.5
Pressanykeytocontinue
/*****************************第二部分***********
请输入成绩按-1结束
12-4-1
平均值为4
Pressanykeytocontinue
*********************************************************/
/**********************分析****************
1由上面的输出结果首先的问题是没有好的人机交互方式,显得比较生硬;
2由上面的第二部分看出,明显输出的是错误结果,当用户误输入时,不会有提醒,直接算出错误结果;
***********************************************************************************************/
/*下面是改的代码,,大家给我找错误,告诉我啊感激不尽!
只有不断发现错误,才会进步的*/
#if0
#include
main()
{
floatscore,average,sum=0;
intn=0;
//do{}while()来控制循环直到输入-1结束循环
do
{
printf("请输入学生的成绩按-1结束\n");
scanf("%f",&score);
if(score<-1||(score>-1&&score<0))//判断用户输入值是不是合法
{
printf("你输入错误\n");
continue;
}
elseif(score==-1)
printf("结束输入\n");
else
{
sum+=score;//计算总分
n++;//计数器,记载输入学生的个数
}
}while(score!
=-1);
//对总分。
。
平均分的输出
if(n!
=0)//如果n为0说明没有输入学生数据(或正确的学生数据),就不执行下面的语句
{
printf("你输入数据的个数为%d\n",n);
printf("你输入的成绩的总分为%g\n",