点击这里给我发消息 点击这里给我发消息

计算机等级:7道经典C语言上机试题解析

添加时间:2013-12-7
    相关阅读: 程序 C语言
副标题#e#

    注意:部分源程序存放在prog1.c中请勿改动主函数main()和输出数据函数writeDAT()的内容。

    函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按行优先把所有的小写字母替换成它前面的字母其它不变,a换成z,例如:Aabm.() 输出 Azal.() 最后调用函数WriteDat()把结果xx输出到文件PS10.DAT中。

    部分源程序已给出,原始数据文件存放的格式是:每行的宽度均小于80个字符。

    请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。

    以下是引用片段:

 #include
  #include
  #include
  #include
  unsigned char xx[50][80];
  int maxline=0;/*文章的总行数*/
  int ReadDat(void)
  void WriteDat(void)
  void encryptChar()
  {
  }
  void main()
  {
  clrscr();
  if(ReadDat()){
  printf("数据文件ENG.IN不能打开!/n/007");
  return;
  }
  encryptChar();
  WriteDat();
  }
  int ReadDat(void)
  {
  FILE *fp;
  int i=0;
  unsigned char *p;
  if((fp=fopen("eng.in","r"))==NULL) return 1;
  while(fgets(xx[i],80,fp)!=NULL){
  p=strchr(xx[i],'/n');
  if(p)*p=0;
  i++;
  }
  maxline=i;
  fclose(fp);
  return 0;
  }
  void WriteDat(void)
  {
  FILE *fp;
  int i;
  fp=fopen("ps10.dat","w");
  for(i=0;i 
  printf("%s/n",xx[i]);
  fprintf(fp,"%s/n",xx[i]);
  }
  fclose(fp);
  }

    解:

    以下是引用片段:

 void encryptChar()
  {int i,j;
  for (i=0;i<50;i++)
  for (j=0;j<80;j++)
  if (xx[i][j]=='a') xx[i][j]='z';
  else (xx[i][j]>='b'&&xx[i][j]<='z') xx[i][j]-=1;
  }

    2、函数ReadDat()的功能是实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数StrChar JR();该函数的功能是:以行为单位把字符串中的所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCTT值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件OUT8.DAT中。

    原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。

    注意:部分源程序已给出。

    请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。

    试题程序:

    以下是引用片段:

 #include
  #include
  #include
  char xx[50][80];
  int maxline=0;/*文章的总行数*/
  int ReadDat(void);
  void WriteDat(void);
  void StrCharJR(void)
  {
  }
  void main()
  {
  clrscr();
  if(ReadDat()){
  printf("数据文件IN.DAT不能打开!/n/007");
  return;
  }
  StrCharJR();
  WriteDat();
  }
  int ReadDat(void)
  {
  FILE *fp;
  int i=0;
  char *p;
  if((fp=fopen("IN,DAT","r"))==NULL) return 1;
  while(fgets(xx[i],80,fp)!=NULL){
  p=strchr(xx[i],`/n`);
  if(p) *p=0;
  i++;
  }
  maxline=i;
  fclose(fp);
  return 0;
  }
  void WriteDat(void)
  {
  FILE *fp;
  int i;
  clrscr();
  fp=fopen("OUT8.DAT","w");
  for(i=0;i 
  printf("%s/n",xx[i]);
  fprintf(fp,"%s/n",xx[i]);
  }
  fclose(fp);
  }
  --------------------------------------------------------------------------------
  void StrCharJR(void)
  {int I,j,strl;
  for(I=0;I 
  {strl=strlen(xx[I]);
  for(j=0;j 
  xx[I][j]+=xx[I][j]>>4;
  }
  }

 

#p#副标题#e#

 

    3、已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价*数量可计算得出。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT10.DAT中。

    注意:部分源程序已给出。

    请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。

    试题程序:

    以下是引用片段:

 #include
  #include
  #include
  #include
  #include
  #define MAX 100
  typedef struct{
  char dm[5]; /*产品代码*/
  char mc[11]; /*产品名称*/
  int dj; /*单价*/
  int sl; /*数量*/
  long je; /*金额*/
  }PRO;
  PRO sell[MAX];
  void ReadDat();
  void WriteDat();
  void SortDat()
  {
  }
  void main()
  {
  memset(sell,0,sizeof(sell));
  ReadDat();
  SortDat();
  WriteDat();
  }
  void ReadDat()
  {
  FILE *fp;
  char str[80],ch[11];
  int i;
  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);
  }
  void WriteDat()
  {
  FILE *fp;
  int i;
  fp=fopen("OUT10.DAT","w");
  for(i=0;i<100;i++){
  fprintf(fp,"%s %s %4d %5d %101d/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
  }
  fclose(fp);
  }
  --------------------------------------------------------------------------------
  void SortDat( )
  {int I,j;
  PRO xy;
  for(I=0;I<99;I++)
  for(j=I+1;j<100;j++)
  if(sell[I].dm 
  {xy=sell[I];
  sell[I]=sell[j];
  sell[j]=xy;}
  else if(sell[I].dm==sell[j].dm)
  if(sell[I].je 
  {xy=sell[I];
  sell[I]=sell[j];
  sell[j]=xy;}
  }

    4、已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT8.DAT中。

    部分源程序已给出。

    请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。

    以下是引用片段:

 #include
  #include
  #include
  #include
  #include
  #define MAX 100
  typedef struct{
  char dm[5]; /*产品代码*/
  char mc[11]; /*产品名称*/
  int dj; /*单价*/
  int sl; /*数量*/
  long je; /*金额*/
  }PRO;
  PRO sell[MAX];
  void ReadDat();
  void WriteDat();
  void SortDat()
  {
  }
  void main()
  {
  memset(sell,0,sizeof(sell));
  ReadDat();
  SortDat();
  WriteDat();
  }
  void ReadDat()
  {
  FILE *fp;
  char str[80],ch[11];
  int i;
  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);
  }
  void WriteDat(void)
  {
  FILE *fp;
  int i;
  fp=fopen(/"OUT8.DAT/",/"w/");
  for(i=0;i<100;i++){
  fprintf(fp,/"%s %s %4d %5d %101d//n/", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
  }
  fclose(fp);
  }

 

#p#副标题#e#

 

    注:该题的冒泡法与11题不同。

    以下是引用片段:

 void SortDat()
  {
  int i,j;
  PRO swap;
  for(i=0;i 
  for(j=i+1;j 
  {
  if(strcmp(sell[i].mc,sell[j].mc)<0)
  {
  swap=sell[i];
  sell[i]=sell[j];
  sell[j]=swap;
  }
  if(strcmp(sell[i].mc,sell[j].mc)==0&&sell[i].je 
  {
  swap=sell[i];
  sell[i]=sell[j];
  sell[j]=swap;
  }
  }
  }
  void SortDat()
  {
  int i,j;
  PRO t;
  for(i=0;i 
  for(j=i+1;j 
  if(strcmp(sell[i].dm,sell[j].dm)<0)
  {
  t=sell[i];
  sell[i]=sell[j];
  sell[j]=t;
  }
  else
  if(strcmp(sell[i].dm,sell[j].dm)==0)
  if(sell[i].je 
  {
  t=sell[i];
  sell[i]=sell[j];
  sell[j]=t;
  }
  }

    5、下列程序的功能是:在三位整数(100至999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,又是两位数字相同,例如144、676等。请编制函数实现此功能,满足该条件的整数的个数通过所编制的函数返回。最后调用函数writeDat()把结果输出到文件out.dat中。请勿改动主函数main()和写函数writeDat()的内容。

#p#副标题#e#

    以下是引用片段:
 #include 
  int jsvalue(int bb[])
  {
  }
  main
  {
  int b[20],num;
  num=jsvalue(b);
  writeDat(num,b);
  }
  writeDat(int num,int b[])
  {
  FILE *out;
  int i;
  out=fopen(/"out.dat/",/"w/");
  fprintf(out,/"%d//n/",num);
  for(i=0;i 
  fclose(out);
  }
  --------------------------------------------------------------------------------
    //注:注意在i==(int)sqrt(i)*(int)sqrt(i)中只有当i是完全平方数时开平方后再取整才不会丢失任何数据。
 int jsvalue(int bb[])
  {
  int i,j,k=0,g,s,b;
  for(i=100;i<=999;i++)
  {
  g=i%10;
  s=i/10%10;
  b=i/100;
  if((i==(int)sqrt(i)*(int)sqrt(i))&&(g==s//s==b//b==g))
  bb[k++]=i;
  }
  return k;
  }
  int jsvalue(int bb[])
  {
  int i,k=0;
  for(i=100;i<=999;i++)
  if((int)sqrt(i)*(int)sqrt(i)==i && (i/100==i%10 || i/100==i/10%10 || i/10%10==i%10))
  bb[k++]=i;
  return k;
  }

    6、设有n个人围坐一圈并按顺时针方向从1到n编号, 从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数, 如此进行下去直到所有的人都出圈为止。

#p#副标题#e#

 

    现要求按出圈次序, 每10人一组, 给出这n个人的顺序表。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出到文件JOSE.OUT中。

    设 n = 100, s = 1, m = 10.

    (1) 将1到n个人的序号存入一维数组p中;

    (2) 若第i个人报数后出圈, 则将p[i]置于数组的倒数第i个位置上, 而原来第i+1个至倒数第i个元素依次向前移动一个位置;

    (3) 重复第(2)步直至圈中只剩下p[1]为止。

    注意: 部分源程序存放在PROG1.C中。

    请勿改动主函数main()和输出数据函数WriteDat()的内容。

    初始化:

    以下是引用片段:

 #include 
  #define N 100
  #define S 1
  #define M 10
  int p[100], n, s, m ;
  void WriteDat(void) ;
  void Josegh(void)
  {
  }
  void main()
  {
  m = M ;
  n = N ;
  s = S ;
  Josegh() ;
  WriteDat() ;
  }
  void WriteDat(void)
  {
  int i ;
  FILE *fp ;
  fp = fopen("jose.out", "w") ;
  for(i = N - 1 ; i >= 0 ; i--) {
  printf("%4d ", p[i]) ;
  fprintf(fp, "%4d", p[i]) ;
  if(i % 10 == 0) {
  printf("/n") ;
  fprintf(fp, "/n") ;
  }
  }
  fclose(fp) ;
  }

    本题评析:

    参考答案及其注释如下:

    以下是引用片段:

 void Josegh(void)
  {
  int i,j,s1,w;
  s1 = s;
  for(i = 1; i <= n; i++)
  p[i-1] = i; /*初始化赋值*/
  for(i = n; i>=1; i--)
  {
  s1 = (s1 + m - 1)%i;
  if(s1 == 0)s1 = i;
  w = p[s1 - 1];
  for(j = s1; j < i; j++)
  p[j - 1] = p[j];
  p[i - 1] = w;
  }
  }

    7、计算500-800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔减、加之和,即第1个素数-第2个素数+第三个素数-第4个素数+第5个素数……的值sum.请编写函数countvalue()实现程序的要求;最后main()函数调用函数writeDAT()把结果cnt和sum,输出到文件OUT11.DAT中。

    以下是引用片段:

 #include<stdio.h>
  int cnt,sum;
  void countvalue()
  {
  }
  void main()
  {cnt=sum=0;
  countvalue();
  printf("素数的个数=%d/n",cnt);
  printf("按要求计算的值=%d/n",sum);
  writeDAT();}
  writeDAT()
  {FILE *fp;
  fp=fopen("OUT11.DAT","w");
  fprintf(fp,"%d/n%d/n",cnt,sum);
  fclose(fp);
  }

  --------------------------------------------------------------------------------------  

    这是答案:
 void countvalue()
  {
  int i,j,k,l;
  k=0;
  l=1;
  for (i=800;i>=500;i--)
  {
  for (j=2;j<=i/2;j++)
  {
  if ((i%j)==0)
  {
  k=1;
  break;
  }
  }
  if ((k==0)&&(l==1))
  {
  sum=sum+i;
  l=2;
  cnt++;
  continue;
  }
  if ((k==0)&&(l==2))
  {sum=sum-i;
  l=1;
  cnt++;
  }
  k=0;
  }
  }
  ---------------------------------------------
  void countvalue()
  {int i,j;
  for(i=800;i>=500;i--)
  {for(j=2;j 
  if(!(i%j)) break;
  if(j==i)
  { cnt++;
  if(cnt%2) sum+=i;
  else sum-=i;
  }
  }
  }

相关计算机等级:7道经典C语言上机试题解析

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册