单元5 循环结构源代码.docx
《单元5 循环结构源代码.docx》由会员分享,可在线阅读,更多相关《单元5 循环结构源代码.docx(12页珍藏版)》请在冰豆网上搜索。
单元5循环结构源代码
单元5循环结构源代码
【例5-1】计算1到100的和。
#include"stdio.h"
#defineN100
intSum(void)
{
inti=1,s=0;//变量s为累加器
while(i<=N)
{
s=s+i;
i++;
}
returns;
}
intmain()
{
ints=0;
s=Sum();
printf("1+2+...+%d=%d\n",N,s);
return0;
}
【例5-2】计算给定数列前n项的和。
计算数列1/2,2/3,3/5,5/8,8/13,…前n项的和,n由用户通过键盘输入。
#include"stdio.h"
doubleSeqSum(intn)
{
doubles=0,num=1,den=2,i=1;
do
{
s=s+num/den;
den=den+num;
num=den-num;
i++;
}while(i<=n);
returns;
}
intmain()
{
doublesum;
intn;
printf("请输入项数:
");
scanf("%d",&n);
sum=SeqSum(n);
printf("数列前%d的和为:
%lf\n",n,sum);
return0;
}
【例5-3】求整数的各位数码及位数。
键盘输入一个正整数,逆序输出各位数码,并输出该整数的位数。
#include"stdio.h"
intReverse(intn)
{
intm,sum=0;//m表示当前商n的个位,sum为计数器
printf("逆序输出整数%d的各位数码为:
\n",n);
for(;n!
=0;n=n/10)
{
m=n%10;//得到n的个位数
sum++;
printf("%d\t",m);
}
returnsum;
}
intmain()
{
intn,sum;
printf("请输入一个正整数:
");
scanf("%d",&n);
sum=Reverse(n);
printf("\n整数%d是一个%d位数。
\n",n,sum);
return0;
}
【示例5-4】continue语句的使用
voidtest()
{
inta,b;
for(a=1,b=1;a<=10;a++,b++)
{
if(b%3==1)
{
b+=3;
continue;
}
if(b>=10)
break;
}
printf("%d,%d\n",a,b);
}
【例5-4】百马百担问题
有100匹马,驮100担货,大马驮三担,中马驮两担,两匹小马驮一担,问有大、中、小马各多少?
共有多少种方案?
#include"stdio.h"
#defineH100
#defineN29
#defineM46
intHorse(void)
{
intdm,zm,xm,sum=0;
for(dm=1;dm<=N;dm++)
{
for(zm=1;zm<=M;zm++)
{
xm=H-dm-zm;//计算小马的数量
if(xm%2==0&&dm*3+zm*2+xm/2==H)
{//xm%2==0保证小马的数量是偶数
printf("大马:
%3d\t中马:
%3d\t小马:
%3d\n",dm,zm,xm);
sum++;
}
}
}
returnsum;
}
intmain()
{
intsum;
sum=Horse();
printf("共有%d种方案。
\n",sum);
return0;
}
【例5-5】用递归法求n!
#include"stdio.h"
doubleFactorial(doublen)
{
if(n==1||n==0)//递归调用终止条件
return1;
else
returnn*Factorial(n-1);//利用递归关系进行递归调用
}
intmain()
{
doublen,m;
printf("请输入一个自然数:
");
scanf("%lf",&n);
m=Factorial(n);
printf("%.0lf!
=%.0lf\n",n,m);
return0;
}
【例5-6】统计输出指定范围内的素数
输出指定范围内的所有素数,并统计输出此范围内素数的个数,要求指定范围由用户输入,每行输出5个素数。
#include"stdio.h"
#include"math.h"
intPrime(intn)
{
inti,flag=1;
if(n==1)
flag=0;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=0;
break;
}
}
returnflag;
}
intCount(inta,intb)
{
intn,count=0;
printf("%d~%d之间的素数有:
",a,b);
for(n=a;n<=b;n++)
{
if(Prime(n))
{
if(count%5==0)
printf("\n");
printf("%6d\t",n);
count++;
}
}
returncount;
}
intmain()
{
inta,b,count;
printf("请输入指定范围[a,b](用空格分隔):
");
scanf("%d%d",&a,&b);
count=Count(a,b);
printf("\n%d~%d之间共有%d个素数。
\n",a,b,count);
return0;
}
【例5-7】输出指定图案
输出以下由星号组成的图案。
*
***
*****
*******
*****
***
*
#include"stdio.h"
#defineN6
voidPattern(void)
{
intx,y,z;
for(x=0;x<=N;x++)
{
if(x<=N/2)
{
for(y=1;y<=3-x;y++)
printf("");
for(z=1;z<=2*x+1;z++)
printf("*");
printf("\n");
}
else
{
for(y=1;y<=x-3;y++)
printf("");
for(z=1;z<=13-2*x;z++)
printf("*");
printf("\n");
}
}
}
intmain()
{
Pattern();
return0;
}
【例5-8】简易菜单
制作一个如图5-14的简易菜单。
用户可通过选择菜单项完成某一功能,只有当用户选择退出时才结束程序的执行,否则,一直可供用户选择操作。
要求:
程序只有一个入口和一个出口(主函数既是入口也是出口)。
图5-14例5-8程序执行图
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
voidFunction1(void)
{
printf("功能1:
\n");
}
voidFunction2(void)
{
printf("功能2:
\n");
}
intSelect(charch)
{//菜单选择
switch(ch)
{
case'1':
Function1();break;
case'2':
Function2();break;
case'0':
return1;
default:
printf("选择错误!
!
!
\n");
}
printf("按任意键继续……");
getch();
return0;
}
voidShowMenu()
{//显示菜单
printf("\t*************************\n");
printf("\t*\t功能菜单\t*\n");
printf("\t*\t1.功能一\t*\n");
printf("\t*\t2.功能二\t*\n");
printf("\t*\t0.退出\t\t*\n");
printf("\t*************************\n");
}
intmain()
{
charch;
while
(1)
{
system("cls");
ShowMenu();
printf("请选择(1,2,0):
");
ch=getchar();getchar();
if(Select(ch))
{
printf("感谢使用,再见!
\n");break;
}
}
return0;
}
【例5-9】汉诺塔问题
古代有一个梵塔,塔内有三个柱A、B、C,A柱上有64个盘子,盘子大小不等,大的在下,小的在上(如图5-15)。
有一个和尚想把这64个盘子从A柱移到B柱,但每次只能允许移动一个盘子,并且在移动过程中,3个柱上的盘子始终保持大盘在下,小盘在上。
在移动过程中可以借助C柱,要求打印移动的步骤。
图5-15汉诺塔
#include"stdio.h"
voidHanoi(intn,charA,charB,charC)
{
if(n==1)
{
printf("将%d号盘子从%c柱移动到%c柱\n",n,A,B);
}
else
{
Hanoi(n-1,A,C,B);
printf("将%d号盘子从%c柱移动到%c柱\n",n,A,B);
Hanoi(n-1,C,B,A);
}
}
intmain()
{
intn;
printf("请输入汉诺塔盘子个数:
\n");
scanf("%d",&n);
Hanoi(n,'A','B','C');printf("%d\n",sum);
return0;
}