01/10/2018, 09:22
Sắp xếp mảng cấu trúc
Em có một mảng cấu trúc như ntn, dù thuật toán sắp xếp đã đúng như k hiểu sao lại k thực hiện sắp xếp.
mặc dùng dùng như thế này ở bài khác lại chạy đc. mong mọi người giúp với
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
struct ngaysinh{
int Ngay , Thang, Nam;
};
struct sinhvien {
int MaSV;
char TenLop[10];
char HoTen[30];
float Diem;
ngaysinh NS;//nam sinh
};
void nhap(sinhvien sv[], int &n){
printf("Nhap so luong sinh vien:");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("Nhap ma sinh vien: "); fflush(stdin); scanf("%d",&sv[i].MaSV );
printf("Nhap ten lop: ");fflush(stdin); gets(sv[i].TenLop);
printf("Nhap ho ten sinh vien: "); fflush(stdin); gets(sv[i].HoTen);
printf("Nhap ngay sinh:
Ngay: ");scanf("%d",&sv[i].NS.Ngay);
printf(" Thang: "); scanf("%d",&sv[i].NS.Thang);
printf(" Nam: "); scanf("%d",&sv[i].NS.Nam);
printf("Nhap diem tb"); fflush(stdin);scanf("%f",&sv[i].Diem);
}
}
void print(sinhvien sv[], int n){
for(int i=0;i<n;i++){
printf("
=======================");
printf("
ma sinh vien: %d", sv[i].MaSV );
printf("
ten lop: %s",sv[i].TenLop);
printf("
sinh vien: %s",sv[i].HoTen);
printf("
ngay sinh: %d/%d/%d ",sv[i].NS.Ngay,sv[i].NS.Thang,sv[i].NS.Nam);
printf("
diem tb: %f",sv[i].Diem);
}
}
void selectionSort (int a[], int n){
for(int i=0;i<n-1;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
if(min!=i){
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
}
void swap (sinhvien x, sinhvien y){
sinhvien temp = x;
x=y;
y=temp;
}
void sortMaSinhVien(sinhvien sv[], int n){
for(int i=0;i<n-1;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(sv[i].MaSV<sv[min].MaSV){
min=j;
}
if(min!=i){
swap(sv[i],sv[min]);
}
}
}
}
int main(){
sinhvien sv[100];
int n;
nhap(sv,n);
sortMaSinhVien(sv,n);
print(sv,n);
}
Bài liên quan
Ví dụ hàm trên chẳng hạn. Mình nghĩ là vì bạn truyền tham chiếu giá trị chứ không phải tham chiếu địa chỉ nên
x
,y
chỉ đóng vai trò biến cục bộ, là bản sao củasv[i]
vàsv[min]
, chạy xong hàm thìx
vày
bị xoá chứ không tác động đếnsv
.Mặc dù loại bỏ swap đi rồi. nhưng nó vẫn không sắp xếp được bạn ah. mình cũng k hiểu sao nữa
hàm
sortMaSinhVien()
bạn cũng truyền tham trị kìatham biến thì có
&
đấykiểu như
scanf()
ý, có&
nên mới tác động được vào biến đầu vào.Bị lỗi này bạn ơi
[Error] declaration of ‘sv’ as array of references
[Error] expected ‘)’ before ‘,’ token
[Error] expected unqualified-id before ‘int’
Thế thì ở trên mình sai rồi XD
Hóng có cao nhân nào đọc code hiểu được vấn đề giúp thớt cái.
scanf
không có & đó đâu nó là hàm C mà.sv[i].MaSV<sv[min].MaSV
chỗ này phải là sv[j]…Không có tham chiếu mảng đâu mà cũng không cần vì có trỏ đi chỗ khác đâu
sai hàm so sánh rồi, bỏ cả swap vs sort đi
ví dụ bạn so sánh giữa các mảng dựa trên tiêu chí điểm tb thì b phải dựa vào điểm tb chứ phần so sánh kia là dùng cho mảng có một phần tử, còn mảng này của b có mấy cái liền
Mình bỏ dấu & trước sinhvien sv[] rồi
còn scanf thì vẫn phải có & chứ.
với lại cái sv[min] là đúng rồi vì mình dùng thuật toán selectionSort
mình chi sắp xếp theo Mã sinh viên thôi mà bạn. là cái sv[i].MaSV mà
#include<stdio.h> #include<conio.h> int so1,so2,kq; int main(); { kq= (so1+so2); printf("Nhap 2 so"); scanf(%d,&so1); scanf(%d,&so2); scanf(%d,&kq); printf("Tong 2 so la:%d",kq); _getch(); }
bi loi
[Error] expected unqualified-id before '{' token
la sao anh? tks aBạn vui lòng lập thớt mới. Đây chỉ là lỗi cú pháp.
Ban ko tra loi o day dc ha ban, ban giup minh duoc k?