30/09/2018, 16:20

Đổi giá trị 2 số cho nhau

Em code bài đổi giá trị 2 số cho nhau, ở đây là a = 2 và b = 3 cho mọi người dễ hình dung.
Thế nhưng khi run thì giá trị a, b vẫn không đổi, nghĩa là a vẫn = 2, b vẫn = 3.
Mọi người giúp em với

#include <stdio.h>
#include <stdlib.h>

int swap(int a, int b)
{
    int t = a;
    a = b;
    b = t;
    return a, b;
}

int main(int argc, char *argv[])
{
    int a = 2, b = 3;
    printf("a = %d	b = %d", a, b);
    swap(a, b);
    printf("
After being swapped:
");
    printf("a = %d	b = %d", a, b);
    return 0;
}
Nguyễn Minh Dũng viết 18:28 ngày 30/09/2018

Em sửa lại hàm swap như thế này

int swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

Lý do là vì C truyền tham trị nên ta cần sử dụng con trỏ. Anh có làm một bài chứng minh ở đây

nhatlonggunz viết 18:33 ngày 30/09/2018

Dạ cám ơn anh, truyền tham trị em cũng hiểu, nhưng con trỏ em chưa học tới.
Để bữa nào rảnh em học về con trỏ.
Mà sao series C của anh không có con trỏ nhỉ (em hỏi vậy thôi chứ em có thấy video nói về nó rồi)

Nguyễn Minh Dũng viết 18:33 ngày 30/09/2018

Em xem đỡ bên C++, nó giống như C thôi. Anh chưa có thời gian làm thôi. Anh sẽ làm đầy đủ.

nhatlonggunz viết 18:25 ngày 30/09/2018

Sao đổi rồi, build nó báo lỗi tùm lum vậy

viết 18:30 ngày 30/09/2018

báo như nào bạn đưa lỗi lên?

... viết 18:35 ngày 30/09/2018

Con trỏ chưa học tới thì truyền tham chiếu cũng được mà

int swap(int& a, int& b)
nhatlonggunz viết 18:21 ngày 30/09/2018

The instruction at 0x00… referenced memory at 0x0… . The memory could not be read, xuất hiện cùng nó là bảng báo file .exe has stopped working

nhatlonggunz viết 18:36 ngày 30/09/2018

Em đã thử, nhưng nó báo expected ‘;’ , ‘,’ or ‘)’ before ‘&’ token

nhatlonggunz viết 18:20 ngày 30/09/2018

Em đã thử, nhưng nó báo expected ‘;’ , ‘,’ or ‘)’ before ‘&’ token

Em đã copy luôn code của anh, kể cả khi chuyển qua int, có return hay không, nó vẫn báo lỗi
expected ‘;’ , ‘,’ or ‘)’ before ‘&’ token

Gió viết 18:31 ngày 30/09/2018
void swap(int& a, int& b)
{
    int t = a;
    a = b;
    b = t;
}

trong C không có & (reference) trong hàm nên không chạy được.

  • nếu chưa học con trỏ thì hơi khó. Có thể định nghĩa 1 đoạn macro để làm
#define swap(a,b) do{ int __t=a; a=b;b=__t;}while(0)
viết 18:28 ngày 30/09/2018

Bạn sửa lại như này nhé, mình chạy trên ubuntu 14.10 thấy ok:

#include <stdio.h>
#include <stdlib.h>

int swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

int main(int argc, char *argv[])
{
    int a = 2, b = 3;
    printf("a = %d\tb = %d", a, b);
    swap(&a, &b);// minh nghi doan nay ban chua goi nhu the nay
    printf("\nAfter being swapped:\n");
    printf("a = %d\tb = %d \n", a, b);
    return 0;
}
nhatlonggunz viết 18:20 ngày 30/09/2018

Cám ơn bạn nhiều, đã thành công

Lập Trình Sư viết 18:29 ngày 30/09/2018

a = (a+b) - (b=a);
Đỗ Trung Quân viết 18:20 ngày 30/09/2018

Với câu này thực ra chẳng cần con trỏ

a = a+b; 5
b = a -b; 2
a = a -b; 3
viết 18:31 ngày 30/09/2018

Cách này chơi được nhưng hơi khó hiểu và hình như bị báo warning :D.

Lập Trình Sư viết 18:35 ngày 30/09/2018

đọc cái này mà khó hiểu chứng tỏ là thời gian dành cho lập trình chưa đủ; và ko hiểu bảng thứ tự toán tử và độ ưu tiên.

Bài liên quan
0