Read-only archive. Login and posting are unavailable.
View Full Version : [lập trình -hỏi] sắp xếp trong cấu trúc struct
cho em hỏi các vấn đề sau :D về C nha mấy bác
em có struct sau :
typedef struct sinhvien
{
char mssv[15];
char hoten[40];
int diem;
} sv;
sv *a;
Yêu cầu là sắp xếp cho mã số sv tăng [giảm] dần và họ tên tăng [giảm] dần. Hàm sắp xếp thì em biết và viết được rồi. Nhưng vấn đề là nó không cơ động, tức là em phải viết hàm : tăng theo mssv, giảm theo mssv, tăng theo tên, giảm theo tên.
----> tổng cộng phải viết là 4 hàm, trong khi đó 2 hàm tăng và 2 hàm giảm giống y hệt nhau chỉ khác cái điều kiện là so sánh các trường khác nhau. Thế nhỡ bắt sắp xếp theo 10-20 trường thì lúc đấy vỡ mồm
Em muốn hỏi các bác cách nào để chỉ viết 2 hàm: tăng và giảm mà sử dụng được cho nhiều trường trong struct đó không ạh. :)
Hàm sắp xếp theo mssv của em đây, cái này em xếp theo kiểu đổi chỗ trực tiếp cho nó gọn :
void doitructiep(sv *a,int n)
{
for (int i=0;i0) doicho(a[i],a);
}
cám ơn các bác nhiều ạh :byebye:
HunterBMT
20-07-2010, 01:41
Sao bác ko viết 1 hàm tăng 1 hàm giảm với parameter là 1 phần tử của struct ??
bác viết hộ em cái ạh :sad:, ko hiểu sao lại ngu đột xuất vậy
meojunior
20-07-2010, 05:32
Đây rồi, tớ đang rỗi nên code thử phát :byebye:, thêm vào một biến kiểu enum để xác định kiểu sắp xếp nữa là OK, nên chỉ cần viết một hàm thôi
/* Define compare type */
typedef enum E_SORT_TYPE
{
E_SHORT_BY_NAME_UP = 0, /* Increase by name */
E_SHORT_BY_NAME_DOWN, /* Decrease by name */
E_SHORT_BY_ID_UP, /* Increase by ID */
E_SHORT_BY_ID_DOWN /* Decrease by ID */
};
void doitructiep(sv *a,int n, E_SORT_TYPE eSortType )
{
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
bool isSwap = false; /* Flag to indicate swap two nood */
switch ( eSortType )
{
case E_SHORT_BY_ID_DOWN:
/* Add code to compare by ID then set value to flag isSwap */
break;
case E_SHORT_BY_ID_UP:
/* Add code to compare by ID then set value to flag isSwap */
break;
case E_SHORT_BY_NAME_UP:
/* Add code to compare by name then set value to flag isSwap */
break;
case E_SHORT_BY_NAME_DOWN:
/* Add code to compare by namethen set value to flag isSwap */
break;
default:
/* Output log indicate wrong parameter here */
break;
}
if ( isSwap )
{
doicho(a[i],a);
}
}
}
}
đệt
đơn giản thế cũng hỏi
code tối ưu là đây
toi uu
\m/
ps: bổ sung thêm bản anh hóa:
optimal
hoặc
perfect
:byebye:
Đây rồi, tớ đang rỗi nên code thử phát :byebye:, thêm vào một biến kiểu enum để xác định kiểu sắp xếp nữa là OK, nên chỉ cần viết một hàm thôi
cám ơn bác nhiều, nhưng hình như nó vẫn chưa tối ưu, của bác là so sánh nhiều trường trong cùng 1 hàm, thế nhỡ có 1 struct nhiều trường thì bắt buộc phải làm nhiều cái :brick: vậy thấy cũng thủ công wá .
ý em là chọn trường nào thì so sánh trường đó, làm 1 thao tác so sánh thôi, có bác nào biết ko :D :brick:
HunterBMT
20-07-2010, 10:52
Thế bác đợi chiều rồi em up code nhé :D Em cũng đang học Cpp :D
Thế bác đợi chiều rồi em up code nhé :D Em cũng đang học Cpp :D
cám ơn bác trước nhá :D
bug_bunny145
20-07-2010, 11:19
các bác cứ đưa vấn đề chuyên môn vào f17 thảo nào nó cứ bị nhạt đi :sad: về nhà đừng bàn chuyện công việc chứ
em chỉ mới nghĩ dc như thế này: sao bác ko viết 1 hàm so sánh, hàm này nhận 2 đối số kieu char,
if (strcmp(x.mssv,y.mssv)>0) return 1
else return 0
xong viet thêm 1 hàm sắp xếp nữa, gọi hàm so sánh trên nếu kq trả về 1 thì đảo, còn 0 thì thôi..
đây là ngu kiến của em, có gì các pác cho em ít ít gạch xíu :shot:
_;17341480']em chỉ mới nghĩ dc như thế này: sao bác ko viết 1 hàm so sánh, hàm này nhận 2 đối số kieu char,
if (strcmp(x.mssv,y.mssv)>0) return 1
else return 0
xong viet thêm 1 hàm sắp xếp nữa, gọi hàm so sánh trên nếu kq trả về 1 thì đảo, còn 0 thì thôi..
đây là ngu kiến của em, có gì các pác cho em ít ít gạch xíu :shot:
:D.
edit : nghĩ 1 hồi hình như thấy chưa ổn bác ơi :sad:. để nghĩ tiếp:((
HunterBMT
20-07-2010, 11:42
_;17341480']em chỉ mới nghĩ dc như thế này: sao bác ko viết 1 hàm so sánh, hàm này nhận 2 đối số kieu char,
if (strcmp(x.mssv,y.mssv)>0) return 1
else return 0
xong viet thêm 1 hàm sắp xếp nữa, gọi hàm so sánh trên nếu kq trả về 1 thì đảo, còn 0 thì thôi..
đây là ngu kiến của em, có gì các pác cho em ít ít gạch xíu :shot:
Cách này sáng tạo đấy chứ. Bác viết 1 hàm
Void sosanh(int x , int y )
{
}
và 1 hàm
Void sosanh2(int x,int y)
{
}
hàm sosanh là tăng, sosanh2 là giảm
Xong thì cứ
for (i=0 ; i =0;j--)
{
sosanh(x,y);
if (flag ==1)
doicho(x,y);// hàm doicho bác viết tựa cái hàm sosanh
}
mấy cái kia tương tự :D em chỉ viết theo ý của bác ở trên còn chưa chỉnh hay workflow thử nên các bác ném nhẹ ạ :)
:sad:
chẳng hạn bây h muốn so sánh theo mssv
thì gọi hàm so sánh
void doitructiep(sv *a,int n)
{
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++)
if ( sosanh(a[i].mssv,a.mssv) ) doicho(a[i],a);
}
so sánh theo tên thì viết hàm
void doitructiep(sv *a,int n)
{
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++)
if ( sosanh(a[i].ten,a.ten) doicho(a[i],a);
}
:sad: ko ổn bác ạh. hàm so sánh đó chỉ là hàm để khi truyền đối số nào nó so sánh đối số đó. Vậy thì vẫn còn phụ thuộc vào hàm sort . Như thế lại phải viết lặp đi lặp lại
Ko biết em hiểu có đúng ko, các bác vào sửa giúp em cái ạh
HunterBMT
20-07-2010, 12:29
Em hiểu ý của bác rồi :D Đợi chiều về em up code lại cho :D H đi học đã
HunterBMT
20-07-2010, 13:59
:| Em đã xem lại. Nếu bác muốn gọn bắt buộc cái sv.mssv và sv.hoten phải thay đc bằng a.x và a.y thì mới giải quyết được cả 2 trường hợp ( Tăng số lượng struct và tăng số lượng properties ) Mà em thì ko biết C có hỗ trợ dùng parameter kiểu đấy không :D Để tối về em lục sách lại rồi báo cáo bác ạ
:| Em đã xem lại. Nếu bác muốn gọn bắt buộc cái sv.mssv và sv.hoten phải thay đc bằng a.x và a.y thì mới giải quyết được cả 2 trường hợp ( Tăng số lượng struct và tăng số lượng properties ) Mà em thì ko biết C có hỗ trợ dùng parameter kiểu đấy không :D Để tối về em lục sách lại rồi báo cáo bác ạ
vấn đề là vậy đó, mình tìm nát rồi ko có kiểu gọi 1 trường của struct trong hàm :shot:
mai nộp bài rồi :brick:. chắc làm theo cách của bác mèo ju nho wá :D. bác nào có ý tưởng ko giúp em với :D
vBulletin® v3.8.0, Copyright ©2000-2026, Jelsoft Enterprises Ltd.