Hỏi về thêm, xóa sinh viên trong cấu trúc

Xin chào mọi người,
Như tiêu đề, mong mọi người giúp em, em vẫn không hiểu sao:

  • Nó không trừ đi giới hạn của nó lúc xóa mặc dù đã n–
  • Thêm vào thì không tăng giới hạn lên
    Nhân tiện mọi người giúp em format cho đẹp với ạ, em cảm ơn mọi người.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{
	int stt;
	char mssv[10];
	char hoten[25];
	float dlt,dt1,dt2,dvl,dav,dtb;
	char xl[15];
}sv;
typedef struct{
	char mm[10];
	char tenmon[25];
    int tinchi;
    float diem;
}mh;
void nhap(sv a[],mh b[],int *n){
	printf("BAN HAY NHAP DU LIEU CHO 5 MON HOC:\n");
	for(int i=0;i<5;i++){
		printf("NHAP TEN MON %i ",i+1);fflush(stdin);gets(b[i].tenmon);
	        printf("NHAP MA MON ");fflush(stdin);gets(b[i].mm);
	        printf("NHAP SO TIN CHI ");scanf("%i",&b[i].tinchi);
	        i++;
	        printf("\nNHAP TEN MON %i ",i+1);fflush(stdin);gets(b[i].tenmon);
	        printf("NHAP MA MON ");fflush(stdin);gets(b[i].mm);
	        printf("NHAP SO TIN CHI ");scanf("%i",&b[i].tinchi);
	        i++;
	        printf("\nNHAP TEN MON %i ",i+1);fflush(stdin);gets(b[i].tenmon);
	        printf("NHAP MA MON ");fflush(stdin);gets(b[i].mm);
	        printf("NHAP SO TIN CHI ");scanf("%i",&b[i].tinchi);
	        i++;
	        printf("\nNHAP TEN MON %i ",i+1);fflush(stdin);gets(b[i].tenmon);
	        printf("NHAP MA MON ");fflush(stdin);gets(b[i].mm);
	        printf("NHAP SO TIN CHI ");scanf("%i",&b[i].tinchi);
	        i++;
	        printf("\nNHAP TEN MON %i ",i+1);fflush(stdin);gets(b[i].tenmon);
		printf("NHAP MA MON ");fflush(stdin);gets(b[i].mm);
		printf("NHAP SO TIN CHI ");scanf("%i",&b[i].tinchi);
    }  
    printf("BAN CAN NHAP BAO NHIEU SINH VIEN ?\n\t");scanf("%i",&(*n));
	for(int i=0;i<*n;i++){
		printf("\nNHAP SO THU TU CHO SINH VIEN ");scanf("%i",&a[i].stt);
		printf("NHAP MSSV ");fflush(stdin);gets(a[i].mssv);
	        printf("NHAP HO & TEN ");fflush(stdin);gets(a[i].hoten);
		printf("NHAP DIEM %s ",b[0].tenmon);scanf("%f",&a[i].dlt);
		printf("NHAP DIEM %s ",b[1].tenmon);scanf("%f",&a[i].dt1);
		printf("NHAP DIEM %s ",b[2].tenmon);scanf("%f",&a[i].dt2);
		printf("NHAP DIEM %s ",b[3].tenmon);scanf("%f",&a[i].dvl);
		printf("NHAP DIEM %s ",b[4].tenmon);scanf("%f",&a[i].dav);
	}
}
void xuly(sv a[],mh b[],int n){
	for(int i=0;i<n;i++){
		float s=(a[i].dlt*b[0].tinchi+a[i].dt1*b[1].tinchi+a[i].dt2*b[2].tinchi+a[i].dvl*b[3].tinchi+a[i].dav*b[4].tinchi);
		int s1=(b[0].tinchi+b[1].tinchi+b[2].tinchi+b[3].tinchi+b[4].tinchi);
	    a[i].dtb=s/s1;
	    if(a[i].dtb>=9) strcpy(a[i].xl,"XUAT SAC");
	    else if(a[i].dtb>=8) strcpy(a[i].xl,"LOAI GIOI");
	    else if(a[i].dtb>=6.5) strcpy(a[i].xl,"LOAI KHA");
	    else if(a[i].dtb>=5) strcpy(a[i].xl,"LOAI TB");
	    else strcpy(a[i].xl,"LOAI YEU");
    }
}
void xuat(sv a[],mh b[],int *n){
	for(int i=0;i<*n;i++){
		for(int j=0;j<5;){
			printf("%-5i%-10s%-25s:\n",a[i].stt,a[i].mssv,a[i].hoten);
			printf("%-25s%-5.2f",b[j].tenmon,a[i].dlt);j++;
			printf("%-25s%-5.2f",b[j].tenmon,a[i].dt1);j++;
			printf("%-25s%-5.2f",b[j].tenmon,a[i].dt2);j++;
			printf("%-25s%-5.2f",b[j].tenmon,a[i].dvl);j++;
			printf("%-25s%-5.2f\nDIEM TB: %-5.2f%-15s\n",b[j].tenmon,a[i].dav,a[i].dtb,a[i].xl);j++;
		}
		printf("\n");
	}
}
void nhapsvn(sv *a, mh b[], int n){
	a=(sv*)malloc(n*sizeof(sv));
	int add;
	printf("BAN MUON NHAP THEM BAO NHIEU SINH VIEN ?\n\t");scanf("%i",&add);
	a=(sv*)realloc(a,n+add);
	for(int i=n;i<(n+add);i++){
		printf("\nNHAP SO THU TU CHO SINH VIEN ");scanf("%i",&(a+i)->stt);
		printf("NHAP MSSV ");fflush(stdin);gets((a+i)->mssv);
	        printf("NHAP HO & TEN ");fflush(stdin);gets((a+i)->hoten);
		printf("NHAP DIEM %s ",b[0].tenmon);scanf("%f",&(a+i)->dlt);
		printf("NHAP DIEM %s ",b[1].tenmon);scanf("%f",&(a+i)->dt1);
		printf("NHAP DIEM %s ",b[2].tenmon);scanf("%f",&(a+i)->dt2);
		printf("NHAP DIEM %s ",b[3].tenmon);scanf("%f",&(a+i)->dvl);
		printf("NHAP DIEM %s ",b[4].tenmon);scanf("%f",&(a+i)->dav);
	}
	n = n + add;
}
void xoasv(sv a[],mh b[],int *n){
	char z[10];
	fflush(stdin);gets(z);
	for(int i=0;i<*n;i++){
		if(stricmp(a[i].mssv,z)==0){
			for (int j = i; j<*n;j++){
				*(a+j) = *(a+j+1);
				i--;
			}
			*n--;
		}
	}
}
int main(){
	sv a[30];
	mh b[5];
	int n;
	printf("  CHUONG TRINH QUAN LY SINH VIEN\n");
	nhap(a,b,&n);
	xuly(a,b,n);
	printf("\nDANH SACH SINH VIEN BAN VUA NHAP\n");
	xuat(a,b,&n);
	printf("\n***********************************************************");
	printf("\n**      NHAP 1 TIM SINH VIEN BAN MUON                    **");
	printf("\n**      NHAP 2 XEM SINH VIEN CO DIEM TB CAO NHAT         **");
	printf("\n**      NHAP 3 LIET KE XEP LOAI SINH VIEN                **");
	printf("\n**      NHAP 4 THEM SINH VIEN                            **");
	printf("\n**      NHAP 5 XOA SINH VIEN BAN MUON                    **");
	printf("\n**      NHAP 6 SAP XEP SINH VIEN THEO DIEM TRUNG BINH    **");
	printf("\n**      NHAP 7 SAP XEP SINH VIEN THEO TEN                **");
        printf("\n**      NHAP 8 XUAT DANH SACH SINH VIEN VUA NHAP RA FILE **");
//      printf("\n**      NHAP 9 DOC DANH SACH SINH VIEN TU FILE           **");
        printf("\n***********************************************************\n");
	int c;
	printf("          NHAP LUA CHON CUA BAN :\t");scanf("%i",&c);
	switch(c){
                case 4:
			nhapsvn(a,b,n);
			xuat(a,b,&n);
			break;
		case 5:
			printf("NHAP MSSV CUA SV CAN XOA:\t");
			xoasv(a,b,&n);
			printf("\n%d\n",n);
			xuat(a,b,&n);
			break;
	}
	printf("KET THUC CHUONG TRINH");
}

Ồ, rảnh quá rồi. Dùng vòng lặp để làm gì thế?

3 Likes

Éc em hiểu ý anh/chị rồi để em chỉnh lại…

2 Likes

Theo yêu cầu

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