计算机等级考试二级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)
{
}
c 字符串转数组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-8190-113430-10,删除负数后,数组中的数据为:211903430,函数返回值为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("输入一个字符:");

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