第8章 善于利用指针

1.输入3个整数,按有小到大的顺序输出(使用指针)。

/*1.一定要先理清思路,把算法想清楚,再开始*/
#include <stdio.h>

void swap(int *,int *);
int main()
{
	int n1,n2,n3;
	int *p1,*p2,*p3;
	printf("请输入3个整数,用空格间隔:");//加上提示性语句,增强交互性。
	
	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",*p1,*p2,*p3);
	
	return 0;
	
	
 } 
 
 
 void swap(int *a,int *b)
 {
 	    int p;
 		p=*b;
 		*b = *a;
 		 *a = p;
	 
 }

2. 输入3个字符串,按由小到大的顺序输出。(要求使用指针)


/*C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false;
负数也是true*/
#include <stdio.h>
#include <string.h>

int main()
{
	void swap(char *, char *);
	char str1[20],str2[31],str3[20];
	printf("input three line:\n");
	gets(str1);
	gets(str2);
	gets(str3);
	if(strcmp(str1,str2)>0)/*debug:'>'必须有,因为负数也是true*/
	{
		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 *str1, char *str2)
{
	char p[20];
	strcpy(p,str1);
	strcpy(str1,str2);
	strcpy(str2,p);
	
	
}

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

#include <stdio.h>

int main()
{
	void input(int *);
	void max_min_value(int *);
	void output(int *);
	
	int number[10];
	input(number);
	max_min_value(number);
	output(number);
	
	return 0; 
}

void input(int * number)
{
	int i;
	for(i=0;i<10;i++)
	{
		scanf("%d",number+i);
	}
}

	void max_min_value(int *number)
	{
		int *max,*min,*p,temp;
		max = min = number;/*先假设初值为最大和最小值*/
		for(p=number+1;p<number+10;p++)
		{
			if(*p > *max)  max = p;
			else if(*p < *min) min = p;
		}
		
		//交换最小与number[0]
		temp = * min;
		*min = number[0];
		number[0] = temp;
		
		//考虑,最大刚好在number[0]的情况
		if(max == number)
		{
			max = min;
		 } 
		 
		//交换最大与number[9]
		temp = number[9];
		number[9] = *max;
		*max = temp; 
		
		
	}
	
	void output(int * number)
	{
		int * p;
		printf("Now ,they are : ");
		for(p=number;p<number+10;p++)
			printf("%d ",*p);
			
		printf("\n");
	} 
	 

4. n个整数,是前面个数顺序向后移m个位置,最后m个数变成前面m个数。

#include <stdio.h>

int main()
{
	void move(int [20],int,int);
	int number[20],n,m,i;
	
	printf("how many numbers?");
	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 to move?");
	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 array[20],int n,int m)
 {
 	int *p,array_end;
 	array_end = *(array+n-1);/*先把末尾值存起来,等下再赋给首位*/
 	
 	for(p=array+n-1;p>array;p--)
 	{
 		*p = *(p-1);
	 }
	 
	 *array = array_end;
	 m--;     /*控制递归调用的次数*/ 
	 
	 if(m>0) move(array,n,m);
 }

5. 报3退圈

#include <stdio.h>

int main()
{
	int i,k,n,num[50],*p,m;
	printf("\ninput number of person:n=");
	scanf("%d",&n);
	p = num;
	
	/*给每个人编号*/
	for(i=0;i<n;i++)
		*(p+i) = i+1;
	
	i=0;
	k=0;/*是否报到3*/
	m=0;/*统计已经退出圈子的人数*/
	
	while(m<n-1)/*因为从0开始*/
	{
		if(*(p+i) != 0) k++;
		if(k == 3)
		{
			*(p+i) = 0;
			k = 0;
			m++;
		 } 
		 
		 i++; /*这步是while循环中必定会执行的*/
		 
		 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("input string: ");
	scanf("%s",str);/*前驱空格和后继空格都不计算在内*/
	
	len = length(str);
	
	printf("The length of string is %d.\n",len);
	
	return 0;
	
	
}

int length(char *p)
{
	int n;
	n = 0;
	while(*p != '\0')
	{
		n++;
		p++;/*增加一个基类型的字节*/
	 } 
	 
	 return n; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值