C语言上机考试题.docx
《C语言上机考试题.docx》由会员分享,可在线阅读,更多相关《C语言上机考试题.docx(21页珍藏版)》请在冰豆网上搜索。
C语言上机考试题
1、从键盘输入10个整数,用冒泡法对这10个数排序(由小到大)后输出.p172
2、从键盘输入10个整数,用选择法对这10个数排序(由大到小)后输出.p155
3、对于一个自然数,如果该数的所有因子之和正好等于该数,则该数称为完数。
统计1000以内的完数个数。
#include
{intm,s,i;
for(m=2;m<1000;m++)
{s=0;
for(i=1;iif((m%i)==0)s=s+i;/*计算所有因子之和*/
if(s==m)/*所有因子之和正好等于该数,则为完数*/
{printf("%d,factorsare",m);
for(i=1;iif(m%i==0)printf("%d",i);
printf("\n");
}
}
}
4、编写主函数和一个函数intdiff(intyear,intm1,intd1,intm2,intd2)。
(1)函数diff计算year年的m1月d1日至m2月d2日之间相隔的天数(假设m1<=m2);
(2)主函数中输入某年的两个日期,调用diff函数计算它们之间相隔的天数,并输出。
#include
intdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
intdiff(intyear,intm1,intd1,intm2,intd2){
inti,d=0;
if(year%4==0&&year%100!
=0||year%400==0)days[2]=29;
elsedays[2]=28;
if(m1==m2)d=d2-d1;
else{
for(i=m1+1;id+=days[i]+days[m1]-d1+d2;
}
return(d);
}
voidmain(){
intyear,m1,d1,m2,d2,ds;
printf("pleaseinputtwodate:
\n");
scanf("%d%d%d%d%d",&year,&m1,&d1,&m2,&d2);
ds=diff(year,m1,d1,m2,d2);
printf("Thedaysoftheyearis%d!
\n",ds);
}
5、编写主函数和一个函数voidmerge(int*a,int*b,intc[])。
要求是:
(1)函数merge对两个已是升序的数组a、b进行归并,归并后的结果仍然是升序的,并通过形参c返回;
(2)主函数:
定义长度为5的数组a,并升序初始化;定义长度为8的数组b,并升序初始化;调用merge函数对数组a、b进行归并,输出归并结果。
#include
#defineM5
#defineN8
voidmergesort(intx[],int*y,int*z){
inti=0,j=0,k=0;
while(iif(x[i]elsez[k++]=y[j++];
}
while(iz[k++]=x[i++];
while(jz[k++]=y[j++];
}
voidmain(){
inta[M]={0,1,3,6,8},b[N]={2,9,7,12,15,21,22,25};
inti,c[M+N],*p=a;
printf("Theoriginalarraya:
\n\t");
for(i=0;iprintf("%d",a[i]);
printf("\n");
printf("Theoriginalarrayb:
\n\t");
for(i=0;iprintf("%d",b[i]);
printf("\n");
mergesort(p,&b[0],c);
printf("Thesortedarrayc:
\n\t");
for(i=0;iprintf("%d",c[i]);
printf("\n");
}
6、从键盘输入一个0~99999之间的整数。
①判断它是一个几位数;
②将该数的各位数字按逆序输出。
#include
voidmain(){
intcount=0;
longnum;
printf("pleaseinputaintegerbetween0and99999:
\n");
scanf("%ld",&num);
do{
printf("%d,",num%10);
num=num/10;
count++;
}while(num%10!
=0);
printf("\n%d\n",count);
}
7、输入一行字符,统计其中有多少个单词并输出,单词之间用空格符分隔开。
#include
voidmain(){
inti=0,count=0;
charstring[80];
printf("pleaseinputastring:
\n");
gets(string);
while(string[i++]!
='\0'){
if(string[i++]=='')
for(i++;string[i]='';i++);
else{
count++;
for(i++;string[i]!
='\0'&&string[i]!
='';i++);
}
}
printf("thereare%dwords!
\n",count);
}
8、输入10个整数,判断它们是否为素数。
要求:
编写一个函数intprime(intm)来判断形参变量m是否为素数,如果是素数则返回1,否则返回0。
#include
#include
intprime(intm){
inti,t,p;
t=sqrt(m);
for(i=2;i<=t;i++){
if(m%i==0){
p=0;
break;
}
}
if(i>t)p=1;
return(p);
}
voidmain(){
inta[10],i,p;
printf("pleaseinput10integers:
\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++){
p=prime(a[i]);
printf("%d",p);
}
}
9、输入10个学生的成绩,求平均成绩。
要求控制成绩输入的正确性,即控制输入的成绩必须为0~100分。
#include
voidmain(){
intscore,i,sum=0,loop;
for(i=1;i<=10;i++){
loop=1;
while(loop){
scanf("%d",&score);
if(score>=0&&score<=100)
loop=0;
else
printf("scoreerror,pleasereinput");
}
sum+=score;
}
printf("Theaveragescoreis%.2f.\n",(float)sum/10);
}
10、编写主函数和一个函数intmonthDay(intyear,intmonth)。
(1)函数monthDay计算year年month月的天数,并返回;
(2)在主函数中输入一个日期(年、月、日),计算该日是当年的第几天(说明:
需要调用monthDay函数)。
#include
intdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
intmonthDay(intyear,intmonth){
inti,d=0;
if(year%4==0&&year%100!
=0||year%400==0)days[2]=29;
elsedays[2]=28;
for(i=1;id+=days[i];
return(d);
}
voidmain(){
intyear,month,day,ds;
printf("pleaseinputadate:
\n");
scanf("%d%d%d",&year,&month,&day);
ds=monthDay(year,month);
ds+=day;
printf("Thedaysoftheyearis%d!
\n",ds);
}
11、写两个函数intgcd(intm,intn)和intlcm(intm,intn),分别求两个正整数m和n的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个正整数的值在主函数中从键盘输入。
#include
intmaxfun(intm,intn){//求m和n的最大公约数的函数
intt;
do{
t=m%n;
m=n;
n=t;
}while(t!
=0);
returnm;
}
intminfun(intm,intn){//求m和n的最小公倍数的函数
intt;
t=maxfun(m,n);
returnm*n/t;
}
voidmain(){
intm,n;
printf("pleaseinputtwopositiveintegerstomandn:
\n");
scanf("%d%d",&m,&n);
printf("%d和%d的最大公约数是%d,最小公倍数是%d\n",
m,n,maxfun(m,n),minfun(m,n));
}
12、有0、1、2、3、4五个数字,能组成多少个互不相同且无重复数字的三位数?
并计算这些三位数之和。
#include
voidmain(){
inti,j,k,count=0;
for(i=1;i<=4;i++){
for(j=0;j<5;j++){
for(k=0;k<5;k++){
if(i!
=j&&i!
=k&&j!
=k){
printf("%d\n",i*100+j*10+k);
count++;
if(count%5==0)printf("\n");
}
}
}
}
printf("\nCount=%d\n",count);
}
13、输出2至1000之间的所有同构数,所谓同构数是指它出现在它的平方数的右端。
例如,5、6、25的平方分别等于25、36、625,所以5、6和25都是同构数。
#include
voidmain(){
longi,j,k;
k=10;
for(i=2;i<=1000;i++){
if(i==k)k*=10;
j=i*i;
if(j%k==i)
printf("%ld\t%ld\n",i,j);
}
}
14、编写一个函数,将一个数插入到已是升序的数组中,且插入后该数组仍是升序数组。
已是升序数组的内容由主函数给出,待插入的数在主函数中输入。
#include
#defineN10
voidinsert(floata[],floatm)
{inti,j;
for(i=0;iif(m<=a[i])/*把比m大的数据都往后移动一位*/
{for(j=N-1;j>i;j--)a[j]=a[j-1];
a[i]=m;break;
}
if(m>a[i-1])a[i]=m;/*m比数组中所有数据都大的话,插入到数据尾部*/
for(i=0;iprintf("%f",a[i]);
}
voidmain()
{
floatk,a[N];inti;
printf("请输入9个升序排好的数据:
");
for(i=0;i<9;i++)
scanf("%f",&a[i]);
printf("请输入插入数据:
");
scanf("%f",&k);
insert(a,k);
}
15、编写一个程序,用折半法查找某数是否在给定的升序数组中,如果在则输出“Findsuccess!
”并输出它是第几个数,否则输出“Nofind!
”。
#include
#defineLEN15
intbinarysearch(floata[],floatnumber)
{
intmid,start=0,end=LEN-1;
while(start<=end){
mid=(start+end)/2;
if(a[mid]start=mid+1;
elseif(a[mid]>number)/*往左继续折半查找*/
end=mid-1;
else/*找到了要查找的数,则返回其位置*/
returnmid;
}
return-1;/*查找失败,返回-1*/
}
voidmain(void)
{inti;floatk;
floata[LEN];
printf("请输入15个以升序排好的数据:
");
for(i=0;i<15;i++)
scanf("%f",&a[i]);
printf("请输入要查找的数:
");
scanf("%f",&k);
if(binarysearch(a,k)>=0)
printf("Findsuccess!
位置为:
%d\n",binarysearch(a,k)+1);
else
printf("Nofind!
");
}
16、编写一函数intsubstr(char*str,intbegin,intlen,char*p),将字符串str的第begin个字符开始的len个字符复制到另一个字符串p中,并返回成功复制字符的个数。
要求在主函数中输入原始字符串及截取字符串的起始位置和长度,并输出被截取的字符串及其长度。
(这只是被调函数)
intfun3(charsubstr[],charstr[],intloc,intlen){
intk,n;
if(loc<1||loc>strlen(str)||len<=0){
substr[0]=\0;
return0;
}
for(k=0,n=loc-1;k=\0;)
substr[k++]=str[n++];
substr[k]=\0;
return1;
}
17、有4个学生,每个学生有5门课程的成绩,编写一个程序计算每一个学生5门课程的平均成绩。
#include
voidmain(){
inta[4][5],i,j;
floataver,sum=0;
printf("请输入四个学生五门课的成绩:
\n");
for(i=0;i<4;i++){
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<4;i++){
for(j=0;j<5;j++){
sum+=a[i][j];
aver=sum/5;
}
printf("\t%.2f\n",aver);
}
}
18、有4个学生,每个学生有5门课程的成绩,编写一个程序统计每一个学生有几门不及格的课程。
#include
voidmain(){
inta[4][5],i,j,count;
printf("请输入四个学生五门课的成绩:
\n");
for(i=0;i<4;i++){
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<4;i++){
count=0;
for(j=0;j<5;j++){
if(a[i][j]<60)count++;
}
printf("第%d个学生的不及格数是%d\n",i+1,count);
}
}
19、有4个学生,每个学生有5门课程的成绩,编写一个程序计算每一门课程4个学生的平均成绩。
#include
voidmain(){
inta[4][5],i,j;
floatsum,aver;
printf("请输入四个学生五门课的成绩:
\n");
for(i=0;i<4;i++){
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
}
for(j=0;j<5;j++){
aver=0;
sum=0;
for(i=0;i<4;i++){
sum+=a[i][j];
}
aver=sum/4;
printf("第%d门课的平均成绩是%.2f\n",j+1,aver);
}
}
20、有4个学生,每个学生有5门课程的成绩,编写一个程序统计每一门课程有几个不及格的学生。
#include
voidmain(){
inta[4][5],i,j;
intcount;
printf("请输入四个学生五门课的成绩:
\n");
for(i=0;i<4;i++){
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
}
for(j=0;j<5;j++){
count=0;
for(i=0;i<4;i++){
if(a[i][j]<60)count++;
}
printf("第%d门课的不及格人数是%d\n",j+1,count);
}
}
21、编写主函数和一个递归函数intsum(inta[],intn)。
要求是:
(1)函数sum求数组a中前n个元素之和,并返回该和值。
(2)主函数中输入10个正整数给数组,调用sum函数求数组中的10个元素之和,并输出该和值。
#include
intsum(inta[],intn){
ints;
if(n==0)s=a[0];
else
{
s=a[n]+sum(a,n-1);
}
returns;
}
voidmain(){
inta[10]={3,1,2,4,5,7,6,8,12,24};
ints=0;
inti;
//for(i=0;i<10;i++)
s=sum(a,9);
printf("sum=%d\n",s);
}
22、编写主函数和一个递归函数intmax(inta[],intn)。
要求是:
(1)函数max求数组a中前n个元素中的最大值,并返回该最大值;
(2)主函数中输入10个正整数给数组,调用max函数求数组中10个元素的最大值,并输出该最大值。
#include
intmax(inta[],intn){
intp;
if(n==1)returna[0];
else{
p=max(a,n-1);
if(a[n-1]>=p)returna[n-1];
elsereturnp;
}
}
voidmain(){
inta[10],m,i;
printf("pleaseinput10integers:
\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
m=max(a,10);
printf("Themaxnumberis%d.\n",m);
}
23、编写主函数和一个递归函数intdecomp(intn)。
要求是:
(1)函数decomp顺序输出n的各位数,并返回它是一个几位数;
(2)主函数中输入一个不超过8位的正整数,调用decomp函数,并输出函数返回结果。
如输入:
851439;则输出:
8,5,1,4,3,9
6
#include
intcount=1;
intdecomp(intn){
if(n>=10){
decomp(n/10);
count++;
}
printf("%d,",n%10);
return(count);
}
voidmain(){
longnum;
intt;
printf("请输入不超过八位的正整数:
\n");
scanf("%ld",&num);
t=decomp(num);
printf("\n这是一个%d位数.\n",t);
}
24、搬砖问题:
36块砖,36人搬,男人每人搬4块,女人每人搬3块,小孩两人抬一块,要求一次搬完,问男、女、小孩各需多少人。
#include
voidmain(){
intchild,girl;
for(child=0;child<=36;child=child+2)//child表示小孩的数量
for(girl=0;girl<=12;girl++)//girl表示女人的数量
if(child/2+3*girl+(36-child-girl)*4==36)//36人共搬36块
printf("boy:
%d,girl:
%d,child:
%d\n",36-child-girl,girl,child);
}
某班有6名学生,期末考试有4门课程。
请编写程序,对这6名学生的学号、姓名、4门课程的考试成绩和平均成绩进行管理。
具体要求有:
(1)编写一个程序,输入这6名学生的学号(长度为5位字符)、姓名(长度不超过15位字符)及4门课程的考试成绩(整数),并计算该学生的平均成绩(实数),最后将这6名学生的成绩记录存入文件stud?
?
?
?
.rec中,其中“?
?
?
?
”为你的学号最后4位,例如,如果你的学号为0102586,则你建立的文件名为stud2586.rec。
——要求按下表中给定的数据输入!
(2)编写一个程序,