南阳理工OJ_交换输出

/*  
* 程序的版权和版本声明部分:  
* Copyright (c) 2013,郑州大学SIAS国际学院  
* 文件名称:  
* 作    者:  王  杰
* 完成日期:2013 年 10 月 30 日    
* 对任务及求解方法的描述部分: 
* 输入描述:  
* 问题描述:
* 程序输出:  
* 问题分析: 
* 算法设计: 
*/
#include<stdio.h>
int main()
{
	int n,s[100];
	int a,min;		//min的作用是存放每次比较后此时最小的数的值
	int * p;		//用于存放数组元素中最小值得地址
	while(1){
		scanf("%d",&n);
		if(n==0){
			break;		
		}
		else{
			for(int m=0;m<n;m++){
				scanf("%d",&s[m]);
			}
			//以下的语句应该是找出最小的元素,并记住地址
			//如果第一个元素最小,就原样输出
			//如果不是,就交换最小的数和第一个数,然后循环输出s【i】并加空格
			min=s[0];
			p=s;			//意义在于当第一个数字是最小的时候的一种情况
			for(int i=0;i<n;i++){
				if(s[i]<min){		//不能有等于,因为还有另外一种情况 ,如 :6 5 4 1 2 1 3, 如果有等于号就会把第二个1的地址记下来,导致出错
					min=s[i];
					p=&s[i];
				}
			}
			a=s[0];
			s[0]=min;
			*p=a;
			for(int j=0;j<n;j++){
				printf("%d ",s[j]);
			}
			printf("\n");
		}
	}

	return 0;
}


运行结果:



总结: 又是一堆的收获!最明显的感受是用了指针的知识。这道题算法思想很简单,但是在记忆地址的时候,本来想到了两种情况,一种是利用数组的下标,二是利用指针,最后毫不犹豫的选择了指针来记忆元素的地址,不过这也导致了很多问题,让我花了一下午的时间来找错误,最后终于明白了!也不枉费自己在上面画的时间,值了!这道题最根本的原因是没有考虑全面(开始一直以为是指针的问题,实际上指针没有什么问题)而是漏掉了一种情况,就是当从第二位开始时,如果出现了两个以上的最小值就会导致p所记忆的地址发生变化,进而影响下面的赋值语句,二前面的p=s; 语句是另一种特殊情况 就是第一个元素是最小的时候。到此,这道题算是结束了。




做的题,写的程序也不算多,但是却有了一种赶脚:每一道题,不管难还是简单,都很有价值,今天这道题  也算是指针初步吧,每道题都有了很多收获,这些点滴就是成长的

轨迹。





另外再附上用下标记忆地址的代码:

#include<stdio.h>

int main()
{
    int n,m,i,t;
    int num[100];
    while(scanf("%d",&n) && n)
    {
        m=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&num[i]);
            if(num[m]>num[i]) m=i;
        }
        t=num[0],num[0]=num[m],num[m]=t;
        for(i=0;i<n;i++)
            if(i) printf(" %d\n",num[i]);
            else printf("%d",num[i]);
    }

}
运行结果:暂时未运行!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值