C趣味程序百例文档格式.docx
《C趣味程序百例文档格式.docx》由会员分享,可在线阅读,更多相关《C趣味程序百例文档格式.docx(125页珍藏版)》请在冰豆网上搜索。
图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。
为此,可以先判断图形的交点,再分别控制打印两个不同的图形。
*程序注释与说明
intx,m,n,yy;
for(yy=0;
yy<
=20;
yy++)/*对于第一个y坐标进行计算并在一行中打印图形*/
{
y=0.1*yy;
/*y:
屏幕行方向坐标*/
m=acos(1-y)*10;
/*m:
cos(x)曲线上y点对应的屏幕列坐标*/
n=45*(y-1)+31;
/*n:
直线上y点对应的列坐标*/
for(x=0;
=62;
x++)
/*x:
屏幕列方向坐标*/
if(x==m&
&
x==n)printf("
+"
/*直线与cos(x)相交时打印“+”*/
elseif(x==n)printf("
/*打印不相交时的直线图形*/
elseif(x==m||x==62-m)printf("
/*打印不相交时的cos(x)图形*/
else
printf("
/*其它情况打印空格*/
\n"
}}
如何实现sin(x)曲线与cos(x)曲线图形的同时显示。
3.绘制圆
在屏幕上用“*”画一个空心的圆
打印圆可利用图形的左右对称性。
根据圆的方程:
R*R=X*X+Y*Y
可以算出圆上每一点行和列的对应关系。
doubley;
intx,m;
for(y=10;
=-10;
y--)
m=2.5*sqrt(100-y*y);
/*计算行y对应的列坐标m,2.5是屏幕纵横比调节系数因为屏幕的行距大于列距,不进行调节显示出来的将是椭圆*/
30-m;
/*图形左侧空白控制*/
/*圆的左侧*/
for(;
30+m;
/*图形的空心部分控制*/
/*圆的右侧*/
运行结果
实现函数y=x2的图形与圆的图形叠加显示
4.歌星大奖赛
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。
选手最后得分为:
去掉一个最高分和一个最低分后其余8个分数的平均值。
请编写一个程序实现。
*问题分析与算法实现
这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。
intinteger,i,max,min,sum;
max=-32768;
/*先假设当前的最大值max为C语言整型数的最小值*/
min=32767;
/*先假设当前的最小值min为C语言整型数的最大值*/
sum=0;
/*将求累加和变量的初值置为0*/
for(i=1;
i<
=10;
i++)
Inputnumber%d="
i);
scanf("
%d"
&
integer);
/*输入评委的评分*/
sum+=integer;
/*计算总分*/
if(integer>
max)max=integer;
/*通过比较筛选出其中的最高分*/
if(integer<
min)min=integer;
/*通过比较筛选出其中的最低分*/
}
Canceledmaxscore:
%d\nCanceledminscore:
%d\n"
max,min);
Averagescore:
(sum-max-min)/8);
/*输出结果*/
}
Inputnumber1=90
Inputnumber2=91
Inputnumber3=93
Inputnumber4=94
Inputnumber5=90
Inputnumber6=99
Inputnumber7=97
Inputnumber8=92
Inputnumber9=91
Inputnumber10=95
Canceledmaxscore:
99
Canceledminscore:
90
Averagescore:
92
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接返平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
----------------------------------------------------------------
5.求最大数
问的约数中最大的三位数是多少?
根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。
因此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。
本题只要求取约数中最大的三位数,则其取值范围可限制在100到999之间。
longi;
intj;
Pleaseinputnumber:
"
%ld"
i);
for(j=999;
j>
=100;
j--)
if(i%j==0)
Themaxfactorwith3digitsin%ldis:
%d,\n"
i,j);
break;
输入:
输出:
Themaxfactorwith3digitsinis:
777
-------------------------------------------------------------------
6.高次方数的尾数
求13的13次方的最后三位数
解本题最直接的方法是:
将13累乘13次方截取最后三位即可。
但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。
事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。
研究乘法的规律发现:
乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。
利用这一规律,可以大大简化程序。
inti,x,y,last=1;
/*变量last保存求X的Y次方过程中的部分乘积的后三位*/
InputXandY(X**Y):
%d**%d"
x,&
y);
=y;
i++)
/*X自乘Y次*/
last=last*x%1000;
/*将last乘X后对1000取模,即求积的后三位*/
Thelast3digitsof%d**%dis:
x,y,last%1000);
/*打印结果*/
InputXandY(X**Y):
13**13
Thelast3digitsof13**13is:
253
13**20
Thelast3digitsof13**20is:
801
8.借书方案知多少
小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。
首先对五本书从1至5进行编号,然后使用穷举的方法。
假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
{inta,b,c,count=0;
TherearediffrentmethodsforXMtodistributebooksto3readers:
for(a=1;
a<
=5;
a++)
/*穷举第一个人借5本书中的1本的全部情况*/
for(b=1;
b<
b++)
/*穷举第二个人借5本书中的一本的全部情况*/
for(c=1;
a!
=b&
c<
c++)
/*当前两个人借不同的书时,穷举第三个人借5本书
中的1本的全部情况*/
if(c!
=a&
c!
=b)
/*判断第三人与前两个人借的书是否不同*/
printf(count%8?
%2d:
%d,%d,%d
:
%d,%d,%d\n
++count,a,b,c);
/*打印可能的借阅方法*/
TherearediffrentmethodsforXMtodistributebooksto3readers:
1:
1,2,3
2:
1,2,4
3:
1,2,5
4:
1,3,2
5:
1,3,4
6:
1,3,5
7:
1,4,2
8:
1,4,3
9:
1,4,5
10:
1,5,2
11:
1,5,3
12:
1,5,4
13:
2,1,3
14:
2,1,4
15:
2,1,5
16:
2,3,1
17:
2,3,4
18:
2,3,5
19:
2,4,1
20:
2,4,3
21:
2,4,5
22:
2,5,1
23:
2,5,3
24:
2,5,4
25:
3,1,2
26:
3,1,4
27:
3,1,5
28:
3,2,1
29:
3,2,4
30:
3,2,5
31:
3,4,1
32:
3,4,2
33:
3,4,5
34:
3,5,1
35:
3,5,2
36:
3,5,4
37:
4,1,2
38:
4,1,3
39:
4,1,5
40:
4,2,1
41:
4,2,3
42:
4,2,5
43:
4,3,1
44:
4,3,2
45:
4,3,5
46:
4,5,1
47:
4,5,2
48:
4,5,3
49:
5,1,2
50:
5,1,3
51:
5,1,4
52:
5,2,1
53:
5,2,3
54:
5,2,4
55:
5,3,1
56:
5,3,2
57:
5,3,4
58:
5,4,1
59:
5,4,2
60:
5,4,3
----------------------------------------------------------------------------
9.杨辉三角形
在屏幕上显示杨辉三角形
1
1
1
2
3
1
4
6
4
1
5
10
......................................
杨辉三角形中的数,正是(x+y)的N次方幂展开式各项的系数。
本题作为程序设计中具有代表性的题目,求解的方法很多,这里仅给出一种。
从杨辉三角形的特点出发,可以总结出:
1)第N行有N+1个值(设起始行为第0行)
2)对于第N行的第J个值:
(N>
=2)
当J=1或J=N+1时:
其值为1
J!
=1且J!
=N+1时:
其值为第N-1行的第J-1个值与第N-1行第J个值之和
将这些特点提炼成数学公式可表示为:
x=1或x=N+1
c(x,y)=
c(x-1,y-1)+c(x-1,y)
其它
本程序应是根据以上递归的数学表达式编制的。
inti,j,n=13;
N="
while(n>
12)
scanf("
n);
/*控制输入正确的值以保证屏幕显示的图形正确*/
for(i=0;
=n;
/*控制输出N行*/
for(j-0;
j<
24-2*i;
j++)printf("
/*控制输出第i行前面的空格*/
for(j=1;
i+2;
%4d"
c(i,j));
/*输出第i行的第j个值*/
voidintc(intx,inty)
/*求杨辉三角形中第x行第y列的值*/
intz;
if((y==1)||(y==x+1))
return1;
/*若为x行的第1或第x+1列,则输出1*/
z=c(x-1,y-1)+c(x-1,y);
/*否则,其值为前一行中第y-1列与第y列值之和*/
returnz;
输入:
N=12输出:
自行设计一种实现杨辉三角形的方法。
------------------------------------------------------------------------------
10.数制转换
将任一整数转换为二进制形式
将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。
对于C语言来说,一个整数在计算机内就是以二进制的形式存储的,所以没有必要再将一个整数经过一系列的运算转换为二进制形式,只要将整数在内存中的二进制表示输出即可。
voidprintb(int,int);
{
intx;
Inputnumber:
x);
numberofdecimalform:
x);
it'
sbinaryform:
printb(x,sizeof(int)*8);
整数
sizeof(int):
int型在内存中所占的字节数
sizeof(int)*8:
int型对应的位数*/
putchar('
\n'
voidprintb(intx,intn)
if(n>
0)
0'
+((unsigned)(x&
(1<
<
(n-1)))>
>
(n-1)));
/*输出第n位*/
printb(x,n-1);
/*归调用,输出x的后n-1位*/
8
输出:
sbunaryform:
01000
-8
it'
11000
32767
11111
-32768
00000
128
*问题的进一步讨论
充分利用C语言可以对位进行操作的特点,可以编写许多其它高级语言不便于编写甚至根本无法编写的程序。
位操作是C语言的一大特点,在深入学习C语言的过程中应力求很好掌握。
程序中使用的位运算方法不是最佳的,也可以不用递归操作,大家可以自行对程序进行优化。
将任意正整数转换为四进制或八进制数
11.打鱼还是晒网
中国有句俗语叫“三天打鱼两天晒网”。
某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
根据题意可以将解题过程分为三步:
1)计算从1990年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若
余数为1,2,3,则他是在“打鱼”
否则
是在“晒网”
在这三步中,关键是第一步。
求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。
闰年的方法可以用伪语句描述如下:
如果
((年能被4除尽且不能被100除尽)或能被400除尽)
则
该年是闰年;