黑马程序员技术交流社区

标题: 谁能解释一下这个程序的后半部分 [打印本页]

作者: 夜空守望者    时间: 2015-4-20 22:43
标题: 谁能解释一下这个程序的后半部分
本帖最后由 夜空守望者 于 2015-4-20 22:46 编辑

  1. </blockquote></div><div class="blockcode"><blockquote>
  2. #include <stdio.h>
  3. #define  N   4
  4. int main( )
  5. {
  6.     int  i,j,min,temp,a[N];
  7.     for(i=0;i<N;i++)
  8.         scanf("%d",  &a[i]);// &a[i]
  9.     printf("\n");
  10.    
  11.    
  12.    
  13.     for(i=0;  i<N-1 ;  i++)//  i<N-1
  14.    
  15.    
  16.     {min=i;//  假设a[i]是最小值
  17.         
  18.         for(j=i;j<N;j++)
  19.             //  假设a[min]币a[j]大,就让i=j,即a[i]=a[j]
  20.             if(a[min]>a[j])  i=j ;
  21.         
  22.         上面是个填空题,填写i=j
  23.         //  我的错误答案a[min]=a[j]------正确答案是i=j
  24.         //
  25.         temp=a[i];
  26.         a[i]=a[min];
  27.         a[min]=temp;
  28.     }
  29.    
  30.    
  31.    
  32.     for (i=0;i<N;i++)
  33.         printf("%5d",a[i]);
  34.     printf("\n");
  35. }
复制代码

求解释if函数语句后面的4--5句代码

作者: itheima_llt    时间: 2015-4-20 22:43
本帖最后由 itheima_llt 于 2015-4-21 00:58 编辑
  1. 在做填空题的时候,首先要读懂题目的意思,知道题目是要考察什么知识。
  2. 根据本题的提示:
  3. min = i;说明是要记录最小值对应的数组指针
复制代码


作者: 只求一份安稳    时间: 2015-4-20 23:11
看着像数组排序。:)这是java?

作者: 只求一份安稳    时间: 2015-4-20 23:14
菜鸟求黑马币:'(
作者: yangengjie    时间: 2015-4-20 23:23
a[i]=a[j]你这样写就已经改变了数组中的值,你要做的应该是记录数组中最小值的角标或者值,而不是改变数组中值,还望采纳
作者: babadan    时间: 2015-4-21 00:17
求黑马币的新人:(
作者: 一诺珍惜    时间: 2015-4-21 00:34
你这是C语言的题目吧。C语言的数组指针是一个很精华的部分,楼上那位仁兄说的角标就是C语言的数组指针,思路大概就是楼上说的那个意思。
作者: itheima_llt    时间: 2015-4-21 01:00
:curse:这个编辑器真的是相当的坑爹,我改了4遍还是显示的乱七八糟,我被它打败了。
真的是一次编辑,终身不能修改啊!
修改就会带出一堆格式,真的让我恨死了HTML。
[i][i]【i]【i】这个标签彻底把我坑惨了
作者: itheima_llt    时间: 2015-4-21 01:02
最后,简单的总结一句吧。
题目是让你操作数组指针,而你却直接操作数组本身,这乱了!
你好好读读程序,程序给的提示都是操作数组指针。
真的不想打a[i] a[i]了,坑了我30分钟!
作者: 追忆似水年华    时间: 2015-4-21 09:41
程序的意思好像是从输入的第一个数开始,向后遍历找到最近的一个大于它的数,前一位的数一它交换,在从大于他的数开始做同样的遍历,重复运算。
作者: 陈文超    时间: 2015-4-21 13:54
你这是冒泡排序吧,如果你用a[min]=a[j],第一次循环的时候,min=0;j=0;执行ELSE 值不变,第二次循环的时候min=0;j=1;如果a[min]>a[j],就让a[0]=a[1]就会让数组里面前两个数相等了,然后第三次如果还是a[min]>a[j]就会让a[1]=a[2]也就是a[0]会变成原来的a[1],a[1]变成原来的a[2]而原来的a[0]就消失了,改变了数组的值,你不妨试着没执行一次打印一下
作者: 1352107393    时间: 2015-4-21 18:33
内循环是找出最后一个比a[min]大的a[j],并且i=j(如果 j 最后为3,则i=3),然后外循环做一下变量替换即把较小的数给a[min],接着外循环就从  i  这个下标继续循环(此时的 i=3 但是i<4-1   所以循环结束).


如果你是要排序的话,这段代码是有问题的。
可以copy这段代码
for(i=0;  i<N-1 ;  i++)//  i<N-1
                {
                        min=i;//  假设a[i]是最小值
                for(j=i;j<N;j++)
                    if(a[min]>a[j])
                    {  
                                temp=a[j];
                                a[j]=a[min];
                                a[min]=temp;
                        }
            }
作者: 我想努力半年    时间: 2015-4-21 20:31
C的看不懂。。
作者: 依秋无泪    时间: 2015-4-21 21:04
#include <stdio.h>

#define  N   4

int main( )

{

    int  i,j,min,temp,a[N];

    for(i=0;i<N;i++)

        scanf("%d",  &a[i]);// &a[i]

    printf("\n");

   
   

   

    for(i=0;  i<N-1 ;  i++)// 这个for一次循环就能找到该数组从i开始的最小值,保存到a[i],

   

   

    {
min=i;//  假设a[i]是最小值

      

        for(j=i;j<N;j++)
         
           if(a[min]>a[j])  i=j ;//这个for是用来存放最小值的数组的索引-index  



        temp=a[i];

        a[i]=a[min];

        a[min]=temp;//这3行代码是实现2个数进行交换

    }

   

   

   

    for (i=0;i<N;i++)

        printf("%5d",a[i]);//按规定格式输出该数组  %md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空

格,若大于m,则按实际位数输出。。


    printf("\n");

}

作者: flowerdance    时间: 2015-4-21 22:25
我想问一问 你的代码是怎么弄上来的
作者: yangengjie    时间: 2015-4-21 22:41
楼主我回复给黑马币不
作者: godrick007    时间: 2015-4-22 06:45
这是一个c++程序,功能是 输入一个4个元素的一维数组,后对数组进行冒泡排序 最后再打印数组。
填空题 j = i 那个位置是为了考察你冒泡排序的思想,外循环执行一次就可以将数组中最大的数移动到数组的末尾,
当 i ++ 时 ,j也被赋值,这样在 j<N 的情况下内循环再外循环的控制下每次都可以减少最后元素的判断(因为已经挪好了位置)。还有,你确定这个是  i = j  而不是 j = i? 你要搞清楚是谁给谁赋值

作者: Zack    时间: 2015-4-22 11:04
本帖最后由 Zack 于 2015-4-22 11:08 编辑

问题是冒泡排序数组吧,只需交换比较大小之后只需交换指针位置(答案写法),若是按题主那么写的话,把后面位置的值赋给前面,前面的值就会丢失,不用考虑什么复杂的概念性东西,望能解决
作者: 过路人    时间: 2015-4-22 23:22
   我仔细看了半天你的代码,按照正确代码i=j,程序的意思是:将数组a[N]中元素的最小值与倒数第二小的值的位置互换,但不改变数组的元素每个值。(程序这么操作真的很蛋疼,没多大的意义),你那样会覆盖数组的倒数一个最小的元素。
    纯手写,地球人都能看懂我的解释!
作者: 夜空守望者    时间: 2015-4-23 00:13
只求一份安稳 发表于 2015-4-20 23:11
看着像数组排序。这是java?

这是c语言
作者: 夜空守望者    时间: 2015-4-23 00:14
yangengjie 发表于 2015-4-20 23:23
a=a[j]你这样写就已经改变了数组中的值,你要做的应该是记录数组中最小值的角标或者值,而不是改变数组中值 ...

我的题目写错了,不是i=j,正确答案是min=j
作者: 夜空守望者    时间: 2015-4-23 00:16
陈文超 发表于 2015-4-21 13:54
你这是冒泡排序吧,如果你用a[min]=a[j],第一次循环的时候,min=0;j=0;执行ELSE 值不变,第二次循环的时候m ...

这是类似于冒泡排序法的 选择排序法!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2