Làm sao để hàm xoa_mang lấy mảng ban đầu đã nhập để xoá?

#include <stdio.h>
#include<stdlib.h>
int nhapN(){
    int n;
    printf("nhap n=");
    scanf("%d",&n);
    do{
        if(n<5 || n>30){
            printf("nhap sai, nhap lai n=");
            scanf("%d",&n);
        }
    }while(n<5 || n>30);
    return n;
}
void nhapmangB(int B[],int n){
    for(int i=0;i<n;++i){
        scanf("%8d",&B[i]);
    }
}
void inmangB(int B[],int n){
     for(int i=0;i<n;++i){
        printf("  B[%d]=%d",i,B[i]);
    }
}
void ktra_mang(int B[],int n){
    int x,dem=0;
    printf("\nnhap x=");scanf("%d",&x);
    printf("\nmang duoc ktra nhu sau:");
    for(int i=0;i<n;++i){
        if(B[i]==x){
            ++dem;
            B[i]=0;
        }
        printf("   B[%d]=%d",i,B[i]);
    }
    printf("\nco %d so bang x",dem);
}
void xoa_mang(int B[],int n){
    int k;
    printf("\nnhap k=");scanf("%d",&k);
    do{
        if(k<1 || k>n){
            printf("nhap sai k,nhap lai k=");scanf("%d",&k);
        }
    }while(k<1 || k>n);

    for(int i=k;i<n-1;++i){
        B[i]=B[i+1];
    }
    --n;
}
int main()
{
    int n=nhapN();
    int B[n];
    nhapmangB(B,n);
    inmangB(B,n);
    ktra_mang(B,n);
    xoa_mang(B,n);
    printf("\nmang sau khi xoa nhu sau:");
    inmangB(B,n);

     return 0;
}

//anh chị ơi cho e hỏi,làm sao để hàm xoa_mang lấy mảng ban đầu được nhập để xóa,anh chị giúp e với,e cảm ơn ạ

Nhập được, in được, nhưng không xóa được à bạn?

  • Tại sao hàm kiểm tra lại gán phần tử có giá trị x thành 0 (B[i]=0;) ?
printf("\nmang duoc ktra nhu sau:");
    for(int i=0;i<n;++i){
        if(B[i]==x){
            ++dem;
            B[i]=0;
        }
        printf("   B[%d]=%d",i,B[i]);
    }
  • Với hàm xoa_mang của bạn đang khai báo biến int n chỉ là một biến local cho nên những thay đổi của n bên trong hàm sẽ bị mất sau khi thoát ra khỏi hàm -> giá trị của n ở ngoài hàm main không có thay đổi gì nên sau khi xóa mảng còn lại vẫn giữ nguyên n phần tử. Hơn nữa k của bạn nhập vào là gía trị của số cần xóa, nhưng thực tế bạn lại xóa phần tử ở vị trí k.

Thử lại thế này xem sao:

void xoa_mang(int B[],int *n)
{
    int i, j;
    int res = -1;
    int k;
    printf("\nnhap k=");scanf("%d",&k);
    do{
        if(k<1 || k>*n){
            printf("nhap sai k,nhap lai k=");scanf("%d",&k);
        }
    }while(k<1 || k>*n);
    // Xoa cac phan tu co gia tri = k
    for(i = *n-1; i >= 0; i--)
    {
        if(B[i] == k)
        {
            for(j = i; j < *n-1; j++)
            {
                B[j] = B[j+1];
            }
            (*n)--;
        }
    }
}

Đề bài là viết các hàm:

  • nhập x, kiểm tra trong mảng có phần tử nào bằng x thì gán bằng 0
  • nhập k, xóa phần tử ở vị trí thứ k trong mảng.

Em chỉ hỏi là làm sao để hàm xoa_mang() của em xoá mảng ban đầu em nhập.
Vì em chạy hàm ktra_mang() trước nên nó lấy luôn cái mảng sau khi sửa đấy để xóa,em muốn lấy cái mảng ban đầu nhập để xóa ý.

void xoa_mang(int B[],int n){
    int k;
    printf("\nnhap k=");scanf("%d",&k);
    do{
        if(k<1 || k>n){
            printf("nhap sai k,nhap lai k=");scanf("%d",&k);
        }
    }while(k<1 || k>n);

    for(int i=k;i<n-1;++i){
        B[i]=B[i+1];
    }
    --n;
}

void nhapmangB(int B[],int n){
    for(int i=0;i<n;++i){
        scanf("%8d",&B[i]);
    }
}

int main()
{
    int n=nhapN();
    int B[n];
    nhapmangB(B,n);
    inmangB(B,n);
    ktra_mang(B,n);
    xoa_mang(B,n);
    printf("\nmang sau khi xoa nhu sau:");
    inmangB(B,n);

     return 0;
}
  • Sao phần reply của bạn lộn xộn vậy?

  • \

Từ đầu tới cuối bạn chỉ thao tác với mỗi mảng B[n] trong hàm main thôi chứ đâu có mảng này mảng nọ. Chỉ có là sau khi bạn gọi hàm ktra_mang thì nó đã sửa mảng B[n] đi (gán giá trị các phần tử có giá trị x thành 0).
Nếu bạn muốn giữ nguyên mảng ban đầu sau khi nhập thì bạn copy thành một mảng khác rồi xử lý riêng trong hàm ktra_mang thôi. @@

3 Likes

tại mình không quen chat trên đây,nên hơi lộn xộn

ý tưởng của bạn hay quá thank nhá

Bạn đọc lại hướng dẫn sử dụng và nội quy diễn đàn nhé. ^^

nội quy dài kinh hồn,mình đọc rồi mà vẫn hay bị lỗi này nọ ý :((

Chắc reply bằng email? :thinking:

no no :sweat_smile::sweat_smile::sweat_smile:

cho mình hỏi, cái này dùng tham chiếu hay tham trị với con trỏ gì đấy được không

Mình không hiểu cái này là cái nào?

Trong C không có tham chiếu.

tham trị thì bạn đang dùng rồi.

Mình có dùng con trỏ cho biến n trong phần trả lời trước.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?