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

Sao chương trình này không chạy được ạ
khi em nhâp 1 số
thì máy tính hiển thị ("Unitled1.exp has stopped working ")

#include<stdio.h>
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;
 }
 int hoandoi (int A[],int n)
 {for(int i=0;i<n-1;i++)
    for(int j=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",A[i]);
 }
 main()
  {
      int i,n,A[100];
      scanf("%d",&n);
      input(A,n);
      printf("mang truc khi sap\n");
      display(A,n);
      printf("mang sau khi spa\n");
      hoandoi(A,n);
      display(A,n);

  }
1 Like

Mảng chỉ có 1 phần tử, nghĩa là chỉ có phần tử A[0].
Bạn cho j chạy từ 1 -> n-1. Vậy A[1] là gì?

2 Likes

là phần tử thứ 2…

Mảng của bạn chỉ có 1 phần tử, mà bạn lại truy cập vào phần tử thứ 2. Lỗi truy cập vào vùng nhớ không xác định.
Mình nghĩ nếu bạn dùng bubble sort như vậy thì nên thêm cái điều kiện cho nó. Nếu n > 1 thì mới làm mấy cái vòng for kia.
Những thuật toán sắp xếp khác thì không cần điều kiện đó.

2 Likes

1 phần tử tính làm gì đâu mình xem lại rồi bị thiêu dấu và ở dòng cuối mà vẫn chạy

sao vẫn chưa sắp xếm nhỉ

code bạn thiếu khá nh chỗ, chạy k đc

bạn xem hộ tớ với…

Hàm swap(int,int) khi thực hiện xong không có tác dụng gì. Bạn phải thay bằng con trỏ

int swap(int * a,int * b){
* a^= * b;
* b^=* a;
* a^=* b;
}
1 Like

minh chua hoc con tro chuot ban a

sao swap không có tác dụng nhỉ??? không sắp xếp gì cả

code bạn chỗ hoán vị phải sử dụng địa chỉ nó mới cập nhật đc dữ liệu, vì hàm hoán vị của bạn k xài địa chỉ nên nó k hoạt động thôi, code mình đã sửa vài chỗ, bài xem tham khảo

#include<stdio.h>
#include"conio.h"
void input(int A[], int n)
{
	for (int i = 0; i<n; i++)
	{
		printf("A[%d]", i);
		scanf_s("%d", &A[i]);
	}
}
void swap(int &x,int &y)
{
	int temp,i,j;
	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", A[i]);
}
void main()
{
	int  n, A[100];
	scanf_s("%d", &n);
	input(A, n);
	printf("mang truc khi sap\n");
	display(A, n);
	printf("\nmang sau khi spa\n");
	hoandoi(A, n);
	display(A, n);
	_getch();
}
2 Likes
void swap(int &x,int &y)
{
	int temp,i,j;
	temp = x;
	x = y;
	y = temp;
}

&x va &y la gi thế bạn mình không biết cái này sao lại có thếm i và j làm gì vậy

&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
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?