指针与数组补充习题.docx

上传人:b****5 文档编号:7509825 上传时间:2023-05-11 格式:DOCX 页数:27 大小:21.99KB
下载 相关 举报
指针与数组补充习题.docx_第1页
第1页 / 共27页
指针与数组补充习题.docx_第2页
第2页 / 共27页
指针与数组补充习题.docx_第3页
第3页 / 共27页
指针与数组补充习题.docx_第4页
第4页 / 共27页
指针与数组补充习题.docx_第5页
第5页 / 共27页
指针与数组补充习题.docx_第6页
第6页 / 共27页
指针与数组补充习题.docx_第7页
第7页 / 共27页
指针与数组补充习题.docx_第8页
第8页 / 共27页
指针与数组补充习题.docx_第9页
第9页 / 共27页
指针与数组补充习题.docx_第10页
第10页 / 共27页
指针与数组补充习题.docx_第11页
第11页 / 共27页
指针与数组补充习题.docx_第12页
第12页 / 共27页
指针与数组补充习题.docx_第13页
第13页 / 共27页
指针与数组补充习题.docx_第14页
第14页 / 共27页
指针与数组补充习题.docx_第15页
第15页 / 共27页
指针与数组补充习题.docx_第16页
第16页 / 共27页
指针与数组补充习题.docx_第17页
第17页 / 共27页
指针与数组补充习题.docx_第18页
第18页 / 共27页
指针与数组补充习题.docx_第19页
第19页 / 共27页
指针与数组补充习题.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

指针与数组补充习题.docx

《指针与数组补充习题.docx》由会员分享,可在线阅读,更多相关《指针与数组补充习题.docx(27页珍藏版)》请在冰点文库上搜索。

指针与数组补充习题.docx

指针与数组补充习题

指针与数组练习题

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;

for(i=0;i

{

index=i;

for(j=i+1;j

if(a[j]

if(index==i)continue;

temp=a[index];

a[index]=a[i];

a[i]=temp;

}

}

9、编写程序判断一个字符串是否为回文字符串。

Level

Yes

12345

No

解:

#include

#include

voidmain()

{

chars[81],*p1,*p2;

intn;

gets(s);

p1=p2=s;

while(*p2)p2++;

p2--;

while(p1

{

if(*p1!

=*p2)break;

else

{

p1++;p2--;

}

}

if(p1

printf("No\n");

else

printf("Yes\n");

}

 

10、有n个人围成一个圆圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号?

方法一:

#include

intmain(void)

{

intcount,i,j,m,n,no=0;

intnum[100];

scanf("%d",&n);

for(i=0;i

num[i]=i+1;

for(i=0,j=0;i

{

for(count=0;;j=(j+1)%n)

{

if(num[j])

{

if(++count==3)break;

}

}

no++;

if(no==n)break;

printf("No%d:

%d\n",no,num[j]);

num[j]=0;

}

printf("LastNois:

%d\n",num[j]);

return0;

}

方法二:

(借鉴别人的)

#include

#defineN5//排队人数(可任意更改)

#defineCAL3//凡报3的人出列(可任意更改)

//下面是排队编号函数:

从h开始的n个人依次编号1到n

voidstdline(int*h,intn)

{

inti;

for(i=1;i

}

/*下面函数表示从指针h处开始的人数为boy个人排队,从1报数,每报到call的人出列*/

voidoutline(int*h,intboy,intcall)

{

int*p,chu,callnum;

/*说明:

p工作指针,表示从头依次指向每个元素,点名

chu计数器,记录出列的人数

callnum计数器,记录点名次序

*/

chu=0;

callnum=0;//各计数器清零

p=h;//开始时,工作指针指向数组首

printf("出列顺序是:

\n");

while(chu

{

if(*p!

=0)callnum++;//每次加报数

if(callnum==call)//如果某一个人报到出列数call...

{

printf("%5d",*p);//打印编号,表示出列

chu++;//出列人数加1

if(chu==boy)//如果全部出列....

{

*h=*p;//把最后一个出列人的编号记入地址开始处

return;//结束

}

if(chu%10==0)printf("\n");//每输出10个换行

callnum=0;//出列后,重新报数

*p=0;//出列后,将其编号赋零,以示区别

}

p++;//工作指针移向下一个人,即下一个数组元素

if(p>h+boy-1)p=h;/*如果移到最后一个元素的后面,则让指向地址开头继续报数*/

}

}

intmain()

{

inta[N];//用数组模拟队列,每个元素代表一个人

stdline(a,N);//编号

outli

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2