2013-03-10 135 views
-2
#include <stdio.h> 

main() 
{ 
    int i,l,t=1,m,a[15]={0}; 
    for(i=0;i<15;i++) 
    { 
     scanf("%d",&a[i]); 
    } 

    for(i=0;i<15;i++) 
    { 
     if(a[i]>=3 && a[i]<=8) 
     { 
      for(l=i+1;l<15;l++) 
      { 
       if(a[i]>a[l]) 
       { 
        m=a[i]; 
        a[i]=a[l]; 
        a[l]=m; 
       } 
      } 
      printf(" No%d \t %d \n",t++,a[i]); 
     } 
    } 
    system("pause"); 
} 

在ci中的这段代码中,要按升序打印数组的元素,但元素的值必须在3和8之间。我得到的结果排除值超过8,但它们包括3以下的值。为什么会发生这种情况?提前致谢。数组中的元素if语句

+0

我的眼睛,你的格式是可怕的。请修复 – 2013-03-10 17:40:48

回答

3

我建议你分别进行排序,然后打印3到8之间的元素,然后按照你想要的顺序得到它。

// sort the array 
for(i=0;i<15;i++) 
{ 
    for(l=i+1;l<15;l++) 
    { 
     if(a[i]>a[l]) 
     { 
      m=a[i]; 
      a[i]=a[l]; 
      a[l]=m; 
     } 
    } 
} 

for (i = 0; i < 15; i++) 
{ 
    if (a[i] < 3) 
     continue; 

    if (a[i] > 8) 
     break; 

    printf(" No%d \t %d \n",t++,a[i]); 
} 

编辑:修改的打印循环

+1

如果数组已排序,则可以有更好的循环打印,即在某些情况下较少的迭代,忽略直到a [i]'>> = 3,然后仅打印直到a [i]为<= 8 – 2013-03-10 17:51:52

+0

是。我已经更改了代码。我可以迭代到主循环之外的a [i] <3',这将避免稍后的检查,但我认为这将被称为过早优化。所以我已经离开了那个 – 2013-03-10 17:56:59

+0

真的! :) ...只是做了一个观察这就是全部 – 2013-03-10 17:58:37

1

看起来你正在运行某种在有一个排序算法的,但你跳过3和8

你看到下3个数字印刷是因为你printf是在循环后的原因之间的所有元素交换:在完成内部循环时,可以在i位置插入小于a[i]的数字。如果在循环前移动printf,打印的数字将全部来自[3..8]范围,包括两端。

0

你的外循环,从您的排序排除双方3和8:

for(i=0;i<15;i++) 
{ 
    if(a[i]>=3 && a[i]<=8) /* <--- exclusion here */ 
    { 
     /* code nested in outer loop and exclusion */ 
    } 
} 

然而,你的内循环有没有这样的排斥:

for(l=i+1;l<15;l++) 
{ 
    if(a[i]>a[l]) /* <--- no exclusion! */ 
    { 
     m=a[i]; 
     a[i]=a[l]; 
     a[l]=m; 
    } 
} 

我建议修改你的内部循环以排除低于3的值从它的搜索:

for(l=i+1;l<15;l++) 
{ 
    if(a[l]>=3 && a[i]>a[l]) 
    { 
     m=a[i]; 
     a[i]=a[l]; 
     a[l]=m; 
    } 
}