2013-03-10 3 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. Почему это происходит? Заранее спасибо.элементы массива, если оператор

+0

Мои глаза, ваше форматирование ужасно. Исправьте –

ответ

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]); 
} 

EDIT: модифицированный цикл печати

+1

. Если массив отсортирован, вы можете иметь лучший цикл для печати, т. Е. Меньшие итерации в некоторых случаях, игнорировать до 'a [i]' is> = 3, а затем печатать только до тех пор, пока 'a [i]' is <= 8 –

+0

да. Я изменил код. Я мог бы выполнить итерацию до 'a [i] <3' вне основного цикла, это позволит избежать этой проверки позже, но я думаю, что это будет называться преждевременной оптимизацией. Поэтому я оставил это –

+0

True! :) ... Просто делал наблюдение, вот и все. –

1

Похоже, что вы работаете в какой-то алгоритм сортировки в там, но пропустить все элементы между 3 и 8.

Причина вы видите цифры до 3 напечатанных потому, что ваш printf после цикла, что выполняет обмен: к моменту завершения внутреннего цикла число, которое меньше a[i], может быть вставлено на 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; 
    } 
} 
Смежные вопросы