指针与数组补充习题.docx
- 文档编号:7509825
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:27
- 大小:21.99KB
指针与数组补充习题.docx
《指针与数组补充习题.docx》由会员分享,可在线阅读,更多相关《指针与数组补充习题.docx(27页珍藏版)》请在冰点文库上搜索。
指针与数组补充习题
指针与数组练习题
1、从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复的字符。
如输入”ad2f3adjfeainzzzv”,则输出”23adefijnvz”。
解:
方法一:
#include"stdio.h"
#include"string.h"
intmain(void)
{
charstr1[80],str2[80],temp;
inti,j=0,k,index;
printf("请输入一个字符串:
");
gets(str1);
for(i=0;str1[i];i++)
{
for(k=0;k
if(str1[i]==str1[k])break;
if(k>=i)
str2[j++]=str1[i];
}
str2[j]=0;
for(i=0;str2[i];i++)//选择排序
{
index=i;
for(j=i+1;str2[j];j++)
if(str2[j] if(index==i)continue; temp=str2[index]; str2[index]=str2[i]; str2[i]=temp; } printf("经去重排序后字符串变为: "); puts(str2); return0; } 方法二: #include"stdio.h" #include"string.h" intmain(void) { charstr[80];//只用一个数组哦 char*p1=str+1,*temp=NULL,*t=NULL,x,*k=NULL; gets(str); while(*p1) { temp=t=p1; temp--; while(temp! =str) { if(*p1==*temp)break; elsetemp--; } if(temp! =str) { while(*t) { *t=*(t+1);t++; } } elseif(*temp==*p1) { while(*t) { *t=*(t+1);t++; } } elsep1++; } for(p1=str+1;*p1;p1++)//插入法排序 { x=*p1; for(temp=str;temp<=p1-1;temp++) if(x<*temp)break; for(k=p1-1;k>=temp;k--) *(k+1)=*k; *temp=x; } puts(str); } 方法三: #include #include"string.h" intmain(void) { charstr1[500]={0},str2[256]={0}; inti; gets(str1); for(i=0;str1[i];i++) { str2[str1[i]]=1; } for(i=0;i! =256;i++) if(str2[i]==1) printf("%c",i); putchar('\n'); return0; } 2、从键盘输入一个n×n的二维数组(n键盘输入),找出此二维数组中各行的最大值,并按从大到小的次序输出各行的最大值及此值所在的行号。 如: 输入 4(n=4) 13342344 45782130 98321150 5668822(n×n) 输出 983(最大98,在第3行) 884 782 441 解题步骤: 1.找每行最大值将它们存入一维数组中 2.对一维数组排序 3.输出的同时查找这个数在第几行 解: #include"stdio.h" #include"string.h" intmain(void) { inta[80][80],b[80],c[80];//定义b数组保存各行最大值,c数组保存各行行号 intn,i,j,k=0,l=0,index,max,temp; scanf("%d",&n); printf("请输入%d阶矩阵: ",n); for(i=0;i for(j=0;j scanf("%d",&a[i][j]); for(i=0;i { max=a[i][0]; for(j=1;j if(a[i][j]>max)max=a[i][j]; b[k++]=max;//记录此行的最大值 c[l++]=i+1;//记录这时的行号 } for(i=0;i { index=i; for(j=i+1;j if(b[j]>b[index])index=j; if(index==i)continue; temp=b[index]; b[index]=b[i]; b[i]=temp; temp=c[index];//交换最大值时别忘了交换相应的行号 c[index]=c[i]; c[i]=temp; } printf("每行最大数排序后: \n"); for(i=0;i printf("%-4d在第%2d行\n",b[i],c[i]); return0; } /*从键盘输入一个n×n的二维数组(n键盘输入), 找出此二维数组中各行的最大值,并按从 大到小的次序输出各行的最大值及此值所在的行号。 1.找每行最大值将它们存入一维数组中 2.对一维数组排序 3.输出的同时查找这个数在第几行*/ 3、下面程序实现如下功能: 输入一个整数字符串转换为一个整数值,如”1234”转换为1234,”-1234”转换为-1234。 读懂main函数,编写转换函数chnum。 解: #include #include intmain(void) { chars[60]; intn; longchnum(char*p); gets(s); if(*s=='-')n=-chnum(s+1); elsen=chnum(s); printf("%d\n",n); return0; } longchnum(char*p) { longsum=0; while(*p) { if(*p>='0'&&*p<='9') sum=sum*10+*p-'0'; p++; } returnsum; } 4、从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。 读懂以下main函数,编写相应的函数del16和htod。 解: #include #include voidmain() { chars1[10],s2[10]; voiddel16(char*p1,char*p2); longhtod(char*p); gets(s1);//读入一字符串 del16(s1,s2);//去掉所有非十六进制字符到s2 printf("%d\n",htod(s2));//把s2转换为10进制 } voiddel16(char*p1,char*p2) { while(*p1) { if(*p1<='f'&&*p1>='a'||*p1<='F'&&*p1>='A'||*p1<='9'&&*p1>='0') *p2++=*p1; p1++; } *p2='\0'; } longhtod(char*p) { longsum=0; while(*p) { if(*p<='f'&&*p>='a')sum=sum*16+*p-'a'+10; elseif(*p<='F'&&*p>='A')sum=sum*16+*p-'A'+10; elseif(*p<='9'&&*p>='0')sum=sum*16+*p-'0'; p++; } returnsum; } 5、编写函数insert(char*s1,char*s2,intpos),实现在字符串s1中的指定位置pos处插入字符串s2。 (花了我1天的编程时间2010.3.12) Happy---Year New 7 HappyNewYear 思路: 1.s1字符串找第pos个位置 2.将pos位置后的元素顺移动一位,插入s2字符串中一个元素 3.接着插入直到s2字符串结束 /* 1.s1字符串找第pos个位置 2.将pos位置后的元素顺移动一位,插入s2字符串中一个元素 3.接着插入直到s2字符串结束 */ #include"stdio.h" #include"string.h" intmain(void) { chars1[80],s2[80]; intn; voidinsert(char*s1,char*s2,intpos); gets(s1); gets(s2); scanf("%d",&n); insert(s1,s2,n); puts(s1); return0; } voidinsert(char*s1,char*s2,intpos) { inti,count2=0; char*p=NULL,*p1=s1,*p2=s2; while(*s2! ='\0'){ s2++;count2++; }//统计s2字符串字符个数,以确定字符串s1位移量。 i=1; while(i { s1++;i++; }//让指针指向pos位置 p=s1;//记录pos位置 while(*s1)s1++;//s1指向’\0’ for(i=1;i { while(s1>=p) { *(s1+1)=*s1;s1--; } while(*s1)s1++;//准备第二轮位移的开始! ! ! ! p++; } i=1; while(i { p1++;i++; }//指针指向pos位置 while(*p2) { *p1++=*p2++; }//加载s2字符串 } /*遇见问题处理: 1.位移量不能为count2,会位移多一位,不符合题目要求 2.循环体要有出口,有步长,否则会陷入死循环 3.指针的指向要明确,来回都要非常清楚它的位置。 */ 方法二: #include"stdio.h" #include"string.h" intmain(void) { chars1[80],s2[80]; intn; voidinsert(char*s1,char*s2,intpos); gets(s1); gets(s2); scanf("%d",&n); insert(s1,s2,n); puts(s1); return0; } voidinsert(char*s1,char*s2,intpos) { chars[80]; char*p=s1,*p1=s; p=p+pos-1; *p++=0; while(*p) { *p1++=*p++; } *p1=0; strcat(s1,s2); strcat(s1,s); } 6、编写程序,实现下面一个有关单词个数统计问题。 编写一个函数findstr(char*str,char*substr),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。 例如,假定输入的字符串为”asdasasdfgasdaszx67asdmklo”,子字符串为as,函数返回值是6。 asdasasdfgasdaszx67asdmklo as 6 解: #include"stdio.h" #include"string.h" intmain(void) { chars1[80],s2[80]; intn; intfindstr(char*str,char*substr); printf("请输入一个字符串: "); gets(s1); printf("请输入你要查找的字符串: "); gets(s2); n=findstr(s1,s2); printf("%s在%s里共有%d个\n",s2,s1,n); return0; } intfindstr(char*str,char*substr) { inti,j,k,count=0; chartemp[80]; intlength=strlen(substr); for(i=0;i { k=0; for(j=i;j temp[k++]=str[j]; temp[k]='\0'; if(! strcmp(temp,substr))count++; } returncount; } 法二: #include"stdio.h" #include"string.h" intmain(void) { chars1[80],s2[80]; intn; intfindstr(char*str,char*substr); printf("请输入一个字符串: "); gets(s1); printf("请输入你要查找的字符串: "); gets(s2); n=findstr(s1,s2); printf("%s在%s里共有%d个\n",s2,s1,n); return0; } intfindstr(char*str,char*substr) { intcount=0,falg; char*p=substr; while(*str) { if(*str==*substr) { falg=0;//这个初始化的位置很关键,不要放错位置! ! ! ! ! str++;substr++; while(*substr) { if(*str! =*substr) { falg=1;break; } else { str++;substr++; } } if(falg==1) { substr=p; } else { count++;substr=p; } } elsestr++; } returncount; } /*sdasasdfgasdadszx67asdmklo as 6*/ 7、有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出”abdefghjkmnptwy”。 #include #include voidmain() { chara[20]="bdfhjmptwy";//升序 chars[]="ganke"; char*p1=a,*p2=s,*p=NULL; while(*p2) { while(*p1) { if(*p2>*p1)p1++; elsebreak;//要有出口! ! ! ! } p=p1;//保存指针的位置! ! ! while(*p1)p1++; while(p1! =p) { *(p1+1)=*p1; p1--; } *(p1+1)=*p1; *p=*p2; p2++; p1=a;//指针复原很重要! ! ! ! } puts(a); } 8、编写程序将已按升序排好的两个字符串a和b中的字符按升序归并到字符串c中,最后输出”abcdefghijklmnpq”。 解: 方法一: #include #include voidmain() { chara[]="acegikm";//升序 charb[]="bdfhjlnpq";//升序 charc[80],*p=c; inti=0,j=0,k=0; char*p1=a,*p2=b; while(*p1||*p2) { if(*p1=='\0'&&*p2) { while(*p2) { *p++=*p2++; } } if(*p1>*p2) { *p++=*p2;p2++; } elseif(*p1==*p2) { *p++=*p1; p1++;p2++; } else { *p++=*p1;p1++; } } *p=0; puts(c); } 方法二: #include #include intmain() { chara[]="acegikm";//升序 charb[]="bdfhjlnpq";//升序 strcat(a,b); voidpaixu(chara[]);//排序函数 paixu(a); puts(a); } voidpaixu(chara[]) { inti,j,index,temp;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 数组 补充 习题