Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Xóa phần tử trong mảng

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    10

    Mặc định Xóa phần tử trong mảng

    Đề bài: nhập vào n số nguyên, chương trình tìm số âm đầu tiên và xóa phần tử này, sau đó sắp xếp lại dãy-->in ra màn hình. Em code như sau đây nhưng chương trình bị lỗi: xóa được số âm đầu tiên, in ra dãy mới ko có số âm đó nhưng nó lại tự chèn thêm số 0 ở cuối.
    Code:
    #include <stdio.h>
    int i,n;
    int a[100];
    void remove (int ,int );
    int main (void)
    {
    do
    {
          printf("Co bao nhieu so?\n");
          scanf("%d",&n);
    }while(n<=0);
    for(i=0;i<n;i++)
      {
           printf("Nhap so  #%d\n",i+1);
           scanf("%d",&a[i]);
      }
    remove (i,n);
    printf("Day moi sau khi xoa so am dau tien:\n");
    for(i=0;i<n;i++)
         printf("%d\n",a[i]);
    return 0;
    }
    void remove (int i,int n)
     {
            int j;
            for(i=0;i<n;i++)
            if(a[i]<0)
              {
                for(j=0;j<n;j++)
                a[j]=a[j+1];
                 i--;
                 break;
              }
     }
    Mọi người code cho em lun đoạn này nhá ( giải thích càng tốt).
    Cho em hỏi thêm 1 câu là: Muốn tạo ra 1 hàm để xóa tất cả các số âm trong dãy rùi sắp xếp ra dãy mới thì làm thế nào ạh?
    Em yêu anh không hề toan tính
    Tình yêu mình vô đối phải không anh!

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Khi xóa thành công một số trong mảng thì _maxLen của mảng phải giảm đi 1 đơn vị.
    Nên tìm các bài viết về vector của rr, hoặc đọc về singlelinklist thì nó sẽ khác.
    Với mảng tĩnh:
    Để xóa bỏ tất cả thì xóa từng cái cũng được, nên tạo một biến để lưu lại ví trí phần từ trước đó đã xóa.
    Lần sau chỉ việc chạy từ đó đi là được.
    Hay hơn nữa thì khi loại bỏ rồi sắp xếp thì băng qua các vị trí âm, và đếm lượng số âm trong khoảng đã băng qua đó ( rank ). Khi dồn về đầu thì _index - rank là ok.
    Chút gợi ý, bạn nghĩ xem sao ^^!
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    C Code:
    1. void remove (int i,int n)
    2.  {
    3.         int j;
    4.         for(i=0;i<n;i++)
    5.         if(a[i]<0)
    6.           {
    7.             for(j=0;j<n;j++)
    8.             a[j]=a[j+1];
    9.              i--;
    10.              break;
    11.           }
    12.  }

    Hàm này sai rồi .
    1/Khi bạn tìm được a[i] là phần tử cần xoá thì bạn phải chạy biến j từ i mới đúng .
    2/Với lại j chỉ chạy đến n-1 thôi vì bạn có cái a[j+1]
    3/Sau khi xoá thì số phần tử trong mảng giảm chứ sao bạn lại giảm i.

    code sửa lại là :
    C Code:
    1. void remove (int i,int n)
    2.  {
    3.         int j;
    4.         for(i=0;i<n;i++)
    5.         if(a[i]<0)
    6.           {
    7.             for(j=i;j<n-1;j++)
    8.             a[j]=a[j+1];
    9.              n--;
    10.              break;
    11.           }
    12.  }

  4. #4
    Ngày gia nhập
    03 2008
    Bài viết
    10

    Bạn NT_OnlyLove nói mình ko hỉu lắm, có lẽ do kiến thức của mình còn hạn chế, thanks anyway.!!

    Cảm ơn bạn sieuphuong, tuy nhiên mình cũng đã thử cho j chạy đến n-1 thôi, nhưng vẫn ko được vì lúc này thay vì chèn số 0 vào cuối, nó lại chèn vào cái số cuối cùng của dãy nhập (VD: nhập vào -1,2,3,4 thì nó sắp xếp lại là 2,3,4,4). Giúp mình với nhá. Thanks so much !!!
    Em yêu anh không hề toan tính
    Tình yêu mình vô đối phải không anh!

  5. #5
    Ngày gia nhập
    06 2007
    Nơi ở
    một nơi xa xăm...
    Bài viết
    127

    Bạn biết tại sao nó vẫn in ra 2 giá trị cuối không.Vì ta sẽ có
    Code:
    a[n-1]=a[n]
    mà trong hàm remove lại không làm giảm giá trị của n vì bạn truyền vào đó tham trị của n.Để được kết quả chính xác thì cần chuyền vào đó tham chiều của n
    Mình sửa trên cách code của bạn nhé :
    C Code:
    1. #include <stdio.h>
    2. int i,n;
    3. int a[100];
    4. int remove (int&);
    5. int main ()
    6. {
    7.     int kq;
    8.     do
    9.     {
    10.         printf("Co bao nhieu so?\n");
    11.         scanf("%d",&n);
    12.     }while(n<=0);
    13.     for(i=0;i<n;i++)
    14.     {
    15.         printf("Nhap so  #%d\n",i+1);
    16.         scanf("%d",&a[i]);
    17.     }
    18.     kq=remove (n);
    19.     if(kq==0) printf("Khong co so am nao");
    20.     else {
    21.         printf("Day moi sau khi xoa so am dau tien:\n");
    22.         for(i=0;i<n;i++)
    23.             printf("%d\n",a[i]);
    24.     }
    25.     return 0;
    26. }
    27. int remove (int &n)
    28. {
    29.     int j;
    30.     for(i=0;i<n;i++)
    31.         if(a[i]<0)
    32.         {
    33.             for(j=i;j<n-1;j++)
    34.                 a[j]=a[j+1];
    35.             n=n-1;
    36.             return 1;
    37.         }
    38.         return 0;
    39. }
    Đã được chỉnh sửa lần cuối bởi Alviss : 23-04-2008 lúc 03:14 PM.

  6. #6
    Ngày gia nhập
    03 2008
    Bài viết
    10

    Mặc định Xóa phần tử trong mảng

    Alviss ơi mình làm như bạn chỉ, tại sao nó báo lỗi " Syntax error before & "? Chỗ gọi biến &n đó hình như có vấn đề. Hay tại mình dùng C trong môi trường Linux nên khác?
    Em yêu anh không hề toan tính
    Tình yêu mình vô đối phải không anh!

  7. #7
    Ngày gia nhập
    03 2008
    Bài viết
    126

    mình thấy code của alviss chạy ok rồi

  8. #8
    Ngày gia nhập
    05 2008
    Bài viết
    0

    Chào tất cả các bạn!
    Minh mói học lập trình nên gặp phải bài mắc quá. Các bạn giúp mình viết code bài này được không nếu được mình cám ơn nhiều. Mình post lên các bạn giúp mình nhé:
    Viết chương trình nhập vào một dãy các số theo thứ tự tăng, nếu nhập sai quy cách thì yêu cầu nhập lại. In dãy số sau khi đã nhập xong. Nhập thêm một số mới và chèn số đó vào dãy đã có sao cho dãy vẫn đảm bảo thứ tự tăng. In lại dãy số để kiểm tra.

  9. #9
    Ngày gia nhập
    04 2008
    Bài viết
    4

    Post ban lam sai roi!de xoa mot phan tu trong mang nhu the nay la ban

    C Code:
    1. void Xoa(int a[],int &n)
    2. {
    3.     for(int i=0;i<n;i++)
    4.     {
    5.         if(a[i]<0)//xoa mot so  am trong mang
    6.        
    7.         {  
    8.             for(int j=i;j<n-1;j++)
    9.             {
    10.                 a[j]=a[j+1];
    11.             }
    12.             n--;
    13.             break;
    14.  
    15.         }
    16.    
    17.     }
    18.  
    19. }

    ham xoa do ban con ham main ban tu viet nhe!hihi co thac mac gi cu trao doi tiep nhe

    Vui lòng gõ tiếng Việt có dấu và đưa code vào tag code khi đưa bài viết lên diễn đàn. Đọc Nội quy để biết thêm chi tiết!
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 11-05-2008 lúc 08:39 PM. Lý do: Nhắc nhở

Các đề tài tương tự

  1. xóa các phần tử giống nhau trong mảng chỉ để lại 1 phần tử
    Gửi bởi trungbd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 30
    Bài viết cuối: 12-08-2013, 04:01 PM
  2. Bài tập C xóa phần tử trùng nhau trong mảng 1 chiều để lại 1 phần tử
    Gửi bởi ronoa trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 06-01-2012, 10:46 PM
  3. Kỹ thuật C++0x Xóa không được 1 phần tử bất kì và xóa tại vị trí bất kì trong DSLK
    Gửi bởi datinh_o0o7 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 19-03-2011, 10:24 PM
  4. Bài tập C++ xóa sinh viên trong dssv , ai test dùm em , xóa sv thứ 3 mà nó toàn xóa sv thứ 4
    Gửi bởi prt_awm trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 08-11-2010, 02:24 PM
  5. Thuật toán trên C | Xóa phần tử trong dãy phần tử tăng dần?
    Gửi bởi quangphuit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-03-2010, 01:57 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn