2011l蓝桥杯c语言高职真题附加答案
2011 模拟c语言高职
注意:
本套模拟题主要模拟命题形式与考核范围。真实竞赛题的数量、难度可能与此套模拟题有差异。
说明:
本试卷包含两种题型:“代码填空”与“程序设计”。
填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不多于一条语句(即不能出现分号)。
编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。
1.代码填空(满2分)
形如:“abccba”,“abcba”的串称为回文串,下列代码判断一个串是否为回文串。请补充空白的部分。STRLEN从1开始
char buf[] = "abcde11edcba";
int x = 1;
for(int i=0; i if(__buf[i]!=buf[strlen(buf)-1-i]_________________) { x = 0; break; } printf("%s\n", x ? "是":"否"); 2.代码填空(满分3分) 下列代码把一个二进制的串转换为整数。请填写缺少的语句; char* p = "1010110001100"; int n = 0; for(int i=0;i { n = ___n+(p[i]-48)*pow(2,strlen(p)-1-i)_______________; } printf("%d\n", n); 3.代码填空(满分3分) 用具体数字,加快效率 假设a,b,c是3个互不相等的整数。下列代码取出它们中居中的数值,记录在m中。其中的swap()函数可以交换两个变量的值。请完善代码。 if(a>b) swap(&a, &b); if(b>c) swap(&b, &c); __if(a>b) swap(&a,&b)____________________; int m = b; 4.代码填空(满分6分) 下面函数的目的是求出某个日期是该年度的第几天。试完善之。 如果传入:year=1980,month=1, day=1 则返回1 如果传入:year=1980,month=2, day=1 则返回32 int getDayOfYear(int year, int month, int day) { int days [2][12]={{31,30,31,30,31,30,31,31,30,31,30,31}, {31,28,31,30,31,30,31,31,30,31,30,31}}; int flag =(year%4==0 && year%100!=0) || year%400 == 0 ? 1 : 0; //flag=1,表示是闰年,flag=0,表示非闰年 int sum = day ; for(int i=0;i sum += days[flag][i]; } return sum; } 5.代码填空(满分7分) 计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。 int f(int m, int n) { if(m==0 || n==0) return 1; return ___f(m,n-1)+f(m-1,n)_; 递归 } 6.代码填空(满分10分) (a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1,1 3 3 1,1 4 6 4 1。这些系数构成了著名的杨辉三角形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(m,n都从0算起)。 int f(int m, int n) { if(m==0) return 1; if(n==0 || n==m) return 1; return ____f(m-1,n-1)+f(m-1,n)_______; 递归 } 7.程序设计(满分15分) 从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出: 1 2 4 3 输入数字3,则程序输出: 1 2 3 8 9 4 7 6 5 输入数字4,则程序输出: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 #include int main() { int n,j; int a[20][20]={0}; loop: printf("输入0--20:\n"); int l,h,i=1,x=1;//l是行,h是列,x代表第几圈 scanf("%d",&n); for(x=1;x<(n+3)/2;x++) { for(l=x-1;l<(n-x+1);l++,i++) a[x-1][l]=i; for(h=x;h a[h][n-x]=i; for(l=n-x-1;l>=x-1;l--,i++) a[n-x][l]=i; for(h=n-x-1;h>x-1;h--,i++) a[h][x-1]=i; } for(i=0;i { for(j=0;j printf("%6d",a[i][j]); printf("\n"); } goto loop; } 8.程序设计(满分9分) 从键盘输入一个日期,格式为yyyy-M-d 要求计算该日期与1949年10月1日距离多少天 例如: 用户输入了:1949-10-2 程序输出:1 用户输入了:1949-11-1 程序输出:31 9.程序设计(满分12 分) 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程: 1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。 2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。 3、将奇数位总和加上偶数位总和,结果应该可以被10整除。 例如,卡号是:5432123456788881 则奇数、偶数位(用红色标出)分布:5432123456788881 奇数位和=35 偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。 最后35+35=70 可以被10整除,认定校验通过。 请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。 比如,用户输入:356827027232780 程序输出:成功 10.程序设计(满分20 分) 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为[0],这个可以不考虑。循环圈的输出格式仿照: [82962, 75933, 63954, 61974] 其中数字的先后顺序可以不考虑。 #include #include void BlackHole(int a); int sort(int p[],int len,int flag); int i,j; int r[100]={0}; int main() { printf("请输入一个五位数\n"); scanf("%d",&i); BlackHole(i); return 0; } void BlackHole(int a) { int save=a; static int t=0; int flag=0; int s=0; int p[5]; int len=0; for(i=0;i { if(a==r[i]) { flag=1; s=i; break; } } if(flag==0) { r[t]=a; t++; while (save) { len+=1; save /= 10; } for(i=0;i p[i]=a%10; a/=10; } int max=sort(p,len,1); int min=sort(p,len,0); BlackHole(max-min); } else{ printf("["); for(i=s;i { if(i==t-1) { printf("%d]",r[i]); } else printf("%d,",r[i]); } } } int sort(int p[],int len,int flag) { int temp; int Rec=0; for(i=0;i for(j=i+1;j if(flag==1){//从小到大排序 if (p[i] temp=p[i]; p[i]=p[j]; p[j]=temp; } } else{//从大到小排序 if (p[i]>p[j]){ temp=p[i]; p[i]=p[j]; p[j]=temp; } } } } for(i=len-1;i>=0;i--)Rec+=p[i]*pow(10,len-1-i); return Rec; }