1 【程序改错】

功能

用选择法对数组中的 n 个元素按从小到大的顺序进行排序。

#include "stdio.h"
#define N 20

void fun(int a[], int n)
{
    int i, j, t, k;
    for (j = 0; j < n-1; j++)
    {
        /**********ERROR**********/
        k = j
        for (i = j+1; i < n; i++)
        /**********ERROR**********/
            if(a[i] > a[k])
                /**********ERROR**********/
                k = j;
        t = a[k];
        a[k] = a[j];
        a[j] = t;
    }
}

void main()
{
    int a[N]={9,6,8,3,-1},i, m = 5;
    printf("排序前的数据:");
    for(i = 0; i < m; i++)
        printf("%d ",a[i]);
    printf("\n");
    fun(a,m);
    printf("排序后的数据:");
    for(i = 0; i < m; i++)
        printf("%d ",a[i]);
    printf("\n");
}

改错参考答案

  1. k = j;
  2. if(a[i] < a[k]) 或 if(a[k] > a[i])
  3. k = i;

2 【程序改错】

功能

计算级数 ex=1+x+x2/2!+x3/3!+…+xn/n! 的值。其中 xn 代表 x 的 n 次方。

#include "stdio.h"
main()
{
    int m,n;
    float x,term,ex1,ex2;
    printf("x,m=");
    scanf("%f %d",&x,&m);
    /**********ERROR**********/
    ex1==ex2=1;
    term=1;
    for(n=1;n<=m;n++)
    {
        /**********ERROR**********/
        term*=x%n;
        ex1+=term;
    }
    ex2=term;
    /**********ERROR**********/
    for (n=m;n>1; n--)
    {
        term*=n/x;
        ex2+=term;
    }
    printf("exforward=%f exbackrard=%f\n",ex1,ex2);
}

改错参考答案

  1. ex1=ex2=1;
  2. term*=x/n;
  3. for(n=m;n>=1;n--)

3 【程序改错】

题目

求两个整数的最小公倍数。

注意

不可以增加或删除程序行,也不可以更改程序的结构。

#include "stdio.h"
main()
{
    int a,b,i,j,t;
    scanf("%d,%d",&a,&b);
    if(a>b) t=a;
    else t=b;
    /**********ERROR**********/
    for(i=t;i<=a;i++)
    {
        if(i%a==0&&i%b==0)
        /**********ERROR**********/
        j=i;break;
    }
}

改错参考答案

  1. for(i=t;;i++) 或 for(i=t;i<=a*b;i++)
  2. {j=i;break;}

4 【程序改错】

功能

求广义菲玻那契级数的第 n 项。广义菲玻那契级数的前 n 项为:1,1,1,3,5,9,17,31,…… 项值通过函数值返回 main ( ) 函数。

例如

若 n = 15,则应输出:The value is: 2209。

#include "conio.h"
#include "stdio.h"

long fun ( int n )
{
    long a=1, b=1, c=1, d=1, k;
    /**********ERROR**********/
    for (k=4; k<n; k++)
    {
        d = a+b+c;
        /**********ERROR**********/
        a=b
        b=c;
        c=d;
    }
    /**********ERROR**********/
    return k;
}

main( )
{
    int n = 15;
    clrscr( );
    printf( "The value is: %ld\n", fun ( n ) );
}

改错参考答案

  1. for (k=4; k<=n; k++)
  2. a=b;
  3. return d;

5 【程序改错】

题目

下面程序用来计算 N=10 个数的平均数,试改正程序中的错误之处。

注意

不可以增加或删除程序行,也不可以更改程序的结构。

#include "stdio.h"
/**********ERROR**********/
#define N=10
main()
{
    int i;
    float s=0,a;
    /**********ERROR**********/
    for(i=1;i<=s;i++);
    {
        scanf("%f",&a);
        s+=a;
    }
    printf("aver=%f",s/N);
}

改错参考答案

  1. #define N 10
  2. for(i=1;i<=N;i++) 或 for(i=1;i<=10;i++) 或 for(i=0;i<10;i++)

6 【程序改错】

功能

求广义菲玻那契级数的第 n 项。广义菲玻那契级数的前 n 项为:1,1,1,3,5,9,17,31,…… 项值通过函数值返回 main ( ) 函数。

例如

若 n = 15,则应输出:The value is: 2209。

#include "conio.h"
#include "stdio.h"

long fun ( int n )
{
    long a=1, b=1, c=1, d=1, k;
    /**********ERROR**********/
    for (k=4; k<n; k++)
    {
        d = a+b+c;
        /**********ERROR**********/
        a=b
        b=c;
        c=d;
    }
    /**********ERROR**********/
    return k;
}

main( )
{
    int n = 15;
    clrscr( );
    printf( "The value is: %ld\n", fun ( n ) );
}

改错参考答案

  1. for (k=4; k<=n; k++)
  2. a=b;
  3. return d;

7 【程序改错】

题目

从键盘输入数 a、b、c 后,输出其中最小的数。

注意

不可以增加或删除程序行,也不可以更改程序的结构。

#include "stdio.h"
main()
{
    int a,b,c,t,m;
    scanf("%d%d%d",&a,&b,&c);
    printf("a=%d,b=%d,c=%d\n",a,b,c);
    /**********ERROR**********/
    t=(a>b)?a :b;
    /**********ERROR**********/
    m=(t>c)?t :c;
    printf("m is %d\n", m);
}

改错参考答案

  1. t=(a<b)?a:b;
  2. m=(t<c)?t:c;

8 【程序改错】

功能

读取 7 个数(1-50)的整数值,每读取一个值,程序打印出该值个数的 *。

#include "stdio.h"
main()
{
    int i,a,n=1;

    int a,b,c,t,m;
    /**********ERROR**********/
    while(n<7)
    {
        do
        {
            scanf("%d",&a);
        }
        /**********ERROR**********/
        while(a<1&&a>50);
        /**********ERROR**********/
        for(i=0;i<=a;i++)
            printf("*");
        printf("\n");
        n++;
    }
}

改错参考答案

  1. while(n<=7) 或 while(n<8)
  2. while(a<1||a>50); 或 while(a>50||a<1);
  3. for(i=0;i<a;i++)

9 【程序改错】

功能

某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上 5,然后除以 10 的余数代替该位数字。再将新生成数据的第一位和第四位交换,第二位和第三位交换。

例如

输入一个四位整数 1234,则结果为:9876。

#include "stdio.h"
main()
{
    int a,i,aa[4],t;
    printf("输入一个四位整数:");
    /**********ERROR**********/
    scanf("%d",a);
    aa[0]=a%10;
    /**********ERROR**********/
    aa[1]=a%100%10;
    aa[2]=a%1000/100;
    aa[3]=a/1000;
    /**********ERROR**********/
    for(i=0;i<3;i++)
    {
        aa[i]+=5;
        aa[i]%=10;
    }
    for(i=0;i<=3/2;i++)
    {
        t=aa[i];
        aa[i]=aa[3-i];
        aa[3-i]=t;
    }
    for(i=3;i>=0;i--)
        printf("%d",aa[i]);
}

改错参考答案

  1. scanf("%d",&a);
  2. aa[1]=a%100/10;
  3. for(i=0;i<=3;i++) 或 for(i=0;i<4;i++)

10 【程序改错】

功能

编写函数 fun 计算下列分段函数的值:

$$
f(x) = \begin{cases}

20·x & x<0且x\neq-3 \\

\sin(x) & 0\leq x<10且x\neq2及x\neq3 \\

x^2+x-1 & 其他

\end{cases}

$$

#include "math.h"
#include "stdio.h"

float fun(float x)
{
    /**********ERROR**********/
    float y
    /**********ERROR**********/
    if (x<0 || x!=-3.0)
        y=x*20;
    else if(x>=0 && x<10.0 && x!=2.0 && x!=3.0)
        y=sin(x);
    else
	    y=x*x+x-1;
    /**********ERROR**********/
    return x;
}

main()
{
    float x,f;
    printf("Input x=");
    scanf("%f",&x);
    f=fun(x);
    printf("x=%f,f(x)=%f\n",x,f);
}

改错参考答案

  1. float y;
  2. if (x<0 && x!=-3.0)
  3. return y;

11 【程序改错】

题目

打印出 100~200 间 (包括 100 和 200) 所有不能被 3 整除的数。

注意

不可以增加或删除程序行,也不可以更改程序的结构。

#include "stdio.h"
main()
{
    int n;
    for(n=100;n<=200;n++)
    {
        /**********ERROR**********/
        if(n%3=0)
        /**********ERROR**********/
	        break;
        printf("%3d",n);
    }
}

改错参考答案

  1. if(n%3==0)
  2. continue;