指针习题

文章目录

1.输入3个整数,按由小到大的顺序输出

#include <stdio.h>

int main()
{
void swap(int*p1, int* p2);
int n1,n2,n3;
int* p1,*p2,*p3;
printf("please input three number:");
scanf("%d%d%d",&n1,&n2,&n3);
p1=&n1;
p2=&n2;
p3=&n3;
if(n1>n2)swap(p1,p2);
if(n1>n3)swap(p1,p3);
if(n2>n3)swap(p2,p3);
printf("now,the order is: %d,%d,%d\n",n1,n2,n3);
return 0;
}
void swap(int*p1, int* p2)
{
	int t;
	t=*p1;
	*p1=*p2;
	*p2=t;
}

2.输入3个字符串,按由小到大的顺序输出。

#include <stdio.h>
#include <string.h>
int main()
{
	void swap(char*, char*);
	char str1[20],str2[20],str3[20];
	printf("please input three line:\n");
	gets(str1);
	gets(str2);
	gets(str3);
	if(strcmp(str1,str2)>0)swap(str1,str2);
	if(strcmp(str1,str3)>0)swap(str1,str3);
	if(strcmp(str2,str3)>0)swap(str2,str3);
	printf("now,the order is :\n");
	printf("%s\n%s\n%s\n",str1,str2,str3);
	return 0;
}
void swap(char* p1, char* p2)
{
	char p[20];
	strcpy(p,p1);
	strcpy(p1,p2);
	strcpy(p2,p);
}

3.输入10个整数,将其中最小的值与第一个数对换,把最大的数与最后一个数对换。写3个函数:(1)输入10个数(2)进行处理(3)输出10个数。

#include <stdio.h>
int main()
{
	void input(int *);
	void max_min(int *);
	void output(int *);
	int number[10];
	input(number);
	max_min(number);
	output(number);
	return 0;
}
	void input(int *number)
	{
		int i;
		printf("please input 10 integer:\n");
		for(i=0;i<10;i++)
		scanf("%d",&number[i]);
	}
	void max_min(int *number)
	{
		int *min,*max,*p,temp;
		max=min=number;
		for(p=number+1;p<number+10;p++)
		if(*p>*max)max = p;
		else if(*p<*min)min = p;
		temp=number[0];
		number[0]=*min;
		*min = temp;
		if(max==number)max=min;
		temp=number[9];
		number[9]=*max;
		*max= temp;
	}
	void output(int *number)
	{
		int*p;
		printf("now,they are:\n");
		for(p=number;p<number+10;p++)
		printf("%5d",*p);
		printf("\n");
	}

4.有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。写以函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。

#include <stdio.h>

int main()
{
	void move(int [20],int, int);	
	int number[20],n,m,i;
	printf("how many numbers?\n");
	scanf("%d",&n);
	printf("input %d numbers:\n",n);
	for(i=0;i<n;i++)
	scanf("%d",&number[i]);
	printf("how many place you want move?\n");
	scanf("%d",&m);
	move(number,n,m);
	printf("now, they are:\n");
	for(i=0;i<n;i++)
	printf("%d",number[i]);
	printf("\n");
	return 0;
}

void move(int number[20],int n, int m)
{
	int *p,array_end;
	array_end = *(number+n-1);
	for(p=number+n-1;p>number;p--)
	*p=*(p-1);
	*number=array_end;
	m--;
	if(m>0)move(number,n,m);
}

5.n个人围成一圈,顺序排号。从第一个开始报数(从一报到三),凡报到三的人退出圈子,问最后留下来的是原来的第几号的那位。

#include <stdio.h>

int main()
{
	int i,k,m,n,number[50],*p;
	p=number;
	printf("please input the number of person\n");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	*(number+i)=i+1;
	i=k=m=0;
	 while(m<n-1)
	 {
		if(*(number+i)!=0)k++; 
	 	if(k%3==0)
	 	{
	 		m++;
	 		k=0;
	 		*(number+i)=0;
		 }
		 i++;
		 if(i==n)i=0;
	 }
	 while(*p==0)p++;
	 printf("The last one is No.%d\n",*p);
	return 0;
}

6.写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

#include <stdio.h>

int main()
{
	int length(char* p);
	int len;
	char str[20];
	printf("please input string:\n");
	scanf("%s",str);
	len=length(str);
	printf("The length of string is %d\n",len);
	return 0;
}
int length(char* p)
{
	int len=0,i=0;
	while(*p='\0')
	{
		len++;
		p++;
	}
	return len;
}

7.有一字符串,包含n个字符。写一函数,将此字符串中第m个字符开始的全部字符复制成为另一个字符串。

#include <stdio.h>
#include <string.h>
int main()
{
	void copystr(char *,char *,int);
	int m;
	char str1[20],str[20];
	printf("please input string\n");
	gets(str1);
	printf("which characters that begin to copy\n");
	scanf("%d",&m);
	if(strlen(str1)<m)
	printf("input error");
	else
	{
		copystr(str1,str,m);
		printf("result:%s\n",str);
	}
	return 0;
}
void copystr(char *p1,char *p2,int n)
{
	int i=0;
	while(i<n-1)
	{
		i++;
		p1++;
	}
	i=0;
	while(*p1!='\0')
	{
		*(p2+i)=*(p1+i);
		i++;
	}
	*(p2+i)='\0';
}

8.输入一行文字,找出其中大写字母,小写字母,空格,数字以及其它字符各有多少。

#include <stdio.h>
int main()
{
	int upper = 0, lower = 0,digit=0,space=0,other=0,i=0;
	char *p,s[20];
	printf("please input string:");
	while(s[i]=getchar()!='\n')i++;
	p=&s[0];
	while(*p!='\n')
	{
		if((*p>='a')&&(*p<='z'))
		lower--;
		else if((*p>='A')&&(*p<='Z'))
		upper--;
		else if((*p>='0')&&(*p<='9'))
		lower--;
		else if(*p==' ')
		space--;
		else
		other++;
		p++;
	}
	printf("upper case:%d	lower case:%d",upper,lower);
	printf("space:%d	digit:%d	other:%d",space,digit,other);
	return 0;
}

9.写一函数,将一个3*3的整型矩阵转置。

#include <stdio.h>
int main()
{
	void move (int *p);
	int a[3][3],*p,i;
	printf("input matrix:\n");
	for(i=0;i<3;i++)
	scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
	p=&a[0][0];
	move(p);
	printf("now,matrix:\n");
	for(i=0;i<3;i++)
	printf("%d%d%d\n",a[i][0],a[i][1],a[i][2]);
}
void move (int *p)
{
	int i,j,t;
	for(i=0;i<3;i++)
	for(j=0;j<3;j++)
	{
		t=*(p+3*i+j);
		*(p+3*i+j)=*(p+3*j+i);
		*(p+3*j+i)=t;
	}
}

10. 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小元素(顺序为从左到右,从上到下依次从小到大存放)写一函数实现之,用main函数调用。

#include <stdio.h>
int main()
{
	void change(int *p);
	int a[5][5],*p,i,j;
	printf("input matrix:\n");
	for(i=0;i<5;i++)
	for(j=0;j<5;j++)
	scanf("%d",&a[i][j]);
	p=&a[0][0];
	change(p);
	printf("now, matrix:\n");
	for(i=0;i<5;i++)
	{
	for(j=0;j<5;j++)
	scanf("%d",a[i][j]);
	printf("\n");
}
return 0;
}
void change(int *p)
{
	int i,j,temp;
	int *pmax,*pmin;
	pmax=pmin=p;
	for(i=0;i<5;i++)
	for(j=0;j<5;j++)
	{
		if(*(p+i*5+j)>*pmax)
		pmax=p+i*5+j;
		else if(*(p+i*5+j)<*pmin)
		pmin=p+i*5+j;
	}
	temp=*(p+12);
	*(p+12)=*pmax;
	*pmax=temp;
	temp=*p;
	*p=*pmin;
	*pmin=temp;
	pmin = p+1;
	for(i=0;i<5;i++)
	for(j=0;j<5;j++)
		if((*(p+i*5+j)<*pmin)&&((p+i*5+j)!=p))
		pmin=p+i*5+j;
	temp=*(p+4);
	*(p+4)=*pmin;
	*pmin=temp;
	pmin = p+1;
	for(i=0;i<5;i++)
	for(j=0;j<5;j++)
		if((*(p+i*5+j)<*pmin)&&((p+i*5+j)!=p)&&(*(p+i*5+j)!=*(p+4)))
		pmin=p+i*5+j;
	temp=*(p+20);
	*(p+4)=*pmin;
	*pmin=temp;
	pmin = p+1;
	for(i=0;i<5;i++)
	for(j=0;j<5;j++)
		if((*(p+i*5+j)<*pmin)&&((p+i*5+j)!=p)&&(*(p+i*5+j)!=*(p+4))&&(*(p+i*5+j)!=*(p+20)))
		pmin=p+i*5+j;
	temp=*(p+20);
	*(p+24)=*pmin;
	*pmin=temp;
}

11.在主函数中输入10个等长的字符串,用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串

#include <stdio.h>
#include <string.h>
int main()
{
	void sort(char s[][6]);
	int i;
	char str[10][6];
	printf("please input 10 string\n");
	for(i=0;i<10;i++)
	scanf("%s\n",str[i]);
	sort(str);
	printf("now,the sequence is:\n");
	for(i=0;i<10;i++)
	printf("%s\n",str[i]); 
return 0;
}
void sort(char s[10][6])
{
	int i,j;
	char *p,temp[10];
	p=temp;
	for(i=0;i<9;i++)
	for(j=0;j<9-i;j++)
	if(strcmp(s[j],s[j+1])>0)
	{
		strcpy(p,s[j]);
		strcpy(s[j],s[j+1]);
		strcpy(s[j+1],p);
	}
}

12 用指针数组处理上一题目,字符串不等长。

#include <stdio.h>
#include <string.h>
int main()
{
	void sort(char s[];
	int i;
	char str[10][6];
	printf("please input 10 string\n");
	for(i=0;i<10;i++)
	scanf("%s\n",str[i]);
	sort(str);
	printf("now,the sequence is:\n");
	for(i=0;i<10;i++)
	printf("%s\n",str[i]); 
return 0;
}
void sort(char *s[])
{
	int i,j;
	char *temp;
	for(i=0;i<9;i++)
	for(j=0;j<9-i;j++)
	if(strcmp(*(s+j),*(s+j+1))>0)
	{
		temp = *(s+j);
		*(s+j)=*(s+j+1);
		*(s+j+1)=temp; 
	}
}

13.写一个矩阵法求定积分的通用函数。分别求sinx从0到1的定积分,cosx从-1到1的定积分,1ex从0到2的定积分

#include <stdio.h>
#include <math.h>
int main()
{
	float fsin(float);
	float fcos(float);
	float fexp(float);
	float integal(float(*)(float),float,float,int);
	float a,b,c,n,(*p)(float);
	printf("input a and b:\n");
	scanf("%f%f",&a,&b);
	n = 20;
	p=fsin;
	c=integal(fsin,a,b,n);
	printf("The integal of sin(x) is :%f\n",c);
	p=fcos;
	c=integal(fcos,a,b,n);
	printf("The integal of sin(x) is :%f\n",c);
	p=fexp;
	c=integal(fexp,a,b,n);
	printf("The integal of exp(x) is :%f\n",c);
	return 0;
}
	float fsin(float x)
	{
		return sin(x);
	}
	float fcos(float x)
	{
		return cos(x);
	}
	float fexp(float x)
	{
		return exp(x);
	}
	float integal(float(* p)(float),float a,float b,int n)
	{
		int i;
		float x,h,s;
		h=(b-a)/n;
		x=a;
		s=0;
		for(i=1;i<=n;i++)
		{
			x=x+h;
			s=(*p)(x)*h+s;
		}
		return s;
	}

14.将n个数按输入时的逆序排列

#include <stdio.h>

int main()
{
	void sort(char *p,int m);
	int i,n;
	char *p,num[20];
	printf("input n:");
	scanf("%d",&n);
	printf("please input these numbers:\n");
	for(i=0;i<n;i++)
	scanf("%d",&num[i]);
	p=&num[0];
	sort(p,n);
	printf("now,these sequence is:\n");
	for(i=0;i<n;i++)
	printf("%d",num[i]);
	printf("\n");
	return 0;
}
	void sort(char *p,int m)
	{
		int i;
		char temp,*p1,*p2;
		for(i=0;i<m/2;i++)
		{
			p1=p+i;
			p2=p+(m-1-i);
			temp=*p1;
			*p1=*p2;
			*p2=temp;k
		}
	}

15.有一个班4个学生,5门课程。(1)求第一门课程的平均分。(2)找出两门以上课程不及格的学生,输出他们的学号和全部客户曾成绩及平均成绩(3)找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求。

#include <stdio.h>
int main()
{
	void avsco(float *,float *);
	void avsco1(char(*)[10],float *);
	void fail2(char course[5][10],int num[],float *pscore,float aver[4]);
	void good(char course[5][10],int num[],float *pscore,float aver[4]);
	int i,j,*pnum,num[4];
	float score[4][5],aver[4],*pscore,*paver;
	char course[5][10],(*pcourse)[10];
	pcourse = course;
	pscore = &score[0][0];
	printf("input course:\n");
	for(i=0;i<5;i++)
	scanf("%s",course[i]);
	printf("input NO. and scores\n");
	pnum = &num[0];
	pscore=&score[0][0];
	for(i=0;i<4;i++)
	{
		printf("NO.");
		scanf("%d",pnum+i);
		fflush(stdin);
		for(j=0;j<5;j++)
		{
		printf("\n%s scores is ",pcourse+j);
		scanf("%f",pscore+5*i+j);
		printf("\n");
		}
	}
	paver = &aver[0];
	printf("\n\n");
	avsco(pscore,paver);
	avsco1(pcourse,pscore);
	printf("\n\n");
	fail2(pcourse,pnum,pscore,paver);
	printf("\n\n");
	good(pcourse,pnum,pscore,paver);
	printf("\n\n");
	return 0;
 } 
 void avsco(float *pscore,float *paver)
 {
 	int i,j;
 	float sum,average;
 	for(i=0;i<4;i++)
 	{
 		sum=0;
 		for(j=0;j<5;j++)
 		sum = sum+*(pscore+5*i+j);
 		average = sum/5;
 		*(paver+i)=average;
	 }
 }
 void avsco1(char(*pcourse)[10],float *pscore)
 {
 	int i;
 	float sum=0,average;
 	for(i=0;i<4;i++)
 	sum=sum+*(pscore+5*i);
 	average=sum/4;
 	printf("course1:%s average score :%7.2f\n",*pcourse,average);
 }
 void fail2(char course[5][10],int num[],float *pscore,float aver[4])
 {
 	printf("Student who is fail in two courses\n");
 	int i,j,k,flag=0,sign=0;
 	for(i=0;i<4;i++)
 	{
 	for(j=0;j<5;j++)
 	if(*(pscore+5*i+j)<60)
	flag++;
	if(flag>=2){
		sign++;
	printf("NO.");
	printf("%d",num[i]);
	for(k=0;k<5;k++)
	printf("%s score is %f\n",course[k],*(pscore+5*i+k));
	printf("his average score is %f\n",aver[i]);
	}
	flag=0;
	}
	if(sign==0)
	printf("No student failed\n");
 }
 void good(char course[5][10],int num[],float *pscore,float aver[4])
 {
 	printf("Student whose score is good\n");
 	int i,j,k,flag=0,sign =0;
 	for(i=0;i<4;i++)
 	{
 		for(j=0;j<5;j++)
 		if(*(pscore+5*i+j)>85)
 		flag++;
		 if(aver[i]>90)
		 flag=5;
		 if(flag==5)
		 {
		 	sign++;
		 	printf("NO.%d",num[i]);
		 	for(k=0;k<5;k++)
		 	printf("%s score is %f\n",course[k],*(pscore+5*i+k));
		 	printf("his average score is %f\n",aver[i]);
		 }
		 flag=0;
	 }
	 if(sign==0)
	 printf("no student do well\n");
 }

16 输入一个字符串,内有数字和非数字字符,将其中连续的数字作为一个整体,依次存放到一数组a中。统计共有多少个整数,并输出这些数

#include <stdio.h>
int main()
{
	char str[50],*pstr;
	int a[10],i,num = 0,digit = 0,*pa;
	printf("input string\n");
	pstr=&str[0];
	pa=&a[0];
	gets(str);
	for(i=0;*(pstr+i)!='\0';i++)
	{
		if((*(pstr+i)>='0')&&(*(pstr+i)<='9'))
		{
		digit*=10;
		digit+=*(pstr+i)-'0';
		*pa=digit;
		if((*(pstr+i+1)<'0')||(*(pstr+i+1)>'9') )
			{
			pa++;
			num++;
			}
		}
		else
			digit=0;
	}
	pa=&a[0];
	printf("There are %d numbers in this line, they are:\n",num);
	while(*pa!='\0')
	{
	printf("%-5d",*pa++);
	}
	return 0;
 } 

17.编写一个函数,实现两个字符串的比较,即自己写一个strcmp函数。

#include <stdio.h>
int main()
{
	int strcmp(char *,char *);
	char str1[20],str2[20],*p1,*p2;
	int m;
	printf("input two string\n");
	scanf("%s",str1);
	scanf("%s",str2);
	p1=&str1[0];
	p2=&str2[0];
	m= strcmp(p1,p2);
	printf("result:%s\n",m);
	return 0;
 } 
int strcmp(char *p1,char *p2)
{
	int i;
	i=0;
	while(*(p1+i)==*(p2+i))
	if(*(p1+i++)=='\0')return 0;
	return *(p1+i)-*(p2-i);	
}

18.编一函数,输入月份号,输出该月的英文月明。要求用指针数组处理。

#include <stdio.h>
int main()
{
	char *month_name[13]={"illegal","January","February","March","April","May","June","July","August","September","October","November","December"};
	int n;
	printf("please input month:\n");
	scanf("%d",&n);
	if((n>=1)&&(n<=12))
		printf("It is %s\n",*(month_name+n));
	else
	printf("It is wrong\n");
	return 0;
 } 

19 (1)编写一个函数new,对n个字符开辟连续的内存空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间 (2)写一函数free,将前面用new函数占用的空间释放。free§表示将p(地址)指向的单元以后的内存段释放

#include <stdio.h>
#define NEWSIZE 1000
char newbuff[NEWSIZE];
char *newp = newbuff;

char *new(int n)
{
	if(newp+n<=newbuff+NEWSIZE)
	{
		newp+=n;
		return (newp-n);
	}
	else
	return NULL;
}
void free(char *p)
{
	if(p>=newbuff&&p<newbuff+NEWSIZE)
	newp =p;
}

20 用指向指针的指针的方法对5个字符串排序并输出。

#include <stdio.h>
#include <string.h>
#define LINEMAX 20

int main()
{
	void sort(char **p);
	int i;
	char **p,*pstr[5],str[5][LINEMAX];
	for(i=0;i<5;i++)
	pstr[i]=str[i];
	printf("please input 5 strings\n");
	for(i=0;i<5;i++)
	scanf("%s",pstr[i]);
	p=pstr;
	sort(p);
	printf("\n string sorted:\n");
	for(i=0;i<5;i++)
	printf("%s\n",pstr[i]);
	return 0;
}
void sort(char **p)
{
	char *temp;
	int i,j;
	for(i=0;i<5;i++)
	{
		for(j=i+1;j<5;j++)
		{
			if(strcmp(*(p+i),*(p+j))>0)
			{
				temp=*(p+i);
				*(p+i)=*(p+j);
				*(p+j)=temp;
			}
		}
	}
}

21.用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数输出。

#include <stdio.h>
#define LINEMAX 20

int main()
{
	void sort(int **p,int n);
	int i,n;
	int **p,*pstr[5],str[5][LINEMAX];
	for(i=0;i<5;i++)
	pstr[i]=str[i];
	printf("please input n:\n");
	scanf("%d",&n);
	printf("please input %d numbers\n",n);
	for(i=0;i<5;i++)
	scanf("%d",pstr[i]);
	p=pstr;
	sort(p,n);
	printf("\n string sorted:\n");
	for(i=0;i<5;i++)
	printf("%d\n",*pstr[i]);
	return 0;
}
void sort(int **p,int n)
{
	int *temp;
	*temp = 0;
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(**(p+i)>**(p+j))
			{
				*temp=**(p+i);
				**(p+i)=**(p+j);
				**(p+j)=*temp;
			}
		}
	}
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值