C语言程序设计.docx
《C语言程序设计.docx》由会员分享,可在线阅读,更多相关《C语言程序设计.docx(68页珍藏版)》请在冰豆网上搜索。
![C语言程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/24/2dae08a7-0a28-4a4b-9665-527713a65d6c/2dae08a7-0a28-4a4b-9665-527713a65d6c1.gif)
C语言程序设计
查看文章
最新全国计算机等级考试三级(C语言)上机考试试题总结
2008年03月04日星期二12:
11P.M.
最新全国计算机等级考试三级(C语言)上机考试试题总结
版权所有:
中国个人站长站2007-2008
第一种:
产品销售记录问题:
/*已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。
其中:
金额=单价*数量计算得出。
函数ReadDat()读取这100个销售记录并存入结构数组sell中。
请编制函数SortDat(),其功能要求:
按金额从小到大进行排列,若金额相等,则按产品代码从小到大进行排列,最终排列结果仍存入结构数组sell中。
最后main()函数调用函数WriteDat()把结果输出到文件OUT1.DAT中。
注意:
部分源程序存放在PROG1.C中。
#defineMAX100
typedefstruct{
chardm[5];/*产品代码*/
charmc[11];/*产品名称*/
intdj;/*单价*/
intsl;/*数量*/
longje;/*金额*/
}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如果金额大小成立的话,就条件成立,把两个数据换位置,如果前者不成立,就判定金额是否相等,如果相等的话,代码还有大小的话,按从小到大的顺序排列。
这种函数的编程方法,适用于有一定基础的编程者,如果是初学者的话建议用以下函数来表达,此方法是按照题意一部一部来分析的,是比较保守的编程方法。
voidSortDat()
{inti,j;
PROswap;
for(i=0;i{for(j=i+1;jif(sell[i].je>sell[j].je)
{swap=sell[i];sell[i]=sell[j];sell[j]=swap;}
elseif((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].je0))
排序要求:
按金额从大到小进行排列,若金额相等,则按产品代码从大到小进行排列相应语句:
if((sell[i].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排序要求:
按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列
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排序要求:
按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列
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
inta[300],b[300],cnt=0;
jsvalue()
{/**/
inti,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;ifor(j=i+1;jif(b[i]
{t=b[i];b[i]=b[j];b[j]=t;}
}
/**/
}
相似题求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序。
jsvalue()
{inti,j,t;
for(i=0;i<300;i++)
{for(j=2;jif(a[i]%j==0)break;
if(j==a[i])
b[cnt++]=a[i];
for(i=0;ifor(j=i+1;jif(b[i]
{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
inta[300],cnt=0;
doublepjz1=0.0,pjz2=0.0;
jsvalue()
{/**/
inti,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];}
elsepjz2+=a[i];
if(cnt)pjz1/=cnt;
if(cnt<300)pjz2/=300-cnt;
/**/
}
之二要求:
求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及所有不满足此条件的四位数平均值pjz2。
if((q+b)==(g+s))
{cnt++;pjz1+=a[i];}
elsepjz2+=a[i];
之三要求:
求出个位数上的数减千位数上的数减百位数上的数减十位数上的数小于零的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及所有不满足此条件的四位数平均值pjz2。
if(g-q-b-s<0)
{cnt++;pjz1+=a[i];}
elsepjz2+=a[i];
之四要求:
求出所有这些四位数是素数的个数cnt,再求出所有满足此条件的四位数平均z值pjz1,以及所有不满足此条件的四位数平均值pjz2。
jsvalue()
{/**/
inti,j,t;
for(i=0;i<300;i++)
{for(j=2;jif(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];}
elsepjz2+=a[i];
code:
/*
类型题四:
200个四位数题:
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:
把千位数字和十位数字重新组成一个新的十位数ab(新
十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab>cd,ab必须是偶数且能被5整除,cd必须是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
程序中已定义数组:
a[200],b[200],已定义变量:
cnt
#include
#defineMAX200
inta[MAX],b[MAX],cnt=0;
voidjsVal()
{/**/
inti,j,k,A,B,C,D;
for(i=0;i{A=a[i]/1000;B=a[i]/10%10;C=a[i]%10;D=a[i]/100%10;
if(A&&C&&(B==0)&&(D%2)&&(10*A>10*C+D))
b[cnt++]=a[i];
}
for(i=0;i{k=i;
for(j=i+1;jif(b[k]
if(k!
=i){A=b[k];b[k]=b[i];b[i]=A;}
}
/**/
}
200个四位数题之其余九题说明
之二要求:
把千位数字和十位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十
位数均是素数且新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
要求:
把个位数字和千位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的千位数字),以及把百位数字和十位数字组成另一个新的十位数(新十位数的十位数字是原四位数的百位数字,新十位数的个位数字是原四位数的十位数字),如果新组成的两个十位数必须是一个奇数,另一个为偶数并且两个十位数中至少有一个数能被17整除,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足
上述条件的四位数的个数cnt。
之四要求:
)把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:
把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab-cd>=10且ab-cd<=20且两个数均是偶数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
之五要求:
如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。
之六要求:
把千位数字和个位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的个位数字),以及把百位数字和十位数字组成另一个新的十位数(新十位数的十位数字是原四位数的百位数字,新十位数的个位数字是原四位数的十位数字),如果新组成的两个十
位数均是奇数并且两个十位数中至少有一个数能被5整除,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
之七要求:
把个位数字和千位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的千位数字),以及把百位数字和十位数字组成另一个新的十位数(新十位数的十位数字是原四位数的百位数字,新十位数的个位数字是原四位数的十位数字),如果新组成的两个十
位数均是偶数并且两个十位数中至少有一个数能被9整除,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
之八要求:
把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两
个十位数ab同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
之九要求:
如果四位数各位上的数字均是奇数,则统计出满足此条件的个数cnt并把这些四位数按从大到小的顺序存入数组b中。
之十要求:
把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两
个十位数ab-cd>=0且ab-cd<=10且两个数均是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
类型题五
已知在文件IN.DAT中存有若干个(个数<200)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。
请编制函数Calvalue(),其功能要求:
1.求出这文件中共有多少个正整数totNum;2.求这些数右移1位后,产生的新数是奇数的数的个数totCnt,以及满足此条件的这些数(右移前的值)的算术平均值totPjz。
最后main()函数调用函数WriteDat()把所求的结果输出到文件OUT.DAT中。
#defineMAXNUM200
intxx[MAXNUM];
inttotNum=0;/*文件IN.DAT中共有多少个正整数*/
inttotCnt=0;/*符合条件的正整数的个数*/
doubletotPjz=0.0;/*平均值*/
voidCalvalue(void)
{/**/
for(;xx[totNum];totNum++)
if((xx[totNum]>>1)%2)
{totCnt++;totPjz+=xx[totNum];}
if(totCnt)totPjz/=totCnt;
/**/
}
类似题一、编制函数Calvalue(),其功能要求:
1.求出这文件中共有多少个正整数totNum;2.求这些数右移1位后,产生的新数是偶数的数的个数totCnt,以及满足此条件的这些数(右移前的值)的算术平均值totPjz。
voidCalvalue(void)
{/**/
for(;xx[totNum]>0;totNum++)
if((xx[totNum]>>1)%2==0)
{totCnt++;totPjz+=xx[totNum];}
if(totCnt)totPjz/=totCnt;
/**/
类型题六
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数SortCharD(),其函数的功能是:
以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按行
重新存入字符串数组xx中。
最后main()函数调用函数WriteDat()把结果xx输出到文件OUT2.DAT中。
例:
原文:
dAe,BfC.
CCbbAA
结果:
fedCBA.,
bbCCAA
charxx[50][80];
intmaxline=0;/*文章的总行数*/
voidSortCharD(void)
{/**/
inti,j,k,m,n;charch;
for(i=0;i{j=strlen(xx[i]);/*求出每行的字符个数*/
for(m=0;m{for(n=m+1;nif(xx[i][m]{ch=xx[i][m];xx[i][m]=xx[i][n];xx[i][n]=ch;}
}
}
/**/
}
处理字符串类型题之二
code:
/*请编制函数ConvertCharA(),其函数的功能是:
以行为单位把字符串中的所有小写字母改写成该字母的下一个字母,如果是字母z,则改写成字母a,大写字母和其它字符保持不变。
把已处理的字符串仍按行重新存入字符串数组xx中。
voidConvertCharA(void)
{/**/
inti,j;
for(i=0;ifor(j=0;jif(xx[i][j]=='z')xx[i][j]='a';/*如果是z的话,就变为a*/
elseif((xx[i][j]>='a')&&(xx[i][j]<'z'))
xx[i][j]++;/*如果不是z的话就把字符向
后移动一个。
*/
/**/
}
字符串类型题之三
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数SortCharA(),其函数的功能是:
以行为单位对字符按从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中。
voidSortCharD(void)
{/**/