整理模拟c语言高职附答案.docx
《整理模拟c语言高职附答案.docx》由会员分享,可在线阅读,更多相关《整理模拟c语言高职附答案.docx(16页珍藏版)》请在冰点文库上搜索。
整理模拟c语言高职附答案
2011模拟c语言高职(附答案)
注意:
本套模拟题主要模拟命题形式与考核范围。
真实竞赛题的数量、难度可能与此套模拟题有差异。
说明:
本试卷包含两种题型:
“代码填空”与“程序设计”。
填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。
所填写的代码不多于一条语句(即不能出现分号)。
编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。
注意:
在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。
选手的程序必须是通用的,不能只对试卷中给定的数据有效。
1.代码填空(满2分)
形如:
“abccba”,“abcba”的串称为回文串,下列代码判断一个串是否为回文串。
请补充空白的部分。
charbuf[]="abcde11edcba";
intx=1;
for(inti=0;iif(___________________)
{
x=0;
break;
}
printf("%s\n",x?
"是":
"否");
答案:
buf[i]!
=buf[strlen(buf)-1-i]
附测试程序:
#include
#include
main()
{inti;
charbuf[]="abc2de11edcba";
intx=1;
for(i=0;iif(buf[i]!
=buf[strlen(buf)-1-i])
{
x=0;
break;
}
printf("%s\n",x?
"是":
"否");
}
2.代码填空(满分3分)
下列代码把一个二进制的串转换为整数。
请填写缺少的语句;
char*p="1010110001100";
intn=0;
for(inti=0;i{
n=__________________;
}
printf("%d\n",n);
答案:
n*2+(*(p+i)-'0')
附测试程序:
#include
main()
{inti;
char*p="1001";
intn=0;
for(i=0;i{
n=n*2+(*(p+i)-'0');
}
printf("%d\n",n);
}
3.代码填空(满分3分)
假设a,b,c是3个互不相等的整数。
下列代码取出它们中居中的数值,记录在m中。
其中的swap()函数可以交换两个变量的值。
请完善代码。
if(a>b)swap(&a,&b);//将较大数推向b
if(b>c)swap(&b,&c);//将较大数推向c,c即为三个数中的最大值
______________________;//再将a、b中的较大数推向b,b即为中间数
intm=b;
答案:
if(a>b)swap(&a,&b);
附测试程序:
#include
#include
voidswap(int*p,int*q)
{intt;
t=*p;
*p=*q;
*q=t;
}
main()
{inta,b,c,m;
printf("Inputa,b,c:
");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)swap(&a,&b);//将较大数推向b
if(b>c)swap(&b,&c);//将较大数推向c,c即为三个数中的最大值
if(a>b)swap(&a,&b);;//再将a、b中的较大数推向b,b即为中间数
m=b;
printf("min=%d,m=%d,max=%d\n",a,m,c);
}
4.代码填空(满分6分)
下面函数的目的是求出某个日期是该年度的第几天。
试完善之。
如果传入:
year=1980,month=1,day=1
则返回1
如果传入:
year=1980,month=2,day=1
则返回32
intgetDayOfYear(intyear,intmonth,intday)
{
intdays_____________________;
intflag=(year%4==0&&year%100!
=0)||year%400==0?
1:
0;
intsum=day;
for(inti=0;isum+=days[flag][i];
}
returnsum;
}
答案:
[2][12]={{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
intgetDayOfYear(intyear,intmonth,intday)
{
inti,days[2][12]={{0,31,28,31,30,31,30,31,31,30,31,30},{0,31,29,31,30,31,30,31,31,30,31,30}};
intflag=(year%4==0&&year%100!
=0)||year%400==0?
1:
0;
intsum=day;
for(i=0;isum+=days[flag][i];
}
returnsum;
}
main()
{
intyear,month,day;
printf("Ipnutyear,month,day:
");
scanf("%d,%d,%d",&year,&month,&day);
printf("%d\n",getDayOfYear(year,month,day));
}
5.代码填空(满分7分)
计算3个A,2个B可以组成多少种排列的问题(如:
AAABB,AABBA)是《组合数学》的研究领域。
但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。
下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。
请完善它。
intf(intm,intn)
{
if(m==0||n==0)return1;
return_______________________;
}
答案:
f(m-1,n)+f(m,n-1)
附测试程序:
#include
#include
intf(intm,intn)
{
if(m==0||n==0)return1;
returnf(m-1,n)+f(m,n-1);
}
main()
{
inti,j;
printf("Inputm,n:
");
scanf("%d,%d",&i,&j);
printf("kinds=%d\n",f(i,j));
}
6.代码填空(满分10分)
(a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:
121,1331,14641。
这些系数构成了著名的杨辉三角形:
1
11
121
1331
14641
15101051
下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(m,n都从0算起)。
intf(intm,intn)
{
if(m==0)return1;
if(n==0||n==m)return1;
return__________________________;
}
答案:
f(m-1,n-1)+f(m-1,n)
附测试程序:
#include
intf(intm,intn)
{if(m==0)return1;
if(n==0||n==m)return1;
returnf(m-1,n-1)+f(m-1,n);
}
main()
{inti,j;
for(i=0;i<10;i++)
{for(j=0;j<=i;j++)
printf("%4d",f(i,j));
printf("\n");
}
}
7.程序设计(满分15分)
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n的数字按照顺时针螺旋的形式填入其中。
例如:
输入数字2,则程序输出:
12
43
输入数字3,则程序输出:
123
894
765
输入数字4,则程序输出:
1234
1213145
1116156
10987
程序源代码:
#include
intval=0;//设置全局变量val,以使每次调用f()时,所填写的值是接着上次的顺序
voidf(inti,intk,int(*farr)[20])//每调用一次函数将打印以(i,i)为正方形的左上角,k为边长的正方形框
{intc;
for(c=0;cfarr[i][i+c]=++val;
for(c=1;cfarr[i+c][i+k-1]=++val;
for(c=k-2;c>=0;c--)//写入正方形下边沿的值
farr[i+k-1][i+c]=++val;
for(c=k-2;c>=1;c--)//写入正方形左边沿的值
farr[i+c][i]=++val;
}
main()
{
intn,count,arr[20][20],a,b;
printf("Inputn:
");
scanf("%d",&n);
for(count=0;countf(count,n-count*2,arr);//(count,count)为每个正方形的左上角的坐标,正方形的边长为(n-count*2)
for(a=0;a{for(b=0;bprintf("%-5d",arr[a][b]);
printf("\n");
}
}
8.程序设计(满分9分)
从键盘输入一个日期,格式为yyyy-M-d
要求计算该日期与1949年10月1日距离多少天
例如:
用户输入了:
1949-10-2
程序输出:
1
用户输入了:
1949-11-1
程序输出:
31
程序源代码:
#include
voidmain()
{
intyear,month,day,y,total=0,flag=0;
intyue[2][12]={{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("Inputyyyy-m-d:
");
scanf("%d-%d-%d",&year,&month,&day);
if(year<1949||year==1949&&month<10){printf("DateError!
\n");return;}//如果输入的日期在1949-10-1之前,则提示日期错误
if(year==1949)
{for(y=10;ytotal=total+yue[0][y];//统计1949年内距离10月份的整月天数
total+=day-1;//统计当月日的天数,再减去1949年10月1日当天
}
else//以下是年份大于1949的情况
{for(y=1949;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;ytotal=total+yue[flag][y];
total=total+day;//累加当月中日的天数
}
printf("total=%d\n",total);
}
9.程序设计(满分12分)
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?
其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:
5432123456788881
则奇数、偶数位(用红色标出)分布:
5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:
16261577,求和=35。
最后35+35=70可以被10整除,认定校验通过。
请编写一个程序,从键盘输入卡号,然后判断是否校验通过。
通过显示:
“成功”,否则显示“失败”。
比如,用户输入:
356827027232780
程序输出:
成功
程序源代码:
#include
#include
voidmain()
{intlen,i,num,count=1,total=0;
charid[30];
printf("InputcardID:
");
scanf("%s",id);
len=strlen(id);//求串长
for(i=len-1;i>=0;i--,count++)
{num=id[i]-'0';//将数字字符转换成数值
if(count%2==1)//从最后一位数字数起的奇数位
total+=num;
else
total+=num*2>=10?
num*2-9:
num*2;//从最后一位数字数起的偶数位
}
printf("total=%d\n",total);//显示所求之和
if(total%10==0)
printf("成功\n");
else
printf("失败\n");
}
10.程序设计(满分20分)
任意一个5位数,比如:
34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
65432,一个最小的数23456。
求这两个数字的差,得:
41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。
如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:
[82962,75933,63954,61974]这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为[0],这个可以不考虑。
循环圈的输出格式仿照:
[82962,75933,63954,61974]
其中数字的先后顺序可以不考虑。
程序源代码:
(数据输出在data.txt文件中)
#include
#include
longx,heidong[2][20]={0};//行用来记录循环的次数,列用来记录循环的差值
intcount;
FILE*fp;
voidtopart(longnumber,intpart[5])//将number的每个数字分离到5个元素的整型数组中
{inti;
for(i=4;i>=0;i--)
{part[i]=number%10;number/=10;}
}
longdifference(intval[5])//求最大值减去最小值后的差值
{inti,j,t;
longmax=0,min=0;
for(i=0;i<4;i++)//将数组从小到大排序
for(j=i+1;j<5;j++)
if(val[i]>val[j])
{t=val[i];val[i]=val[j];val[j]=t;}
for(i=4;i>=0;i--)max=max*10+val[i];//求最大值
for(i=0;i<=4;i++)min=min*10+val[i];//求最小值
returnmax-min;
}
voidhei(longfnum)//寻找黑洞
{longdiff;
inti,num[5];
if(count>10)
{fprintf(fp,"%ld:
[",x);
for(i=0;i<20&&heidong[0][i]!
=0;i++)
(4)预防或者减轻不良环境影响的对策和措施的合理性和有效性;if(heidong[1][i]>1)fprintf(fp,"%7ld",heidong[0][i]);
fprintf(fp,"]\n");
return;
}
topart(fnum,num);//调用topart()将x的每个数字分离到数组num[]中
《中华人民共和国环境保护法》和其他相关法律还规定:
“建设项目防治污染的设施,必须与主体工程同时设计,同时施工,同时投产使用(简称“三同时”)。
防治污染的设施必须经原审批环境影响报告书的环境保护行政部门验收合格后,该建设项目方可投入生产或者使用。
”“三同时”制度和建设项目竣工环境保护验收是对环境影响评价的延续,从广义上讲,也属于环境影响评价范畴。
diff=difference(num);//得到差值
for(i=0;i<20&&heidong[0][i]!
=0;i++)
填报内容包括四个表:
if(heidong[0][i]==diff){heidong[1][i]++;count++;break;}//找到已存在数组中的值则计数
环境,是指影响人类生存和发展的各种天然的和经过人工改造的自然因素的总体。
if(heidong[0][i]==0)heidong[0][i]=diff;
hei(diff);
D.可能造成轻度环境影响、不需要进行环境影响评价的建设项目,应当填报环境影响登记表}
voidmain()
{inti;
if((fp=fopen("data.txt","w"))==NULL)//以可写方式打开文件
4.环境影响评价工作等级的调整{printf("不能打开文件!
");exit(0);}
2.辨识与分析危险、有害因素for(x=10000;x<99999;x++)
1.依法评价原则;{if(x==11111||x==22222||x==33333||x==44444||x==55555||x==66666||x==77777||x==88888)continue;
(1)结合评价对象的特点,阐述编制安全预评价报告的目的。
for(i=0;i<20;i++)
{heidong[0][i]=0;heidong[1][i]=0;}//将数组置全0
count=0;
hei(x);
}
规划编制单位对规划环境影响进行跟踪评价,应当采取调查问卷、现场走访、座谈会等形式征求有关单位、专家和公众的意见。
fclose(fp);
}