2013-12-21 2 views
2

Я пытаюсь удалить отрицательные числа из массива со следующим кодом. К сожалению, не получить результаты. Он просто печатает первый элемент снова и снова. Может кто-нибудь, пожалуйста, дайте мне знать, где я иду не так?Удалить отрицательные числа из массива в C

#include <stdio.h> 
void removenegative(int a[],int *p, int *q); 
int main() 
{ 
    int a[] = {2, 3, -5, -7, 6, 9}; 
    int i; 
    int *p, *q; 
    p = a; 
    q = a+6-1; 
    removenegative(a, p,q); 
    for(i=0;i<6;i++) 
     { 
      printf("%2d", *p); 
     } 
    printf("\n"); 
} 
void removenegative(int a[],int *p, int *q) 
{ 
    int *x; 
    x= &a[0]; 
    while (p<=q) 
     { 
      if (*p>=0) 
       { 
        *x = *p; 
        x++; 
       } 
      p++; 
     } 
    for(; x<=q; x++) 
     { 
      *x = -1; 
     } 
} 

ответ

2

printf("%2d", *p); 

в:

printf("%2d", a[i]); 

Вы зацикливание i, но не используется.

4
for(i=0;i<6;i++) 
    { 
     printf("%2d", *p); 
    } 

Вы не меняется p!

+0

был избит на 5 секунд. ;-) –

+0

@ 0xF1 У вас было немного лучше, так что +1 :) – Guido

+0

то же самое 2 вас! и веселое рождество !! ;-) –

4

Вы печатаете только одно значение:

printf("%2d", *p);

сделать это до for цикла:

p = a;

и добавить p++ внутри цикла;

4

Это просто печатает первый элемент снова и снова

Конечно, это так ...

for(i=0;i<6;i++) 
    { 
     printf("%2d", *p); 
    } 

Вы всегда печать * р, который является [0]

1

Ваш код правильный:

void removenegative(int a[],int *p, int *q) 
{ 
    int *x; 
    x= &a[0]; // let x point to the first thing in a 

    while (p<=q) // continue while p points to an address before q 
     { 
      if (*p>=0) // if the thing pointed to by p is greater than zero... 
       { 
        *x = *p; // copy from p to x, increment x 
        x++; 
       } 
      p++; // increment p 
     } 
    for(; x<=q; x++) // while x is less than q... 
     { 
      *x = -1; // fill in -1 
     } 
} 

Так x является увеличивающимся указатель записи, в то время как p сканирует массив и q выступает в качестве конца-массива маркеров.

Как я был избит во время ввода текста, ваша выходная процедура неверна.

+3

Котировка всего его хорошего кода не является ответом на вопрос. – Barmar

+0

Напротив, когда его вопрос: «Я пытаюсь удалить отрицательные числа из массива со следующим кодом. К сожалению, не получив результатов», показывая, что он действительно получает результаты, потому что код, который он считает неправильным делает именно то, что он думает, является ответом на вопрос. – Tommy

+0

Кажется странным способом указать, что ошибка в коде X заключается в предоставлении аннотированного списка кода Y. – Barmar

Смежные вопросы