指针实验题(一)
1、 改错题:
【题目】下面的程序中函数divfun的功能是:对于s指向的一个含有数字字符和非数字字符的字符串(串长不超过80),将其中连续的数字字符转换为一个整数,如果连续的数字字符个数超过4个,则以4个数字字符为一组进行转换。将转换后生成的整数依次存放到整型数组a中。函数返回放入a数组中整数的个数。例如,若输入的字符串为“c123yz45786*56abc123456789”,则a数组中的数值分别为:(1234578656123456789)。
含有错误的源程序如下:
#include<stdio.h>
                                        /*增加语句 include <ctype.h> */
void divfun(char *s,int a[])            /* 去掉void 改为 int */
{char *p=s;
int i=0,k,sum;
while(*p)
  if(isdigit(*p))
  {sum=*p-'0'; p++; k=1;
    while(isdigit(*p))
    {k++;
      if(k<=4) {sum=sum+*p-'0'; p++;}  /*改为 sum=sum*10+*p-‘0’ */
      else {a[i++]=sum;
        k=1; sum=*p-'0'; p++;
      }
      }
    a[i++]=sum;
    }
  else p++;
  return i-1;
}
main()
{char *str;int i,n,num[40];    /*改为 char str[80] */
  gets(str); n=divfun(str,num);
  puts(str);
  for(i=0;i<=n;i++)
  printf("%6d",num[i]);
  printf("\n");
}
注:改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。
2、 编程题:
【题目】编码问题。设有一个整型数组a[N]中存放N个互不相同的整数。例如,N6时,有a=(430512),此时,a数组的编码定义如下:a[0]的编码为0放入b[0]a[i]的编码为:在a[0],a[1],…,a[i-1]中比a[i]的值小的数的个数(i=12N1)放入b[i]。因而,由上述a数组各元素的值产生的编码数值b=(0,0,0,3,1,2)
按下列要求编写程序:
(1) 编写函数void encode(int x[],int y[],int n),其功能是对数组x中前n个整数求出其编码,
并保存到y数组中。
(2) 编写主函数,从键盘上输入一组整数并保存到整型数组中,调用函数encode求出其编码,将原数组及其编码数组的值写入到结果文件myf2.out中。最后将你本人的学号字符串也保存到结果文件myf2.out中。
(3) 输入的一组整数为4,3,0,5,1,2
【参考程序】
#include <stdio.h>
#define N 6
void encode(int x[],int y[],int n)
{int i,j,count;
y[0]=0;
for(i=1;i<n;i++)
  { count=0;
    for(j=0;j<i;j++)
      if(x[j]<x[i]) count++;
    y[i]=count;
  }
}
main()
{int a[N],b[N],k,j;FILE *out;
out=fopen("e:\\temp\\myf2.out","w");
for(j=0;j<N;j++) scanf("%d",&a[j]);
encode(a,b,N);
for(j=0;j<N;j++) {printf("%5d",a[j]); fprintf(out,"%5d",a[j]);}
fprintf(out,"\n");
for(j=0;j<N;j++) {printf("%5d",b[j]); fprintf(out,"%5d",b[j]);}
printf("\n"); fprintf(out,"\n");
fprintf(out,"本人学号\n");
fclose(out);
}
运行结果:4    3    0    5    1    2
          0    0    0    3    1    2
本人学号
【题目】设有一个数列a1,a2,…,an,其中a1,a2可以是任意的正整数,从a3开始的所有后续项通过下列公式生成:
an-2
an-1
an
偶数
奇数
2 an-2 an-1
奇数
偶数
an-2 2an-1
偶数
偶数
an-2 an-11
奇数
奇数
an-2 an-1
按下列要求编写程序:
(4) 编写函数void make(long int a[],int n),其功能是:逐项求出具有上述性质的数列中a3an各项的值,并把这些数依次存入a数组a[3]a[n]元素中。
(5) 主函数中通过数组初始化设定该数列前两项的值为a1=1,a2=2,调用函数make生成该数列a3an项的值,并按每行5个数将生成的数列写入到结果文件myf2.out中。最后将你本人的学号字符串也保存到结果文件myf2.out中。
【参考程序】
#define N 40
#include <stdio.h>
void make(long int a[],int n)
{ int i,x,y,result;
  for(i=3;i<=n;i++)
  { x=a[i-2]%2;
    y=a[i-1]%2;
    result=2*x-y;
    switch(result)
    {case -1: a[i]=2*a[i-2]+a[i-1];break;
      case 2:  a[i]=a[i-2]+2*a[i-1];break;
      case 0:  a[i]=a[i-2]+a[i-1]+1;break;
      case 1:  a[i]=a[i-2]+a[i-1];break;
    }
  }
}
main()
{FILE *out;
long int t[N]={0,1,2};
int m=30,i;
out=fopen("e:\\temp\\myf2.out","w");
make(t,m);
for(i=1;i<=m;i++)
  {printf("%12ld",t[i]); fprintf(out,"%12ld",t[i]);
  if(i%5==0){printf("\n"); fprintf(out,"\n");}
  }fprintf作用
printf("\n"); fprintf(out,"\n");
fprintf(out,"本人学号\n");
fclose(out);
}
运行结果:          1          2          5          9          14
          37          65        102        269        473
        742        1957        3441        5398      14237
      25033      39270      103573      182113      285686
      753485    132****    ****342    5481541    9638225
    15119766    39877757    70117289  109995046  290107381
本人学号

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。