Struct sinh viên tổng hợp


Cho em hỏi 2 câu này với ạ :(( em làm hoài mà không ra

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct SINHVIEN
{
    char Hoten[40];
    int  MSSV;
	int ngay;
	int thang;
	int nam;
	float toan;
	float li;
	float hoa;
	float tbc;
}sv;
void NhapSLSV(int &n)
{
	do{
    printf("Nhap so sinh vien: ");
    scanf("%d",&n);
    if(n<=0 || n>100)
    	printf("Nhap sai!Nhap lai!\n");
    }while(n<=0 || n>100);
}
void Nhap1sv(sv &x)
{
	printf("\nNhap MSSV: ");
    scanf("%d",&x.MSSV);
	printf("Nhap ho ten: ");
	fflush(stdin);
    gets(x.Hoten);
    printf("Nhap ngay/thang/nam sinh:\n");
    printf("Nhap ngay sinh: ");
	scanf("%d",&x.ngay);
	printf("Nhap ngay thang: ");
	scanf("%d",&x.thang);
	printf("Nhap ngay nam: ");
	scanf("%d",&x.nam);
    do{
		printf("Nhap vao diem toan: ");
		scanf("%f", &x.toan);
		if(x.toan<0 || x.toan>10)
		{
			printf("Diem toan khong hop le. Xin kiem tra lai !\n");
		}
	}while(x.toan<0 || x.toan>10);
	do{
		printf("Nhap vao diem li: ");
		scanf("%f", &x.li);

		if(x.li<0 || x.li>10)
		{
			printf("\nDiem li khong hop le. Xin kiem tra lai !\n");
		}
	}while(x.li<0 || x.li>10);
	do{
		printf("Nhap vao diem hoa: ");
		scanf("%f", &x.hoa);
		if(x.hoa<0 || x.hoa>10)
		{
			printf("\nDiem hoa khong hop le. Xin kiem tra lai !\n");
		}
	}
         while(x.hoa<0 || x.hoa>10);
    x.tbc = (x.toan + x.li + x.hoa) / 3;
}
void NhapDSSV(sv a[], int n)
{
	printf(" \n\tNHAP DANH SACH SINH VIEN");
    for(int i=0; i<n; i++)
    {
        printf("\nNhap thong tin sinh vien: %d",i+1);
        Nhap1sv(a[i]);
    }
}
void Xuat1sv(sv x)
{
	printf("\n%d\t%s\t%d/%d/%d\t%.2f\t%.2f\t%.2f",x.MSSV,x.Hoten,x.ngay, x.thang, x.nam,x.toan,x.li,x.hoa);
}
void XuatDSSV(sv a[], int n)
{
	printf("\tDANH SACH SINH VIEN");
	for(int i=0; i<n; i++)
	{
		printf("\nSinh vien thu %d:",i+1);
		Xuat1sv(a[i]);
	}
}
int main()
{
	
    int n,key;
    bool danhap = false;
    do{
    printf("Nhap so sinh vien: ");
    scanf("%d",&n);
    if(n<=0 || n>100)
    	printf("Nhap sai!Nhap lai!\n");
    }while(n<=0 || n>100);
    sv a[n],x;
    
    NhapDSSV(a,n) ;
    XuatDSSV(a,n);
   //cauf
   // caug
}

Dùng code c ạ …

  1. Bạn biết dùng thuật toán Sắp xếp Chèn chưa? Chỉ cần áp dụng nó và so sánh SINHVIEN.tbc với nhau thôi.
  2. Chèn 1 SV vào mảng đã sắp xếp, chỉ cần duyệt mảng (for) và chèn (tương tự thuật toán Sắp xếp Chèn) vào vị trí đúng thôi.
4 Likes
  1. Rồi ạ nhưng chỉ bên mảng, còn bên struct em dùng thì lỗi không ạ :frowning:
void SapxepDTB(sv a[], int n)
{
	
	for (int i=1; i<n; i++)
	{
		sv tim ;
		tim = a[i];
		int j= i-1 ;
		
		while (j>=0 && a[j].tbc> tim.tbc )
		{
			a[j+1]=a[j];
			j=i-1;
		}
		a[j+1] =tim ;
	}
}

Như vậy thì sai ở đâu ạ

j=i-1 liệu có đúng chưa?

3 Likes

Cám ơn ạ em đã fix được . Mà có vấn đề là nó chỉ đổi tbc còn muốn đổi cả tên - mssv-… thì sao ạ

Mình chưa hiểu!
Bạn đảo mảng SV thì nó đổi cả sinh viên, chứ sao lại chỉ đổi tbc.

3 Likes

Dạ mà em làm câu g : thêm sinh viên ạ cái đó đổi mỗi điểm tbc

Thế lúc chèn bạn viết thế nào?
Mà nhập thì nhập điểm từng môn rồi tính ra đtb, ai lại chỉ nhập điểm trung bình không vậy.

1 Like

Đây ạ tại em nghĩ khi dùng insert sort rồi thì khi thêm nó tự xếp luôn

void ChenSV(sv a[],int &n,int chen)
{
n++;
for (int i=n;i>chen;i–)
{
a[i].tbc=a[i-1].tbc;
a[i].MSSV=a[i-1].MSSV;
strcpy(a[i].Hoten,a[i-1].Hoten);
a[i].ngay=a[i-1].ngay;
a[i].thang=a[i-1].thang;
a[i].nam=a[i-1].nam;

}
printf("\nNhap diem TB: ");
scanf("%f",&a[chen].tbc);
printf("\nNhap ten: ");
fflush(stdin);
gets(a[chen].Hoten);
printf("\nMSSV: ");
scanf("%c",&a[chen].MSSV);
printf("Nhap ngay/thang/nam sinh:\n");
printf("Nhap ngay sinh: ");
fflush(stdin);
scanf("%d",&a[chen].ngay);
printf("Nhap ngay thang: ");
scanf("%d",&a[chen].thang);
printf("Nhap ngay nam: ");
scanf("%d",&a[chen].nam);

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