最新全国计算机等级考试三级(C语言)上机考试试题总结
第一种: 产品销售记录问题:
/* 已知在文件IN.DAT中存有100个产品销售记录, 每个产品销售记录由产品代码dm(字符型4位), 产品名称mc(字符型10位), 单价dj(整型), 数量sl(整型), 金额je(长整型)五部分组成。 其中:
金额=单价*数量计算得出。函数ReadDat( )读取这100个销售记录并存入结构数组sell中。请编制函数SortDat( ), 其功能要求: 按金额从小到大进行排列, 若金额相等, 则按产品代码从小到大进行排列, 最终排列结果仍存入结构数组sell中。最后main( )函 数调用函数WriteDat()把结果输出到文件OUT1.DAT中。 注意: 部分源程序存放在PROG1.C中。
#define MAX 100
typedef struct {
char dm[5] ; /* 产品代码 */
char mc[11] ; /* 产品名称 */
int dj ; /* 单价 */
int sl ; /* 数量 */
long je ; /* 金额 */
} PRO ;
函数解析://if((sell[i].je>sell[j].je)||(sell[i].je==sell[j].je)&&(strcmp(sell[i].dm,
sell[j].dm)>0))是此题的精华所在理解它 就理解了这道题的编程道理
首先sell[i].je>sell[j].je如果金额大小成立的话,就条件成立,把两个数据换位置,如果前者不成立,就判定金额是否 相等,如果相等的话,代码还有大小的话,按从小到大的顺序排列。
这种函数的编程方法,适用于有一定基础的编程者,如果是初学者的话建议用以下函数来表达, 此方法是按照题意一部一部来分析的,是比较保守的编程方法。
void SortDat()
{ int i,j;
PRO swap;
for(i=0; i < MAX-1; i++)
{ for(j=i+1; j < MAX; j++)
if(sell[i].je>sell[j].je)
{swap=sell[i]; sell[i]=sell[j]; sell[j]=swap;}
else if((sell[i].je==sell[j].je)&&(strcmp(sell[i].dm,sell[j].dm)>0))
{swap=sell[i]; sell[i]=sell[j]; sell[j]=swap;}
}
100个产品销售记录排序其余9题说明
1) in.dat 内容完全相同。
2) 程序也基本雷同,仅排序的要求不一样。
3) 考生应熟悉 strcmp() 函数,否则有的题相当不好处理。
试题变化 :
排序要求:
按金额从小到大进行排列, 若金额相等, 则按产品代码从大到小 进行排列 相应语句:
if((sell[i].je>sell[j].je)||( (sell[i].je==sell[j].je) && (strcmp(sell[i].dm, sell[j].dm) < 0)))
排序要求: 按金额从大到小进行排列, 若金额相等, 则按产品代码从小到大 进行排列 相应语句: if((sell[i].je < sell[j].je)||(sell[i].je==sell[j].je)&&(strcmp(sell[i].dm, sell[j].dm)>0))
排序要求:
按金额从大到小进行排列, 若金额相等, 则按产品代码从大到小 进行排列 相应语句:
if((sell[i].je < sell[j].je)||(sell[i].je==sell[j].je)&&(strcmp(sell[i].dm,sell[j].dm)<0))
排序要求:
按产品名称从小到大进行排列, 若产品名称相同, 则按金额从小 到大进行排列
if((strcmp(sell[i].mc, sell[j].mc)>0)||(strcmp(sell[i].mc,sell[j].mc)==0)&&(sell[i].je>sell[j].je))
排序要求:
按产品名称从小到大进行排列, 若产品名称相同, 则按金额从大 到小进行排列
if(strcmp(sell[i].mc, sell[j].mc)>0 || (strcmp(sell[i].mc, sell[j].mc)==0)&&(sell[i].je < sell[j].je))
排序要求:
按产品名称从大到小进行排列, 若产品名称相同, 则按金额从小 到大进行排列
if((strcmp(sell[i].mc, sell[j].mc) < 0) || (strcmp(sell[i].mc,sell[j].mc)==0)&&(sell[i].je>sell[j].je))
排序要求:
按产品名称从大到小进行排列, 若产品名称相同, 则按金额从大 到小进行排列
if((strcmp(sell[i].mc, sell[j].mc) < 0)|| (strcmp(sell[i].mc, sell[j].mc)==0)&&(sell[i].je < sell[j].je))
排序要求:
按产品代码从小到大进行排列, 若产品代码相同, 则按金额从小 到大进行排列
if((strcmp(sell[i].dm, sell[j].dm)>0)||(strcmp(sell[i].dm,sell[j].dm)==0)&&(sell[i].je>sell[j].je
第二类习题 300个四位数问题:
300个四位数问题(此类共10题) 本类10题中,五题产生数组B,并对B按一定要求排序;
其余五题是求平均值。我把它们分成两组五题来讨论。 以下为产生数组B之题一:
已知数据文件IN.DAT中存有300个四位数, 并已调用读函数 readDat()把这些数存入数组a中, 请编制一函数jsvalue(),其功 能是: 求出个位数上的数减千位数上的数减百位数上的数减十位 数上的数大于零的个数cnt, 再把所有满足此条件的四位数依次 存入数组b中, 然后对数组b的四位数按从大到小的顺序进行排序。 最后main( )函数调用写函数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
#include
int a[300], b[300], cnt=0 ;
jsvalue()
{/**/
int i,j,g,s,b,q,t;
for(i=0; i < 300; i++)
{g=a[i]%10; /*个位的数字*/
s=a[i]/10%10; /*十位的数字*/
b=a[i]/100%10; /*百位的数字*/
q=a[i]/1000; /*千位的数字*/
if(g-q-b-s>0)
b[cnt++]=a[i];
for(i=0; i < cnt-1; i++)
for(j=i+1; j < cnt; j++)
if(b[i] < b[j])
{ t=b[i]; b[i]=b[j]; b[j]=t; }
}
/**/
}
相似题 求出所有这些四位数是素数的个数cnt, 再把所有满足此 条件的四位数依次存入数组b中, 然后对数组b的四位数按从小到 大的顺序进行排序。
jsvalue()
{ int i,j,t;
for(i=0; i < 300; i++)
{ for(j=2;j if(a[i]%j==0) break;
if(j==a[i])
b[cnt++]=a[i];
for(i=0; i < cnt-1; i++) /*排序*/
for(j=i+1; j < cnt; j++)
if(b[i] < b[j])
{ t=b[i]; b[i]=b[j]; b[j]=t; }
}
要求: 求出千位数上的数减百位数上的数减十位数上的数减个位 数上的数大于零的个数cnt, 再把所有满足此条件的四位数依次 存入数组b中, 然后对数组b的四位数按从小到大的顺序进行排序。
if(q-b-s-g>0)
b[cnt++]=a[i];
要求: 求出千位数上的数加百位数上的数等于十位数上的数加个 位数上的数的个数cnt, 再把所有满足此条件的四位数依次存入 数组b中, 然后对数组b的四位数按从大到小的顺序进行排序。
if((q+b)==(s+g))
b[cnt++]=a[i];
类型题三:300个数满足条件的求平均值
求满足条件的数的个数、平均值及不满足条件的数的平均 值等,此类也是五题。本处仅给出一个全题,其余题只给出不同 之处。
已知数据文件IN.DAT中存有300个四位数, 并已调用读函数 readDat()把这些数存入数组a中, 请编制一函数jsvalue(),其功 能是: 求出千位数上的数减百位数上的数减十位数上的数减个位 数上的数大于零的个数cnt, 再求出所有满足此条件的四位数平 均值pjz1, 以及所有不满足此条件的四位数平均值pjz2。最后 main()函数调用写函数writeDat()把结果cnt,pjz1,pjz2输出到 OUT.DAT文件。
例如: 9123, 9-1-2-3>0, 则该数满足条件计算平均值pjz1, 且个数cnt=cnt+1。 9812, 9-8-1-2<0, 则该数不满足条件计算平均值pjz2。 程序中已定义数组: a[300], 已定义变量: cnt,pjz1,pjz2
int a[300], cnt=0 ;
double pjz1=0.0, pjz2=0.0 ;
jsvalue()
{/**/
int i,g,s,b,q;
for(i=0; i < 300; i++)
{g=a[i]%10; /*个位的数字*/
s=a[i]/10%10; /*十位的数字*/
b=a[i]/100%10; /*百位的数字*/
q=a[i]/1000; /*千位的数字*/
if(g-q-b-s>0)
{ cnt++; pjz1+=a[i]; }
else pjz2+=a[i];
if(cnt) pjz1/=cnt;
if(cnt<300) pjz2/=300-cnt;
/**/
}
之二 要求:
求出千位数上的数加百位数上的数等于十位数上的数加个 位数上的数的个数cnt, 再求出所有满足此条件的四位数平均值 pjz1, 以及所有不满足此条件的四位数平均值pjz2。
if((q+b)==(g+s))
{ cnt++; pjz1+=a[i]; }
else pjz2+=a[i];
之三 要求:
求出个位数上的数减千位数上的数减百位数上的数减十位 数上的数小于零的个数cnt, 再求出所有满足此条件的四位数平 均值pjz1, 以及所有不满足此条件的四位数平均值pjz2。
if(g-q-b-s<0)
{ cnt++; pjz1+=a[i]; }
else pjz2+=a[i];
之四 要求:
求出所有这些四位数是素数的个数cnt, 再求出所有满足 此条件的四位数平均z值pjz1, 以及所有不满足此条件的四位数平 均值pjz2。
jsvalue()
{/**/
int i,j,t;
for(i=0; i < 300; i++)
{ for(j=2;j if(a[i]%j==0)
{pjz2+=a[i];
break;}
if(j==a[i])
{cnt++; pjz1+=a[i];}
if(cnt) pjz1/=cnt;
if(cnt<300) pjz2/=300-cnt;
}
之五 要求:
求出千位数上的数加个位数上的数等于百位数上的数加十 位数上的数的个数cnt, 再求出所有满足此条件的四位数平均值 pjz1, 以及所有不满足此条件的四位数平均值pjz2。
if((q+g)==(b+s))
{ cnt++; pjz1+=a[i]; }
else pjz2+=a[i];
code:
/*
类型题四: 200个四位数题:
已知数据文件IN.DAT中存有200个四位数, 并已调用读函数 readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其 功能是: 把�