Sắp sếp số theo thứ tự tăng dần bị lỗi

&x,&y trong C++ gọi là reference . Nhưng trong C thì hàm viết như vậy không chạy được

3 Likes

có cách nào khác không bạn

đúng như lời @Gio nói. “&” trong C++ gọi là reference, nói dễ hiểu là tham chiếu, còn dễ hiểu hơn có nghĩa là địa chỉ. Trong C thì bạn có thể tham khảo cách của @Gio. À, còn i vs j k có gì đâu, nãy mình bỏ nhầm chỗ đó, bạn có thể xóa nó :))

1 Like

nhưng sao mình chạy chương trình C vẫn chạy nhỉ. chẳng hiểu

1 Like

Chắc trình biên dịch của bạn không phải thuần C :smile:

1 Like

cũng còn tùy vào compiler nữa bạn à

Cai & x &y là của C++ nếu C thì làm sao hả bạn

1 Like

C++ va C khác nhau không các bạn

2 Likes

@Toi_Do nếu là C thì bạn có thể sử dụng cách của Gió nêu ở trên đấy. Còn C vs C++ khác nhau thì chỉ khác phương thức vs chút xíu ngôn ngữ thôi, còn lại thì y chang nhau :))

2 Likes

Mình sửa lại code của bạn như sau:

#include<stdio.h>
void input(int A[],int n);
void swap( int x, int y) ;
void hoandoi (int A[],int n);
void display(int A[], int n);
int main() {
    int n,A[100];
    printf("Nhap so phan tu cua mang:");
    scanf("%d",&n);
    input(A,n);
	printf("mang truoc khi sap:");
    display(A,n);
	printf("\nmang sau khi sap:");
    hoandoi(A,n);
    display(A,n);
    return 0;
}
void input(int A[],int n) {
    for(int i=0; i<n; i++) {
        printf("A[%d]=",i);
        scanf("%d",&A[i]);
    }
}
void swap( int *x, int *y) {
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}
void hoandoi (int A[],int n) {
    for(int i=0; i<n-1; i++)
        for(int j=i+1; j<n; j++)
            if(A[i]>A[j])
                swap(&A[i],&A[j]);
}
void display(int A[], int n) {
    for(int i=0; i<n; i++)
        printf("%d\t",A[i]);
}

Mình lưu ý vài điểm về code của bạn:
1.Khi bạn khai báo int hoandoi (int A[],int n) như thế này thì hàm hoandoi phải trả về hàm gọi nó một số nguyên.
2.Khi dùng hàm nên khai báo trước rồi mới định nghĩa.
3.Ở hàm swap, bạn dùng để hoán đổi 2 biến muk lại để tham số của hàm là 2 biến thì sẽ không giải quyết được vấn đề. Cái này bạn nên xem video sau:




2 Likes

C++ phát triển dựa trên nền tảng C. C++ có hỗ trợ hướng đối tượng, và nhiều thứ khác :smile:

4 Likes

Nếu mà phân vân C hay C++ thì theo mình bạn nên học C. Nếu học tốt C bạn sẽ có khả năng “quản lý” rất tốt:

  • hàm trong C không cho phép override => quản lý tên hàm.
  • bộ nhớ trong C đều do bạn quản lý=> quản lý bộ nhớ.
  • không có namespace hay lớp=> tất cả đều “lộ” ra, đòi hỏi khả năng quản lý cấu trúc dữ liệu …
2 Likes

@Toi_Do hàm swap ko có tác dụng vì khi gọi nó ra, bạn chỉ truyền cho nó tham trị, tức là 2 giá trị của a[i] và a[j] và vào trong hàm swap nó hoán vị 2 giá trị đó với nhau nhưng chỉ là trong hàm swap thôi, kêt thúc hàm swap thì các biến địa phương trực thuộc hàm swap sẽ bị giải phóng và ko tồn tại nữa.
Mỗi variable (biến) đều có một ô nhớ, mỗi ô nhớ có 1 địa chỉ riêng
Nếu muốn đổi chỗ a[i] với a[j] thì bạn phải nhớ là phải thay đổi giá trị có trong địa chỉ ô nhớ của a[i] và của a[j] tức là phải tác động trực tiếp vào đó.
Để có thể làm được điều này thì khi gọi hàm swap bạn bắt buộc phải truyền vào cho nó tham biến chứ không phải tham trị, tức là truyền vào hàm swap cái địa chỉ của ô nhớ của phần tử a[i] và a[j].
Khi đó hàm swap của bạn phải sửa là swap(int *a, int *b);, và trong đó muốn thao tác với giá trị của a và b thì phải có thêm dấu * trước a và b ( *a và *b ) - Vì a,b khi này là địa chỉ của ô nhớ nên không thể so sánh giá trị nằm trong 2 ô đó bằng cách so sanh địa chỉ (a>b) được, mà phải là (*a>*b)

khi gọi ra ở dưới thì bạn phải truyền cho swap địa chỉ ô a[i] và a[j], tức là swap(&a[i],&a[j]);
Cái đó là 1 phần của pointer. tuy nhiên nếu bạn chưa học thì có thể hiểu nôm na như mh nói ở trên. nếu tìm hiểu về pointer thì bạn sẽ rõ hơn rất nhiều! Và có rất nhiều thứ hay ho đang chờ đợi bạn trong phần pointer (tuy nhiên ko có gì hay mà dễ cả :stuck_out_tongue: )

1 Like

Mình lơ tơ mơ quá không hiểu lắm. Bạn cho mình hỏi luôn cái câu lệnh.
void hoandoi (int A[],int n) {
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(A[i]>A[j])
swap(&A[i],&A[j]);
Ai lớn hơn Aj thì câu lệnh thực hiện và hoán đổi Ai vs Aj. Xong j++ tăng lên 1 tại sao Ai vẫn là số cũ mà không phải số hoán đổi hả bạn. Mình biết nếu làm thế sẽ sai. Nhưng vẫn thắc mắc quá mong bon giúp

1 Like

Nếu bạn đã truyền địa chỉ cho hàm swap(); và hàm swap bạn viết đúng thì chắc chắn sẽ swap đc nhé!
hàm swap đúng sẽ là:

void swap(int *a, int *b){
int c=*a;
*a=*b;
*b=c;
}
4 Likes

@Toi_Do anh có một số video hướng dẫn swap đó em. Em vào phần C++ xem nhé. Link ở đây

1 Like

Vấn đề này bạn liên hệ anh Đạt để hỏi thêm về truyền tham chiếu, tham trị …
Nếu bạn không hiểu (và không muốn hiểu) về con trỏ - tham chiếu thì bạn có thể đổi hàm swap thành vầy

void swap(int A[], int i, int j)
{
    int temp;
    temp=A[i];
    A[i]=A[j];
    A[j]=temp;
}

rồi chỗ gọi thì gọi swap(A, i, j) thay vì gọi như cũ :fu:

3 Likes

theo mình chỉ cần sửa chỗ vòng for từ j=1 thành j=i+1 là đc :sob:

Ad ơi, cho e hỏi nếu bài này dùng cấp phát động với con trỏ *p thì khi cho i,j chạy so sánh p[i] với p[j] có được không hay là dùng *(p+i), *(p+j) vậy?
E mới học về cấp phát động nên không hiểu rõ lắm .

Topic này khá cũ rồi. @chutchit tạo topic mới và đặt câu hỏi được không? Vì nó cũ nên mọi người không nhớ được chính xác vấn đề ^^

Hoặc có ai đó nhớ thì tốt quá. Nhưng nếu em có thể tạo một topic mới và nêu câu hỏi cụ thể hơn thì dễ dàng hơn cho mọi người đấy :smile:

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