资源描述
第1类 按结构体成员筛选并排序
试题一
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从小到大进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
【参考答案】
void SortDat()
{
int i,j;
PRO temp;
for(i=0;i<99;i++)
if(strcmp(sell[i].mc,sell[j].mc)>0) {
temp=sell[i];
sell [i]=sell[j];
sell[j]=temp;
}
else if(strcmp(sell[i].mc,sell[j].mc)==0) if(sell[i].je>sell[j].je) {
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题二
已知文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
【参考答案】
void SortDat()
{
int i,j;
PRO temp;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if (strcmp(sell[i].mc,sell[j].mc)<0) {
temp=sell[i];
sell [i]=sell[j];
sell[j]=temp;
}
else if(strcmp(sell[i].mc,sell[j].mc)==0) if(sell[i].je<sell[j].je)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题三
已知文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
【参考答案】
void SortDat()
{
int i,j;
PRO temp;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if (strcmp(sell[i].dm,sell[j].dm)>0)
{
temp=sell[i];
sell [i]=sell[j];
sell[j]=temp;
}
else if(strcmp(sell[i].dm,sell[j].dm)==0) if(sell[i].je>sell[j].je)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题四
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDat( )的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat( ),其功能要求:按金额从大到小进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用写函数WriteDat( )把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
【参考答案】
void SortDat()
{
int i,j; /*定义循环控制变量*/
PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/
for(i=0;i<99;i++) /*利用选择法进行排序*/
for(j=i+1;j<100;j++)
if(sell[i].je<sell[j].je) /*按金额从大到小进行排列*/
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
else if (sell[i].je==sell[j].je) /*若金额相同*/
if (strcmp(sell[i].dm,sell[j].dm)<0) /*则按产品代码从大到小进行排列*/
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题五
已知文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
【参考答案】
void SortDat()
{
int i,j; /*定义循环控制变量*/
PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/
for(i=0;i<99;i++) /*利用选择法排序*/
for(j=i+1;j<100;j++)
if (strcmp(sell[i].mc,sell[j].mc)<0) /*按产品名称从大到小进行排列*/
{
temp=sell[i];
sell [i]=sell[j];
sell[j]=temp;
}
else if(strcmp(sell[i].mc,sell[j].mc)==0) /*若产品名称相同,则按金额从小到大排列*/
if(sell[i].je>sell[j].je)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题六
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDat( )的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat( ),其功能要求:按金额从大到小进行排列,若金额相同,则按产品名称从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat( )把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
【参考答案】
void SortDat()
{
int i,j;
PRO temp;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(sell[i].je<sell[j].je)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
else if(sell[i].je==sell[j].je) if(strcmp(sell[i].mc,sell[j].mc)>0)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题七
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDat( )的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat( ),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat( )把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
【参考答案】
void SortDat()
{
int i,j;
PRO temp;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(strcmp(sell[i].dm,sell[j].dm)<0)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
else if(strcmp(sell[i].dm,sell[j].dm)==0) if(sell[i].je<sell[j].je)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题八
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价数量可计算得出。函数ReadDat( )的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat( ),其功能要求:按产品名称从小到大进行排列,若产品名称相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat( )把结果输出到文件OUT.DAT中。
注意:部分源程序存放在PROG1.C中。请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
【参考答案】
void SortDat()
{ int i,j;
PRO temp;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if (strcmp(sell[i].mc,sell[j].mc)>0)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
else if (strcmp(sell[i].mc,sell[j].mc)==0)
if (sell[i].je<sell[j].je)
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题九
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDat( )的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat( ),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat( )把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
【参考答案】
void SortDat()
{
int i,j; /*定义循环控制变量*/
PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/
for(i=0;i<99;i++) /*利用选择法进行排序*/
for(j=i+1;j<100;j++)
if (sell[i].je>sell[j].je) /*按金额从小到大进行排列*/
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
else if (sell[i].je==sell[j].je) /*若金额相同*/
if (strcmp(sell[i].dm,sell[j].dm)<0) /*则按产品代码从大到小进行排列*/
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
试题十
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中,金额=单价×数量可计算得出。函数ReadDat( )的功能是读取这100个销售记录并存入数组sell中。请编制函数SortDat( ),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从小到大进行排列,排列结果仍存入结构数组sell中,最后调用函数WriteDat( )把结果输出到文件OUT.DAT中。
注意:部分源程序已给出。请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
【参考答案】
void SortDat()
{
int i,j; /*定义循环控制变量*/
PRO temp; /*定义数据交换时的暂存变量(这里是PRO类型的结构体变量)*/
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
{
if (sell[i].je>sell[j].je) /*按金额从小到大进行排列*/
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
else if (sell[i].je==sell[j].je) /*若金额相同*/
if (strcmp(sell[i].dm,sell[j].dm)>0) /*则按产品代码从小到大进行排列*/
{
temp=sell[i];
sell[i]=sell[j];
sell[j]=temp;
}
}
}
第2类 数位分解后按数筛选统计并排序
试题十一
已知数据文件IN.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中。请编制函数jsValue(),其功能是:求出千位数上的数加个位数上的数等于百位数上的数加十位数上的数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用写函数writeDat()把数组b中的数输出到OUT.DAT文件中。
例如:6712,6+2=7+1,则该数满足条件,存入数组b中,且个数cnt=cnt+1。
8129,8+9≠1+2,则该数不满足条件,忽略。
注意:部分源程序已给出。程序中已定义数组:a[300],b[300],已定义变量:cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
【参考答案】
void jsValue()
{
int i,j; /*定义循环控制变量*/
int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/
int temp; /*定义数据交换时的暂存变量*/
for(i=0;i<300;i++)
{
a4=a[i]/1000;
a3=a[i]%1000/100;
a2=a[i]%100/10;
a1=a[i]%10;
if(a4+a1==a3+a2)
{
b[cnt]=a[i];
cnt++;
}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
试题十二
已知数据文件IN.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal( ),其功能是:如果4位数各位上的数字均是奇数,则统计出满足此条件的个数cnt,并把这些4位数按从大到小的顺序存入数组b中。最后调用函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT.DAT文件。
注意:部分源程序已给出。程序中已定义数组:a[200],b[200],已定义变量:cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
【参考答案】
void jsVal()
{
int i,j;
int a1,a2,a3,a4;
int temp;
for(i=0;i<200;i++)
{
a4=a[i]/1000;
a3=a[i]%1000/100;
a2=a[i]%100/10;
a1=a[i]%10;
if(a4%2!=0 && a3%2!=0 && a2%2!=0 && a1%2!=0)
{
b[cnt]=a[i];
cnt++;
}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
试题十三
已知数据文件IN.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数从大到小进行排序,最后调用写函数writeDat()把数组b中的数输出到OUT.DAT文件。
例如:7153,7+1=5+3,则该数满足条件,存入数组b中,且个数cnt=cnt+1。
8129,8+1 ≠2+9,则该数不满足条件,忽略。
注意:部分源程序已给出。程序中已定义数组:a[300],b[300],已定义变量:cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
【参考答案】
void jsValue()
{
int i,j;
int a1,a2,a3,a4;
int temp;
for(i=0;i<300;i++)
{
a4=a[i]/1000;
a3=a[i]%1000/100;
a2=a[i]%100/10;
a1=a[i]%10;
if (a4+a3==a2+a1)
{
b[cnt]=a[i];
cnt++; /*计算满足条件的数的个数*/
}
}
for(i=0;i<cnt-1;i++) /*对数组b中的4位数按从大到小进行排序*/
for(j=i+1;j<cnt;j++)
if(b[i]<b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
试题十四
已知数据文件IN1.DAT和IN2.DAT中分别存有100个两位十进制数,并且已调用读函数readDat()把这两个文件中的数存入数组a和b中,请考生编制一个函数jsVal(),实现的功能是依次对数组a和b中的数按条件重新组成一个新数并依次存入数组c中,再对数组c中的数按从小到大的顺序进行排序,最后调用输出函数writeDat()把结果c输出到文件OUT.DAT中。
组成新数的条件:如果数组a和b中相同下标位置的数必须符合一个是偶数,另一个是奇数,则数组a中的数按二进制数左移八位后再加上数组b对应位置上的数,把这样组成的新数依次存入数组c中。
例如:a:12 33 24 15 21
b:32 35 17 15 18
c:6161 5394
排序后c:5394 6161
注意:部分源程序存在文件PROG1.C文件中。程序中已定义:a[100]、b[100]和c[100]。请勿改动数据文件IN1.DAT和IN2.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
【参考答案】
void jsVal()
{
int i,j; /*定义循环变量*/
int temp; /*用于存储排序中的中间变量*/
for (i = 0;i <= MAX - 1;i++) /*循环查找符合条件的元素*/
if (((a[i] % 2 == 0) && (b[i] % 2 != 0)) || ((a[i] % 2 != 0) && (b[i] % 2 == 0)))
{ /*判断数组a和b中相同下标位置的数是否符合一个是偶数,另一个是奇数*/
c[i] = (a[i]<<8) + b[i]; /*a[i]按二进制左移8位再加上b[i]*/
cnt++; /*记录c中个数*/
}
for (i = 0;i < MAX - 1;i++) /*将C中的元素按从小到大顺序排列*/
for (j = 0;j < MAX - i - 1; j++)
if (c[j] > c[j+1]){
temp = c[j];
c[j] = c[j + 1];
c[j+1] = temp;
}
}
试题十五
已知数据文件IN.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数减百位数上数减十位数上的数减个位数上的数大于零的数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用写函数writeDat()把数组b中的数输出到OUT.DAT文件中。
例如:9123,9-1-2-3>0,则该数满足条件,存入数组b中,且个数cnt=cnt+1。
9812,9-8-1-2<0,则该数不满足条件,忽略。
注意:部分源程序已给出。程序中已定义数组:a[300],b[300],已定义变量:cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
【参考答案】
void jsValue()
{
int i,j; /*定义循环控制变量*/
int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/
int temp; /*定义数据交换时的暂存变量*/
for(i=0;i<300;i++) /*逐个取每一个4位数*/
{
a4=a[i]/1000; /*求4位数的千位数字*/
a3=a[i]%1000/100; /*求4位数的百位数字*/
a2=a[i]%100/10; /*求4位数的十位数字*/
a1=a[i]%10; /*求4位数的个位数字*/
if(a4-a3-a2-a1>0) /*如果千位数减百位数减十位数减个位数大于零*/
{
b[cnt]=a[i];
cnt++;
}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
试题十六
下列程序的功能是:选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些4位自然数的个数cnt及这些数的和sum。请编写函数countValue()实现程序的要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()和写函数writeDAT()的内容。
【参考答案】
void countValue()
{
int i;
int a1,a2,a3,a4;
for(i=5000;i>=1000;i--)
{
a4=i/1000;
a3=i%1000/100;
a2=i%100/10;
a1=i%10;
if(a4+a3==a2+a1 && a4+a3==(a1-a4)*10)
{
cnt++;
sum+=i;
}
}
}
试题十七:已知数据文件IN.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsVal(),其功能是:如果4位数各位上的数字均是0、2、4、6或8,则统计出满足此条件的数的个数cnt,并把这些4位数按从大到小的顺序存入数组b中,最后调用写函数writeDat()把结果cnt及数组b中符合条件的4位数输出到OUT.DAT文件中。
注意:部分源程序已给出。程序中已定义数组:a[200],b[200],已定义变量:cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。【参考答案】
void jsVal()
{
int i,j;
int a1,a2,a3,a4;
int temp;
for(i=0;i<200;i++)
{
a4=a[i]/1000;
a3=a[i]%1000/100;
a2=a[i]%100/10;
a1=a[i]%10;
if(a4%2==0 && a3%2==0 && a2%2==0 && a1%2==0)
{
b[cnt]=a[i];
cnt++;
}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
试题十八:已知数据文件IN.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue( ),其功能是:求出个位数上的数减千位数上数减百位数上的数减十位数上的数大于零的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从大到小的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到OUT.DAT文件中。
例如:1239,9-1-2-3>0,则该数满足条件,存入数组b中,且个数cnt=cnt+1。
8129,9-8-1-2<0,则该数不满足条件,忽略。
注意:部分源程序已给出。程序中已定义数组:a[300],b[300],已定义变量:cnt。请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。【参考答案】
void jsValue()
{
int i,j; /*定义循环控制变量*/
int a1,a2,a3,a4; /*定义变量保存4位数的每位数字*/
int temp; /*定义数据交换时的暂存变量*/
for(i=0;i<300;i++) /*逐个取每一个4位数*/
{
a4=a[i]/1000; /*求4位数的千位数字*/
a3=a[i]%1000/100; /*求4位数的百位数字*/
a2=a[i]%100/10; /*求4位数的十位数字*/
a1=a[i]%10; /*求4位数的个位数字*/
if(a1-a3-a2-a4>0) /*如果个位数减千位数减百位数减十位数大于零*/
{
b[cnt]=a[i]; /*则将满足条件的数存入数组b中*/
cnt++; /*统计满足条件的数的个数*/
}
}
for(i=0;i<cnt-1;i++) /*对数组b的4位数按从大到小的顺序进行排序*/
for(j=i+1;j<cnt;j++)
if(b[i]<b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
试题十九
展开阅读全文