改错题 1.  下列给定程序中,fun()函数的功能是:从整数1~50中,选出能被3整除且有一位上的数是5的数,并把这些数放在b所指的数组中,将这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。
    请修改函数中的错误,使它能得出正确的结果。
    注意:不要改动main()函数,不能增行或减行,也不能更改程序的结构。
    试题程序:
    #include<stdio.h>
    //****found****
    int fun(int *b);
    {
    int j,a1,a2,i=0;
    //****found****
    for(j=10;j<=50;j++)
    {
    a2=j/10;
    a1=j-a2*10;
    if((j%3==0&&a2==5)||(j%3==0&&a1==5))
    {
    b[i]=j;
    i++;
    }
    }
    //****found****
    return j;
    }
    void main()
    {
    int a[50],i,n;
    n=fun(a);
    printf("the result is:\n");
    for(i=0;i<n;i++)
    printf("%4d",a[i]);
    printf("\n");
    }
【正确答案】(1)错误:int fun(int *b);
   正确:int fun(int *b)
   (2)错误:for(j=10;j<=50;j++)
   正确:for(j=1;j<=50;j++)
   (3)错误:return j;
   正确:return i;
【答案解析】 (1)根据题目的要求,第一个标识下fun()函数的定义为“int fun(int *b);”。C语言中规定,函数的定义格式,不应以分号结束,所以应把末尾的分号去掉。
   (2)题干要求在1~50之间选出符合条件的整数,循环条件表达式的起始应当是j=1,而不是j=10,所以第二个标识下应改为“for(j=1;j<=50;j++)”。
   (3)变量i是标识数组b的下标,也就是数组的个数。题目“return j”返回的是循环条件表达式中的变量,所以这里应改为“return i”。