指针实验题(一)
1、 改错题:
【题目】下面的程序中函数divfun的功能是:对于s指向的一个含有数字字符和非数字字符的字符串(串长不超过80),将其中连续的数字字符转换为一个整数,如果连续的数字字符个数超过4个,则以4个数字字符为一组进行转换。将转换后生成的整数依次存放到整型数组a中。函数返回放入a数组中整数的个数。例如,若输入的字符串为“c123yz45!786*56abc123456789”,则a数组中的数值分别为:(123,45,786,56,1234,5678,9)。
含有错误的源程序如下:
#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个互不相同的整数。例如,N=6时,有a=(4,3,0,5,1,2),此时,a数组的编码定义如下:a[0]的编码为0放入b[0];a[i]的编码为:在a[0],a[1],…,a[i-1]中比a[i]的值小的数的个数(i=1,2,…,N-1)放入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-1+1 |
奇数 | 奇数 | an-2 +an-1 |
按下列要求编写程序:
(4) 编写函数void make(long int a[],int n),其功能是:逐项求出具有上述性质的数列中a3~an各项的值,并把这些数依次存入a数组a[3]~a[n]元素中。
(5) 主函数中通过数组初始化设定该数列前两项的值为a1=1,a2=2,调用函数make生成该数列a3~an项的值,并按每行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小时内删除。
发表评论