四川省20次机试试题及参考答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

20-1套参考答案:
一、程序调试题(文件名test1-1.c)(40分)
磁盘上有test1-1.c,其功能是:计算一个英文句子中最长单词的长度max(单词长度即为单词中字母的个数).假设该英文句子中只含有字母和空格,在空格之间连续的字母串称为单词,当输入回车符时标志句子结束。

调试程序使之能输出正确的结果。

注意: 可以增加和修改程序行,但不得删除程序中的整行。

在一处增加的程序行不得超过两行,不得更改程序的结构。

#include <stdio.h>
int len_max(char *strp)
{ int max=0,len=0;
while(strp!='\0')
{ while((*strp>='A'&&*strp<='Z')&&(*strp>='a'&&*strp<='z')) /* 改为|| */
{ len++;/* 增加一行语句:strp++; */
}
if(len<max) max=len; /* 改为len>max */
len=0;
strp++;
}
return; /* 改为return max */
}
void main()
{ char str[100];
int maxlen;
printf("Input a sentence:\n");
gets(str);
maxlen=len_max(&str); /* 改为str */
printf("maxlen=%d\n",maxlen);
}
二、编写程序(程序文件取名为test1-2.c)(60分)
请用函数调用方式编写程序,要求:
l、写一create函数,功能是:根据形参n的值(1<=n<=10),按如下所示规律构造二维数组下三角的前n行:
1
57
9 11 13
13 15 17 19
17 19 21 23 25
………….
2、在main函数中输入一整数m(1<=m<=10)并调用create函数,输出该二维数组下三角的前m行。

3、结果要求输出到屏幕和文件test1-2.dat中。

评分标准:
1.文件打开、关闭正确
2.屏幕结果输出正确
3.文件结果输出正确
4.函数定义、形参书写正确
5.正确定义实参二维数组,并能正确调用creat函数
6.函数中对二维数组的处理正确
参考程序:
# include <stdio.h>
void creat(int a[10][10],int n)
{ int i,j;
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
a[i][j]=i*4+j*2+1;
}
main()
{ int a[10][10],m,i,j;
FILE *fp;
fp=fopen("test1-2.dat","w");
printf("Input m(1~10):");
scanf("%d",&m);
creat(a,m);
for(i=0;i<m;i++)
{ for(j=0;j<=i;j++)
{ printf("%5d",a[i][j]);
fprintf(fp,"%5d",a[i][j]);
}
printf("\n");
fprintf(fp,"\n");
}
fclose(fp);
}
20-2套参考答案:
一、程序调试题(文件名test2-1.c)(40分)
磁盘上有test2-1.c,其功能是:把一个正整数各位上的数转换成对应的数字字符,并逆序输出(输出时每个数字字符之后插入一个*号)。

例如:输入256,则输出的字符为6*5*2*
注意:可以增加和修改程序行,但不得删除程序中的整行。

在一处增加的程序行不得
超过两行,不得更改程序的结构。

#include <stdio.h>
void fun(int m, char s) /* 改为*s*/
{ int k, i=10;
while(m!=0)
{ k=m/i ; /* 改为m%i */
*s=k+"0"; /* 改为'0' */
s++ ;
m=(m-k)/i ;
}
/*增加一行内容:*s='\0'; */
}
void main()
{ int x, i;
char s[10];
scanf("%d", &x);
if(x>0)
{ fun(x, s);
for(i=0 ; s ; i++) /* 改为s[i] */
printf("%c*" , s[i]) ;
}
else printf("x value error\n");
}
二、编写程序(程序文件取名为test2-2.c)(60分)
已知磁盘上的test2-2.txt文本文件中包含有3个字符串,每个字符串的长度小于80且3个字符串之间以换行符做分隔。

编写程序要求实现:
1. 从文件中读入3个字符串并把它们按升序排序。

2. 将排序后的3个字符串输出到屏幕和追加到原磁盘文件的尾部。

评分标准:
1.文件打开和关闭正确
2.串的读入正确
3.串的排序正确
4.文件位置指针定位正确
5.屏幕输出和文件输出正确
6.程序结构合理
参考程序:
# include <stdio.h>
# include <string.h>
main()
{ char str[3][80],string[80];
int i,j,k;
FILE *fp;
fp=fopen("test2-2.txt","r+");
for(i=0;i<3;i++)
fgets(str[i],80,fp);
printf("The strings:\n");
for(i=0;i<3;i++)
printf("%s",str[i]);
for(i=0;i<2;i++)
{ k=i;
for(j=i+1;j<3;j++)
if( strcmp( str[k] , str[j] ) > 0 ) k=j;
if(k!=i)
{ strcpy(string,str[k]);
strcpy(str[k],str[i]);
strcpy(str[i],string);
}
}
printf("Sorted result:\n");
fseek(fp,0,2);
for(i=0;i<3;i++)
{ printf("%s",str[i]);
fprintf(fp,"%s",str[i]);
}
fclose(fp);
}
20-3套参考答案:
一、程序调试题(文件名test3-1.c)(40分)
磁盘上已有一文件tesl3-l.c,其中函数fun的功能是计算两矩阵之乘积。

请改正程序中的错误,使它能计算出正确的结果。

注意:只能修改语句行,不得增加或删除行,也不得更改程序的结构。

#include <stdio.h>
#define M 2
#define N 3
#define P 2
void fun(int a[M][N],b[N][P],c[M][P]) /* 改为int b[N][P],int c[M][P]*/
{ int i,j,k;
for(i=0;i<=P;i++) /* 改为i<P */
for(j=0;j<P;j++)
{ c[i][j]=0;
for(k=0;k<n;k++) /* 改为k<N */
c[i][j]=a[i][k]*b[k][j]; /* 改为+= */
}
}
void main()
{ int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2]={{1,2},{3,4},{5,6}};
int c[2][2], i, j;
fun(*a,*b,*c); /* 改为fun(a,b,c) */
for(i=0;i<2;i++)
{ for(j=0;j<2;j++)
printf("%d ",c[i][j]);
printf("\n");
}
}
二、编写程序(程序文件取名为test3-2.c)(60分)
用函数调用方式编写程序。

在主函数中提示输入自然数n,调用函数fun,并输出结果。

函数fun用递归的方法求1+2+…+n的值。

要求:1、将结果显示在屏幕上的同时输出到文件test3-2.dat中。

2、文件名test3-2.dat要求从命令行参数给出。

评分标准:
1.文件打开和关闭正确
2.函数定义、调用和参数使用正确
3.屏幕输出和文件输出正确
4.递归调用方法正确
5.命令行参数使用正确
6.程序结构合理
参考程序:
# include <stdio.h>
int fun(int n)
{ int f;
if(n<1) return 0;
else if(n==1) f=1;
else f=fun(n-1)+n;
return f;
}
main(int argc,char *argv[])
{ int sum,n;
FILE *fp;
if(argc!=2)
{ printf("Error!\n");
exit(0);
}
fp=fopen(argv[1],"w");
printf("Input n: ");
scanf("%d",&n);
sum=fun(n);
printf("1+2+...+%d=%d\n",n,sum);
fprintf(fp,"1+2+...+%d=%d\n",n,sum);
fclose(fp);
}。

相关文档
最新文档