01/10/2018, 17:17

Sắp xếp mảng không thành công

Đoạn code này của em viết để sắp xếp mảng dùng phương pháp đổi chỗ trực tiếp mà không chạy được ạ, mọi người xem giúp em chỗ nào sai với ạ.

#include <stdio.h>
#include <stdlib.h>
void hoanDoi(int *b, int *c);
void sapXepArray(int A[], int *kichThuoc);

int main()
{
    int A[100];
    int i, n;
    printf("Nhap vao so phan tu cua mang: ");
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        A[i] = rand()%(9+1);
    }
    for(i=0; i<n; i++)
    {
        printf("A[%d] = %d    ", i, A[i]);
    }
    sapXepArray(A,&n);
    printf("Mang sau khi duoc sap xep:
");
    for(i=0; i<n; i++)
    {
        printf("A[%d] = %d
", i, A[i]);
    }
    return 0;
}

void hoanDoi(int *b, int *c)
{
    int temp;
    temp = *b;
    *b = *c;
    *c = temp;

}

void sapXepArray(int A[], int *kichThuoc)
{
    int i,j;

    for(i=0; i<*kichThuoc-1; i++)
    {
        for(j=i+1; j<*kichThuoc; j++)
        {
            if(A[j] < A[i])
            {
                hoanDoi(A[j],A[i]);
            }
        }
    }

}

Mong mọi người giúp đỡ! Em cám ơn nhiều ạ.

rogp10 viết 19:28 ngày 01/10/2018

hoanDoi(A[j],A[i]);

Đúng là C chắc là crash rồi.

A[i] với A[j]int mà.

HK boy viết 19:24 ngày 01/10/2018

merged and moved by noname00

Z viết 19:26 ngày 01/10/2018

Em sửa thành:
hoanDoi( *(A + j), *(A+i) );
Như thế này không biết đúng không ạ.
Kết quả nó vẫn không chạy hàm sapXepArray luôn ạ

rogp10 viết 19:25 ngày 01/10/2018

hoanDoi( *(A + j), *(A+i) );

Mình thấy có gì khác nhau đâu

Z viết 19:27 ngày 01/10/2018

Em mới học về con trỏ ạ
Giúp em giải quyết với ạ.
=((

*grab popcorn* viết 19:19 ngày 01/10/2018

Chắc gặp con trỏ với mảng bạn hơi rối. Vậy giả sử bây giờ bạn ko truyền 2 thành phần trong mảng, mà truyền 2 biến a và b vào hàm hoán đổi thì bạn sẽ truyền như thế nào

int a = 10;
int b = 20;
hoanDoi(...);
Z viết 19:23 ngày 01/10/2018
hoanDoi( int b, int c)
{
     int temp;
     temp = b;
     b = c;
     c = temp;
}
...
   hoanDoi( A[j] , A[i] );

Như này đc ko ạ?

*grab popcorn* viết 19:24 ngày 01/10/2018

Không phải, ý mình là hàm hoan đổi ko thay đổi gì.
Nhưng thay vì truyền a[i], a[j] thì bạn thay bằng a và b thì bạn sẽ truyền như thế nào?

hoanDoi(a, b);
// hay
hoanDoi(&a, &b);
Anh chàng Doggo viết 19:20 ngày 01/10/2018

Hàm nhận vào con trỏ thì bạn đưa địa chỉ 2 biến A[j], A[i] vào là ngon lành thôi nhé

hoanDoi(&A[j], &A[i]);

Một ví dụ khác nhận vào con trỏ trong chương trình của bạn là ở ngay lệnh scanf, bạn đưa cho nó địa chỉ của n, từ đó scanf mới có thể thay đổi giá trị của n được

scanf("%d", &n);
James viết 19:21 ngày 01/10/2018

hàm hoanDoi(int* b, int* c) của bạn nhận vào 2 con trỏ mà, bạn truyền vào A[i], A[j] hay *(A+i), *(A+j) -> đều là truyền giá trị.
bạn thử truyền như này xem (A+i), (A+j)

Z viết 19:23 ngày 01/10/2018

Dạ em đã hiểu được vấn đề rồi ạ. Em cám ơn mọi người nhiều nha ^^

Z viết 19:28 ngày 01/10/2018

Em cảm ơn mọi người đã giúp đỡ ạ, cám ơn mọi người rất nhiều!!
image
^^

Bài liên quan
0