2015高考C语言题

更新时间:2023-10-31 17:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

试卷编号:8258 所属语言:计算机基础 试卷方案:111 试卷总分:400分 共有题型:3种

一、程序填空 共5题 (共计100分)

第1题 (20.0分) 题号:650 难度:中 第1章 /*------------------------------------------------------- 【程序填空】

---------------------------------------------------------

函数int change(char s[])将s中的数字字符串转换成整数, 并返回该数。例如s[]中为\,转换后为123。

函数int multi(char s[],char t[])将s字符串转换的整数乘 以t字符串转换的整数,并返回乘积。

--------------------------------------------------------- 注意:请勿改动程序中的其他内容。

-------------------------------------------------------*/

#include int change(char s[]) {

int i,sum; sum=0;

for(i=0;s[i];i++)

/**************************SPACE*************************/ sum=sum*10+【?】-'0'; return sum; }

int multi(char s[],char t[]) {

int mul;

/**************************SPACE*************************/ mul=【?】; return mul; }

int main() {

char s1[]=\ int mst;

mst=multi(s1,s2); printf(\ return 0; } 答案:

=======(答案1)======= s[i]

=========或========= *(s+i)

=======(答案2)======= change(s)*change(t) =========或========= change(t)*change(s)

第2题 (20.0分) 题号:651 难度:中 第1章 /*------------------------------------------------------- 【程序填空】

---------------------------------------------------------

函数void check(long n, int c[])检测长整型正整数n是几 位数,同时找出最小的数字。将位数和最小的数字存放在数 组c中。

例如n=1256044时,n是7位数,最小的数字是0。

--------------------------------------------------------- 注意:请勿改动程序中的其他内容。

-------------------------------------------------------*/

#include

/**************************SPACE*************************/ void check(long n, int 【?】) {

int min,p,k; min=9; p=0; do{

k=n;

min=(min>k)? k: min; n/=10; p++;

}while(n); c[0]=p; c[1]=min; }

int main() {

long n; int c[2];

printf(\输入长整型正整数:\ scanf(\ check(n, c);

/**************************SPACE*************************/ printf(\是%d位数,最小数字是%d\\n\【?】); return 0; } 答案:

=======(答案1)======= c[]

=========或========= c[2]

=======(答案2)======= n,c[0],c[1]

第3题 (20.0分) 题号:652 难度:中 第1章 /*------------------------------------------------------- 【程序填空】

---------------------------------------------------------

函数int convert(int a,int nsys)将nsys(nsys<10)进制数a, 转换成十进制数并返回。

--------------------------------------------------------- 注意:请勿改动程序中的其他内容。

---------------------------------------------------------*/

#include #define N 5

int convert(int a,int nsys) {

int t,p;

if(a

t=t+a*p;

/**************************SPACE*************************/ 【?】; p*=nsys; }

return t; }

int main() {

int i,d;

int num[N][2]={{704,8},{10011,2},{266,7},{3,5},{22110,3}}; for(i=0;i

d=convert(num[i][0],num[i][1]);

/**************************SPACE*************************/ printf(\进制数的%d\\t = 十进制数的%d\\n\【?】); }

return 0; } 答案:

=======(答案1)======= a/=10

=========或========= a=a/10

=======(答案2)======= num[i][1],num[i][0],d

第4题 (20.0分) 题号:653 难度:中 第1章 /*------------------------------------------------------- 【程序填空】

---------------------------------------------------------

函数void rearr(int a[], int n)将已经升序排列的一维数 组a中的n个元素重新排列,重新排列的规则是:

将a数组中的最小元素放到a[0],最大元素放到a[1], 将次小元素放到a[2],次大元素放到a[3],..., 以此类推。

例如:

原a数组各元素为:

-11 -7 0 3 8 15 16 20 38 重新排列后a数组各元素为: -11 38 -7 20 0 16 3 15 8

--------------------------------------------------------- 注意:请勿改动程序中的其他内容。

-------------------------------------------------------*/

#include #define N 9

void rearr(int a[], int n) {

int left,right,i; int b[N]; left=0; right=N-1;

for(i=0; left

b[i]=a[left++];

/**************************SPACE*************************/ b[i+1]=a[【?】]; }

if(left==right) b[i]=a[left]; for(i=0;i

/**************************SPACE*************************/ a[i]=【?】; }

int main() {

int i,a[N]={-11,-7,0,3,8,15,16,20,38}; rearr(a,N); for(i=0;i

答案:

=======(答案1)======= right--

=======(答案2)======= b[i]

第5题 (20.0分) 题号:654 难度:中 第1章 /*------------------------------------------------------- 【程序填空】

---------------------------------------------------------

函数void change(char s[],char t[])将s字符串中字母和数 字字符按以下规则转换,并将其保存在t中。其他字符则不作 转换。

大写字母转换规则:'A'->'z','B'->'y',...,'Z'->'a' 小写字母转换规则:'z'->'A','y'->'B',...,'a'->'Z' 数字字符转换规则:'0'->'9','1'->'8',...,'9'->'0'

--------------------------------------------------------- 注意:请勿改动程序中的其他内容。

-------------------------------------------------------*/ #include #include

void change(char s[],char t[]) {

int i;

for(i=0;s[i];++i) {

if(isalpha(s[i]))

t[i]=(isupper(s[i]) ? 'Z'-s[i]+'a' : 'z'-s[i]+'A'); else if(isdigit(s[i])) t[i]='9'-s[i]+'0'; else

/**************************SPACE*************************/ 【?】; } t[i]=0; }

int main() {

char t[100]=\ char s[100];

/**************************SPACE*************************/ 【?】;

printf(\ return 0; } 答案:

=======(答案1)======= t[i]=s[i]

=======(答案2)======= change(t,s)

二、程序改错 共5题 (共计150分)

第1题 (30.0分) 题号:575 难度:中 第1章 /*------------------------------------------------------- 【程序改错】

---------------------------------------------------------

题目:int sort(int a[],int n)函数将n个元素的数组a中互不相 同的元素按升序排列,重新存入数组a中,函数返回按升序 排列后互不相同元素的个数。

例如:数组a中元素为6,2,7,5,4,3,4,6,5,4,调用sort函数后, 函数值为6,主函数中输出排序后的数组a元素为 2,3,4,5,6,7。

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

--------------------------------------------------------- 注意:不得增行或删行,也不得更改程序的结构。

--------------------------------------------------------*/

#include int sort(int a[],int n) {

int i,j,k,low,high,mid,t; for(k=i=1;i

low=0;

high=k-1; while(low<=high) {

mid=(low+high)/2;

if(a[mid]>=a[i]) high=mid-1; else low=mid+1; }

if(low>=k||a[low]!=a[i]) {

/*******************FOUND*******************/ t=a[i]-1;

/*******************FOUND*******************/ for(j=k;j>=low;j--) a[j+1]=a[j]; a[low]=t; k++; } }

return k; }

int main() {

int a[ ]={6,2,7,5,4,3,4,6,5,4}; int i,n;

n=sizeof(a)/sizeof(int); for(i=0;i

printf(\

/*******************FOUND*******************/ sort(a,n); printf(\ for(i=0;i

=======(答案1)======= t=a[i];

=======(答案2)======= for(j=k-1;j>=low;j--)

=======(答案3)======= n=sort(a,n);

第2题 (30.0分) 题号:576 难度:中 第1章 /*------------------------------------------------------- 【程序改错】

---------------------------------------------------------

题目:函数unsigned delbits(unsigned x,unsigned p,unsigned n) 把非负整数x从左端第p(p>1)位开始的n位删除,形成新的数 返回。

例如:若x为12345,p为3,n为2,形成新的数为125。 若x为12345,p为6,n为2,形成新的数为12345。 若x为12345,p为3,n为4,形成新的数为12。

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

--------------------------------------------------------- 注意:不得增行或删行,也不得更改程序的结构。

--------------------------------------------------------*/

#include

unsigned delbits(unsigned x,unsigned p,unsigned n) {

int a[10],i,j,k; i=0; while(x) {

/*******************FOUND*******************/ a[i]=x; x/=10; } k=i;

for(i=0;i

a[i]+=a[k-i-1];

a[k-i-1]=a[i]-a[k-i-1]; a[i]=a[i]-a[k-i-1]; } j=p-1;

/*******************FOUND*******************/ for(i=p+n;i<=k-1;i++)

{

a[j]=a[i]; j++; } k=j;

for(i=0;i

/*******************FOUND*******************/ x+=a[i]*10; return x; }

int main() {

unsigned x,p,n;

printf(\ scanf(\

printf(\ scanf(\

printf(\ scanf(\ x=delbits(x,p,n);

printf(\ return 0; } 答案:

=======(答案1)======= a[i++]= x; =========或========= a[i]=x,i++; =========或========= a[i]=x,++i; =========或========= a[i]=x,i=i+1; =========或========= a[i]=x,i=1+i; =========或========= a[i]=x,i+=1; =========或========= a[i]=x;i++; =========或========= a[i]=x;++i; =========或========= a[i]=x;i=i+1;

=========或========= a[i]=x;i=1+i; =========或========= a[i]=x;i+=1;

=======(答案2)======= for(i=p+n-1;i<=k-1;i++) =========或========= for(i=p-1+n;i<=k-1;i++)

=======(答案3)======= x=x*10+a[i];

=========或========= x=10*x+a[i];

=========或========= x=a[i]+x*10;

=========或========= x=a[i]+10*x;

第3题 (30.0分) 题号:577 难度:中 第1章 /*------------------------------------------------------- 【程序改错】

---------------------------------------------------------

题目:void move(int a[],int n,int m)函数将n个元素的一维 数组a循环左移m个位置,

void change(int a[],int n,int b[][N])函数将数组a按 行存入二维数组b,然后将b按列重新存入数组a。

例如:数组a的元素为1,2,3,4,5,6,7,8,9,10,11,12,调用move函 数将a循环左移3个位置后,a的元素为

4,5,6,7,8,9,10,11,12,1,2,3,调用change函数后,a的元 素为4,8,12,5,9,1,6,10,2,7,11,3。

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

--------------------------------------------------------- 注意:不得增行或删行,也不得更改程序的结构。

--------------------------------------------------------*/ #include #define M 3 #define N 4

void move(int a[],int n,int m)

{

int i,t; while(m) {

t=a[0];

for(i=0;i

/*******************FOUND*******************/ a[i]=a[i+m]; a[n-1]=t; m--; } }

void change(int a[],int n,int b[][N]) {

int i,j;

for(i=0;i

/*******************FOUND*******************/ b[i/M][i-i/N]=a[i]; for(i=0;i

/*******************FOUND*******************/ a[j*M+i]=b[i][j]; }

int main() {

int a[M*N]={1,2,3,4,5,6,7,8,9,10,11,12}; int b[M][N],i,j,m;

printf(\ for(i=0;i

printf(\ for(i=0;i

printf(\ for(i=0;i

printf(\ printf(\ }

printf(\

for(i=0;i

=======(答案1)======= a[i]=a[i+1];

=========或========= a[i]=a[1+i];

=======(答案2)======= b[i/N][i%N]=a[i]; =========或========= b[i/N][i-i/N*N]=a[i];

=======(答案3)======= a[i*M+j]=b[j][i]; =========或========= a[M*i+j]=b[j][i]; =========或========= a[j+i*M]=b[j][i]; =========或========= a[j+M*i]=b[j][i];

第4题 (30.0分) 题号:579 难度:中 第1章 /*------------------------------------------------------- 【程序改错】

---------------------------------------------------------

题目:void add(char a[],char b[],char c[])函数将由'0','1' 组成的字符串a,b按二进制数加法规则相加,和仍以'0','1' 组成的字符串形式保存到字符串c中。

例如:字符串a为\字符串b为\调用add函数后字符串c 为\。

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

--------------------------------------------------------- 注意:不得增行或删行,也不得更改程序的结构。

--------------------------------------------------------*/

#include #include void reverse(char s[]) {

int i,len; char t;

/*******************FOUND*******************/ len=strlen(s-1); for(i=0;i

t=s[i];

s[i]=s[len-i-1]; s[len-i-1]=t; } }

void add(char a[],char b[],char c[]) {

int i,j,k,t,flag; i=strlen(a)-1; j=strlen(b)-1; k=flag=0;

while(i>=0||j>=0) {

if(i<0)

t=b[j]-48+flag; else if(j<0) t=a[i]-48+flag; else

t=a[i]-48+b[j]-48+flag;

/*******************FOUND*******************/ c[k]=t/2; k++; flag=0; if(t>1) flag=1; i--; j--; }

/*******************FOUND*******************/ if(flag==0) c[k++]='1'; c[k]='\\0';

reverse(c); }

int main() {

char a[50],b[50],c[51]; printf(\ scanf(\

printf(\ scanf(\ add(a,b,c);

printf(\ return 0; } 答案:

=======(答案1)======= len=strlen(s);

=======(答案2)======= c[k]=t%2+48;

=========或========= c[k]=48+t%2;

=========或========= c[k]=t%2+'0'; =========或========= c[k]='0'+t%2;

=======(答案3)======= if(flag)

=========或========= if(flag==1)

=========或========= if(flag!=0)

=========或========= if(t>1)

=========或========= if(t>=2)

第5题 (30.0分) 题号:580 难度:中 第1章 /*------------------------------------------------------- 【程序改错】

---------------------------------------------------------

题目:int find(char a[],char b[],int c[])统计字符串a中出 现字符串b的次数,并将字符串b每次在字符串a中出现的起 始下标依次保存在数组c中。

例如:若字符串a为\ 字符串b为\,字符串b在a中出现2次,起始下标依 次为10,33。若字符串a为\字符串b为 \,字符串b在a中出现3次,起始下标依次为6,7,13。

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

--------------------------------------------------------- 注意:不得增行或删行,也不得更改程序的结构。

--------------------------------------------------------*/ #include #include

int find(char a[],char b[],int c[]) {

int i,j,n=0; i=0; while(a[i]) { j=0;

while(a[i]==b[j]&&a[i]&&b[j]) {

i++;j++; }

if(b[j]=='\\0') {

/*******************FOUND*******************/ c[n]=i; n++; }

/*******************FOUND*******************/ i=j; }

/*******************FOUND*******************/ return n-1; }

int main() {

char a[80]=\

char b[10]=\ int c[80]; int i,n;

printf(\ puts(a);

printf(\ puts(b); n=find(a,b,c); if(n) {

printf(\ printf(\

for(i=0;i

printf(\ return 0; } 答案:

=======(答案1)======= c[n]=i-j;

=========或========= c[n]=i-strlen(b);

=======(答案2)======= i=i-j+1;

=========或========= i+=1-j;

=========或========= i+=-j+1;

=========或========= i=i+1-j;

=========或========= i=-j+i+1;

=========或========= i=-j+1+i

=========或========= i=1+i-j;

=========或========= i=1-j+i;

=======(答案3)======= return n;

=========或========= return (n);

三、程序设计 共5题 (共计150分)

第1题 (30.0分) 题号:543 难度:中 第1章 /*------------------------------------------------------- 【程序设计】

---------------------------------------------------------

c语言中实数有小数表示法和科学表示法两种形式。 例如:

小数表示法的实数203400.0,用科学表示法为2.034e5,其中 2.034称为尾数,5称为阶码;

小数表示法的实数-0.00769,用科学表示法为-0.769e-2,其 中-0.769称为尾数,-2称为阶码。

主函数main()中二维数组double sci[N][3]为测试数据。sci 数组各行前两列保存了用科学表示法表示的实数的尾数和阶 码,程序先将sci数组中用科学表示法表示的实数转换成小数 表示法表示的实数,再依据小数表示法的实数大小,对sci数 组进行升序排序。

编写函数:

1.编写函数void change(double sci[][3]),根据sci数组前 两列的尾数和阶码,计算出小数表示法的实数,将其保存在 sci数组的第三列。

2.编写函数void sort(double sci[][3]),依据sci数组中第 三列,即小数表示法表示的实数大小进行升序排序。

在函数中不允许使用系统提供的任何库函数。

--------------------------------------------------------- 注意:请勿改动主函数main()中的任何语句。

---------------------------------------------------------*/

#include #include #include #define N 5

void change(double sci[][3]) {

/**********Program**********/

/********** End **********/ }

void sort(double sci[][3]) {

/**********Program**********/

/********** End **********/ }

int main() {

double sci[N][3]={{4.76,2},{-9.007,-4},{6.789,0},{-0.8145,3},{9.007,-4}}; int i; FILE *fp;

if((fp=fopen(\ {

printf(\ exit(0); }

change(sci); sort(sci); for(i=0;i

printf(\ fprintf(fp,\ }

fclose(fp); getch(); return 0; }

答案: int i; double j,k; for(i=0;i

sci[i][2]=sci[i][0];

k=sci[i][1]>=0 ?sci[i][1]:-sci[i][1]; for(j=0;j

sci[i][2]=(sci[i][1]< 0 ? sci[i][2]*0.1 : sci[i][2]*10); }

int i,j; double t;

for(i=0;i

if(sci[j][2]>sci[j+1][2]) {

t=sci[j][0];sci[j][0]=sci[j+1][0];sci[j+1][0]=t; t=sci[j][1];sci[j][1]=sci[j+1][1];sci[j+1][1]=t; t=sci[j][2];sci[j][2]=sci[j+1][2];sci[j+1][2]=t; } }

第2题 (30.0分) 题号:544 难度:中 第1章 /*------------------------------------------------------- 【程序设计】

---------------------------------------------------------

主函数main()的char s[]中为测试数据,保存了形如 \字符串。将字 符串中类似\这样的子串视为一个分数,将其转换为整数 9和4,其中9为分子,4为分母。将分子分母分别保存在二维 数组frica的第一列和第二列。并根据分数值的大小,对数组 frica进行升序排序。

编写函数:

1.编写函数int abstract(char s[],int frica[][2]),将字 符串s中类似\这样的子串转换成两个整数,分别存放在 frica数组的第一列和第二列,函数返回这样的子串个数(即 分数个数)。

2.编写函数void sort(int frica[][2],int n),根据分数值 大小,对frica数组中n个分数进行升序排序。

--------------------------------------------------------- 注意:请勿改动主函数main()中的任何语句。

---------------------------------------------------------*/

#include #include

/**********Program**********/

/********** End **********/ }

int main() {

char s[]=\ int i,j,n,ser[10][4]; FILE *fp;

if((fp=fopen(\ {

printf(\ exit(0); }

n=abstract(s,ser); sum(ser,n); for(i=0;i

printf(\ fprintf(fp,\ }

printf(\ fprintf(fp,\ }

fclose(fp); getch(); return 0; }

答案:int i,k,sum; for(k=i=0;s[i];i++) if(isdigit(s[i])) {

sum=0;

for(;isdigit(s[i]);i++) sum=sum*10+s[i]-'0'; if(s[i]==',') ser[k][0]=sum;

else if(s[i]==';') ser[k][1]=sum; else

ser[k++][2]=sum; } return k; int i;

for(i=0;i

ser[i][3]=ser[i][2]*ser[i][0]+ser[i][2]*(ser[i][2]-1)*ser[i][1]/2; }

第5题 (30.0分) 题号:547 难度:中 第1章 /*------------------------------------------------------- 【程序设计】

---------------------------------------------------------

主函数main()中二维数组int num[6][3]为测试数据,num数 组各行第一、二列已经赋值为

{{4,12},{0,11},{6,-3},{12,7},{5,1},{13,9}}。

程序计算num数组各行第三列数据,并根据第三列数的大小 对num数组进行升序排序。

num数组各行第三列数等于下列a、b两个整数之和: a=该行第一列数+最小非负整数,使得a为3的倍数, 例如,num数组第一行第一列数为4,则最小非负整数为2; 第二行第一列数为0,则最小非负整数为0; 第五行第一列数为5,则最小非负整数为1; b=该行第二列数*该数所在行、列下标之和。

编写函数:

1)编写函数void cal(int num[][3],int n),根据上述计算 方法,计算num数组各行第三列数。

2)编写函数void sort(int num[][3],int n),根据num数组 第三列数据的大小,对num数组进行升序排序。

--------------------------------------------------------- 注意:请勿改动主函数main()中的任何语句。

---------------------------------------------------------*/

#include #include #include

void cal(int num[][3],int n) {

/**********Program**********/

/********** End **********/ }

void sort(int num[][3],int n) {

/**********Program**********/

/********** End **********/ }

int main() {

int num[6][3]={{4,12},{0,11},{6,-3},{12,7},{5,1},{13,9}}; int i; FILE *fp;

if((fp=fopen(\ {

printf(\ exit(0); }

cal(num,6); sort(num,6);

for(i=0;i<6;i++){

printf(\ fprintf(fp,\ }

fclose(fp); return 0; }

答案:int i,k; for(i=0;i

if((k=num[i][0]%3)==0)

num[i][2]=num[i][0]; else

num[i][2]=num[i][0]+3-k; num[i][2]+=(i+1)*num[i][1]; }

int i,j,t;

for(i=0;i

if(num[j][2]>num[j+1][2]) {

t=num[j][0];num[j][0]=num[j+1][0];num[j+1][0]=t; t=num[j][1];num[j][1]=num[j+1][1];num[j+1][1]=t; t=num[j][2];num[j][2]=num[j+1][2];num[j+1][2]=t; } }

本文来源:https://www.bwwdw.com/article/58d2.html

Top