Sắp xếp thành hàng theo chiều cao và giới tính

Toàn bộ sinh viên nam của lớp giáo dục thể chất có số thứ tự trong danh sách lớp là số lẻ, còn lại các sinh viên nữ có số thứ tự là số chẵn. Giảng viên muốn các bạn sinh viên xếp thành một hàng dài. Trong đó các bạn nữ đứng trước các bạn nam, và người có chiều cao thấp hơn sẽ được đứng trước (nếu bằng nhau thì người có số thứ tự nhỏ hơn đứng trước). Danh sách lớp đã có chiều cao của các sinh viên trong lớp, giảng viên muốn gọi các bạn sinh viên theo số thứ tự để lên xếp hàng. Hãy viết chương trình giúp giảng viên thực hiện việc này.

Đầu vào: số nguyên n là sĩ số lớp và n số nguyên tiếp theo là chiều cao tính bằng centimét của các sinh viên trong lớp (được sắp theo số thứ tự, số thứ tự bắt đầu từ 1).

Đầu ra: số thứ tự của các sinh viên để sắp thành hàng, cách nhau bởi dấu cách.

     #include"stdio.h"
        int main()
        {
        	int n,min;
        	scanf("%d",&n);
        	int c[n],b[n];
        	for(int k=0;k<n;k++)
        	{
        	    scanf("%d",&c[k]);
        	}
        	min=c[1];
        	for(int i=0;i<n/2;i++)
        	{
        	    
        	    for(int k=1;k<n;k+=2)
        	    {
        	        if(c[k]<=min)
        	        {
        	            min=c[k];
        	            b[i]=k;
        	        }
        	    }
        	    c[b[i]]=200;
        	    printf("%d ",b[i]+1);
        	}
        	min=c[0];
        	for(int i=n/2;i<n;i++)
        	{
        	    
        	    for(int k=0;k<n;k+=2)
        	    {
        	        if(c[k]<=min)
        	        {
        	            min=c[k];
        	            b[i]=k;
        	        }
        	    }
        	    c[b[i]]=200;
        	    printf("%d ",b[i]+1);
        	}
        	return 0;
        }

cho em hỏi em sai ở đâu ạ
image

bạn đã chạy thử chương trình với input đó chưa?


đây ạ


code của bạn có vẻ rất hên xui
mảng b ban đầu chưa được gán, nó sẽ ra một giá trị hên xui, như trong hình (khi mới khai báo, toàn bộ 6 phần tử tỏng mảng b sẽ được gán là 896)
ví dụ ở dòng 23,
i = 1, b[i] = b[1] = 896, c[896]???
mảng c rõ ràng chỉ có 6 phần tử, nhưng khi thưc hiện gán thì nó vẫn cho qua

tóm lại là do mình rảnh nên copy code của bạn về chạy cho vui thôi chứ code của bạn sai rồi, ở đây chỉ check một chỗ đó thôi là thấy có vấn đề rồi
bạn hãy nêu lên ý tưởng của bạn cho bài này xem?

2 Likes

tại vì em thấy trước đấy đã tìm min của c[k] và gán b[i]=k trước đấy rồi, vì luôn có thể tìm được min nên b[i] phải được gán bằng k của min chứ ạ

vậy thì chỉ có thể là cpu bị lỗi, tính toán sai mà thôi
bạn có thể tự debug để kiểm tra

hơn nữa, mình đang muốn hỏi về ý tưởng của bạn khi viết code này, mô tả các bước bằng lời

1 Like

Ý tưởng của em là tìm min của các số thứ tự chẵn rồi xếp vào trong đầu hàng, sau đó cho giá trị của người đó lên cao để min k tìm đến nữa, rồi tiếp tục đến người thứ 2, cho đến khi đến người thứ n/2 (vì nam nữ có stt xem kẽ nên chắc chắn đến n/2 thì cũng hết nữ). Làm tương tự với nam có stt lẻ

bạn có thể giải thích các dòng lệnh của bạn không, vòng for lớn để làm gì, for nhỏ để làm gì
sau mỗi vòng for thì được gì?

1 Like

vòng for lớn là để gọi ra từng vị trí b[i] cần xếp người vào, vòng for nhỏ để tìm min của c và gán k của c[k] min đã tìm được vào trong b[i], sau mỗi vòng for nhỏ thì cho giá trị c min lên rất cao để vòng sau min sẽ tìm đến c khác

thua, theo cách giải thích này thì dù bạn có giải thích trực tiếp bằng lời cũng thua rồi
bạn tự chạy code rồi in ra xem coi nó có đúng với ý tưởng của bạn không
với i = 1 ở vòng lặp i đầu tiên, thì ra kết quả như hình ở trên, có vẻ như là nguyên vòng for bên trong không có chạy được gì (if false hết)

1 Like

vâng ạ, em cảm ơn a :sweat_smile:

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