/*
* 程序的版权和版本声明部分:
* 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]);
}
}
运行结果:暂时未运行!