蓝桥杯第2届预赛高职C语言真题解析.docx
- 文档编号:30086358
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:20.56KB
蓝桥杯第2届预赛高职C语言真题解析.docx
《蓝桥杯第2届预赛高职C语言真题解析.docx》由会员分享,可在线阅读,更多相关《蓝桥杯第2届预赛高职C语言真题解析.docx(18页珍藏版)》请在冰豆网上搜索。
蓝桥杯第2届预赛高职C语言真题解析
2011年蓝桥杯(第2届)预赛高职高专真题解析
利息计算
小李年初在银行存款1千元(一年定期)。
他计划每年年底取出100元救助失学儿童。
假设银行的存款利率不变,年利率为3%,年底利息自动计入本金。
下面的代码计算5年后,该账户上有多少存款。
试填写缺失的代码。
doublemoney=1000;
intn=5;
inti;
for(i=0;i { money=________; money-=100; } printf("%.2f\n",money); 参考答案: money+money*0.03 开平方 如果没有计算器,我们如何求2的平方根? 可以先猜测一个数,比如1.5,然后用2除以这个数字。 如果我们猜对了,则除法的结果必然与我们猜测的数字相同。 我们猜测的越准确,除法的结果与猜测的数字就越接近。 根据这个原理,只要我们每次取猜测数和试除反馈数的中间值作为新的猜测数,肯定更接近答案! 这种计算方法叫做“迭代法”。 下面的代码模拟了如何用手工的方法求2的平方根的过程。 请填写缺少的代码。 #include intmain(intargc,char*argv[]) { doublen=2; doublea=0; doubleb=n; while(fabs(a-b)>1E-15){ a=(a+b)/2; b=__________; } printf("%f\n",a); return0; } 参考答案: n/a 最小公倍数 求两个数字的最小公倍数是很常见的运算。 比如,3和5的最小公倍是15。 6和8的最小公倍数是24。 下面的代码对给定的两个正整数求它的最小公倍数。 请填写缺少的代码,使程序尽量高效地运行。 intf(inta,intb) { inti; for(i=a;;______________){ if(i%b==0)returni; } } 参考答案: i+=a或者i=i+a; 日期间隔计算 人类历史上出现了很多种历法。 现行的公历即格里历由儒略历改革而来。 它是目前较为精确和规则简明的一种历法,约3300年误差一日。 因为闰年问题以及每个月的长度不等,仍然使得某些计算较为麻烦。 比如: 求两个日期间差多少天。 下面的代码实现了求两个由公历表示的日期间差多少天的功能。 其计算原理是先求出每个日期距离1年1月1日的天数差值,再进一步做差即可。 请研读代码,填写缺失的部分。 #include typedefstructmydate{ intyear; intmonth; intday }MyDate; intGetAbsDays(MyDatex) { inti; intmonth_day[]={31,28,31,30,31,30,31,31,30,31,30,31}; intyear=x.year-1;//因为欲求距离1年1月1日的距离 intdays=year*365+year/4-year/100+year/400; if(x.year%4==0&&x.year%100! =0||x.year%400==0) month_day[1]++; for(i=0;i<_______________________;i++) days+=month_day[i]; days+=x.day-1; returndays; } intGetDiffDays(MyDatea,MyDateb) { returnGetAbsDays(b)-GetAbsDays(a); } intmain(intargc,char*argv[]) { intn; MyDatea={1842,5,18}; MyDateb={2000,3,13}; n=GetDiffDays(a,b); printf("%d\n",n); return0; } 参考答案: x.month-1 字符串的轮换 串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。 这称为对串进行位移=1的轮换。 同理,“abcd”变为: “cdab”则称为位移=2的轮换。 下面的代码实现了对串s进行位移为n的轮换。 请补全缺失的代码。 voidshift(char*s,intn) { char*p; char*q; intlen=strlen(s); if(len==0)return; if(n<=0||n>=len)return; char*s2=(char*)malloc(_________); p=s; q=s2+n%len; while(*p) { *q++=*p++; if(q-s2>=len) { *q=___________; q=s2; } } strcpy(s,s2); free(s2); } 参考答案: sizeof(char)*(len+1) '\0' 金字塔 下面代码的目标是输出一个大写字母组成的金字塔。 其中space表示金字塔底距离左边的空白长度,x表示金字塔底的中心字母。 比如: space=0,x=’C’,则输出: A ABA ABCBA 再如: space=2,x=’E’,则输出: A ABA ABCBA ABCDCBA ABCDEDCBA 请分析该段代码的逻辑,填写缺少的部分。 voidh(intspace,charx) { inti; if(x<'A'||x>'Z')return; ______________; for(i=0;i for(i=0;i for(i=0;i<=x-'A';i++)printf("%c",________); printf("\n"); } 参考答案: h(space+1,x-1) x-i 中奖计算 某抽奖活动的规则是: 每位参与者在纸上写下一个8位数的号码。 最后通过摇奖的办法随机产生一个8位数字。 参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。 例如: 小张写的数字是: 12345678,而开奖号码是: 42347856。 则称小张中了3个号,因为其中最长的相同连续位是: “234”。 如果小张写的是: 87654321,则他只中了一个号。 下面的代码根据传入的参数,返回中了几个号。 其中: a表示被评价的号码,b表示摇号产生的数字。 请填写缺少的代码。 把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。 intg(inta,intb) { charsa[]="00000000"; charsb[]="00000000"; intn=0; inti,j; sprintf(sa,"%8d",a); sprintf(sb,"%8d",b); for(i=0;i<8;i++) { for(j=1;j<=8-i;j++) { chart=________; sa[i+j]=0; if(strstr(sb,sa+i)) { if(j>n)_________; } sa[i+j]=t; } } returnn; } 参考答案: sa[i+j] n=j 字符串的处理 在实际的开发工作中,对字符串的处理是最常见的编程任务。 本题目即是要求程序对用户输入的串进行处理。 具体规则如下: 1.把每个单词的首字母变为大写。 2.把数字与字母之间用下划线字符(_)分开,使得更清晰 3.把单词中间有多个空格的调整为1个空格。 例如: 用户输入: youandmewhatcpp2005program 则程序输出: YouAndMeWhatCpp_2005_program 用户输入: thisisa99cat 则程序输出: ThisIsA99_cat 我们假设: 用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。 每个单词间由1个或多个空格分隔。 假设用户输入的串长度不超过200个字符。 (1)编程思路。 按题目给定的规则对字符串中的字符处理时,需要知道字符串中当前待处理字符前一个字符的情况。 定义变量flag来标记,flag=0表示前一个字符为空格,flag=1表示前一个字符为小写字母,flag=2表示前一个字符为数字。 在处理当前字符ch时,根据flag的值分为三种情况: 1)flag=0。 若当前字符为小写字母,则一定是单词的首字母,变大写后保存,修改flag=1; 若当前字符为数字,直接保存,之后修改flag=2 若当前字符为空格,不用保存直接跳过,相当于删除了多余的空格。 2)flag=1。 若当前字符为小写字母,直接保存; 若当前字符为数字,在数字前加“-”后保存,之后修改flag=2; 若当前字符为空格,直接保存,之后修改flag=0。 2)flag=2。 若当前字符为小写字母,在字母前加“-”后保存,修改flag=1; 若当前字符为数字,直接保存; 若当前字符为空格,直接保存,之后修改flag=0。 (2)源程序。 #include #include intmain() { charsrc[201],dest[201],ch; intflag=0;//flag=0,1,2分别表示前一字符为空格,字母,数字 gets(src); intlen1=0,len2=0; while(src[len1]! ='\0') { ch=src[len1++]; switch(flag) { case0: if(ch>='a'&&ch<='z') { dest[len2++]=ch-32; flag=1; } elseif(ch>='0'&&ch<='9') { dest[len2++]=ch; flag=2; } break; case1: if(ch=='') { dest[len2++]=ch; flag=0; } elseif(ch>='a'&&ch<='z') { dest[len2++]=ch; } elseif(ch>='0'&&ch<='9') { dest[len2++]='_'; dest[len2++]=ch; flag=2; } break; case2: if(ch=='') { dest[len2++]=ch; flag=0; } elseif(ch>='a'&&ch<='z') { dest[len2++]='_'; dest[len2++]=ch; flag=1; } elseif(ch>='0'&&ch<='9') { dest[len2++]=ch; } break; } } dest[len2]='\0'; puts(dest); return0; } 画表格 在图形环境中很容易做出漂亮的表格。 但在控制台环境中就比较困难了。 有的时候可以用一些符号大略地模拟: +-------+------+ |abc? ? ? ? |xyz=tt| +-------+------+ |hellomm|t2? ? ? ? | +-------+------+ 本题目要求设计一个程序,把用户输入的内容用这种“准表格”的方式展现出来。 具体的要求是: 用户输入的第一行是一个整数,表示接下来有多少行信息。 接下来的每行由若干单元组成。 单元间用逗号分开。 程序输出: 用表格方式重新展现的输入内容。 例如: 用户输入: 3 cat,dog,good 1,2,5 donotuse,,that 输出: +----------+---+----+ |cat|dog|good| +----------+---+----+ |1|2|5| +----------+---+----+ |donotuse||that| +----------+---+----+ 从中不难看出: 两个连续的逗号表示中间有一个内容为空的单元,列的数目由最大的单元数的那行决定 列的宽度由同列的最宽的单元决定,单元格中的信息左对齐。 可以假设: 用户输入的最大行数为30,可能的最多列数为40。 (1)编程思路。 定义数组intwidth[40]保存表格的各列的最大宽度,变量colNum保存每行的列数。 输入每行字符串后,求出该行各列的列数并更新数组width的对应元素值。 各列的最大宽度求出后,构造出分隔行模板串line1和数据行模板串line2。 输出表格时,根据输入的每行字符串和模板数据串line2生成输出数据串data。 (2)源程序。 #include #include intmain() { charmess[30][1000]; intwidth[40]={0},colNum=0;//保存各列宽度和列数 intn,i; scanf("%d",&n); getchar(); for(i=0;i { gets(mess[i]); intcnt=0,len=0; for(intk=0;mess[i][k]! ='\0';k++) { if(mess[i][k]==',') { if(width[cnt] len=0; cnt++;//列数加1 } else len++; } if(width[cnt] cnt++; if(colNum } charline1[1000],line2[1000];//分隔行line1和数据行line2模板 intpos=0; line1[pos]='+';line2[pos]='|'; pos++; for(i=0;i { for(intj=1;j<=width[i];j++) { line1[pos]='-';line2[pos]=''; pos++; } line1[pos]='+';line2[pos]='|'; pos++; } printf("%s\n",line1); chardata[1000]; for(i=0;i { strcpy(data,line2); pos=1; inttpos=pos; intcnt=0; for(intk=0;mess[i][k]! ='\0';k++) { if(mess[i][k]==',') { pos=pos+width[cnt]+1; tpos=pos; cnt++; } else data[tpos++]=mess[i][k]; } printf("%s\n",data); printf("%s\n",line1); } return0; } 5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。 如果只有5个砝码,重量分别是1,3,9,27,81。 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。 本题目要求编程实现: 对用户给定的重量,给出砝码组合方案。 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后。 可以假设用户的输入的数字符合范围1~121。 (1)编程思路。 由于5个砝码的重量分别是1(30),3(31),9(32),27(33),81(34),可以看成是三进制数。 对5位三进制数1~243进行穷举,各位的数码可能为0~2,由于每种砝码只有一个,不可能有2,因此将各位数码减1后,正好为-1,0或1,-1表示砝码放在物品一边,用“-”号,0表示对应砝码不用,1表示砝码放在称重端,用“+号。 若对应组合正好为输入重量n,则为所求,按要求输出表达式即可。 (2)源程序。 #include voidprint_result(inta[]) { intb[5]={1,3,9,27,81}; inti,first=1; for(i=4;i>=0;i--) { if(a[i]==1&&first! =1) printf("+"); elseif(a[i]==-1) printf("-"); if(a[i]! =0) printf("%d",b[i]); if(a[i]==1)first=0; } printf("\n"); } intmain() { inti,n,a[5]; scanf("%d",&n); for(i=0;i<243;i++) { intt=i; for(intj=0;j<=4;j++) { a[4-j]=t%3-1; t=t/3; } if(81*a[4]+27*a[3]+9*a[2]+3*a[1]+1*a[0]==n) print_result(a); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝桥杯第 预赛 高职 语言 题解