2019高考C语言题

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

试卷编号:8258
所属语言:计算机基础
试卷方案:111
试卷总分:400分
共有题型:3种
一、程序填空共5题(共计100分)
第1题(分)题号:650 难度:中第1章/*------------------------------------------------------- 【程序填空】
---------------------------------------------------------
函数int change(char s[])将s中的数字字符串转换成整数,并返回该数。

例如s[]中为"123",转换后为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[]="123",s2[]="56";
int mst;
mst=multi(s1,s2);
printf("%d\n",mst);
return 0;
}
答案:
=======(答案1)=======
s[i]
=========或=========
*(s+i)
=======(答案2)=======
change(s)*change(t)
=========或=========
change(t)*change(s)
第2题(分)题号: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%10;
min=(min>k)? k: min;
n/=10;
p++;
c[0]=p;
c[1]=min;
}
int main()
{
long n;
int c[2];
printf("输入长整型正整数:");
scanf("%ld",&n);
check(n, c);
/**************************SPACE*************************/ printf("%ld是%d位数,最小数字是%d\n",【?】);
return 0;
}
答案:
=======(答案1)=======
c[]
=========或=========
c[2]
=======(答案2)=======
n,c[0],c[1]
第3题(分)题号: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;
return a;
t=0;
p=1;
while(a!=0)
{
t=t+a%10*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<N;i++)
{
d=convert(num[i][0],num[i][1]);
/**************************SPACE*************************/
printf("%d进制数的%d\t = 十进制数的%d\n",【?】);
}
return 0;
}
答案:
=======(答案1)=======
a/=10
=========或=========
a=a/10
=======(答案2)=======
num[i][1],num[i][0],d
第4题(分)题号: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<right; i+=2)
{
b[i]=a[left++];
/**************************SPACE*************************/ b[i+1]=a[【?】];
}
if(left==right)
b[i]=a[left];
for(i=0;i<N;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<N;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
答案:
=======(答案1)=======
right--
=======(答案2)=======
b[i]
第5题(分)题号: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]="7984 RH hSVVK BVZI,dRHS BLF TLLW OFXP!"; char s[100];
/**************************SPACE*************************/ 【?】;
printf("%s\n",s);
return 0;
}
答案:
=======(答案1)=======
t[i]=s[i]
=======(答案2)=======
change(t,s)
二、程序改错共5题(共计150分)
第1题(分)题号: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<n;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<n;i++)
printf("%d\t",a[i]);
/*******************FOUND*******************/ sort(a,n);
printf("\nAfter sorting:\n");
for(i=0;i<n;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
答案:
=======(答案1)=======
t=a[i];
=======(答案2)=======
for(j=k-1;j>=low;j--)
=======(答案3)=======
n=sort(a,n);
第2题(分)题号: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%10;
x/=10;
}
k=i;
for(i=0;i<k/2;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<k;i++)
/*******************FOUND*******************/ x+=a[i]*10;
return x;
}
int main()
{
unsigned x,p,n;
printf("Input x(unsigned int):\n");
scanf("%u",&x);
printf("Input p(unsigned int):\n");
scanf("%u",&p);
printf("Input n(unsigned int):\n");
scanf("%u",&n);
x=delbits(x,p,n);
printf("After deleting x=%u\n",x);
return 0;
}
答案:
=======(答案1)=======
a[i++]= x%10;
=========或=========
a[i]=x%10,i++;
=========或=========
a[i]=x%10,++i;
=========或=========
a[i]=x%10,i=i+1;
=========或=========
a[i]=x%10,i=1+i;
=========或=========
a[i]=x%10,i+=1;
=========或=========
a[i]=x%10;i++;
=========或=========
a[i]=x%10;++i;
=========或=========
a[i]=x%10;i=i+1;
=========或=========
a[i]=x%10;i=1+i;
=========或=========
a[i]=x%10;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题(分)题号: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<n-1;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<n;i++)
/*******************FOUND*******************/ b[i/M][i-i/N]=a[i];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
/*******************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("Before moving\nArray a:\n");
for(i=0;i<M*N;i++)
printf("%d ",a[i]);
printf("\nInput m:\n");
scanf("%d",&m);
move(a,M*N,m);
printf("\nAfter moving\nArray a:\n");
for(i=0;i<M*N;i++)
printf("%d ",a[i]);
change(a,M*N,b);
printf("\n\nAfter changing\nArray b:\n"); for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf("%d\t",b[i][j]);
printf("\n");
}
printf("Array a:\n");
for(i=0;i<M*N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
答案:
=======(答案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题(分)题号:579 难度:中第1章
/*------------------------------------------------------- 【程序改错】
---------------------------------------------------------
题目:void add(char a[],char b[],char c[])函数将由'0','1' 组成的字符串a,b按二进制数加法规则相加,和仍以'0','1'
组成的字符串形式保存到字符串c中。

例如:字符串a为"1100",字符串b为"111",调用add函数后字符串c 为"10011"。

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

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

--------------------------------------------------------*/
#include <>
#include <>
void reverse(char s[])
{
int i,len;
char t;
/*******************FOUND*******************/
len=strlen(s-1);
for(i=0;i<len/2;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("Input a(binary):\n");
scanf("%s",a);
printf("Input b(binary):\n");
scanf("%s",b);
add(a,b,c);
printf("After adding a+b=%s\n",c);
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题(分)题号:580 难度:中第1章/*------------------------------------------------------- 【程序改错】
---------------------------------------------------------
题目:int find(char a[],char b[],int c[])统计字符串a中出现字符串b的次数,并将字符串b每次在字符串a中出现的起
始下标依次保存在数组c中。

例如:若字符串a为"You are a citizen or other person"
字符串b为"" ,字符串b在a中出现2次,起始下标依
次为10,33。

若字符串a为"bcde aeeeq mneec",字符串b为 "ee" ,字符串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]="You are a citizen or other person";
char b[10]="";
int c[80];
int i,n;
printf("String a:\n");
puts(a);
printf("Substring b:\n");
puts(b);
n=find(a,b,c);
if(n)
{
printf("\nAfter counting:\n%d times\n",n); printf("Location:\n");
for(i=0;i<n;i++) printf("%d\t",c[i]);
printf("\n");
}
else
printf("\nCan not find substring.\n");
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题(分)题号:543 难度:中第1章/*------------------------------------------------------- 【程序设计】
---------------------------------------------------------
c语言中实数有小数表示法和科学表示法两种形式。

例如:
小数表示法的实数,用科学表示法为,其中
称为尾数,5称为阶码;
小数表示法的实数,用科学表示法为,其
中称为尾数,-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]={{,2},{,-4},{,0},{,3},{,-4}};
int i;
FILE *fp;
if((fp=fopen("","w"))==NULL)
{
printf("File open error\n");
exit(0);
}
change(sci);
sort(sci);
for(i=0;i<N;i++){
printf("%f\t%f\t%f\n",sci[i][0],sci[i][1],sci[i][2]);
fprintf(fp,"%f\t%f\t%f\n",sci[i][0],sci[i][1],sci[i][2]); }
fclose(fp);
getch();
return 0;
}
答案: int i;
double j,k;
for(i=0;i<N;i++)
{
sci[i][2]=sci[i][0];
k=sci[i][1]>=0 ?sci[i][1]:-sci[i][1];
for(j=0;j<k;j++)
sci[i][2]=(sci[i][1]< 0 ? sci[i][2]* : sci[i][2]*10); }
int i,j;
double t;
for(i=0;i<N-1;i++)
for(j=0;j<N-1-i;j++)
{
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题(分)题号:544 难度:中第1章
/*-------------------------------------------------------
【程序设计】
---------------------------------------------------------
主函数main()的char s[]中为测试数据,保存了形如
" 9/4 6/13 56/21 8/9 13/5 7/13 "字符串。

将字符串中类似"9/4"这样的子串视为一个分数,将其转换为整数
9和4,其中9为分子,4为分母。

将分子分母分别保存在二维数组frica的第一列和第二列。

并根据分数值的大小,对数组
frica进行升序排序。

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

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

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

---------------------------------------------------------*/
#include<>
#include<>
#include<>
#include<>
int abstract(char s[],int frica[][2])
{
/**********Program**********/
/********** End **********/
}
void sort(int frica[][2],int n)
{
/**********Program**********/
/********** End **********/
}
int main()
{
char s[]=" 9/4 6/13 56/21 8/9 13/5 7/13 "; int frica[10][2],i,n;
FILE *fp;
if((fp=fopen("","w"))==NULL)
{
printf("File open error\n");
exit(0);
}
n=abstract(s,frica);
sort(frica,n);
for(i=0;i<n;i++){
printf("%d/%d\t",frica[i][0],frica[i][1]);
fprintf(fp,"%d/%d\t",frica[i][0],frica[i][1]); }
printf("\n");
fprintf(fp,"\n");
fclose(fp);
getch();
return 0;
}
答案:int i,k,sum;
sum=0;
for(k=i=0;s[i];i++)
{
if(isdigit(s[i]))
{
sum=sum*10+s[i]-'0';
if(s[i+1]=='/' || s[i+1]==' ')
{
frica[k/2][k%2]=sum;
k++;
sum=0;
}
}
}
return k/2;
int i,j,t;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(frica[j][0]*frica[j+1][1]>frica[j+1][0]*frica[j][1])
{
t=frica[j][0];frica[j][0]=frica[j+1][0];frica[j+1][0]=t; t=frica[j][1];frica[j][1]=frica[j+1][1];frica[j+1][1]=t; }
}
第3题(分)题号:545 难度:中第1章
/*-------------------------------------------------------
【程序设计】
---------------------------------------------------------
主函数main()的char s[]中为测试数据,保存了形如
" 59,63 83,85 94,74 100,80 99,95 77,81 "字符
串。

将字符串中类似"59,63"这样的子串视为一个学生的语文
和数学成绩,将其转换为整数59和63,其中59为语文成绩,
63为数学成绩。

将这两个成绩分别保存在二维数组score的第
一列和第二列。

并根据总成绩和语文成绩的大小,对score数
组进行降序排序。

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

2.编写函数void sort(int score[][2],int n),对score数
组中n个成绩进行降序排序,排序依据是:先按总成绩降序排
序,如总成绩相同,则再按语文成绩降序排序。

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

---------------------------------------------------------*/
#include<>
#include<>
#include<>
#include<>
int abstract(char s[],int score[][2])
{
/**********Program**********/
/********** End **********/
}
void sort(int score[][2],int n)
{
/**********Program**********/
/********** End **********/
}
int main(){
char s[]=" 59,63 83,85 94,74 100,80 99,95 77,81 "; int score[10][2],i,n;
FILE *fp;
if((fp=fopen("","w"))==NULL)
{
printf("File open error\n");
exit(0);
}
n=abstract(s,score);
sort(score,n);
for(i=0;i<n;i++){
printf("%5d%5d%5d\n",score[i][0],score[i][1],score[i][0]+score[i][1]);
fprintf(fp,"%5d%5d%5d\n",score[i][0],score[i][1],score[i][0]+score[i][1]); }
printf("\n");
fprintf(fp,"\n");
fclose(fp);
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]==',')
score[k][0]=sum;
else
score[k++][1]=sum;
}
}
return k;
int i,j,t;
int s1,s2;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
s1=score[j][0]+score[j][1];
s2=score[j+1][0]+score[j+1][1];
if(s1<s2 || s1==s2 && score[j][0]<score[j+1][0])
{
t=score[j][0];score[j][0]=score[j+1][0];score[j+1][0]=t;
t=score[j][1];score[j][1]=score[j+1][1];score[j+1][1]=t;
}
}
第4题(分)题号:546 难度:中第1章
/*------------------------------------------------------- 【程序设计】
---------------------------------------------------------
主函数main()的char s[]中为测试数据,保存了形如
" 13,2;4 1,12;5 3,4;10 5,8;6 "字符串。

将字符串中类似"13,2;4"这样的子串视为一个等差数列的3个参数:首
项、公差、项数。

将该子串转换成三个整数分别保存在二维
数组ser一行的前三列中,并根据这3个参数计算等差数列的和,保存在ser数组的第四列。

例如:
子串"13,2;4"转换为13 2 4三个整数,和为64。

子串"1,12;5"转换为1 12 5三个整数,和为125。

编写函数:
1.编写函数int abstract(char s,int ser[][4]),将s字符
串中类似"13,2;4"这样的子串转换成三个整数,分别存放在
ser数组的第一、第二、第三列,函数返回这样的子串个数。

2.编写函数void sum(int ser[][4] , int n),计算ser数
组中n组等差数列的和,将其保存在ser数组各行第四列。

计算等差数列和的公式为:
项数*首项+项数*(项数-1)*公差/2。

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

---------------------------------------------------------*/ #include<>
#include<>
#include<>
#include<>
int abstract(char s[],int ser[][4])
{
/**********Program**********/
/********** End **********/
}
void sum(int ser[][4] , int n){
/**********Program**********/
/********** End **********/
}
int main()
{
char s[]=" 13,2;4 1,12;5 3,4;10 5,8;6 "; int i,j,n,ser[10][4];
FILE *fp;
if((fp=fopen("","w"))==NULL)
{
printf("File open error\n");
exit(0);
}
n=abstract(s,ser);
sum(ser,n);
for(i=0;i<n;i++){
for(j=0;j<4;j++){
printf("%5d",ser[i][j]);
fprintf(fp,"%5d",ser[i][j]);
}
printf("\n");
fprintf(fp,"\n");
}
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<n;i++){
ser[i][3]=ser[i][2]*ser[i][0]+ser[i][2]*(ser[i][2]-1)*ser[i][1]/2; }
第5题(分)题号: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("","w"))==NULL)
{
printf("File open error\n");
exit(0);
}
cal(num,6);
sort(num,6);
for(i=0;i<6;i++){
printf("%5d%5d%5d\n",num[i][0],num[i][1],num[i][2]);
fprintf(fp,"%5d%5d%5d\n",num[i][0],num[i][1],num[i][2]); }
fclose(fp);
return 0;
}
答案:int i,k;
for(i=0;i<n;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<n-1;i++)
for(j=0;j<n-1-i;j++)
{
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; }
}。

相关文档
最新文档