《C语言程序设计王新萍趣味程序实例.docx》由会员分享,可在线阅读,更多相关《C语言程序设计王新萍趣味程序实例.docx(17页珍藏版)》请在第一文库网上搜索。
1、C语言趣味程序实例1歌星大奖赛在歌星大奖赛中,有10个评委为参赛的选手打分,分数为oo分。选手最后得分为: 去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。* 问题分析与算法设计这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。* 程序说明与注释#include stdio.h,int main()(int integer,i,max,min,sum;max=-32768; 运行结果Input number 1=90Input number2=91Input number3=93Input number4=94Input number5=90I
2、nput number6=99Input number7=97Input number8=92Input number9=91Input number 10=95Canceled max score:99Canceled min score:90Average score:92*思考题题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接先假设当前的最大值max为C语言整型数的最小值*/min=32767;/*先假设当前的最小值min为C语言整型数的最大值*/SUm=0; /*将求累加和变量的初值置为0*/for(i=l;imax)max=integer; /*通过
3、比较筛选出其中的最高分*/ if(integermin)min=integer; /*通过比较筛选出其中的最低分*/ )printf(,Canceled max score:%dnCanceled min score:%dn,max,min);printf(nAverage 8限(111”,(511111-1)加11)/8);/*输出结果*/1返平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?C语言趣味程序实例2打鱼还是晒网中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两 天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。* 问题分析与
4、算法设计根据题意可以将解题过程分为三步:(1)计算从1990年1月1日开始至指定日期共有多少天;(2)由于“打鱼”和“哂网”的周期为5天,所以将计算出的天数用5去除;(3)根据余数判断他是在“打鱼”还是在“晒网”;若 余数为1, 2, 3,则他是在“打鱼”否则是在“晒网”在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断 经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:如果(年能被4除尽且不能被100除尽)或 能被400除尽)则该年是闰年;否则不是闰年。C语言中判断能否整除可以使用求余运算(即求模)*程序与程序注释#include ,s
5、tdio.h,struct dateint year;int month;int day;1;void main()(struct date today,term;int yearday,year,day;printf( nEnter year/month/day:);scanf(,%d%d%d,1,fetoday.year,fetoday.monthtoiay.day); * 输入日期 */term.month=12;*设置变量的初始值:月*/term.day=31;/*设置变量的初始值:日*/for(yearday=0,year= 1990;year0&day4) printf(he wa
6、s fishing at that day.n);*打印结果*/else printf(He was sleeping at that day.nu);1int days(struct date day)(static int day_tab2 13H 0,31,28,31,30,31,30,31,31,30,31,30,31, * 平均每月的天数 */ 0,31,29,31,30,31,30,31,31,30,31,30,31,), ); int i,lp;lp=day.year%4=0&day.year% 100! =0 day. y ear%400=0;*判定year为闰年还是平年,IP
7、=O为平年,非O为闰年*/for(i=l ;iday.month;i+) /*计算本年中自1月1日起的天数*/ day.day+=day_tablp i;return day.day;)* 运行结果Enter year/month/day :1991 10 25He was fishing at that day.Enter year/month/day: 1992 10 25He was sleeping at that day.* 思考题请打印出任意年份的日历。C语言趣味程序实例3抓交通肇事犯一辆卡车违反了交通规则,撞人后逃逸。现场三人目击该事件,但都没有记住车号, 只记住了一些特征。甲说
8、:车号的前两位数字是相同的;乙说:车号的后两位数字是相同的, 但与前两位不同;丙说:4位车号正好是一个整数的平方。请根据上述特征编写程序协助警 方找出肇事车牌号码。* 问题分析与算法设计按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判 断该整数是另一个整数的平方。*程序说明与注释#include math.hmain() int i,j,k,c;for (i=l;i=9;i+)for (j=lj=9+) if (i!=j) k=i*IOOO+i*lOO+j*IO+j;for(c=3l ;c*ck;c+);if(c*c=k)printf(,lorry-No. is %
9、d.n,k);*运行结果lorry-No. is 7744.*思考题模拟机动车选号。C语言趣味程序实例4新娘和新郎三对情侣参加婚礼,三个新郎为A、B、C,三个新娘为X、Y、Zo有人不知道谁和 谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:A说他将和X结婚;X 说她的未婚夫是C; C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请编程找 出谁将和谁结婚。* 问题分析与算法设计将A、B、C三人用1、2、3表示,将X和A结婚表示为“X=l”,将Y不与A结婚表 示为“Y! =1”。按照题目中的叙述可以写出表达式:X! =1A不与X结婚X! =3X的未婚夫不是CZ! =3C不与Z结婚题
10、意还隐含着X、Y、Z三个新娘不能结为配偶,则有:X!=Y 且 X!=Z 且 Y!=Z穷举各种可能情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式计算 的结果均为“真”,则假设情况就是正确的结果。* 程序与程序注释int x,y,z;for(x=l;x=3;x+)for(y=l;y=3;y+)for(z=l ;z=3;z+)main()/*穷举X的全部可能配偶*/ /*穷举Y的全部可能配偶*/ /*穷举Z的全部可能配偶*/if(x!=l&x!=3&z!=3&x!=y&x!=z&y!=Z)/*判断配偶是否满足题意*/printf(,X will marry to %cn,A+x-l);
11、/*打印判断结果*/printf(Y will marry to %c.n,A,+y-l);printf(Z will marry to %c.n,A+z-l);*运行结果X will marry to B.(X与B结婚)Y will marry to C.Z will marry to A.(Y与C结婚)(Z与A结婚)C语言趣味程序实例5谁家孩子跑最慢张、王、李三家各有三个小孩。一天,三家的九个孩子在一起比赛短跑,规定不分年 龄大小,跑第一得9分,跑第二得8分,依次类推。比赛结果各家的总分相同,且这些孩子 没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。已知获第一名的是李 家的
12、孩子,获得第二的是王家的孩子。问获得最后一名的是谁家的孩子? *问题分析与算法设计按题目的条件,共有1+2+3+9=45,每家的孩子的得分应为15分。根据题意可知: 获第一名的是李家的孩子,获得第二的是王家的孩子,则可推出:获第三名的一定是张家的 孩子。由“这些孩子没有同时到达终点的”可知:名次不能并列,由“没有一家的两个或三 个孩子获得相连的名次”可知:第四名不能是张家的孩子。程序中为了方便起见,直接使用分数表示。* 程序与程序注释int score44;main() int i,j,k,who;scorelll=7;/*按已知条件进行初始化:SCOre1:张家三个孩子的得分*/score2
13、l=8;score3l J=9;for(i=4;i6;i+)for(j=4;j7;j+)for(k=4;i!=j&k7;k+) if(k!=i&k!=j*score:王家三个孩子的得分*/ *score3:李家三个孩子的得分*/*i:张家孩子在4到6分段可能的分数*/ *j:王家孩子在4到6分段可能的分数*/ *k:李家孩子在4到6分段可能的分数*/*分数不能并列*/& 15-i-scorell!=l 5-j-score2l& 15-i-score I 1!=15-k-score3l & 15-j-score2IJ!=l 5-j-score3l)(scored 2=i; scorel3=l5-i-7;*将满足条件的结果记入数组*/score 2 2 =j; score23=15-j-8;score 3 2=k; score33=15-k-9;)for(who=0,i= 1 ;i=4;i+,printf(n)fbr(j=l;j=3;j+)(printf(%d ,scoreij);*输出各家孩子的得分情况*/if(scoreij=l)/*记录最后一名的家庭序号*/who=i; )if(who=l)/*输出最后判断的结果*/printf(The last one arrived to end is a child from fa