C语言大赛题目精选带答案.docx
- 文档编号:1039128
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:15
- 大小:26.53KB
C语言大赛题目精选带答案.docx
《C语言大赛题目精选带答案.docx》由会员分享,可在线阅读,更多相关《C语言大赛题目精选带答案.docx(15页珍藏版)》请在冰点文库上搜索。
第1题歌手大赛问题
题目:
青年歌手参加歌曲大奖赛,有10个评委进行打分,试编程求这位选手的平均得分。
3种方法:
分别要求使用到排序,数组,函数,指针。
分析:
这道题的核心程序是排序,将评委打的10个分数利用数组按增序(或降序)排列,计算数组中除了第一个和最后一个分数以外的数以外的数的平均分
答案:
#include
doubleAver(intp[],intcount)//求出结果,p为整型数组,count为数组大小
{
doubleresult=0;
for(inti=0;i for(intj=i;j { if(p[i] { inttemp=p[i]; p[i]=p[j]; p[j]=temp; } } printf("评委打分按顺序: "); for(intm=0;m<10;m++)//显示排序后结果 printf("%d",p[m]); printf("\n"); for(intk=1;k result+=p[k]; result/=count-2; returnresult; } voidmain() { printf("请输入10组评分: \n"); intp[10]; inti; for(i=0;i<10;i++)//输入评分 { printf("输入评委%d打分: ",i+1); scanf("%d",&p[i]); } doubleresult=Aver(p,10);//计算平均分 printf("\n平均分为%5.2f\n",result); } 1.11.打鱼还是晒网 中国有句俗语叫“三天打鱼两天晒网”。 某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。 *问题分析与算法设计 根据题意可以将解题过程分为三步: 1)计算从1990年1月1日开始至指定日期共有多少天; 2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除; 3)根据余数判断他是在“打鱼”还是在“晒网”; 若余数为1,2,3,则他是在“打鱼” 否则是在“晒网” 在这三步中,关键是第一步。 求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。 闰年的方法可以用伪语句描述如下: 如果((年能被4除尽且不能被100除尽)或能被400除尽) 则该年是闰年; 否则不是闰年。 C语言中判断能否整除可以使用求余运算(即求模) *程序与程序注释 #include intdays(structdateday); structdate{ intyear; intmonth; intday; }; voidmain() { structdatetoday,term; intyearday,year,day; printf("Enteryear/month/day: "); scanf("%d%d%d",&today.year,&today.month,&today.day);/*输入日期*/ term.month=12;/*设置变量的初始值: 月*/ term.day=31;/*设置变量的初始值: 日*/ for(yearday=0,year=1990;year { term.year=year; yearday+=days(term);/*计算从1990年至指定年的前一年共有多少天*/ } yearday+=days(today);/*加上指定年中到指定日期的天数*/ day=yearday%5;/*求余数*/ if(day>0&&day<4)printf("hewasfishingatthatday.\\n");/*打印结果*/ elseprintf("Hewassleepingatthatday.\\n"); } intdays(structdateday) { staticintday_tab[2][13]= {{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,}, }; inti,lp; lp=day.year%4==0&&day.year%100! =0||day.year%400==0; /*判定year为闰年还是平年,lp=0为平年,非0为闰年*/ for(i=1;i day.day+=day_tab[lp]; returnday.day; } *运行结果 Enteryear/month/day: 19911025 Hewasfishingatday. Enteryear/month/day: 19921025 Hewassleepingatday. Enteryear/month/day: 19931025 Hewassleepingatday 2.12.抓交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。 现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。 甲说: 牌照的前两位数字是相同的;乙说: 牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说: 四位的车号刚好是一个整数的平方。 请根据以上线索求出车号。 *问题分析与算法设计 按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。 *程序与程序注释 #include #include voidmain() { inti,j,k,c; for(i=1;i<=9;i++)/*i: 车号前二位的取值*/ for(j=0;j<=9;j++)/*j: 车号后二位的取值*/ if(i! =j)/*判断二位数字是否相异*/ { k=i*1000+i*100+j*10+j;/*计算出可能的整数*/ for(c=31;c*c if(c*c==k)printf("Lorry--No.is%d.\\n",k);/*若是,打印结果*/ } } *运行结果 Lorry_No.is7744 3.14.怎样存钱利最大 假设银行整存整取存款不同期限的月息利率分别为: 0.63%期限=1年 0.66%期限=2年 0.69%期限=3年 0.75%期限=5年 0.84%期限=8年 利息=本金*月息利率*12*存款年限。 现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。 *问题分析与算法 为了得到最多的利息,存入银行的钱应在到期时马上取出来,然后立刻将原来的本金和利息加起来再作为新的本金存入银行,这样不断地滚动直到满20年为止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一样的。 分析题意,设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时存款人应得到的本利合计为: 2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8 其中rateN为对应存款年限的利率。 根据题意还可得到以下限制条件: 0<=i8<=2 0<=i5<=(20-8*i8)/5 0<=i3<=(20-8*i8-5*i5)/3 0<=i2<=(20-8*i8-5*i5-3*i3)/2 0<=i1=20-8*i8-5*i5-3*i3-2*i2 可以用穷举法穷举所有的i8、i5、i3、i2和i1的组合,代入求本利的公式计算出最大值,就是最佳存款方案。 *程序与程序注释 #include #include voidmain() { inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1; floatmax=0,term; for(i8=0;i8<3;i8++)/*穷举所有可能的存款方式*/ for(i5=0;i5<=(20-8*i8)/5;i5++) for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++) for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++) { i1=20-8*i8-5*i5-3*i3-2*i2; term=2000.0*pow((double)(1+0.0063*12),(double)i1) *pow((double)(1+2*0.0063*12),(double)i2) *pow((double)(1+3*0.0069*12),(double)i3) *pow((double)(1+5*0.0075*12),(double)i5) *pow((double)(1+8*0.0084*12),(double)i8); /*计算到期时的本利合计*/ if(term>max) { max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8; } } printf("Formaxinumprofit,heshouldsosavehismoneyinabank: \\n"); printf("madefixeddepositfor8year: %dtimes\\n",n8); printf("madefixeddepositfor5year: %dtimes\\n",n5); printf("madefixeddepositfor3year: %dtimes\\n",n3); printf("madefixeddepositfor2year: %dtimes\\n",n2); printf("madefixeddepositfor1year: %dtimes\\n",n1); printf("Toal: %.2f\\n",max); /*输出存款方式*/ } *运行结果 Formaxinumprofit,heshouldsosavehismoneyinabank: madefixeddepositfor8year: 0times madefixeddepositfor5year: 4times madefixeddepositfor3year: 0times madefixeddepositfor2year: 0times madefixeddepositfor1year: 0times Total: 8841.01 可见最佳的存款方案为连续四次存5年期。 4.51.谁是窃贼 公安人员审问四名窃贼嫌疑犯。 已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。 在回答公安人员的问题中: 甲说: “乙没有偷,是丁偷的。 ” 乙说: “我没有偷,是丙便的。 ” 丙说: “甲没有偷,是乙偷的。 ” 丁说: “我没有偷。 ” 请根据这四人的答话判断谁是盗窃者。 *问题分析与算法设计 假设A、B、C、D分别代表四个人,变量的值为1代表该人是窃贱。 由题目已知: 四人中仅有一名是窃贱,且这四个人中的每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话: “X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。 故在列条件表达式时,可以不关心谁说谎,谁说实话。 这样,可以列出下列条件表达式: 甲说: ”乙没有偷,是丁偷的。 ”B+D=1 乙说: “我没有偷,是丙偷有。 ”B+C=1 丙说: “甲没有偷,是乙偷的。 ”A+B=1 丁说: “我没有偷。 ”A+B+C+D=1 其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贱的条件。 *程序与程序注释 #include voidmain() { inti,j,a[4]; for(i=0;i<4;i++)/*假定只有第i个人为窃贱*/ { for(j=0;j<4;j++)/*将第i个人设置为1表示窃贱,其余为0*/ if(j==i)a[j]=1; elsea[j]=0; if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1)/*判断条件是否成立*/ { printf("Thethiefis");/*成立*/ for(j=0;j<=3;j++)/*输出计算结果*/ if(a[j])printf("%c.",j+\'A\'); printf("\\n"); } } } *运行结果 ThethiefisB.(乙为窃贱。 ) 69.魔术师的猜牌术 (1) 魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。 对观众说: 我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信? 你们就看。 魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。 这样依次进行将13张牌全翻出来,准确无误。 问魔术师手中的牌原始顺序是怎样安排的? *问题分析与算法设计 题目已经将魔术师出牌的过程描述清楚,我们可以利用倒推的方法,很容易地推出原来牌的顺序。 人工倒推的方法是: 在桌子上放13空盒子排成一圈,从1开始顺序编号,将黑桃A放入1号盒子中,从下一个空盒子开始对空的盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数,顺序放入3、4、5...,直到放入全部3张牌。 注意在计数时要跳过非空的盒子,只对空盒子计数。 最后牌在盒子中的顺序,就是魔术师手中原来牌的顺序。 这种人工的方法是行之有效的,计算机可以模拟求解。 *程序与程序注释 #include inta[14]; voidmain() { inti,n,j=1;/*j: 数组(盒子)下标,初始时为1号元素*/ printf("Theoriginalorderofcardsis: "); for(i=1;i<=13;i++)/*i: 要放入盒子中的牌的序号*/ { n=1; do{ if(j>13)j=1;/*由于盒子构成一个圈,j超过最后一个元素则指向1号元素*/ if(a[j])j++;/*跳过非空的盒子,不进行计数*/ else{if(n==i)a[j]=i;/*若数到第i个空盒子,则将牌放入空盒中*/ j++;n++;/*对空盒计数,数组下标指向下一个盒子*/ } }while(n<=i);/*控制空盒计数为i*/ } for(i=1;i<=13;i++)/*输出牌的排列顺序*/ printf("%d",a); printf("\\n"); } *运行结果 Theoriginalorderofcardsis: 18251031211947613 70.魔术师的猜牌术 (2) 魔术师再次表演,他将红桃和黑桃全部迭在一起,牌面朝下放在手中,对观众说: 最上面一张是黑桃A,翻开后放在桌上。 以后,从上至下每数两张全依次放在最底下,第三张给观众看,便是黑桃2,放在桌上后再数两张依次放在最底下,第三张给观众看,是黑桃3。 如此下去,观众看到放在桌子上牌的顺序是: 黑桃A2345678910JQK 红桃A2345678910JQK 问魔术师手中牌的原始顺序是什么? *问题分析与算法设计 本题可在上题的基础上进行编程,不同的在于计数的方法和牌的张数,这些并不影响我们求解题目的思路,仍可按照倒推的方法,得到原来魔术师手中的牌的顺序。 *程序与程序注释 #include inta[27]; voidmain() { inti,n,j=1; a[1]=1;/*初始化第一张牌*/ printf("Theoriginalorderofcardsis: (r: radb: block): \\n"); for(i=2;i<=26;i++) { n=1; do{ if(j>26)j=1;/*超过最后一个元素则指向1号元素*/ if(a[j])j++;/*跳过非空的盒子,不进行计数*/ else{ if(n==3)a[j]=i;/*若数到第3个空盒子,则将牌放入空盒中*/ j++;n++;/*对空盒计数,数组下标指向下一个盒子*/ } }while(n<=3);/*控制空盒计数为3*/ } for(i=1;i<=26;i++)/*输出牌的排列顺序*/ { printf("%c",a>13? \'r\': \'b\'); printf("%d",a>13? a-13: a); if(i==13)printf("\\n"); } printf("\\n"); } *运行结果 Theoriginalorderofcardsis: (r: radb: black): b1r6b10b2r12r3b3b11r9b4r7b12b5 r4r13b6b13r11b7r5r1b8r8r10b9r2 75.10个小孩分糖果 十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。 然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。 问经过这样几次后大家手中的糖的块数一样多? 每人各有多少块糖? *问题分析与算法设计 题目描述的分糖过程是一个机械的重复过程,编程算法完全可以按照描述的过程进行模拟。 *程序与程序注释 #include voidprint(ints[]); intjudge(intc[]); intj=0; voidmain() { staticintsweet[10]={10,2,8,22,16,4,10,6,14,20};/*初始化数组数据*/ inti,t[10],l; printf("child\\n"); printf("round12345678910\\n"); printf(".............................\\n"); print(sweet);/*输出每个人手中糖的块数*/ while(judge(sweet))/*若不满足要求则继续进行循环*/ { for(i=0;i<10;i++)/*将每个人手中的糖分成一半*/ if(sweet%2==0)/*若为偶数则直接分出一半*/ t=sweet=sweet/2; else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 大赛 题目 精选 答案