模拟c语言高职附答案_第1页
模拟c语言高职附答案_第2页
模拟c语言高职附答案_第3页
模拟c语言高职附答案_第4页
模拟c语言高职附答案_第5页
免费预览已结束,剩余4页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2011 模拟 c 语言高职 (附答案)注意:本套模拟题主要模拟命题形式与考核范围。 真实竞赛题的数量、 难度可能与此套模拟题 有差异。说明:本试卷包含两种题型: “代码填空”与“程序设计” 。 填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分, 使得程序逻辑 正确、完整。 所填写的代码不多于一条语句 (即不能出现分号) 。编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。 注意: 在评卷时使 用的输入数据与试卷中给出的实例数据可能是不同的。 选手的程序必须是通用的 ,不能只对 试卷中给定的数据有效。1. 代码填空(满 2 分)形如:"abccba”,&quo

2、t;abcba”的串称为回文串,下列代码判断一个串是否为回文串。请补 充空白的部分。char buf = "abcde11edcba"int x = 1;for(int i=0; i<strlen(buf)/2; i+)if()x = 0; break;printf("%sn", x ? "是 ":" 否");答案: bufi!=bufstrlen(buf)-1-i附测试程序:#include<stdio.h>#include<string.h>main() int i;char bu

3、f = "abc2de11edcba"int x = 1;for(i=0; i<strlen(buf)/2; i+) if(bufi!=bufstrlen(buf)-1-i) x = 0;break; printf("%sn", x ? "是 ":" 否");2. 代码填空(满分 3 分) 下列代码把一个二进制的串转换为整数。请填写缺少的语句; char* p = "1010110001100"int n = 0;for(int i=0;i<strlen(p); i+)n = ; p

4、rintf("%dn", n);答案: n*2+(*(p+i)-'0')附测试程序:#include<string.h>main()int i;char *p="1001"int n=0;for(i=0;i<strlen(p); i+) n=n*2+(*(p+i)-'0'); printf("%dn", n);3. 代码填空(满分 3 分)m 中。其假设a,b,c是3个互不相等的整数。下列代码取出它们中居中的数值,记录在 中的swap()函数可以交换两个变量的值。请完善代码。if(a&

5、gt;b) swap(&a, &b);/ 将较大数推向 bif(b>c) swap(&b, &c);/ 将较大数推向 c, c 即为三个数中的最大值;/ 再将 a、b 中的较大数推向 b,b 即为中间数 int m = b;答案: if(a>b) swap(&a, &b);附测试程序:#include<stdio.h>#include<string.h>void swap(int *p, int *q) int t;t=*p;*p=*q;*q=t;main() int a,b,c,m;printf("

6、Input a,b,c:");scanf("%d,%d,%d",&a,&b,&c); if(a>b) swap(&a, &b); / if(b>c) swap(&b, &c); / if(a>b) swap(&a, &b); / m=b;将较大数推向 b将较大数推向 c,c 即为三个数中的最大值 再将 a、b 中的较大数推向 b ,b 即为中间数printf("min=%d,m=%d,max=%dn",a,m,c);4. 代码填空(满分 6 分) 下面函数

7、的目的是求出某个日期是该年度的第几天。试完善之。 如果传入: year=1980, month=1, day=1 则返回 1 如果传入: year=1980, month=2, day=1 则返回 32 intgetDayOfYear(int year, int month, int day) int days ;int flag =(year%4=0 && year%100!=0) | year%400 = 0 ? 1 : 0;int sum = day ;for(int i=0;i<month;i+)sum += daysflagi;return sum;答案: 21

8、2=0,31,28,31,30,31,30,31,31,30,31,30,0,31,29,31,30,31,30,31,31,30,31,30 附测试程序: #include<stdio.h> int getDayOfYear(int year, int month, int day) inti,days212=0,31,28,31,30,31,30,31,31,30,31,30,0,31,29,31,30,31,30,31, 31,30,31,30;int flag =(year%4=0 && year%100!=0) | year%400 = 0 ? 1 : 0

9、;int sum = day ; for(i=0;i<month;i+) sum += daysflagi;return sum;main()int year,month,day; printf("Ipnut year,month,day:"); scanf("%d,%d,%d",&year,&month,&day);printf("%dn", getDayOfYear(year,month,day);5. 代码填空(满分 7 分)计算3个A , 2个B可以组成多少种排列的问题(如: AAABB, AAB

10、BA )是组合数 学的研究领域。 但有些情况下, 也可以利用计算机计算速度快的特点通过巧妙的推理来解 决问题。下列的程序计算了m个A, n个B可以组合成多少个不同排列的问题。请完善它。int f(int m, int n)if(m=0 | n=0) return 1;return ;答案: f(m-1,n)+f(m,n-1)附测试程序:#include<stdio.h>#include<stdio.h>int f(int m, int n)if(m=0 | n=0) return 1;return f(m-1,n)+f(m,n-1);main()int i,j;prin

11、tf("Input m,n:");scanf("%d,%d",&i,&j);printf("kinds=%dn",f(i,j);6. 代码填空(满分 10 分)(a+b)的n次幕的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1, 1 33 1, 1 4 6 4 1。这些系数构成了著名的杨辉三角形:11 11 2 11 331146411 5 10 1051下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(m, n都从0算起)。int f(int m, int n)if(m=0) retur

12、n 1; if(n=0 | n=m) return 1;return ;答案: f(m-1,n-1)+f(m-1,n)附测试程序:#include<stdio.h>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);main() int i,j;for(i=0;i<10;i+) for(j=0;j<=i;j+)printf("%4d",f(i,j);printf("n");7. 程序设计(满分 15 分)从键盘

13、输入一个整数(120)则以该数字为矩阵的大小,把1,2,3n*n的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:1 24 3输入数字3,则程序输出:1 2 38 9 47 6 5输入数字4,则程序输出1 234121314511 1615610 987程序源代码:#include<stdio.h>int val=0; / 设置全局变量 val, 以使每次调用 f() 时, 所填写的值是接着上次的顺序void f(int i,int k,int (*farr)20) /每调用一次函数将打印以 (i,i) 为正方形的左上角, k 为边长的正方形框 int c;for(

14、c=0;c<k;c+) /写入正方形上边沿的值farrii+c=+val;for(c=1;c<k;c+) /farri+ci+k-1=+val;for(c=k-2;c>=0;c-) /farri+k-1i+c=+val;for(c=k-2;c>=1;c-) /farri+ci=+val;写入正方形右边沿的值写入正方形下边沿的值写入正方形左边沿的值main()int n,count,arr2020,a,b;printf("Input n:");scanf("%d",&n);for(count=0;count<n/2+n

15、%2;count+) / n 1+n/2 次f(count,n-count*2,arr); / (count,count)为偶数时 ,循环 n/2 次; n 为奇数时 ,循环为每个正方形的左上角的坐标 , 正方形的边长为 (n-count*2)for(a=0;a<n;a+) /输出已填入数据的二维数组 arr for(b=0;b<n;b+)printf("%-5d",arrab);printf("n");8. 程序设计(满分 9 分) 从键盘输入一个日期,格式为 yyyy-M-d 要求计算该日期与 1949 年 10 月 1 日距离多少天 例

16、如: 用户输入了: 1949-10-2 程序输出: 1 用户输入了: 1949-11-1 程序输出: 31 程序源代码: #include<stdio.h> void main() int year,month,day,y,total=0,flag=0;int yue212=0,31,28,31,30,31,30,31,31,30,31,30,0,31,29,31,30,31,30,31,31, 30,31,30;/ 将非闰年和闰年各月的天数存放在数组中printf("Input yyyy-m-d:"); scanf("%d-%d-%d",&

17、amp;year,&month,&day);Error!n"); return;if (year<1949 | year=1949 && month<10) printf("Date / 如果输入的日期在 1949-10-1 之前 , 则提示日期错误if(year=1949) for(y=10;y<month;y+)total=total+yue0y; / 统计 1949 年内距离 10 月份的整月天数 total+=day-1; / 统计当月日的天数 , 再减去 1949 年 10 月 1 日当天else / 以下是年份大

18、于 1949 的情况 for(y=1949;y<year-1;y+) / 计算间隔整年份的天数 if(y%4=0 && y%100!=0)|(y%400=0) / 判断间隔年是否为闰年 total=total+366;else total=total+365;total+=91; /加上 1949 年 10 月 1 日到 1949 年底所经过的天数if(year%4=0 && year%100!=0)|(year%400=0) /判断当年是否为闰年flag=1;for(y=0;y<month;y+) / 累加当年中前面各月份的天数 total=tot

19、al+yueflagy;total=total+day; / 累加当月中日的天数 printf("total=%dn",total);9. 程序设计(满分 12 分) 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担 心,因为并不是一个随便的信用卡号码都是合法的,它必须通过 Luhn 算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆向将奇数位(1、3、5 等等)相加。2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 9),再求和。3、将奇数位总和加上偶数位总和,结果应该可以被10 整除。例如,卡号是

20、: 5432123456788881 则奇数、偶数位(用红色标出)分布: 5432123456788881 奇数位和 =35偶数位乘以 2(有些要减去 9)的结果: 1 6 2 6 1 5 7 7,求和 =35。最后 35+35=70 可以被 10 整除,认定校验通过。 请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示: “成功”,否则 显示“失败” 。比如,用户输入: 356827027232780 程序输出:成功程序源代码:#include<stdio.h>#include<string.h>void main() int len,i,num,coun

21、t=1,total=0;char id30;printf("Input card ID:"); scanf("%s",id);len=strlen(id); / for(i=len-1;i>=0;i-,count+) num=idi-'0' / if(count%2=1) / total+=num;else求串长将数字字符转换成数值 从最后一位数字数起的奇数位total+=num*2>=10 ? num*2-9 : num*2; /从最后一位数字数起的偶数位printf("total=%dn",total)

22、; / 显示所求之和 if(total%10=0)printf(" 成功 n");elseprintf(" 失败 n");10. 程序设计(满分 20 分)任意一个 5 位数,比如: 34256,把它的各位数字打乱,重新排列,可以得到一个最大 的数: 65432 ,一个最小的数 23456。求这两个数字的差,得: 41976,把这个数字再次重复 上述过程(如果不足 5 位,则前边补 0)。如此往复,数字会落入某个循环圈(称为数字黑 洞)。比如,刚才的数字会落入: 82962, 75933, 63954, 61974 这个循环圈。 请编写程序,找到 5 位

23、数所有可能的循环圈, 并输出,每个循环圈占 1 行。其中 5 位数 全都相同则循环圈为 0 ,这个可以不考虑。循环圈的输出格式仿照:82962, 75933, 63954, 61974 其中数字的先后顺序可以不考虑。程序源代码: ( 数据输出在 data.txt 文件中 )#include<stdio.h>#include<stdlib.h>long x,heidong220=0; / 行用来记录循环的次数 , 列用来记录循环的差值int count;FILE *fp;void topart(long number,int part5) /将 number 的每个数字分

24、离到 5 个元素的整型数组中 int i;for(i=4;i>=0;i-) parti=number%10; number/=10; long difference(int val5) / 求最大值减去最小值后的差值 int i,j,t;将数组从小到大排序long max=0,min=0;for(i=0;i<4;i+) /for(j=i+1;j<5;j+)if(vali>valj) t=vali; vali=valj; valj=t; for(i=4;i>=0;i-) max=max*10+vali; /求最大值for(i=0;i<=4;i+) min=min*10+vali; /求最小值r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论