30/09/2018, 16:23
Sắp xếp DS Học Sinh Theo Thứ Tự Bảng Chữ Cái
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct HS
{
char Hoten[30];
};
void Nhap(HS a[],int n)
{
for(int i=0;i<n;i++)
{
fflush(stdin);
printf("
Nhap ten: ");
gets(a[i].Hoten);
}
}
void Sapxep(HS a[],int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(strcmp(a[i].Hoten,a[j].Hoten)<0)
{
HS k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
}
void Xuat(HS a[],int n)
{
for(int i=0;i<n;i++)
{
printf("
%s",a[i].Hoten);
}
}
void main()
{
HS a[100];
int n=3;
Nhap(a,n);
Sapxep(a,n);
Xuat(a,n);
getch();
}
Kết quả ra không chính xác, Ai giúp em sữa với.
Bài liên quan
chỗ strcmp “== 1” chứ không phải “< 0”
Mình nhớ không nhầm thì hàm
strcmp(char string1[ ], string2[ ])
dùng để so sánh hai chuỗi ký tự với nhau nhưng không phân biệt chữ thường hay chữ in, trả về 3 giá trị:nhỏ hơn 0
,bằng 0
vàlớn hơn 0
.Nếu muốn biết rõ hơn thì bạn cứ search google là được ngay.Nhưng để dễ hơn có thể định nghĩa lại như sau để trả về 3 giá trị-1
,0
,1
:Mình thấy bạn đang dùng thuật toán
Selection sort
để sắp xếp danh sách sinh viên theo thứ tự ABCnên
strcmp(a[ i ].Hoten, a[ j ].Hoten)==1)
nếu bạn định nghĩa lại hàmstrcmp
như trên hoặcstrcmp(a[ i ].Hoten, a[ j ].Hoten) > 0)
thì code của bạn mới đúng được. Nhưng để chính xác hơn khi bạn sắp xếp theo thứ tự ABC thì bạn nên tách tên từ chuỗihoten
của mỗi sinh viên để so sánh, nếu như hai tên trùng nhau thì so sánh cả chuỗi họ tên và nên dùng hàmstricmp(char string1[ ], string2[ ])
để so sánh vì hàm này không phân biệt chữ in hay chữ thường. Bạn có thể tham khảo code của mình ,mình đã post ở trên.–Nếu có gì sai nhờ bạn sửa giúp mình.
b có thể giải thích lại hàm void tachten() hộ mình đk k
Lấy từ cuối cùng thôi. Để thuật toán này đúng thì phải bỏ hết số khoảng trắng bên phải trước.
Nếu từng thành phần có ý nghĩa quan trọng thì nên tách chúng ra và cho hẳn một
struct
để dễ thao tác. Cái này thể hiện tính abstraction rất cao Thiết đặt một “<” lên chúng là được.nếu bh tên của 2 sv giống nhau thì so sánh đệm và họ kiểu j đk b
Nếu bạn đã xác định được thứ tự < thì nói nhanh là nhiều tên có hai họ nên tên đệm lấy chữ tiếp theo ngay trước tên thôi.