C语言不挂科之我爱谭浩强——编程题拿高分(附例题答案和知识点详解)

期末考试要考C语言,边复习边写博客,总结了一些自己不太明白或者可能出错的知识点。现自己已经弄明白,写的你们肯定也能明白,希望期末备考的同学们不挂科,也适合自学C语言的小白哦
这篇博客主要写指针,由易到难,会了指针,前面的例题也就都会了。

  1. 对三个数进行大小排序
# include <stdio.h>
int swap(int *p,int *q);
int main(){
int  a=5, b=11, c=9;
int *p1=&a,*p2=&b,*p3=&c;
printf("%d %d %d\n",a,b,c);
printf("%d %d %d\n",p1,p2,p3);
	if (a>b){
		swap(p1,p2);
	}
	if(a>c){
		swap(p1,p3);
	}
	if (b>c){
		swap(p2,p3);
	}
	printf("%d %d %d\n",a,b,c);
	printf("%d %d %d\n",p1,p2,p3);
}

int swap(int *p,int *q){
	int o;
	o = *p;
	*p = *q;
	*q = o;}

5 11 9
6487556 6487552 6487548
5 9 11
6487556 6487552 6487548

这个swap函数必须用指针写,如果这样,两个数在函数内是交换了,但没有返回主函数,所以必须用指针写,由结果可以看出,函数交换了指针上存放的数值,指针本身并没有变。

int swap(int p,int q){
	int o;
	o = p;
	p = q;
	q = o;
}
  1. 对10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换
# include <stdio.h>
int swap(int *p,int *q);
int main( ){
	int a[10]={11,5,8,7,6,9,0,3,4,2} ,*min,*max,*p;
	max=min=a;
	p=a; 
	for (;p<a+10;p++){
		if (*max<*p)
			max=p;
	}
	swap(a+9,max);
	for (p=a;p<a+10;p++){
		if(*min>*p)
			min=p;		
	}
	swap(a,min);
	for (p=a;p<a+10;p++)
		printf("%d ",*p);
}

int swap(int *p,int *q){
	int o;
	o = *p;
	*p = *q;
	*q = o;
}

本题的主要思路就是先让max和min都等于第一个值的地址,让其与后面的每一个值的地址进行比较,(注意这里是指针的大小比较)如果min比后面的某个值x大,就把x的地址赋值给min,若还有个y比x还小,就把y的地址再赋值给min,直到找到最小的值。注意这时并没有进行数值交换,只是min这个指针指向了不同的数值,下面的swap函数才让其交换了地址所存放的数值。max是一样的。
有的同学可能会想到,用一个for循环,直接找出最大和最小的值不就行吗。不行!
因为这里有个bug如果a=>第一个数是最大的,b=>最后一个数为最小的,a||b 之能交换一个最值,a&b直接不交换。要是非得用也行, 看老谭怎么写的吧
在这里插入图片描述

  1. 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
# include <stdio.h>
int main(){
	int i, k, m, n, num[50], *p;
	printf("input number of person: n=" );
	scanf("%d", &n);
	p=num;
	for(i=0;i<n;i++)		//给人数编号
		*(p+i)=i+1;
		
	i=0;				//i为每次循环时计数变量
	k=0;				//k为按1 2 3报数的计数变量
	m=0;				//m 是出局的人数
	
	while(m<n-1){ 		//m 是出局的人数,因有n个人,最后剩一个人,最多出局(n-1)个人
	   if( *(p+i) != 0)	//判断这个序号(原来的序号)是否出局
			k++;		//如果这个号没有出局,就报数,计数器加1,要是出局了就不算这个号了
			
		if(k==3){		//报3的出局
			*(p+i)=0;	//将出局的这个人标记为0
			k=0;		//使计数器置零,重新数1 2 3
			m++;		//出局人数计数器加1
			}		

			i++;		//将指针后移,虽然i不是指针,但p+i就是指针了,i为指针服务
		if(i==n)		//如果指针移到了尾部,则返回到头部
			i=0;		//因为编号是从1开始的,所以i=0,以确保下一个是开头
		}
	int a=0;			
	for(i=0;i<n;i++){	//因为报到3的就设置成0了,所以加起来就是最后那个序号 
		a+=num[i];		
	}
	printf("最后一个是%d ",a);

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45755332/article/details/106992236