2013-03-10 127 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; 
    } 
}