最新全国计算机等级考试三级(C语言)上机考试试题总结

4/14/2005来源:全国等级考试人气:18017

 最新全国计算机等级考试三级(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;
 /**/
 }