蓝色部分为解题答案
题目前加☆为2005年4月份根据给大论坛考生反馈的题号集中而来
题目前加★为2005年9月上机考试试题,题中难免有题型相同而题号增加的现象,此类标注仅供参考。
个别南开题如57,100与书中有所不同,是按实际考试的题目而来,并对今年在实际上机出现的考题,用红色字体表示实际上机题中的注意事项。
******************************************************************************
题目80(整数各位数运算题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出个位数上的数减千位数上的数减百位数上的数减十位数上的数大于零的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果输出到out.dat文件。
例如:1239,9-1-2-3>0,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。
8129,9-8-1-2<0,则该数不满足条件计算平均值pjz2。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
jsValue()
{int i,j,thou,hun,ten,data,n=0;
for(i=0;i<300;i++)
{thou=a[i]/1000; hun=a[i]/100%10;
ten=a[i]%100/10; data=a[i]%10;
if(data-thou-hun-ten>0) { cnt++; pjz1+=a[i];}
else { n++; pjz2+=a[i];}
}
if(cnt==0) pjz1=0;
else pjz1/=cnt;
if(n==0) pjz2=0;
else pjz2/=n;
}
**************************************************************************
☆题目81(整数各位数运算题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加百位数等于十位数上的数加个位数上的数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果输出到out.dat文件。
例如:7153,7+1=5+3,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。8129,8+1<>2+9,则该数不满足条件计算平均值pjz2。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2。
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
jsValue()
{int i,thou,hun,ten,data,n=0;
for(i=0;i<300;i++)
{thou=a[i]/1000; hun=a[i]%1000/100;
ten=a[i]%100/10; data=a[i]%10;
if(thou+hun==ten+data) {cnt++;pjz1+=a[i];}
else {n++;pjz2+=a[i];}
}
if(cnt==0) pjz1=0;
else pjz1/=cnt;
if(n==0) pjz2=0;
else pjz2/=n;
}
************************************************************************
★题目82(素数题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果cnt,pjz1,pjz2输
出到out.dat文件。
例如:5591是素数,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。
9812是非素数,则该数不满足条件计算平均值pjz2。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
jsValue()
{int i;
for(i=0;i<300;i++)
if(isP(a[i])) {pjz1+=a[i];cnt++;}
else pjz2+=a[i];
if(cnt==0) pjz1=0;
else pjz1/=cnt;
if(300-cnt==0) pjz2=0;
else pjz2/=(300-cnt);
}
***********************************************************************
☆题目83(方差运算题)
请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中奇数的个数odd,奇数的平均值ave1,偶数的平均值ave2以及所有奇数的方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
计算方差的公式如下:
N 2
totfc=1/N ∑ (xx[i]-ave1)
i=1
设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于等于2000)
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
/*********编制函数ReadDat()的部分************/
for(i=0;i<MAX;i++)
{fscanf(fp,"%d,",&xx[i]);
if((i+1)%10==0)
fscanf(fp,"\n");
}
/*******************************************/
void Compute(void)
{ int i,yy[MAX];
for(i=0;i<MAX;i++)
yy[i]=0;
for(i=0;i<MAX;i++)
if(xx[i]%2) { yy[odd++]=xx[i]; ave1+=xx[i];}
else { even++; ave2+=xx[i];}
if(odd==0) ave1=0;
else ave1/=odd;
if(even==0) ave2=0;
else ave2/=even;
for(i=0;i<odd;i++)
totfc+=(yy[i]-ave1)*(yy[i]-ave1)/odd;
}
*************************************************************************
☆题目84(选票问题)
现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推 :内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数大于5个人时被认为无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
void CountRs(void)
{ int i,j,count;
for(i=0;i<100;i++)
{ count=0;
for(j=0;j<10;j++)
if(xx[i][j]=='1') count++;
if(count>5) continue;
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++;
}
}
**************************************************************************
☆题目85(整数各位数运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把一个四位数的个位数字上的值减去千位数字上的值再减去百位数字上的值最后减去十位数字上的值,如果得出的值大于等于零且原四位数是偶数,则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
void jsVal()
{int i,j,thou,hun,ten,data;
for(i=0;i<MAX;i++)
{thou=a[i]/1000; hun=a[i]/100%10;
ten=a[i]%100/10; data=a[i]%10;
if(data-thou-hun-ten>=0&&a[i]%2==0) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) {thou=b[i];b[i]=b[j];b[j]=thou;}
}
**********************************************************************
题目86(整数各位打散组合运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab>cd,ab必须是偶数且能被5整除,cd必须是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
void jsVal()
{int i,j,thou,hun,ten,data,ab,cd;
for(i=0;i<MAX;i++)
{thou=a[i]/1000; hun=a[i]%1000/100;
ten=a[i]%100/10; data=a[i]%10;
ab=10*thou+ten; cd=10*data+hun;
if((ab-cd)>0&&(ab%2!=1&&ab%5==0)&&cd%2==1&&ab>=10&&cd>=10)
{b[cnt]=a[i];cnt++;}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {data=b[i];b[i]=b[j];b[j]=data;}
}
******************************************************************
☆题目87(整数各位运算统计题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加个位数等于百位数上的数加十位数上的数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数把结果输出到out.dat文件。
例如:6712,6+2=7+1,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。8129,8+9<>1+2,则该数不满足条件计算平均值pjz2。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2。
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
jsValue()
{ int i,gw,sw,bw,qw,cnt2=0;
for(i=0;i<300;i++)
{gw=a[i]%10; sw=a[i]/10%10;
bw=a[i]/100%10; qw=a[i]/1000;
if((qw+gw)==(sw+bw)) { cnt++;pjz1+=a[i]; }
else { cnt2++;pjz2+=a[i]; }
}
if(cnt==0) pjz1=0;
else pjz1/=cnt;
if(cnt2==0) pjz2=0;
else pjz2/=cnt2;
}
****************************************************
题目88(字符串排序题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数SortCharA(),其函数的功能是:以行为单位对字符按从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT1.DAT中。
例:原文:dAe,BfC.
CCbbAA
结果:,.ABCdef
AACCbb
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
void SortCharA(void)
{int i,j,k,strl;
char ch;
for(i=0;i<maxline;i++)
{strl=strlen(xx[i]);
for(j=0;j<strl-1;j++)
for(k=j+1;k<strl;k++)
if(xx[i][j]>xx[i][k])
{ch=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=ch;}
}
}
题目89(整数统计排序题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把一个四位数的千位数字上的值加上个位数字上的值恰好等于百位数字上的值加上十位数字上的值,并且原四位数是奇数,则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
void jsVal()
{
int i,j,gw,sw,bw,qw;
for(i=0;i<MAX;i++)
{gw=a[i]%10; sw=a[i]/10%10;
bw=a[i]/100%10; qw=a[i]/1000;
if((qw+gw)==(sw+bw)&&a[i]%2) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) { qw=b[i]; b[i]=b[j]; b[j]=qw;}
}
*************************************************************************
★题目90(整数排序题)
下列程序的功能是:将一正整数序列{K1,K2,...,K9}重新排列成一个新的序列。新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。要求编写函数jsValue()实现此功能,最后调用writeDat()函数将新序列输出到文件out.dat中。
说明:在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
例:序列{6,8,9,1,2,5,4,7,3}
经重排后成为{3,4,5,2,1,6,8,9,7}
部分源程序存在文件prog1.c中。
请勿改动主函数main()和写函数writeDat()的内容。
jsValue(int a[10][9])
{ int i,j,k,val,num;
for(i=0;i<10;i++)
{ val=a[i][0];
for(j=0;j<9;j++)
if(a[i][j]<val)
{ num=a[i][j];
for(k=j;k>0;k--)
a[i][k]=a[i][k-1];
a[i][0]=num;
}
}
}
*******************************************************************************
题目91(整数统计运算题)
请编制程序prog1.c,从文件in.dat中读取200个整数至数组xx中,求出奇数的个数cnt1和偶数的个数cnt2以及数组xx下标为偶数的元素值的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
/**********************/
sum=0; pj=0.0; cnt1=cnt2=0;
for(i=0;i<N;i++)
{ if(xx[i]%2) cnt1++;
else cnt2++;
if(i%2==0) {pj+=xx[i];sum++;}
}
pj/=sum;
/***********************/
*******************************************************************************
☆题目92(整数统计运算题)
请编制程序prog1.c,从文件IN.DAT中读取200个整数至数组xx中,求出最大数max及最大数的个数cnt和数组xx中能被3整除或能被7整除的算术平均值pj(保留2位小数)。
结果max,cnt,pj输出到OUT.DAT中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
/*********************/
cnt=0; max=xx[0]; pj=0.0; n=0;
for(m=0;m<N;m++)
if(max<xx[m]) max=xx[m];
for(m=0;m<N;m++)
{if(xx[m]==max) cnt++;
if(xx[m]%3==0||xx[m]%7==0)
{ pj+=xx[m]; n++; }
}
pj/=n;
/*********************/
*****************************************************************************
☆题目93(方差运算题)
请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute(),分别计算出xx中奇数的个数odd,偶数的个数even,平均值aver以及方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
计算方差的公式如下:
N 2
totfc=1/N ∑ (xx[i]-aver)
i=1
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于等于2000)
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
/***************编制函数ReadDat()*****************/
for(i=0;i<MAX;i++)
{ fscanf(fp,"%d,",&xx[i]);
if((i+1)%10==0)
fscanf(fp,"\n");
}
/*********************************************/
void Compute(void)
{ int i;
for(i=0;i<MAX;i++)
{ if(xx[i]%2) odd++;
else even++;
aver+=xx[i];
}
aver/=MAX;
for(i=0;i<MAX;i++)
totfc+=(xx[i]-aver)*(xx[i]-aver);
totfc/=MAX;
}
*******************************************************************************
题目94(整数统计运算题)
请编制程序prog1.c,从文件in.dat中读取200个整数至数组xx中,求出奇数的个数cnt1和偶数的个数cnt2以及数组xx中值为偶数的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
/****************************/
cnt1=0; cnt2=0; pj=0.0;
for(m=0;m<N;m++)
if(xx[m]%2) cnt1++;
else { cnt2++; pj+=xx[m];}
if(cnt2==0) pj=0;
else pj/=cnt2;
/****************************/
****************************************************************************
☆题目95(字符替换题)
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS4.DA中。
替代关系:f(p)=p*11 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或f(p)对应的字符是大写字母,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]*11%256>='A'&&xx[i][j]*11%256<='Z') continue;
else xx[i][j]=xx[i][j]*11%256;
}
***********************************************************************
☆题目96(字符替换题)
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS5.DAT中。
替代关系:f(p)=p*11mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符是小写字母或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]>='a'&&xx[i][j]<='z') continue;
else xx[i][j]=xx[i][j]*11%256;
}
*************************************************************************
★题目97(字符替换题)
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS9.DAT中。
替代关系:f(p)=p*11 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符是数字字符0至9或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]>='0'&&xx[i][j]<='9') continue;
else xx[i][j]=xx[i][j]*11%256;
}
******************************************************************************
★题目98(字符替题)
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS3.DAT中。
替代关系:f(p)=p*17 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或其ASCII值是奇数,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*17%256<=32||(xx[i][j]*17%256)%2!=0) continue;
else xx[i][j]=xx[i][j]*17%256;
}
*****************************************************************************
题目99(结构体排列题)
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列,若金额相等,则按产品代码从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT1.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
void SortDat()
{int i,j;
PRO xy;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(sell[i].je>sell[j].je||sell[i].je==sell[j].je&&strcmp(sell[i].dm,sell[j].dm)>0)
{xy=sell[i];sell [i]=sell[j];sell[j]=xy;}
}
*************************************************************************
★☆题目100(字符替换题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数CharConvA(),其函数的功能是:以行为单位把字符串中的最后一个字符的ASCII值右移4位,高位补0后加最后第二个字符的ASCII值,得到最后一个新的字符,最后第二个字符的ASCII值右移4位,高位补0后加最后第三个字符的ASCII值,得到最后第二个新的字符,依此类推一直处理到第二个字符,第一个字符的ASCII值加原最后一个字符的ASCII值,得到第一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT10.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和写函数writeDat()的内容。
void CharConvA()
{ int i,j;
char p,c;
for(i=0;i<maxline;i++)
{ p=xx[i][strlen(xx[i])-1];
c=xx[i][0];
for(j=strlen(xx[i])-1;j>0;j--)
xx[i][j]=(xx[i][j]>>4)+xx[i][j-1];
xx[i][0]=p+c;
}
}