admin 管理员组文章数量: 887629
2024年1月12日发(作者:火狐浏览器国际版)
计算机等级考试二级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 在计算机等级考试二级C语言程序设计试题中,数组元素的删除操作是一个重要的命题点,有关数组元素删除的试题(特别是给定字符串中指定字符的删除)在历年考试试卷的程序填空题和程序设计题中经常出现。 一.例题讲解 例1 假定整数数列中的数不重复,并存放在数组中。编写函数fun,其功能是:删除数列中值为x的元素。n中存放的是数列中元素的个数。若待删除的元素在数列中不存在,函数返回值-1;若存在,则删除该元素后返回值n-1。 #include #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 printf("nInput x (to delete):"); scanf("%d",&x); printf("Delete : %dn",x); n=fun(w,n,x); if (n==-1) printf("***Not be found!***nn"); else { printf("The data after deleted:n"); for(i=0;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 即可完成。 编写的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 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 #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 printf("n"); n = fun(b, N); printf("The number of Nonnegative integer :%dn",n); printf("nThe Nonnegative integer :n"); for (i=0; i printf("n"); return 0; } 解析1:为删除数组a中值为负的元素,可以用循环while(i i=0; while(i if (a[i]<0) { for(j=i; j a[j]= a[j+1]; // 删除第i个负值元素 n--; // 元素个数减1 } else i++; 编写的fun函数如下: int fun(int a[], int n) { int i=0,j; while(i { if (a[i]<0) { for(j=i; 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 编写的fun函数如下: int fun(int a[], int n) { int i,j; for (i=j=0; 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 #include void fun(char s[],char c) { } int main() { char str[]="turbo c and borland c++"; char ch; printf("原始字符串:%sn", str); printf("输入一个字符:"); scanf("%c",&ch); fun(str,ch); printf("str[]=%sn",str); return 0; } 解析:编程思路同例2的解析2,用一重循环完成指定字符c的删除。 但由于是字符串操作,对字符串中每个字符的遍历可写成循环 for (i=0; s[i]!='0';i++) 或 for (i=0; i 若给定源程序中没有#include 另外,删除元素后,一定要置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 #include #define N 20 int fun(int b[]) { } int main() { int a[N],i,num; printf("a数组中的数据 :n"); for (i=0;i { a[i]=rand()%21; printf("%4d",a[i]); } printf("n"); num=fun(a); for (i=0;i printf("n"); return 0; } 2.编写函数fun,它的功能是:把形参a所指数组中的所有偶数从数组中删除,剩下的奇数个数通过函数值返回。 例如,若a所指数组中的数据为:9、1、4、2、3、6、5、8、7,删除偶数后,数组中的数据为:9、1、3、5、7,函数返回值为5。 #include #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 printf("n"); n = fun(b, N); printf("nThe number of odd : %d n", n); printf("nThe odd number :n"); for (i=0; i printf("n"); return 0; } 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 #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 printf("n"); n = fun(b, N); printf("nThe number of even :%dn", n); printf("nThe even :n"); for (i=0; i printf("n"); return 0; } 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 #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=fun(a,n); printf("nnThe data after deleted :n"); for (i=0;i printf("nn"); return 0; } 5.编写函数fun,它的功能是:删除字符串中的所有空格。 例如,主函数中输入“asd af aa z 67”,则输出为“asdafaaz67”。 #include void fun(char *str) { } int main() { char str[81]; printf("Input a string:") ; gets(str); puts(str); fun(str); printf("*** str: %sn",str); return 0; } 6.编写函数fun,它的功能是:删除一个字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指数组中,n中存放指定的下标。 例如,输入一个字符串:World,然后输入3,则调用该函数后的结果为Word。 #include #include #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: %sn", str2) ; return 0; } 7.编写函数fun,它的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符所形成的新串放在t所指数组中。 例如,当s所指字符串中的内容为:ABCDEFGHIJK,在t所指数组中的内容应为:BDFHJ。 #include #include 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: %sn", t); return 0; } 8.编写函数fun,它的功能是:将s所指字符串中ASCII码值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。 例如,若s所指的字符串中的内容为:ABCDEFG12345,则t所指的数组中的内容应为:ACEG135。 #include #include 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: %sn",t); return 0; } 9.编写函数fun,它的功能是:将s所指字符串中ASCII码值为奇数的字符删除,串中剩余字符所形成的新串放在t所指数组中。 例如,当s所指字符串中的内容为:ABCDEFG12345,在t所指数组中的内容应为:BDF24。 #include #include 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: %sn", t); return 0; } 10.编写函数fun,它的功能是:将s所指字符串中除了下标为偶数,同时ASCII码值也为偶数的字符外,其余的字符全部删除;串中剩余字符所形成的一个新串放在t所指的数组中。 例如,若s所指字符串中的内容为:ABCDEFG123456,则t所指数组中的内容应为:246。 #include 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: %sn", t); return 0; } 11.编写函数fun,它的功能是:将s所指字符串中除了下标为奇数,同时ASCII码值也为奇数的字符外,其余的字符全部删除;串中剩余字符所形成的一个新串放在t所指的数组中。 例如,若s所指字符串中的内容为:ABCDEFG12345,则t所指数组中的内容应为:135。 #include #include 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: %sn", t); return 0; } 12.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:ABCDEFG。 #include 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; } 13.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了字符串中的前导*号之外,将串中其它*号(中间和尾部的*号)全部删除。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****ABCDEFG。 #include 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; } 14.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:将字符串中的前导*号全部删除,中间和尾部的*号不删除。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:A*BC*DEF*G***。 #include 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; } 15.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:将字符串尾部的*号全部删除,前面和中间的*号不删除。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****A*BC*DEF*G。 #include #include 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; } 16.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:使字符串的最前面连续的*号不得多于n个;若多于n个,则删除多于的*;若少于或等于n个,则什么也不做,中间和尾部的*号不删除。 例如,字符串中的内容为:*****A*BC*DEF*G***,若n的值为4,删除后,字符串的内容应当为:****A*BC*DEF*G***;若n的值为8,则字符串的内容仍为:*****A*BC*DEF*G***。 #include 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; } 17.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:使字符串中尾部的*号不得多于n个;若多于n个,则删除多于的*;若少于或等于n个,则什么也不做。前面和中间的*号不删除。 例如,字符串中的内容为:***A*BC*DEF*G*****,若n的值为4,删除后,字符串的内容应当为:***A*BC*DEF*G****;若n的值为8,则字符串的内容仍为:***A*BC*DEF*G*****。 #include 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; } 18.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:ABCDEFG***。 #include 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; } 19.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,将串中其它*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:*****ABCDEFG***。 #include 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; } 20.假定输入的字符串中只包含字母和*号。编写函数fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个数。 例如,字符串中的内容为:*****A*BC*DEF*G***,删除后,字符串的内容应当为:A*BC*DEF*G。 #include 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; } 三.程序设计题参考程序 1. int fun(int b[]) // 参考程序1 { int t[N] ,i, num=0; for (i=0; i if(b[i]>=10) t[num++]=b[i]; for(i=0; i b[i]=t[i]; return num; } int fun(int b[]) // 参考程序2 { int i, num=0; for (i=0; i if(b[i]>=10) b[num++]=b[i]; return num; } 2. int fun(int a[], int n) { int i,j; j = 0; for (i=0; i if (a[i]%2==1) { a[j] = a[i]; j++; } return j; } 3. int fun(int a[], int n) { int i,j; j = 0; for (i=0; i if (a[i]%2== 0) { a[j]= a[i]; j++; } return j; } 4. int fun(int a[], int n) { int i,j; j=0; for (i=1;i if (a[i]!=a[j]) a[++j]=a[i]; return j+1; } 5. 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. 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. 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. 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. 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.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.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.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.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.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.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.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.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.void fun( char *a, char *p) { char *p1,*p2; p1=p2=a; while (*p1!='0') { if ((p1 =p) { *p2=*p1; p2++; } p1++; } *p2='0'; } 19.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.void fun(char *a, int n,int h,int e) { int i,j; for (j=0,i=h;i a[j++]=a[i]; a[j]='0'; }
版权声明:本文标题:C语言程序设计专项训练题之 数组元素的删除 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1705021684h470041.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论