指针与数组补充习题.docx
《指针与数组补充习题.docx》由会员分享,可在线阅读,更多相关《指针与数组补充习题.docx(27页珍藏版)》请在冰点文库上搜索。
![指针与数组补充习题.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/7133a4dc-b807-4d01-bfe3-83f36b5ee38a/7133a4dc-b807-4d01-bfe3-83f36b5ee38a1.gif)
指针与数组补充习题
指针与数组练习题
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;ifor(j=0;jscanf("%d",&a[i][j]);
for(i=0;i{
max=a[i][0];
for(j=1;jif(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;jif(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;iprintf("%-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;jif(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(p1printf("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;inum[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