|
|
|
|
|
最新全国计算机等级考试三级(C语言)上机考试试题总结 |
发布时间:2006-10-14 8:53:12 |
|
收集提供:gaoqian |
|
|
最新全国计算机等级考试三级(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(),其 功能是: 把千位数字和十位数字重新组成一个新的十位数ab(新 十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字), 以及把个位数字和百位数字组成另一 个新的十位数cd (新十位数的十位数字是原四位数的个位数字, 新十位数的个位数字是原四位数的百位数字), 如果新组成的两 个十位数ab>cd, ab必须是偶数且能被5整除, cd必须是奇数,同 时两个新数的十位数字均不为零,则将满足此条件的四位数按从 大到小的顺序存入数组b中, 并要计算满足上述条件的四位数的 个数cnt。 程序中已定义数组: a[200], b[200], 已定义变量: cnt #include #define MAX 200 int a[MAX], b[MAX], cnt = 0 ; void jsVal() {/**/ int i,j,k,A,B,C,D; for(i=0; i < MAX; 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 < cnt-1; i++) { k=i; for(j=i+1; j < cnt; j++) if(b[k] < b[j]) k=j; 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中。 #define MAXNUM 200 int xx[MAXNUM] ; int totNum = 0 ; /* 文件IN.DAT中共有多少个正整数 */ int totCnt = 0 ; /* 符合条件的正整数的个数 */ double totPjz = 0.0 ; /* 平均值 */ void Calvalue(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。 void Calvalue(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 char xx[50][80] ; int maxline = 0 ; /* 文章的总行数 */ void SortCharD(void) {/**/ int i,j,k,m,n; char ch; for(i=0; i < maxline; i++) { j=strlen(xx[i]); /*求出每行的字符个数*/ for(m=0; m < j-1; m++) { for(n=m+1; n < j; n++) if(xx[i][m] < xx[i][n]) { ch=xx[i][m]; xx[i][m]=xx[i][n]; xx[i][n]=ch; } } } /**/ } 处理字符串类型题之二 code: /* 请编制函数ConvertCharA(), 其函数的功能是: 以行为单位 把字符串中的所有小写字母改写成该字母的下一 个字母, 如果是字母z, 则改写成字母a,大写字母和其它字符保持不变。把已处理的字符串仍按行重新存入字符串数组xx中。 void ConvertCharA(void) {/**/ int i,j; for(i=0; i < maxline; i++) for(j=0; j < strlen(xx[i]); j++) if(xx[i][j]=='z') xx[i][j]='a'; /*如果是z的话,就变为a*/ else if((xx[i][j]>='a')&&(xx[i][j]<'z')) xx[i][j]++;/*如果不是z的话就把字符向 后移动一个。*/ /**/ } 字符串类型题之三 函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到 字符串数组xx中; 请编制函数SortCharA( ), 其函数的功能是: 以行为单位对字符按从小到大的顺序进行排序, 排序后的结果仍按行 重新存入字符串数组xx中。 void SortCharD(void) {/**/ int i,j,k,m,n; char ch; for(i=0; i < maxline; i++) { j=strlen(xx[i]); /*求出每行的字符个数*/ for(m=0; m < j-1; m++) { for(n=m+1; n < j; n++) if(xx[i][m] > xx[i][n]) { ch=xx[i][m]; xx[i][m]=xx[i][n]; xx[i][n]=ch; } } } 字符串处理之四 函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到 字符串数组xx中; 请编制函数StrCharJL( ), 其函数的功能是: 以 行为单位把字符串中的所有字符的ASCII值左移4位, 如果左移后, 其字符的ASCII值小于等于32或大于100, 则原字符保持不变, 否则就把左移后的字符ASCII值再加上原字符的ASCII值, 得到新的字符仍存入原字符串对应的位置上,之后把已处理的字符串仍按行重新 存入字符串数组xx中。最后main()函数调用函数WriteDat()把结果 xx输出到OUT7.DAT文件中。 void StrCharJL(void) {/**/ int i,j; char m; /****此题的关键是定义 char m ,如果定义为int c的话就会出现错误 for(i=0; i < maxline; i++) for(j=0; j < strlen(xx[i]); j++) { m=xx[i][j]<<4; if((m>32)&&(m<=100)) xx[i][j]+=m; } } 字符串处理之五 : 函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到 字符串数组xx中; 请编制函数StrCharJR( ), 其函数的功能是: 以行为单位把字符串中的所有字符的ASCII值右移4位, 然后把右移后 的字符ASCII值再加上原字符的ASCII值, 得到新的字符仍存入原字符串对应的位置上,之后把已处理的字符串仍按行重新存入字符串 数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到文 件OUT8.DAT中。 void StrCharJR(void) {/**/ int i,j; for(i=0; i for(j=0; j xx[i][j]+=xx[i][j]>>4; /**/ } 字符串处理之六: 函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入 到字符串数组xx中; 请编制函数ConvertCharD(), 其函数的功能 是: 以行为单位把字符串中的所有小写字母改写成该字母的上一 个字母, 如果是字母a, 则改写成字母z,大写字母和其它字符保持不变。把已处理的字符串仍按行重新存入字符串数组xx中。 void ConvertCharD(void) {/**/ int i,j; for(i=0; i < maxline; i++) for(j=0; j < strlen(xx[i]); j++) if(xx[i][j]=='a') xx[i][j]='z'; else if(islower(xx[i][j])) xx[i][j]-=1; /**/ }
|
|
|
|
|
|
|
|
|