2024年6月15日发(作者:)
指针编程题
1.编写一函数,完成一个字符串的拷贝,要求用字
符指针实现。在主函数中输入任意字符串,并显示原字符串,调用该函数
之后输出拷贝后的字符串。
#include <stdio.h>
void copy(char *pa,char *pb);
int main(void)
{
char a[80],b[80];
printf("Input string:n");
gets(a);
printf("nOldString=%sn",a);
printf("n");
copy(a,b);
printf("nNewString=%sn",b);
return 0;
}
void copy(char *pa,char *pb)
{
while(*pa != '0')
{
*pb=*pa;
pa++;
pb++;
}
*pb='0';
}
2.编写一函数,求一个字符串的长度,要求用字符指针实现。在主函数中
输入字符串,调用该函数输出其长度。
#include <stdio.h>
void MyStrlen(char *pa);
main()
{
char a[80];
printf("please input a:");
gets(a);
MyStrlen(a);
rerurn 0;
}
void MyStrlen(char *pa)
{
int count=0;
while(*pa != '0')
{
pa++;//指向下一位字符
count++;
}
printf("实际字符个数为:%dn",count);
}
3.从键盘上输入10个数据到一维数组中,然后找出数组中的最大值和该值
所在的元素下标。
要求调用子函数search(int *pa,int n,int *pmax,int *pflag)完成,数组名作为
实参,
指针作为形参,最大值和下标在形参中以指针的形式返回。编程素材有
printf("Input 10 numbers:");
和printf("Max is:%dn",...);以及printf("Max position
is:%dn",...)
#include <stdio.h>
int search(int *pa,int n,int *pmax,int *pflag);
int main()
{
int a[10],i,max,flag,pmax;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
pmax=search(a,10,&max,&flag);
printf("Max is:%dn",max);
printf("Max position is:%dn",flag);
}
int search(int *pa,int n,int *pmax,int *pflag)
{
int i,*max;
max=pmax;
*pmax=pa[0];
for(i=1;i<n;i++)
{
if(*pmax<pa[i])
{
*pmax=pa[i];
*pflag=i;
}
}
return *max;
}
4.从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数
对换,最大的数与最后一个数对换。要求进行数据交换的处理过程编写成
一个函数,函数中对数据的处理要用指针方法实现。编程素材有
printf("Input 10 datas:");和printf("Output 10 datas:");
以及printf("%d ",...);输入数据为:35,20,94,-23,39,
-56,100,87,49,12.
#include <stdio.h>
void swap(int *p1,int *p2);
void fun(int *p);
int main()
{
int a[10],i;
printf("Input 10 datas:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
fun(a);
}
void swap(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
void fun(int *pa)
{
int max,min,i,m,n;
max=*pa;
min=*pa;
for(i=1;i<10;i++)
{
if(max<pa[i])
{
max=pa[i];
m=i;
}
if(min>pa[i])
{
min=pa[i];
n=i;
}
}
swap(&pa[0],&pa[n]);
swap(&pa[9],&pa[m]);
printf("Output 10 datas:");
for(i=0;i<10;i++)
printf("%d ",pa[i]);
}
5.编写一个函数(参数用指针)将一个3×3矩阵转置。
#include <stdio.h>
void fun(int (*pa
)[3],int (*pb)[3]);
int main()
{
int a[3][3],i,j,b[3][3]={0};
printf("Please input a:n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
fun(a,b);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%dt",b[i][j]);
printf("n");
}
return 0;
}
void fun(int (*pa)[3],int (*pb)[3])
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
pb[j][i]=pa[i][j];
}
6.利用指向行的指针变量求5×3数组各行元素之和
#include <stdio.h>
void fun(int (*p)[3]);
int main()
{
int a[5][3],i,j;
printf("请输入5*3矩阵a:n");
for(i=0;i<5;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
fun(a);
return 0;
}
void fun(int (*p)[3])
{
int i,j,sum=0;
for(i=0;i<5;i++)
{
printf("第%d行元素之和为:",i+1);
for(j=0;j<3;j++)
sum+=p[i][j];
printf("%dn",sum);
sum=0;
}
}
7.从键盘上输入10个整数存放到一维数组中,用函数实现将10个整数按
输入时的顺序逆序排列,函数中对数据的处理要用指针方法实现。
#include <stdio.h>
void fun(int *pa,int t);
int main()
{
int a[10],i;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
fun(a,10);
return 0;
}
void fun(int *pa,int t)
{
int i;
printf("Output 10 numbers:");
for(i=t-1;i>=0;i--)
printf("%d ",pa[i]);
}
8.用指针法编程,从键盘上输入多个字符串(每个串不超过5个字符且没
有空格),用”*****”作为输入结束的标记。从所输入的若干字符串中,
找出一个最大的串,并输出该串。要求串的输入以及最大串的查找通过调
用编写的函数实现。编程素材有printf("****Input
strings****n");和 printf("max=%sn",...);输入内容为hello
apple zone world *****。
#include <stdio.h>
#include <string.h>
void find(char *name[],int n,int *p)
{
int i,m = 0;
char *pmax = name[0];
for(i = 1;i < n;i++)
{
if(strcmp(pmax,name[i]) < 0)
{
strcpy(pmax,name[i]);
m = i;
}
}
*p = m;
}
int main(void)
{
char *str[100];
char a[100][6];
int i = 0,max;
printf("****Input strings****n");
do
{
str[i] = a[i];
scanf("%s",str[i]);
i++;
}while(strcmp(str[i-1],"*****") != 0);
find(str,i,&max);
printf("max=%sn",str[max]);
return 0;
}
9.在主函数中输入5个字符串(每个字符串的长度不大于20),并输出这5
个字符串。编写一个排序函数,完成对这些字符串按照字典顺序排序。然
后在主函数中调用该排序函数,并输出这5个已排好序的字符串。要求用
指针数组处理这些字符串。编程素材有printf("*****Input 5
strings******n");
Before******n");以
和
及
printf("n******Sort
printf("n******Sort
me,BASIC,Great After******n");输入内容为:Follow
Wall,FORTRAN,Computer design。
#include <stdio.h>
#include <string.h>
void fun(char *pa[20]);
int main()
{
char a[5][20],*p[5];
int i;
printf("*****Input 5 strings******n");
for(i=0;i<5;i++)
gets(a[
i]);
for(i=0;i<5;i++)
p[i]=a[i];
printf("n******Sort Before******n");
for(i=0;i<5;i++)
puts(a[i]);
printf("n******Sort After******n");
fun(p);
for(i=0;i<5;i++)
puts(p[i]);
return 0;
}
void fun(char *pa[20])
{
int i,j;
char *temp=NULL;
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
{
if(strcmp(pa[j],pa[i])<0)
{
temp=pa[i];
pa[i]=pa[j];
pa[j]=temp;
}
}
}
10.找出一个2×3的矩阵中的最大值及其行下标和列下标,要求调用子函
数FindMax(int p[][3], int m, int n, int *pRow, int *pCol)实现,最大值以函数的
返回值得到,行下标和列下标在形参中以指针的形式返回。编程素材有
printf("Input 6 datas:");printf("n****array****n");
和printf("%4d",...);以及printf("nMax=%d, Row=%d,
Col=%dn",...);输入内容为:12,23,10,11,19,17.
#include <stdio.h>
int FindMax(int p[][3], int m, int n, int *pRow, int *pCol);
int main()
{
int a[2][3],i,j,row,col,max;
printf("Input 6 datas:");
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("n****array****n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("%4d",a[i][j]);
printf("n");
}
max=FindMax(a,2,3,&row,&col);
printf("nMax=%d, Row=%d, Col=%dn",max,row,col);
}
int FindMax(int p[][3], int m, int n, int *pRow, int *pCol)
{
int *max,i,j;
max=p[0];
*pRow=0;
*pCol=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(*max<p[i][j])
{
*max=p[i][j];
*pRow=i;
*pCol=j;
}
}
return (*max);
}
11.从键盘上先后读入两个字符串,假定存储在字符数组s1和s2中。注意,
这两个字符串最长均可达到26个字符、最短均可为0个字符。将字符串
s2插入字符串s1中,生成一个新的字符串s。插入方法为s2的第i个字符
插入到原s1的第i个字符后,如果s2比s1(假定s1的长度为L1)长,则s2
的第L1个字符开始到s2结尾的所有字符按在s2中的顺序放在新生成的字
符串s之后。用指针完成程序。程序的运行效果应类似地如下图所示。编
程素材printf("please input strings1:"); printf("please input
strings2:");和printf("result are:%sn",……);图中的acegi和
bdfhjklmn分别是从键盘输入的字符串。
法1:
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char s1[27], s2[27], s3[27];
char *p1=s1,*p2=s2,*p3=s3;
gets(s1);
gets(s2);
i = 0;
while (*(p1+i) != '0' && *(p2+i) != '0')
{
p3[2 * i] = p1[i];
p3[2 * i + 1] = p2[i];
i++;
}
p3[2 * i] = '0';
if (p1[i] == '0')
{
strcat(p3, (p2+i));
}
else
{
strcat(p3, (p1+i));
}
printf("%sn", s3);
}
法2:
#include<stdio.h>
main()
{
void Hebin(char *s1,char *s2);
char s1[26],s2[26];
printf("Please enter a s1:");
scanf("%s",s1);
printf("Please enter a s2:");
scanf("%s",s2);
Hebin(s1,s2);
printf("Result is %s:n",s1);
}
void Hebin(char *s1,char *s2)
{
char s[54];
int i=0,j,k;
while((s[i]=s
1[i])!='0')
{
i++;
}
i=0;
j=0;
k=0;
while(s1[i]!=0||s2[j]!=0)
{
if(s1[i]!=0)
s1[k++]=s[i++];
if(s2[j]!=0)
s1[k++]=s2[j++];
}
s1[k]='0';
}
12.编写一个函数,函数的功能是移动字符串中的内容。移动的规则如下:
把第1到第m个字符,平移到字符串的最后;再把第m+1到最后的字符
移动到字符串的前部。例如,字符串中原由的内容为:ABCDEFGHIJK,m
的值为3,则移动后,字符串中的内容应该是DEFGHIJKABC。在主函数中
输入一个长度不大于20的字符串和平移的值m,调用函数完成字符串的
平移。要求用指针方法处理字符串。编程素材有printf("Please input a
strings:");和printf("Please input intercept point:");以及
printf("Changed strings:%sn",...);输入内容为:ABCDEFGHIJK,3
法1:
#include <stdio.h>
#include <string.h>
void fun(char *pstr,int n);
int main()
{
char str[20];
int m;
printf("Please input a strings:");
gets(str);
printf("Please input intercept point:");
scanf("%d",&m);
fun(str,m);
return 0;
}
void fun(char *pstr,int n)
{
int i,x,count=0;
char b[20];
x=strlen(pstr);
for(i=n;i<x;i++)
{
b[count]=pstr[i];
count++;
}
for(i=0;i<n;i++)
{
b[count]=pstr[i];
count++;
}
b[count]='0';
printf("Changed strings:%sn",b);
}
法2:
#include <stdio.h>
#include <string.h>
void fun(char *pstr,int n);
int main()
{
char str[20];
int m;
printf("Please input a strings:");
gets(str);
printf("Please input intercept point:");
scanf("%d",&m);
fun(str,m);
return 0;
}
void fun(char *pstr,int n)
{
int i,x;
x=strlen(pstr);
printf("Changed strings:");
for(i=n;i<x;i++)
printf("%c",pstr[i]);
for(i=0;i<n;i++)
printf("%c",pstr[i]);
printf("n");
}
13.编写一个函数,用于统计一个字符串中字母、数字、空格的个数。在主
函数中输入该字符串后,调用上述函数,并输出统计结果。要求用指针实
现。编程素材有printf("Input a sring:");和printf("Result
is:char=%d,num=%d,space=%dn",...);
vdhfvsh345#%^$$%^456 5678%Ss s
#include <stdio.h>
#include <string.h>
void fun(char *p,int m);
int main()
{
char a[80];
int n;
printf("Input a sring:");
输入内容为:
fgets(a,sizeof(a),stdin);
n=strlen(a);
fun(a,n);
return 0;
}
void fun(char *p,int m)
{
int i,p1=0,p2=0,p3=0;
for(i=0;i<m;i++)
{
if(p[i]>='0' && p[i]<='9')
p1++;
if(p[i]>='A'
p[i]<='Z'||p[i]>='a'
p[i]<='z')
p2++;
if(p[i]==' ')
p3++;
}
printf("Result is:char=%d,num=%d,space=%dn",p2,p1,p3);
}
&&
&&
14.输入一个长度不大于30的字符串,将此字符串中从第m个字符开始的
剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指
针方法处理字符串。
#include <stdio.h>
#include <string.h>
void fun(char *pa,int n,int y);
int main()
{
char a[30];
int m,x;
printf("Input a string:");
fg
ets(a,sizeof(a),stdin);
x=strlen(a);
printf("Input a position:");
scanf("%d",&m);
fun(a,m,x);
}
void fun(char *pa,int n,int y)
{
char b[30];
int i,count=0;
for(i=n-1;i<y-1;i++)
{
b[count]=pa[i];
count++;
}
b[count]='0';
printf("Output new string:");
puts(b);
}
发布评论