三级上机考试题型分析及解答文档格式.docx
《三级上机考试题型分析及解答文档格式.docx》由会员分享,可在线阅读,更多相关《三级上机考试题型分析及解答文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
![三级上机考试题型分析及解答文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/15/66da536b-fdd2-414e-88f0-5de9d19fba6d/66da536b-fdd2-414e-88f0-5de9d19fba6d1.gif)
再筛选排序
8%
统计及求平均值
4%
4位数字之间比较后
再统计排序
数据排序问题
5%
数学类问题
数学计算类
范围查找类
字符串操作类问题
字符串替代
字符串更改或移动
11%
字符串排序及调换
6%
选票问题
3%
现在对这些题型进行分析及解答。
第一套销售记录排序问题
试题内容
已知在文件INT.DAT中有100个产品记录,每个产品由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)、几部分组成。
其中:
金额=单价×
数量。
函数ReadDat()的功能是读取这100个记录并存入结构数组sell中。
请编制函数SortDat(),其功能要求:
按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列,最终结果仍存在入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT.DAT中。
注意:
部分源程序已给出。
请勿改动主函数main()、读函数ReanDat()和写函数WriteDat()的内容。
【题型分析】本题考查结构体数组的排序。
考查的知识点包括:
结构体成员的运算,字符串的比较,数组排序。
【解题思路】解题时,应注意3个关键点:
关键点1如何按产品名称从大到小排序;
关键点2如果产品名称相同;
关键点3如何按金额从小到大排列。
数组排序可以用冒泡法实现,冒泡法的思路是:
将较大的值像空气一样逐渐“上浮”到数组的顶部,而较小的的数值逐渐“下沉”到数组的底部。
具体为第一趟用第1个记录第2个记录进行比较,如果第1个记录小于第2个记录,就进行交换,然后用第1个记录和第3个记录比较,直到第1个记录和最后1个记录比较完成,这样完成1趟比较后,第1个记录的值就不小于后面所有记录的值,比较了99次;
第2趟用第2个记录和3个记录比较,直到最后1个记录,比较了98次,以此类推。
本题一共需要比较99趟,每趟比较n-j次。
在双循环中进行每次记录比较时,首先用字符串比较函数strcmp比较两个产品的名称,strcmp(sell[i].dm,sell[j].dm)的函数值返回值为一个整数,若比较的两个字符串相等返回0,前者大于后者返回一个正整数,前者小于后者返回一个负整数。
程序的流程是:
首先调用memset()函数,该函数的功能是将sell数组的前sizeof(sell)个字节的值赋为0。
然后调用ReadDat()函数读入数据到结构体数组sell中。
由考生编制的SortDat()函数处理后,再由WriteDat()函数写回文件OUT.DAT中。
所以,在查看结果时,这一题在屏幕上是没有显示的,而需要考生打开OUT.DAT文件进行查看。
IN.DAT原始数据片段如下:
1001软件世界5100
1002计算机用户6120
1003网上生活271
1004网络互连4510
1005威宝3.551000
10063M3.53150
1007办公自动化90100
1008JAVA4815
1009中文WORD976810
1010EXCLE9798103
1011OFFICE9710818
1012ACCESS6478
1013二级BASIC6566
1014二级PASCAL6689
1015二级C6799
1016二级FOR6612
1017二级FOX66100
1018AUTOCAD98871
1019PhotoShop6864
1020一级78101
1021一级B类981000
1022三级A类78765
1023三级B类78888
1024四级88666
1025INTERNET581858
1001软件世界5101
1003网上生活2731
1004网络互连451000
源程序及题解如下:
#include<
stdio.h>
string.h>
stdlib.h>
#defineMAX100
typedefstruct
{
chardm[5];
/*产品代码*/
charmc[11];
/*产品名称*/
intdj;
/*单价*/
intsl;
/*数量*/
longje;
/*金额*/
}PRO;
PROsell[MAX];
voidReadDat();
voidWriteDat();
voidSortDat()
{inti,j;
/*定义循环控制变量*/
PROtemp;
/*定义数据交换时的暂存变量(这里是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;
}
elseif(strcmp(sell[i].mc,sell[j].mc)==0)/*若产品名称相同*/
if(sell[i].je>
sell[j].je)/*则按金额从小到大进行排列*/
}
voidmain()
memset(sell,0,sizeof(sell));
ReadDat();
SortDat();
WriteDat();
voidReadDat()
FILE*fp;
charstr[80],ch[11];
inti;
fp=fopen("
IN.DAT"
"
r"
);
for(i=0;
i<
100;
i++){
fgets(str,80,fp);
memcpy(sell[i].dm,str,4);
memcpy(sell[i].mc,str+4,10);
memcpy(ch,str+14,4);
ch[4]=0;
sell[i].dj=atoi(ch);
memcpy(ch,str+18,5);
ch[5]=0;
sell[i].sl=atoi(ch);
sell[i].je=(long)sell[i].dj*sell[i].sl;
fclose(fp);
voidWriteDat()
OUT.DAT"
w"
fprintf(fp,"
%s%s%4d%5d%10ld\n"
sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
第二套4位数排序或筛选问题(根据数位数字的关系排序)
试题内容:
已知数据文件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。
【题型分析】本题考查对多个整数的筛选以及排序。
多位整数的分解算法,逻辑表达式,数组排序算法。
【解题思路】此题属于4位数的筛选问题,并且需求出各位数的数字,再筛选排序。
解此类题目需主要解决3个问题:
问题1如何取得4位数的各个数位数字;
问题2如何通过条件(本题为千位数字加上个数字等于百位数字加上十位数字)筛选出满足条件的数;
问题3如何对数组中的数进行排序。
解此类题的一般思路为:
先求出每个数的各位数字,再根据各位数字筛选出满足条件的数存入新的数组中,最后对新数组进行排序。
对于问题1,通过算术取余和整除可以分解得到4位数的各个数位上的数字;
对于问题2,通过if条件语句和逻辑表达式可以实现;
对于问题3,排序可以通过双循环的冒泡法来完成。
inta[300],b[300],cnt=0;
voidreadDat();
voidwriteDat();
voidjsValue()
{inti,j;
inta1,a2,a3,a4;
inttemp;
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];
/*将满足条件的数存入数组b中*/
cnt++;
/*统计满足条件的数的个数cnt*/
for(i=0;
cnt-1;
i++)/*对b数组的4位数从小到大升序排序*/
cnt;
if(b[i]>
b[j])
{temp=b[i];
b[i]=b[j];
b[j]=temp;
{
inti;
readDat();
jsValue();
writeDAt();
printf(“cnt=%d\n”,cnt);
printf(“b[%d]=%d\n”,i,b[i]);
voidreadDat()
FILE*fp;