2009C机考模拟题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改错题:
1、计算大于200的前10个素数之和
#include <stdio.h>
void main()
{ int i,j,flag,n=0,s=0;
for(i=201;;i+=2)
{flag=1;
for(j=2;j<=i/2;j++)
if(i%j!=0) /*$ERROR1$*/ ==
{ flag=1; /*$ERROR2$*/ =0
break; }
if(flag==1)
{ s+=i; n++;
f(n!=10) /*$ERROR3$*/ ==10
break;
} }
printf("s=%d\n",s);}
2、输入一个百分制成绩,转换成相应的等级(A~E)
#include <stdio.h>
void main()
{ int a;
scanf("%d",a); /*$ERROR1$*/ &a
if(a<0||a>100)
printf("data error\n");
else
{ else if(a>=90) printf("A\n"); /*$ERROR2$*/ 去掉else else if(a>=80) printf("B\n");
else if(a>=70) printf("C\n");
else if(a>=60) printf("D\n");
printf("E\n"); /*$ERROR3$*/ 加else } }
3、在屏幕上输出以下图形(*字符之前没有空格)
*
**
***
****
*****
****
***
**
*
#include <stdio.h>
void main()
{ int i,j;
i=1; /*$ERROR1$*/ i=0;
while(i<5)
{ j=0;
while(j<i) /*$ERROR2$*/ while(j<=i)
{printf("*");j++;}
printf("\n");
i++; }
i=4;
while(i>0)
{ j=1;
while(j<=i)
{printf("*");j++;}
printf("\n");
i++; /*$ERROR3$*/ i--;
} }
4、统计所有的三位正整数中各个数位上数字之和是11的数的个数。
#include <stdio.h>
void main()
{ int i,j,k,l,s,count;
count=1; /*$ERROR1$*/ count=0;
for(i=100;i<=999;i++)
{ s=0;j=i;
while(j>1) /*$ERROR2$*/ while(j>0)
{ s=s+j/10; /*$ERROR3$*/ s=s+j%10;
j=j/10; }
if(s==11) count=count+1; }
printf("%d\n",count); }
5、输出数组中的最小元素及其下标值(数组中元素各不相同)
#include<stdio.h>
void main()
{ int a[10]={-3,2,-5,4,9,0,8,7,-6,1};
int t,min,i;
min= 0; /*$ERROR1$*/ min=a[0]
t=1; /*$ERROR2$*/ t=0
i=1;
while(i<10)
{ if (min>a[i])
{ min=a[i];
i=t; /*$ERROR3$*/ t=i
}
i++; }
printf("min=%d,address=%d\n",min,t);}
6、将数组中的数按从小到大排序后输出,说明:所有数据输出在一行,且每个数据占5列。
#include<stdio.h>
void main()
{ int a[11]={3,9,-5,20,80,42,28,-19,0,90,22};
int i,j,k;
for (j=0;j<=9;j++)
for(i=0;i<10-j;i++)
{ if (a[i]<a[i+1]) /*$ERROR1$*/ if (a[i]>a[i+1])
{ k=a[i+1]; /*$ERROR2$*/ k=a[i];
a[i]=a[i+1];
a[i+1]=k; }
}
for(i=0;i<11;i++)
printf("%5d",a+i); /*$ERROR3$*/ printf("%5d",a[i]);
printf("\n"); }
7、对学生的记录数据统计不及格的人数并输出不及格学生的信息(说明:num域代表学生学号,name域代表姓名,score代表成绩)。
#include <stdio.h>
struct student
{ int num;
char name[12];
int score;};
void main( )
{ struct stud[5]={ {101,"Liping",45}, /*$ERROR1$*/ struct student
{102,"Huhua",62},
{103,"Hefang",92},
{104,"Chengli",87},
{105,"Liuzhi",58} };
int i,n=0;
printf("num\tname\tscore\n");
i=0;
while(i<5)
{ if(score<60) /*$ERROR2$*/ if(stud[i].score<60)
{printf("%d\t%s\t%d\n",stud[i].num,stud[i].name,stud[i].score);
n--; /*$ERROR3$*/ n++
}
i++; }
printf("n=%d\n",n); }
8、在屏幕上输出以下图形(字符之间没有空格)
1
222
33333
4444444
#include <stdio.h>
void main()
{ char a[7]=" ";
int i,j,k;
for(i=0;i<4;i++)
{ for(j=0;j<i*2+1;j++)
{ k=3-i+j;
a[k]=1+i; /*$ERROR1$*/ a[k]='1'+i;
}
for(j=0;j<7;j++)
printf("%c",a+j); /*$ERROR2$*/ printf("%c",a[j]);
printf("/n"); /*$ERROR3$*/ printf("\n");
} }
9、将字符串str1和字符串str2合并成一个新字符串str,然后输入str。
#include<stdio.h>
#include<string.h>
void main()
{ char str1[30],str2[20],str[60];
int i=0,j=0;
printf("Input the first string:");
gets(str1);
printf("Input the second string:");
gets(str2);
while(str1[i])
{ str[i]=str1[i];
i++; }
while(str2[j])
{ str[i++]=str2[j];
i++; /*$ERROR1$*/ j++;
}
str[i]="\0"; /*$ERROR2$*/ str[i]='\0';
printf("str:%c\n", str); /*$ERROR3$*/ printf("str:%s\n", str);
}
10、下面程序通过指针操作,从键盘输入10个整数存入数组中,将数组元素的值按存储的逆序输出(说明:所有数据输出在一行,且每个数据占5列)
#include <stdio.h>
void main()
{ int a[10],*p;
for(p=a;p<a+10;p++)
scanf("%d",*p);/*$ERROR1$*/ p
p=a+10; /*$ERROR2$*/ a+9
while(p>=a)
{ printf("%5d",p); /*$ERROR3$*/ *p
p--; }
printf("\n"); }
11、下面程序的功能是:第一个数是1,从第二个数起每个数都是它前一项加5,求第n个
数是多少。
(n从键盘输入,用递归实现)
#include <stdio.h>
long function(int n)
{ long m;
if(n==1)
m=0; /*$ERROR1$*/ m=1
else
m=m+5; /*$ERROR2$*/ m=function(n-1)+5
return(m); }
void main()
{ long m;
int n;
scanf("%d",&n);
m= function( ); /*$ERROR3$*/ m= function(n);
printf("%ld\n",m); }
12、下面程序将输出以下图形,请改错
12345
23451
34512
45123
51234
#include <stdio.h>
#include <string.h>
void main()
{ char a[6]="12345",temp;
int i,k;
for(i=1;i<=5;i++)
{ printf("%c\n",a); /*$ERROR1$*/ %s
temp=a[0];
for(k=0;k<4;k++)
a[k+1]=a[k]; /*$ERROR2$*/ a[k]=a[k+1]
a[4]=a[0]; /*$ERROR3$*/ a[4]=temp
} }
填空题:
1、输入一个大于1的正整数,将其分解成质因数的乘积(质因数即素因子),并按下列格式输出,例如:Input:90
Output:90=2*3*3*5
#include <stdio.h>
void main()
{ int n,i;
printf("Input n:");
scanf("%d",____); /*$BLANK1$*/ &n
printf("Output :%d=", n);
i=2;
while(i<n)
{if(n%i==0)
{ printf("%d*",i);
n=_____; /*$BLANK2$*/ n/i
}
else
i++; }
printf("%d\n",___); /*$BLANK3$*/ i
}
2、将自然数1~100以及它们的平方根以只写方式写入到新建的文件文件Dara.txt中。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{ int i;
FILE ___; /*$BLANK1$*/ *fp
if((fp=fopen("data.txt","____"))==NULL) /*$BLANK2$*/ r
{printf("Can not create the file!");exit(0);}
for(i=1;i<=100;i++)
{ fprintf(fp,"%d,%f\n",i,sqrt(i));
printf("%d,%f\n",i,sqrt(i)); }
fclose(___); /*$BLANK3$*/ fp
}
3、从键盘输入一个十进制整数,统计数码为2的个数,如输入32202,则2的个数为3,输入-6242,则2的个数为2。
#include <stdio.h>
void main()
{ long count,n,t;
count=___; /*$BLANK1$*/ count=0;
printf("Input n:");
scanf("%ld",&n);
n=(n>=0?n:-n);
do
{ t=n___10; /*$BLANK2$*/ t=n%10;
if(t==2) count++;
n=n/10; }
while(___); /*$BLANK3$*/ while(n>0);
printf("count=%ld\n",count); }
4、求100~400之间不能被5整除且个位是3的安息之和。
#include <stdio.h>
void main()
{ int i,s;
s=____; /*$BLANK1$*/ s=0;
for(i=100;i<=400;i++)
if(i%5!=0)
if(i%10==____) /*$BLANK2$*/ if(i%10==3)
{
printf("%d\n",i);
s=____; /*$BLANK3$*/ s=s+i;
}
printf("s=%d\n",s);}
5、从键盘输入10个整数并存入一维数组中,查找其中第一个负数,如果能找到则输出这个负数及其下标,否则输出”Not Found!”。
#include <stdio.h>
void main( )
{ int i,a[10];
printf("Input array:\n");
for(i=0;i<10;i++)
scanf("%d",___); /*$BLANK1$*/ scanf("%d",&a[i]);
for(i=0;i<10;i++)
{ if(a[i]<0)
{printf("%d,%d\n",a[i],i);
___; /*$BLANK2$*/ break;
}
}
if(i___ ) /*$BLANK3$*/ if( i>=10)
printf("Not Found!\n");}
6、将3*3的矩阵值(从键盘输入)存入数组a中,计算并输出该矩阵两条对角线元素的总和s
#include <stdio.h>
void main( )
{ int a[3][3], i,j,s=0;
printf("Input array:\n");
for (i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",___); /*$BLANK1$*/ scanf("%d",&a[i][j]);
for (i=0;i<3;i++)
for(j=0;j<3;j++)
{ if((i==j)___ (i+j==2)) /*$BLANK2$*/ if((i==j)||(i+j==2))
s+=___;/*$BLANK3$*/ s+=a[i][j];
}
printf("s=%d\n",s); }
7、9个评委给某个参赛选手打分(存入数组a中),去掉一个最高分和一个最低分,求该参赛选手的平均分。
#include <stdio.h>
void main()
{ int i;
float a[9],max,min,ave;
printf("Input array:\n");
for(i=0;i<9;i++)
scanf("%f",___); /*$BLANK1$*/ scanf("%f",&a[i]);
max=min=ave=___; /*$BLANK2$*/ max=min=ave=a[0];
for(i=1;i<9;i++)
{ ave+=a[i];
if(max<a[i])
max=a[i];
else if(min>a[i])
___; /*$BLANK3$*/ min=a[i];
}
ave=(ave-max-min)/7;
printf("Mark=%.3f\n",ave); }
8、从键盘输入一个整数,输出一个对应的英文星期单词,若输入的整数在1~7之外,则输出”Error!”
#include <stdio.h>
void main()
{int a;
printf("Input a:");
scanf("%d",___); /*$BLANK1$*/ scanf("%d",&a);
switch(a)
{case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 7:printf("Sunday\n");___ /*$BLANK2$*/ break;
___:printf("Error!\n");/*$BLANK3$* default:
} }
9、从键盘输入10个整数存入数组a中,调用fsum函数对数组中的所有数值求和并输出。
#include <stdio.h>
int fsum(int b[],int n)
{ int i,sum;
sum=____ ; /*$BLANK1$*/ sum=0;
for(i=0;i<n;i++)
sum+=____ ; /*$BLANK2$*/ sum+=b[i];
return sum; }
void main()
{ int a[10],i,sum;
printf("Input array:\n");
for(i=0;i<10;++i)
scanf("%d",&a[i]);
sum=fsum( ____,10); /*$BLANK3$*/ sum=fsum(a ,10);
printf("sum=%d\n",sum); }
10、从键盘输入一个字符串(以回车结束),统计字符串中每种数字字符的个数。
将字符0到9的个数分别存放到一维数组a的a[0]至a[9]中,并输出a中不为0的元素值。
#include <stdio.h>
#include <string.h>
void main( )
{ char ch,str[81];
int i, a[10]={0};
printf("Input string:\n");
gets(str);
i=0;
ch=str[0];
while(ch!=______) /*$BLANK1$*/ ‘\0’
{
if(ch>='0' ______ ch<='9') /*$BLANK2$*/ &&
a[ch-'0']++;
ch=str[++i];
}
for(i=0; i<=9;i++)
if(______!=0) /*$BLANK3$*/ a[i]
printf("a[%d]=%d\n", i, a[i]); }
11、通过指针操作,输入字符串,并输出该字符串中ASCII码值最小的字符。
#include <stdio.h>
void main( )
{char str[80],minc,*p;
p=______;/*$BLANK1$*/ p=str;
printf("Input String:\n");
scanf("%s",str);
minc=______; /*$BLANK2$*/ minc=*p;
while(*p!='\0')
{if(*p<minc) minc=*p;
_____; /*$BLANK3$*/ p++;
}
printf("%s\n",str);
printf("Minc = \'%c\'\n",minc); }
12、下列程序中min2函数的功能是求两个整数的较小数,在主函数中输入3个整数,调用min函数求这三个整数的最小数。
#include <stdio.h>
int min2(int x,int y)
{ int min;
if(x___y) /*$BLANK1$*/ <
min=x;
else min=y;
return(___); /*$BLANK2$*/ min
}
void main()
{ int a,b,c,min;
printf("Input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
min=min2(a,b);
min=min2(___); /*$BLANK3$*/ min,c
printf("min=%d\n",min); }
编程题:
1、求所有的水仙花数之和,所谓水仙花数是指一个三数数,其各位数字的立方和等于该数本身。
例如153是一个水仙花数,因为153=1*1*1+5*5*5+3*3*3
#include <stdio.h>
void PRINT(int s)
{ FILE *out;
printf("s=%d\n",s);
if((out=fopen("C:\\24000101\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"s=%d",s);
fclose(out);}
void main()
{int a,b,c,i,s=0;
for (i=100;i<=999;i++)
{a=i%10; c=i/100; b=i/10%10;
if (a*a*a+b*b*b+c*c*c==i) s=s+i; }
PRINT(s); }
2、计算10000以内的9的偶数倍数之和,即:sum=18+36+54+……+9990,其中18、36、54……、9990分别是9的2、4、6、……1110倍。
#include <stdio.h>
void PRINT(long sum)
{ FILE *out;
printf("sum=%ld\n",sum);
if((out=fopen("C:\\24000103\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"sum=%ld",sum);
fclose(out);}
void main()
{ long sum=0;
int i;
for(i=18;i<=10000;i=i+18)
sum=sum+i;
PRINT(sum); }
3、百马百担问题:有100匹马驮100担货,大马驮4担,中马驮3担,5匹小马驮1担,问三种马各有几匹?注意:大中小邓、马必须有,解只有一个;
输出格式:big=10,mid=15,small=75
#include <stdio.h>
void PRINT(int a,int b,int c)
{ FILE *out;
printf("big=%d,mid=%d,small=%d\n",a,b,c);
if((out=fopen("C:\\24000102\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"big=%d,mid=%d,small=%d",a,b,c);
fclose(out); }
void main()
{int a,b,c;
for (a=1;a<25;a++)
for(b=1;b<34;b++)
{c=100-a-b;
if (4*a+3*b+c/5==100 && c%5==0)
PRINT(a,b,c);} }
4、根据下列式子,计算F10的值,要求用循环实现,F1=1,F2=1,F3=3*F2-F1,F4=3*F3-F2,……,F10=3*F9-F8
参考程序一:
#include <stdio.h>
void PRINT(long f)
{ FILE *out;
printf("F10=%ld\n",f);
if((out=fopen("C:\\24000104\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"F10=%ld",f);
fclose(out);}
void main()
{ long f,f1,f2;
int i;
f1=f2=1;
for (i=3;i<=10;i++)
{ f=3*f2-f1; f1=f2; f2=f; }
PRINT(f);}
参考程序二:
void main()
{ long f,g[10];
int i=2;
g[0]=g[1]=1;
while(i<10) g[i++]=3*g[i-1]-g[i-2];
f=g[9];
PRINT(f);}
5、计算1+2+3+4+……+n<2000的最大的n的值,要求使用循环实现。
#include <stdio.h>
void PRINT(int n)
{ FILE *out;
printf("n=%d\n",n);
if((out=fopen("C:\\24000105\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"n=%d",n);
fclose(out); }
void main()
{ int n=0,s=0;
while(s<2000)
s = s + (++n);
n--;
PRINT(n);}
6、根据下式求s的值,要求用循环。
S=1/2-2/3+3/4-4/5+5/6-6/7+……+99/100
#include <stdio.h>
void PRINT(float s)
{ FILE *out;
printf("s=%.4f\n",s);
if((out=fopen("C:\\24000106\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"s=%.4f",s);
fclose(out); }
void main()
{ float s;
int i,flag=1;
s=0;
for (i=1;i<=99;i++)
{ s=s+1.0*i/(i+1)*flag;
flag=-flag; }
PRINT(s); }
7、根据下式求s的值(要求用循环实现)s=1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……+n)
#include <stdio.h>
void PRINT(long s)
{ FILE *out;
printf("s=%ld\n",s);
if((out=fopen("C:\\24000107\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"s=%ld",s);
fclose(out); }
void main()
{ int n=30;
long s=0;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
s=s+j;
PRINT(s); }
8、某人摘下一些桃子,卖掉三分之二,并吃了两个;第二于卖掉剩下的三分之二,又吃了两个;第三天、第四天、第五天、第六天、第七天都如此办理,第八天一看,发现只乘下5个桃子。
求此人一共摘了多少个桃子,要求用循环实现。
#include <stdio.h>
void PRINT(int s)
{ FILE *out;
printf("s=%d\n",s);
if((out=fopen("C:\\24000108\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"s=%d",s);
fclose(out);}
void main()
{int i,s;
s=5;
for(i=7;i>=1;i--) s=(s+2)*3;
PRINT(s); }
9、一个大于200的正整数,若加上1是5的倍数,若加上2是6的倍数,若加上3是7的倍数,求满足条件的最小正整数。
#include <stdio.h>
void PRINT(int n)
{ FILE *out;
printf("n=%d\n",n);
if((out=fopen("C:\\24000109\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"n=%d",s);
fclose(out);}
void main()
{ int n;
n=200;
while(1)
{ if(n+1%5==0 && n+2 %6==0 && n+3 %7 ==0) break;
else n++; }
PRINT(n); }
10、设有正整数a和b,其中:(1)a<b,a<50,b<50 (2)2*a*b=1960 (3)a*a+b*b=2009,求满足条件的a和b的值。
(a=28,b=35)
#include <stdio.h>
void PRINT(int a,int b)
{ FILE *out;
printf("a=%d,b=%d\n",a,b);
if((out=fopen("C:\\24000110\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"a=%d,b=%d",a,b);
fclose(out);}
void main()
{int a,b;
for(a=1;a<50;a++)
for(b=a+1;b<50;b++)
if(2*a*b==1960 && a*a+b*b==2009)
PRINT(a,b); }
11、计算100以内的全部同构数之和。
所谓同构数是指该数出现在它的平方数的右端,例如6的平方是36,因为6出现在36的右端,所以6是同构数。
#include <stdio.h>
void PRINT(int s)
{ FILE *out;
printf("s=%d\n",s);
if((out=fopen("C:\\24000111\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"s=%d",s);
fclose(out); }
void main()
{ int i;
int s=0;
for(i=1;i<100;i++)
if( i*i % (i<10?10:100)==i) s=s+i;
PRINT(s); }
12、编写程序,计算11到1111之间所有能被11整除的奇数之和。
(包含11和1111)
#include <stdio.h>
void PRINT(int s)
{ FILE *out;
printf("s=%d\n",s);
if((out=fopen("C:\\24000112\\RESULT.DA T","w+"))!=NULL)
fprintf(out,"s=%d",s);
fclose(out); }
void main()
{int s,i;
for (i=11,s=0;i<=1111;i=i+2)
if (i%11==0) s+=i;
PRINT(s); }。