指针与数组补充习题Word格式文档下载.docx
- 文档编号:18342975
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:27
- 大小:21.99KB
指针与数组补充习题Word格式文档下载.docx
《指针与数组补充习题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《指针与数组补充习题Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
方法二:
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)
}
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<
stdio.h>
charstr1[500]={0},str2[256]={0};
inti;
str2[str1[i]]=1;
i!
=256;
if(str2[i]==1)
printf("
%c"
i);
putchar('
\n'
2、从键盘输入一个n×
n的二维数组(n键盘输入),找出此二维数组中各行的最大值,并按从大到小的次序输出各行的最大值及此值所在的行号。
如:
输入
4(n=4)
13342344
45782130
98321150
5668822(n×
n)
输出
983(最大98,在第3行)
884
782
441
解题步骤:
1.找每行最大值将它们存入一维数组中
2.对一维数组排序
3.输出的同时查找这个数在第几行
inta[80][80],b[80],c[80];
//定义b数组保存各行最大值,c数组保存各行行号
intn,i,j,k=0,l=0,index,max,temp;
scanf("
%d"
&
n);
请输入%d阶矩阵:
n);
i<
n;
for(j=0;
j<
scanf("
a[i][j]);
max=a[i][0];
for(j=1;
if(a[i][j]>
max)max=a[i][j];
b[k++]=max;
//记录此行的最大值
c[l++]=i+1;
//记录这时的行号
n-1;
i++)//选择排序
if(b[j]>
b[index])index=j;
temp=b[index];
b[index]=b[i];
b[i]=temp;
temp=c[index];
//交换最大值时别忘了交换相应的行号
c[index]=c[i];
c[i]=temp;
每行最大数排序后:
\n"
printf("
%-4d在第%2d行\n"
b[i],c[i]);
/*从键盘输入一个n×
n的二维数组(n键盘输入),
找出此二维数组中各行的最大值,并按从
大到小的次序输出各行的最大值及此值所在的行号。
3.输出的同时查找这个数在第几行*/
3、下面程序实现如下功能:
输入一个整数字符串转换为一个整数值,如”1234”转换为1234,”-1234”转换为-1234。
读懂main函数,编写转换函数chnum。
string.h>
chars[60];
intn;
longchnum(char*p);
gets(s);
if(*s=='
-'
)n=-chnum(s+1);
elsen=chnum(s);
%d\n"
return0;
longchnum(char*p)
longsum=0;
while(*p)
if(*p>
='
0'
&
*p<
9'
)
sum=sum*10+*p-'
;
p++;
returnsum;
4、从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。
读懂以下main函数,编写相应的函数del16和htod。
voidmain()
{
chars1[10],s2[10];
voiddel16(char*p1,char*p2);
longhtod(char*p);
gets(s1);
//读入一字符串
del16(s1,s2);
//去掉所有非十六进制字符到s2
htod(s2));
//把s2转换为10进制
voiddel16(char*p1,char*p2)
if(*p1<
f'
*p1>
a'
||*p1<
F'
A'
*p2++=*p1;
p1++;
*p2='
\0'
longhtod(char*p)
if(*p<
*p>
)sum=sum*16+*p-'
+10;
elseif(*p<
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字符串结束
/*
*/
chars1[80],s2[80];
intn;
voidinsert(char*s1,char*s2,intpos);
gets(s2);
insert(s1,s2,n);
puts(s1);
voidinsert(char*s1,char*s2,intpos)
inti,count2=0;
char*p=NULL,*p1=s1,*p2=s2;
while(*s2!
){
s2++;
count2++;
}//统计s2字符串字符个数,以确定字符串s1位移量。
i=1;
while(i<
pos)
s1++;
i++;
}//让指针指向pos位置
p=s1;
//记录pos位置
while(*s1)s1++;
//s1指向’\0’
for(i=1;
count2;
i++)//位移count2-1个位移量,腾出位置给s2
while(s1>
=p)
*(s1+1)=*s1;
s1--;
while(*s1)s1++;
//准备第二轮位移的开始!
!
}//指针指向pos位置
while(*p2)
*p1++=*p2++;
}//加载s2字符串
/*遇见问题处理:
1.位移量不能为count2,会位移多一位,不符合题目要求
2.循环体要有出口,有步长,否则会陷入死循环
3.指针的指向要明确,来回都要非常清楚它的位置。
chars[80];
char*p=s1,*p1=s;
p=p+pos-1;
*p++=0;
*p1++=*p++;
*p1=0;
strcat(s1,s2);
strcat(s1,s);
6、编写程序,实现下面一个有关单词个数统计问题。
编写一个函数findstr(char*str,char*substr),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。
例如,假定输入的字符串为”asdasasdfgasdaszx67asdmklo”,子字符串为as,函数返回值是6。
asdasasdfgasdaszx67asdmklo
as
6
intfindstr(char*str,char*substr);
请输入你要查找的字符串:
n=findstr(s1,s2);
%s在%s里共有%d个\n"
s2,s1,n);
intfindstr(char*str,char*substr)
inti,j,k,count=0;
chartemp[80];
intlength=strlen(substr);
strlen(str);
k=0;
for(j=i;
i+length;
temp[k++]=str[j];
temp[k]='
if(!
strcmp(temp,substr))count++;
returncount;
法二:
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++;
if(falg==1)
substr=p;
else
count++;
substr=p;
elsestr++;
/*sdasasdfgasdadszx67asdmklo
6*/
7、有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出”abdefghjkmnptwy”。
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!
*(p1+1)=*p1;
p1--;
*(p1+1)=*p1;
*p=*p2;
p2++;
p1=a;
//指针复原很重要!
puts(a);
8、编写程序将已按升序排好的两个字符串a和b中的字符按升序归并到字符串c中,最后输出”abcdefghijklmnpq”。
chara[]="
acegikm"
charb[]="
bdfhjlnpq"
//升序
charc[80],*p=c;
inti=0,j=0,k=0;
char*p1=a,*p2=b;
while(*p1||*p2)
if(*p1=='
*p2)
while(*p2)
*p++=*p2++;
if(*p1>
*p2)
*p++=*p2;
p2++;
elseif(*p1==*p2)
*p++=*p1;
p1++;
else
p1++;
*p=0;
puts(c);
intmain()
strcat(a,b);
voidpaixu(chara[]);
//排序函数
paixu(a);
voidpaixu(chara[])
inti,j,index,temp;
strlen(a)-1;
strlen(a);
if(a[j]<
a[index])index=j;
temp=a[index];
a[index]=a[i];
a[i]=temp;
}
9、编写程序判断一个字符串是否为回文字符串。
Level
Yes
12345
No
#include<
chars[81],*p1,*p2;
gets(s);
p1=p2=s;
while(*p2)p2++;
p2--;
while(p1<
p2)
if(*p1!
=*p2)break;
else
p1++;
p2--;
if(p1<
No\n"
else
Yes\n"
10、有n个人围成一个圆圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号?
intcount,i,j,m,n,no=0;
intnum[100];
&
for(i=0;
i<
n;
i++)
num[i]=i+1;
for(i=0,j=0;
for(count=0;
j=(j+1)%n)
if(num[j])
if(++count==3)break;
no++;
if(no==n)break;
No%d:
%d\n"
no,num[j]);
num[j]=0;
LastNois:
num[j]);
(借鉴别人的)
#defineN5//排队人数(可任意更改)
#defineCAL3//凡报3的人出列(可任意更改)
//下面是排队编号函数:
从h开始的n个人依次编号1到n
voidstdline(int*h,intn)
inti;
for(i=1;
n+1;
i++)*(h+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("
出列顺序是:
while(chu<
boy)
if(*p!
=0)callnum++;
//每次加报数
if(callnum==call)//如果某一个人报到出列数call...
%5d"
*p);
//打印编号,表示出列
chu++;
//出列人数加1
if(chu==boy)//如果全部出列....
*h=*p;
//把最后一个出列人的编号记入地址开始处
return;
//结束
if(chu%10==0)printf("
//每输出10个换行
callnum=0;
//出列后,重新报数
*p=0;
//出列后,将其编号赋零,以示区别
p++;
//工作指针移向下一个人,即下一个数组元素
if(p>
h+boy-1)p=h;
/*如果移到最后一个元素的后面,则让指向地址开头继续报数*/
inta[N];
//用数组模拟队列,每个元素代表一个人
stdline(a,N);
//编号
outli
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 数组 补充 习题