标题:看不懂,这个问题的代码,有哪位大神能跟我解释一下吗?理解不了
只看楼主
计算机好难啊
Rank: 1
等 级:新手上路
帖 子:33
专家分:8
注 册:2020-3-28
结帖率:25%
 问题点数:0 回复次数:15 
看不懂,这个问题的代码,有哪位大神能跟我解释一下吗?理解不了
对稀疏数组a[20](所谓稀疏数组,即有若干数组元素值为0的数组),编写一个程序,将所有非零元素值按紧密排列形式转移到数组的前端。(要求:程序中不再开辟其它的单元作为数组元素值的缓存单元)。
#include <stdio.h>
void main()
{
      int a[20]={0,0,1,0,2,0,0,0,3,4,0,0,0,0,0,5,0,0,6,0};
      int i,j,k;
      for(i=0;i<20;i++)
        printf("%3d",a[i]);
      printf("\n");
      for(i=1;i<20;i++)
      {
        if(a[i]==0) continue;
        for(k=i-1;k>=0;k--)
          if(a[k]!=0) break;
        if(k==i-1) continue;
        a[k+1]=a[i];
        a[i]=0;
      }        
      for(i=0;i<20;i++)
        printf("%3d",a[i]);
      printf("\n");
}
中间这一段有点稀里糊涂的,很懵逼
for(i=1;i<20;i++)
      {
        if(a[i]==0) continue;
        for(k=i-1;k>=0;k--)
          if(a[k]!=0) break;
        if(k==i-1) continue;
        a[k+1]=a[i];
        a[i]=0;
有哪位大神能跟我解释一下吗?
搜索更多相关主题的帖子: 数组 continue i++ for printf 
2020-03-29 15:13
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
看不明白,满屏的break,continue,大脑短路了

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-29 15:28
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
这时候就体现出写成函数意义了
写一个函数 从指定下标开始 查找0 返回下标
写一个函数 从指定下标开始 查找非0 返回下标
交换
继续查找
完事
全写在一个main里面 不好理解 也不值得花时间理解

https://zh.
2020-03-29 15:36
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
使用continue和break大概类似于用了goto,降低代码可读性。如果设计过快排代码就很容易做这题了,相当于选择0作为基数,比0大的在左边,小于等于的在右边,一个循环两个指针即可解决,如下(值班中,手机撕):
i=0;
j=19;
while(i<j)
{
       if(!a[i]&&a[j])
       {
              k=a[i];a[i]=a[j];a[j]=k;  //手机打字换行不方便
       }
       if(a[i])i++;
       if(!a[j])j--;
}

[此贴子已经被作者于2020-3-29 16:52编辑过]


能编个毛线衣吗?
2020-03-29 16:50
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
以下是引用wmf2014在2020-3-29 16:50:23的发言:

使用continue和break大概类似于用了goto,降低代码可读性。如果设计过快排代码就很容易做这题了,相当于选择0作为基数,比0大的在左边,小于等于的在右边,一个循环两个指针即可解决,如下(值班中,手机撕):
i=0;
j=19;
while(i<j)
{
       if(!a&&a[j])
       {
              k=a;a=a[j];a[j]=k;  //手机打字换行不方便
       }
       if(a)i++;
       if(!a[j])j--;
}

对比你们的实现
楼主的代码 交换后 应该会保持原来的次序
你的代码交换之后 没有保持原来的次序
单纯从题意来说 你的做法也符合要求
从代码优化的角度 你的代码修改了原来代码的功能
可能需要进一步确认

https://zh.
2020-03-29 17:37
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
我在4楼给出的代码其实只是想楼主通过对比更好理解代码,既然5楼大神出手指点:没有保持原来的次序,经深刻反思,决定安排:
程序代码:
#include <stdio.h>
void main()
{
    int a[20] = { 0,0,1,0,2,0,0,0,3,4,0,0,0,0,0,5,0,0,6,0 };
    int i, j, k;
    i = j = 0;
    while (i < 20 && j < 20)
    {
        if (!a[i] && a[j])  //如果a[i]==0且a[j]!=0,交换a[i]和a[j]的值
        {
            k = a[i];
            a[i] = a[j];
            a[j] = k;
        }
        if (a[i])i++;      //如果a[i]的值不为0,则跳到下一个
        if (!a[j])j++;     //如果a[j]的值为0,则跳到下一个
    }
    for (i = 0; i < 20; i++)
        printf("%3d", a[i]);
    printf("\n");
}


运行结果:
  1  2  3  4  5  6  0  0  0  0  0  0  0  0  0  0  0  0  0  0

能编个毛线衣吗?
2020-03-29 23:45
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
6楼代码有一个很大的bug,需要修改条件,期待有大神指正!

能编个毛线衣吗?
2020-03-30 00:15
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
回复 7楼 wmf2014
你大概是指 非0 元素开头 GG

https://zh.
2020-03-30 00:23
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
得分:0 
#include <stdio.h>
void main(void)
{
    int a[20]={7,0,1,0,2,0,0,0,3,4,0,0,0,0,0,5,0,0,6,0};
    int i,j,k;
   
    i=j=0;
    while(i<20&&j<20)
    {
        while(a[i])  
        {
            i++;
            j++;
        }
        if(!a[i]&&a[j])
        {
            k=a[i];
            a[i]=a[j];
            a[j]=k;
        }
        if(a[i])  i++;
        if(!a[j]) j++;
    }
   
    for(i=0;i<20;i++)
        printf("%3d",a[i]);
}
2020-03-30 09:21
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
以下是引用取名字在2020-3-30 09:21:10的发言:

#include <stdio.h>
void main(void)
{
    int a[20]={7,0,1,0,2,0,0,0,3,4,0,0,0,0,0,5,0,0,6,0};
    int i,j,k;
   
    i=j=0;
    while(i<20&&j<20)
    {
        while(a)  
        {
            i++;
            j++;
        }
        if(!a&&a[j])
        {
            k=a;
            a=a[j];
            a[j]=k;
        }
        if(a)  i++;
        if(!a[j]) j++;
    }
   
    for(i=0;i<20;i++)
        printf("%3d",a);
}

        while(a[i])
        {
            i++;
            j++;
        }
你没考虑异常数据
如果全部都是非0
这个数据就跑飞了 数组越界

https://zh.
2020-03-30 09:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500702-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025064 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved