I am a teacher!

导航

计算机等级考试二级C语言程序设计专项训练题——数组元素的删除

        数组元素a[i]的删除操作是使元素个数为n的数组(a[0],a[1],…,a[i-1],a[i],a[i+1],…,a[n-1])变成元素个数为n-1的数组(a[0],a[1],…,a[i-1],a[i+1],…,a[n-1]),由于数组在存储时是连续存放的,这样删除元素a[i]时,需将从元素a[i+1]至a[n-1]共n-i-1个数据元素依次前移一个位置。通常采用一重循环 for (k=i+1;k<n;k++) a[k-1]=a[k]; 来完成。

        在计算机等级考试二级C语言程序设计试题中,数组元素的删除操作是一个重要的命题点,有关数组元素删除的试题(特别是给定字符串中指定字符的删除)在历年考试试卷的程序填空题和程序设计题中经常出现。

一.例题讲解

        例1  假定整数数列中的数不重复,并存放在数组中。编写函数fun,其功能是:删除数列中值为x的元素。n中存放的是数列中元素的个数。若待删除的元素在数列中不存在,函数返回值-1;若存在,则删除该元素后返回值n-1。

#include <stdio.h>

#define N 20

int fun(int *a,int n,int x)

{

}

int main()

{

    int w[N]={-3,0,1,5,7,99,10,15,30,90},x,n,i;

    n=10;

    printf("The original data :\n");

    for (i=0;i<n;i++) printf("%5d",w[i]);

    printf("\nInput x (to delete):");

    scanf("%d",&x);

    printf("Delete  :  %d\n",x);

    n=fun(w,n,x);

    if (n==-1)

        printf("***Not be found!***\n\n");

    else

    {

        printf("The data after deleted:\n");

        for(i=0;i<n;i++) printf("%5d",w[i]);

        printf("\n");

    }

    return 0;

}

        解析:先查找x在数组a中的位置p,方法是

        设定监视哨a[n]=x,这样若x在数组中不存在(与x[0]~x[n-1]均不同),通过监视哨,循环可退出。

用于查找x的循环可写成

   p=0;

   while(x!=a[p]) p=p+1;

退出循环后,若p==n,则x在数组中不存在,函数返回-1;否则,将元素a[p]删除,即将元素a[p+1]~a[n-1]每个元素向前移动一个位置。用一重循环

for(i=p;i<n-1;i++) a[i]=a[i+1];

即可完成。

编写的fun函数如下:

int fun(int *a,int n,int x)

{

    int   p=0,i;

    a[n]=x;

    while(x!=a[p])

      p=p+1;

    if (p==n)  return -1;

    else

    {

        for(i=p;i<n-1;i++)

           a[i]=a[i+1];

        return n-1;

    }

}

        例2  编写函数fun,其功能是:删除数组a中所有值为负数的元素。

        例如,若a所指数组中的数据为:21、-7、-8、19、0、-11、34、30、-10,删除负数后,数组中的数据为:21、19、0、34、30,函数返回值为5。

#include <stdio.h>

#define  N  9

int fun(int  a[], int  n)

{

}

int main()

{

    int  b[N]={21,-7,-8,19,0,-11,34,30,-10}, i, n;

    printf("\nThe original data  :\n");

    for (i=0; i<N; i++)  printf("%4d ", b[i]);

    printf("\n");

    n = fun(b, N);

    printf("The number of Nonnegative integer :%d\n",n);

    printf("\nThe Nonnegative integer  :\n");

    for (i=0; i<n; i++)  printf("%4d ", b[i]);

    printf("\n");

    return 0;

}

        解析1:为删除数组a中值为负的元素,可以用循环while(i<n)对数组a中的每个元素a[i]进行判断,若a[i]<0,则将其删除,删除元素a[i],又可以用一个循环,将数组中从元素a[i+1]至最后一个元素依次前移,元素个数n减1;若a[i]>=0,则i++进行下一个元素的判断。算法描述为:

    i=0;

    while(i<n)

        if (a[i]<0)

        {

              for(j=i; j<n-1; j++)

                 a[j]= a[j+1];              // 删除第i个负值元素

              n--;                        // 元素个数减1

        }

        else

              i++;

编写的fun函数如下:

int fun(int  a[], int  n)

{

    int i=0,j;

    while(i<n)

    {

       if (a[i]<0)

       {

          for(j=i; j<n-1; j++)

            a[j]= a[j+1];

          n--;

       }

       else

          i++;

    }

    return n;

}

        上面的程序段采用了二重循环,其时间复杂度为O(n2)。下面给出一种时间复杂度为O(n)的解决方法。

        解析2:由于将负值元素删除后,剩下元素的顺序与其原来顺序一致。可以设置两个变量i和j,用变量i指向原来的数组中的元素(i=0~n-1),用j指向结果数组,j的初始值为0。用循环for (i=0; i<n; i++)对原来的数组中的每个元素a[i]进行判断,若a[i]>=0,则将其移到j所指的位置(即a[j]= a[i]),同时j++移向下一个位置。这样,循环结束后,数组中元素a[0]~a[j-1]均为非负的元素,j就是删除负值元素后的结果数组中元素的个数,作为函数值返回。

编写的fun函数如下:

int fun(int  a[], int  n)

{

    int i,j;

    for (i=j=0; i<n; i++)

      if(a[i]>=0)

      {

         a[j]=a[i];

         j++;

      }

    return j;

}

        例3  编写函数fun,它的功能是:从s所指的字符串中删除给定的字符。同一字母的大、小写按不同字符处理。

若程序执行时,输入字符串为:turbo c and borland c++

从键盘输入字符:n,则输出字符串为:turbo c ad borlad c++。

#include <stdio.h>

#include <string.h>

void fun(char s[],char c)

{

}

int main()

{

    char str[]="turbo c and borland c++";

    char ch;

    printf("原始字符串:%s\n", str);

    printf("输入一个字符:");

    scanf("%c",&ch);

    fun(str,ch);

    printf("str[]=%s\n",str);

    return 0;

}

解析:编程思路同例2的解析2,用一重循环完成指定字符c的删除。

但由于是字符串操作,对字符串中每个字符的遍历可写成循环

for (i=0; s[i]!='\0';i++)    或  for (i=0; i<strlen(s);i++)

若给定源程序中没有#include <string.h>,则最好用s[i]!='\0'作为循环判断条件。

另外,删除元素后,一定要置s[j]='\0';,给字符串加上结束符。

编写的fun函数如下:

void fun(char s[],char c)

{

    int i,j;

    for (i=0,j=0; s[i]!='\0';i++)

        if (s[i]!=c) s[j++]=s[i];

    s[j]='\0';

}

二.程序设计题

1.编写函数fun,它的功能是:删除数组b中所有值小于10的元素。函数返回删除后数组中数据的个数。主函数中输出删除后数组中余下的数据。

#include <stdio.h>

#include <stdlib.h>

#define   N  20

int  fun(int b[])

{

}

int main()

{

    int  a[N],i,num;

    printf("a数组中的数据 :\n");

    for (i=0;i<N ;i++)

    { a[i]=rand()%21; printf("%4d",a[i]); }

    printf("\n");

    num=fun(a);

    for (i=0;i<num ;i++) printf("%4d",a[i]);

    printf("\n");

    return 0;

}

int  fun(int b[])     //  参考程序1
{
    int  t[N] ,i, num=0;
    for (i=0; i<N; i++)
      if(b[i]>=10)
         t[num++]=b[i];
    for(i=0; i<num; i++)
      b[i]=t[i];
    return num;
}
int  fun(int b[])    // 参考程序2
{
    int  i, num=0;
    for (i=0; i<N; i++)
      if(b[i]>=10)
         b[num++]=b[i];
    return num;
}
参考程序

2.编写函数fun,它的功能是:把形参a所指数组中的所有偶数从数组中删除,剩下的奇数个数通过函数值返回。

例如,若a所指数组中的数据为:9、1、4、2、3、6、5、8、7,删除偶数后,数组中的数据为:9、1、3、5、7,函数返回值为5。

#include <stdio.h>

#define  N  9

int fun(int  a[], int  n)

{

}

int main()

{

    int  b[N]={9,1,4,2,3,6,5,8,7}, i, n;

    printf("\nThe original data  :\n");

    for (i=0; i<N; i++)  printf("%4d ", b[i]);

    printf("\n");

    n = fun(b, N);

    printf("\nThe number of odd  : %d \n", n);

    printf("\nThe odd number  :\n");

    for (i=0; i<n; i++)  printf("%4d ", b[i]);

    printf("\n");

    return 0;

}

int fun(int  a[], int  n)
{
    int  i,j;
    j = 0;
    for (i=0; i<n; i++)
      if (a[i]%2==1)
      {
        a[j] = a[i]; j++;
      }
    return j;
}
参考程序

3.编写函数fun,它的功能是:把形参a所指数组中的偶数按原顺序依次存放到a[0]、a[1]、a[2]、……中,把奇数从数组中删除,偶数个数通过函数值返回。

例如,若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除奇数后a所指数组中的数据为:4、2、6、8,函数返回值为4。

#include <stdio.h>

#define  N  9

int fun(int a[], int n)

{

}

int  main()

{

    int  b[N]={9,1,4,2,3,6,5,8,7}, i, n;

    printf("\nThe original data  :\n");

    for (i=0; i<N; i++)  printf("%4d ", b[i]);

    printf("\n");

    n = fun(b, N);

    printf("\nThe number of even  :%d\n", n);

    printf("\nThe even  :\n");

    for (i=0; i<n; i++)  printf("%4d ", b[i]);

    printf("\n");

    return 0;

}

 int fun(int a[], int n)
{
    int  i,j;
    j = 0;
    for (i=0; i<n; i++)
       if (a[i]%2== 0)
      {
        a[j]= a[i]; j++;
      }
    return j;
}
参考程序

4.编写函数fun,它的功能是:删除一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,一维数组中的数据为:2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10,删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10。

#include <stdio.h>

#define N 80

int  fun(int  a[], int  n)

{

}

int main()

{

int  a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,

9,9,10,10,10,10},i,n=20;

    printf("The original data :\n");

    for (i=0; i<n; i++) printf("%3d",a[i]);

    n=fun(a,n);

    printf("\n\nThe data after deleted :\n");

    for (i=0;i<n;i++) printf("%3d",a[i]);

    printf("\n\n");

    return 0;

}

int  fun(int  a[], int  n)
{
    int i,j;
    j=0;
    for (i=1;i<n;i++)
        if (a[i]!=a[j])
            a[++j]=a[i];
    return j+1;
}
参考程序

5.编写函数fun,它的功能是:删除字符串中的所有空格。

例如,主函数中输入“asd af aa z 67”,则输出为“asdafaaz67”。

#include <stdio.h>

void fun(char *str)

{

}

int main()

{

    char str[81];

    printf("Input a string:") ;

    gets(str);

    puts(str);

    fun(str);

    printf("*** str: %s\n",str);

    return 0;

}

void fun(char *str)
{
    int i,j;
    for (i=0,j=0; str[i]!='\0';i++)
        if (str[i]!=' ') str[j++]=str[i];
    str[j]='\0';
}
参考程序

 6.编写函数fun,它的功能是:删除一个字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指数组中,n中存放指定的下标。

例如,输入一个字符串:World,然后输入3,则调用该函数后的结果为Word。

#include <stdio.h>

#include <string.h>

#define LEN 20

void fun (char a[], char b[], int n)

{

}

int main()

{

    char str1[LEN], str2[LEN] ;

    int n ;

    printf("Enter the string:\n") ;

    gets(str1) ;

    printf("Enter the position of the string deleted:") ;

    scanf("%d", &n) ;

    fun(str1, str2, n) ;

    printf("The new string is: %s\n", str2) ;

    return 0;

}

void fun (char a[], char b[], int n)
{
    int i,j;
    for (i=0,j=0;a[i]!='\0';i++)
        if (i!=n) b[j++]=a[i];
    b[j]='\0';
}
参考程序

7.编写函数fun,它的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符所形成的新串放在t所指数组中。

例如,当s所指字符串中的内容为:ABCDEFGHIJK,在t所指数组中的内容应为:BDFHJ。

#include <stdio.h>

#include <string.h>

void fun(char *s, char t[])

{

}

int main()

{

    char   s[100], t[100];

    printf("\nPlease enter string S:");

    scanf("%s", s);

    fun(s, t);

    printf("\nThe result is: %s\n", t);

    return 0;

}

void fun(char *s, char t[])
{
    int i,j;
    for (i=0,j=0;s[i]!='\0';i++)
        if (i%2!=0) t[j++]=s[i];
    t[j]='\0';
}
参考程序

8.编写函数fun,它的功能是:将s所指字符串中ASCII码值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。

例如,若s所指的字符串中的内容为:ABCDEFG12345,则t所指的数组中的内容应为:ACEG135。

#include <stdio.h>

#include <string.h>

void fun(char s[],char t[])

{

}

int main()

{

    char s[100],t[100];

    printf("\nPlease enter string S:");scanf("%s",s);

    fun(s,t);

    printf("\nThe result is: %s\n",t);

    return 0;

}

void fun(char *s,char t[])
{
    int i,j;
    for (i=0,j=0;s[i]!='\0';i++)
        if (s[i]%2!=0) t[j++]=s[i];
    t[j]='\0';
}
参考程序

9.编写函数fun,它的功能是:将s所指字符串中ASCII码值为奇数的字符删除,串中剩余字符所形成的新串放在t所指数组中。

例如,当s所指字符串中的内容为:ABCDEFG12345,在t所指数组中的内容应为:BDF24。

#include <stdio.h>

#include <string.h>

void fun(char *s, char t[])

{

}

int main()

{

    char   s[100], t[100];

    printf("\nPlease enter string S:");

    scanf("%s", s);

    fun(s, t);

    printf("\nThe result is: %s\n", t);

    return 0;

}

void fun(char *s, char t[])
{
    int i,j;
    for (i=0,j=0;s[i]!='\0';i++)
        if (s[i]%2==0) t[j++]=s[i];
    t[j]='\0';
}
参考程序

10.编写函数fun,它的功能是:将s所指字符串中除了下标为偶数,同时ASCII码值也为偶数的字符外,其余的字符全部删除;串中剩余字符所形成的一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为:ABCDEFG123456,则t所指数组中的内容应为:246。

#include <stdio.h>

void fun(char *s, char t[])

{

}

int main()

{

    char   s[100], t[100];

    printf("\nPlease enter string S:"); scanf("%s", s);

    fun(s, t);

    printf("\nThe result is: %s\n", t);

    return 0;

}

void fun(char *s, char t[])
{
    int i,k;
    for (i=k=0; s[i]!='\0';i++)
        if (i%2==0 && s[i]%2==0)
            t[k++]=s[i];
    t[k]='\0';
}
参考程序

11.编写函数fun,它的功能是:将s所指字符串中除了下标为奇数,同时ASCII码值也为奇数的字符外,其余的字符全部删除;串中剩余字符所形成的一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为:ABCDEFG12345,则t所指数组中的内容应为:135。

#include <stdio.h>

#include <string.h>

void fun(char *s, char t[])

{

}

int main()

{

   char   s[100], t[100];

   printf("\nPlease enter string S:");

   scanf("%s", s);

   fun(s, t);

   printf("\nThe result is: %s\n", t);

   return 0;

}

void fun(char *s, char t[])
{
   int i,j=0;
   for (i=0;s[i]!='\0';i++)
      if (i%2==1 && s[i]%2==1)
         t[j++]=s[i];
   t[j]='\0';
}
参考程序

12.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:ABCDEFG。

#include <stdio.h>

void fun(char *str)

{

}

int main()

{

    char  s[81];

    printf("Enter a string:\n");

    gets(s);

    fun( s );

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void fun(char *str)
{
    int i,j;
    for (i=0,j=0; str[i]!='\0';i++)
        if (str[i]!='*') str[j++]=str[i];
    str[j]='\0';
}
参考程序

13.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了字符串中的前导*号之外,将串中其它*号(中间和尾部的*号)全部删除。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****ABCDEFG。

#include <stdio.h>

void fun(char *str)

{

}

int main()

{

    char  s[81];

    printf("Enter a string:\n");

    gets(s);

    fun( s );

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void fun(char *str)
{
    int i,j;
    i=0;
    while (str[i]=='*') i++;
    for (j=i; str[i]!='\0';i++)
        if (str[i]!='*') str[j++]=str[i];
    str[j]='\0';
}
参考程序

14.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:将字符串中的前导*号全部删除,中间和尾部的*号不删除。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:A*BC*DEF*G***。

#include <stdio.h>

void  fun(char *a)

{

}

int main()

{

    char  s[81];

    printf("Enter a string:\n");

    gets(s);

    fun( s );

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void  fun(char *a)
{
    int i,j;
    for (i=0;a[i]=='*';i++);
    for (j=0;a[i]!='\0';i++)
        a[j++]=a[i];
    a[j]='\0';
}
参考程序

15.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:将字符串尾部的*号全部删除,前面和中间的*号不删除。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****A*BC*DEF*G。

#include <stdio.h>

#include <string.h>

void  fun( char *a )

{

}

int main()

{

    char  s[81];

    printf("Enter a string:\n");

    gets(s);

    fun( s );

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void  fun( char *a )
{
    int i,j;
    for (i=0,j=0;a[i]!='\0';i++)
        if (a[i]!='*') j=0;
        else  j++;
    a[i-j]='\0';
}
参考程序

    16.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:使字符串的最前面连续的*号不得多于n个;若多于n个,则删除多于的*;若少于或等于n个,则什么也不做,中间和尾部的*号不删除。

例如,字符串中的内容为:*****A*BC*DEF*G***,若n的值为4,删除后,字符串的内容应当为:****A*BC*DEF*G***;若n的值为8,则字符串的内容仍为:*****A*BC*DEF*G***。

#include <stdio.h>

void  fun( char *a, int  n )

{

}

int main()

{

    char  s[81];  int  n;

    printf("Enter a string:\n");

    gets(s);

    printf("Enter n :  ");

    scanf("%d",&n);

    fun(s,n);

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void  fun( char *a, int  n )
{
    int i,j;
    for (i=0;a[i]=='*';i++) ;
    if (i<=n) return;
    j=n;
    while (a[i]!='\0')
    {
        a[j++]=a[i];
        i++;
    }
    a[j]='\0';
}
参考程序

17.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:使字符串中尾部的*号不得多于n个;若多于n个,则删除多于的*;若少于或等于n个,则什么也不做。前面和中间的*号不删除。

例如,字符串中的内容为:***A*BC*DEF*G*****,若n的值为4,删除后,字符串的内容应当为:***A*BC*DEF*G****;若n的值为8,则字符串的内容仍为:***A*BC*DEF*G*****。

#include <stdio.h>

void  fun( char *a,int n)

{

}

int main()

{

    char  s[81];

    int  n;

    printf("Enter a string:\n");

    gets(s);

    printf("Enter n :  ");

    scanf("%d",&n);

    fun( s,n );

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void  fun( char *a,int n)
{
    int i,j;
    for (i=0,j=0;a[i]!='\0';i++)
        if (a[i]!='*') j=0;
        else  j++;
    if (j>n) a[i-j+n]='\0';
}
参考程序

18.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:ABCDEFG***。

#include <stdio.h>

void  fun( char *a, char *p)

{

}

int main()

{

    char  s[81],*t;

    printf("Enter a string:\n");gets(s);

    t=s;

    while (*t) t++;

    t--;

    while (*t=='*') t--;

    fun(s,t);

    printf("The string after deleted:\n");puts(s);

    return 0;

}

void  fun( char *a, char *p)
{
    char *p1,*p2;
    p1=p2=a;
    while (*p1!='\0')
    {
        if ((p1<p && *p1!='*') || p1>=p)
        {
            *p2=*p1;
            p2++;
        }
        p1++;
    }
    *p2='\0';
}
参考程序

19.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,将串中其它*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****ABCDEFG***。

#include <stdio.h>

void fun(char *a,char *h,char *p)

{

}

int main()

{

    char s[81],*t,*f;

    printf("Enter a string:\n");

    gets(s);

    t=f=s;

    while(*t) t++;

    t--;

    while (*t=='*') t--;

    while (*f=='*') f++;

    fun(s,f,t);

    printf("The string after deleted:\n");puts(s);

    return 0;

}

void fun(char *a,char *h,char *p)
{
    char *t1,*t2;
    for (t1=t2=h;*t1!='\0';t1++)
        if ((t1<=p && *t1!='*') || t1>p)
        {
           *t2=*t1;
           t2++;
        }
    *t2='\0';
}
参考程序

20.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个数。

例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:A*BC*DEF*G。

#include <stdio.h>

void  fun(char *a, int n,int h,int e)

{

 

}

int main()

{

    char  s[81],*t,*f;

    int m=0, tn=0, fn=0;

    printf("Enter a string:\n");

    gets(s);

    t=f=s;

    while(*t) { t++;m++;}

    t--;

    while(*t=='*') { t--;tn++;}

    while(*f=='*') { f++;fn++;}

    fun( s , m,fn,tn );

    printf("The string after deleted:\n");

    puts(s);

    return 0;

}

void  fun(char *a, int n,int h,int e)
{
    int i,j;
    for (j=0,i=h;i<n-e;i++)
        a[j++]=a[i];
    a[j]='\0';
}
参考程序

posted on 2022-11-14 05:49  aTeacher  阅读(519)  评论(0编辑  收藏  举报