
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

// Cach De Ta Xac Dinh Dung '*' <=> no la 1 TH tong quat . Neu Truy Xuat Den Tung Phan Tu Thi Ta Buoc Phai Nhu Kieu BT
#pragma pack(1)
struct HocSinh
{
	char  *maso; // khai bao 100 con tro
	char  *HovaTen;
	char  *Email;
	char  *SDT;
	float Toan, Ly, Hoa;
};
typedef struct HocSinh HS;
struct NhaTruong
{
	HS *ThongTin;
	int SoLuong;
};
// cap phat tung phan tu ben trong Struct Hoc Sinh
void capphatHocSinh(HS &a)
{
	a.maso    =	(char *)calloc(100,sizeof(char));
	a.HovaTen =	(char *)calloc(100,sizeof(char));
	a.Email	  =	(char *)calloc(100,sizeof(char));
	a.SDT     = (char *)calloc(100,sizeof(char));
}
// cap phat cho con tro So luong hoc sinh.
void nhapSoluong(NhaTruong *Cap3)
{
	printf("\nNhap So Luong Hoc Sinh: ");
	scanf("%d", &Cap3->SoLuong);
}
void capphat(NhaTruong *&Cap3)
{
	Cap3->ThongTin = (HS *)calloc( Cap3->SoLuong, sizeof(HS));
}
void nhap(NhaTruong *&Cap3) // ThongTin[i] : Nhu ta da biet no chi la 1 phan tu cua con tro nghia la no la 1 bien binh thuong.
{
	capphat(Cap3);
	for( int i = 0 ; i < Cap3->SoLuong ; i++)
	{
		//fflush(stdin); // ?? 
		printf("\n\n+Thong Tin Sinh Vien %d",i+1);
		capphatHocSinh(Cap3->ThongTin[i]);// chi dc lay gian tiep k the truy xuat truc tiep.
		printf("\nNhap Ma So: ");
		gets(Cap3->ThongTin[i].maso);
		fflush(stdin);
		printf("Nhap Ho va Ten: ");
		gets(Cap3->ThongTin[i].HovaTen);
		printf("Nhap Email:  ");
		gets(Cap3->ThongTin[i].Email);
		printf("Nhap SDT:  ");
		gets(Cap3->ThongTin[i].SDT);
		fflush(stdin);
		printf("Nhap Diem Toan:  "); scanf("%f", &Cap3->ThongTin[i].Toan);
		printf("Nhap Diem Ly:  "); scanf("%f", &Cap3->ThongTin[i].Ly);
		printf("Nhap Diem Hoa:  "); scanf("%f", &Cap3->ThongTin[i].Hoa);
		fflush(stdin);
	}
}
void XuatDanhSach(NhaTruong *Cap3)
{
	printf("\n************************************************");
	printf("\nDanh Sach Hoc Sinh: %d HocSinh ",Cap3->SoLuong);
	for( int i = 0 ; i < Cap3->SoLuong ; i++ )
	{
		printf("\nThong Tin Hoc Sinh %d" ,i+1);
		printf("\nMa So Hoc Sinh: %s ", Cap3->ThongTin[i].maso);
		printf("\nHo va Ten: %s ",Cap3->ThongTin[i].HovaTen);
		printf("\nEmail Hoc Sinh: %s ",Cap3->ThongTin[i].Email);
		printf("\nSo Dien Thoai Hoc Sinh: %s ",Cap3->ThongTin[i].SDT);
		printf("\nDiem Toan: %f ",Cap3->ThongTin[i].Toan);
		printf("\nDiem Ly: %f ",Cap3->ThongTin[i].Ly);
		printf("\nDiem Hoa: %f ",Cap3->ThongTin[i].Hoa);
		printf("\n");
	}
}
void XuatHocSinh(NhaTruong *Cap3)
{
	int vitrixuat;
	do 
	{
		printf("\nMoi Ban Nhap Sinh Vien Muon Xuat: ");
		scanf("%d", &vitrixuat);
		if( vitrixuat >= Cap3->SoLuong) printf("Khong Co Hoc Sinh Nay Trong Nha Truong.");
	} while (vitrixuat >= Cap3->SoLuong);

	printf("\nThong Tin Hoc Sinh %d" ,vitrixuat);
	printf("\nMa So Hoc Sinh: %s ", Cap3->ThongTin[vitrixuat].maso);
	printf("\nHo va Ten: %s ",Cap3->ThongTin[vitrixuat].HovaTen);
	printf("\nEmail Hoc Sinh: %s ",Cap3->ThongTin[vitrixuat].Email);
	printf("\nSo Dien Thoai Hoc Sinh: %s ",Cap3->ThongTin[vitrixuat].SDT);
	printf("\nDiem Toan: %f ",Cap3->ThongTin[vitrixuat].Toan);
	printf("\nDiem Ly: %f ",Cap3->ThongTin[vitrixuat].Ly);
	printf("\nDiem Hoa: %f ",Cap3->ThongTin[vitrixuat].Hoa);
}
void ThemHocSinh(NhaTruong *&Cap3)
{
	Cap3->SoLuong += 1;
	Cap3->ThongTin = (HS *)realloc(Cap3->ThongTin,Cap3->SoLuong * sizeof(HS));
	printf("\n\nThong Tin Sinh Vien %d",Cap3->SoLuong);
	capphatHocSinh(Cap3->ThongTin[Cap3->SoLuong - 1]);// chi dc lay gian tiep k the truy xuat truc tiep.
	fflush(stdin);
	printf("\nNhap Ma So: ");
	gets(Cap3->ThongTin[Cap3->SoLuong - 1].maso);
	printf("Nhap Ho va Ten: ");
	gets(Cap3->ThongTin[Cap3->SoLuong - 1].HovaTen);
	printf("Nhap Email:  ");
	gets(Cap3->ThongTin[Cap3->SoLuong - 1].Email);
	printf("Nhap So Dien Thoai:  ");
	gets(Cap3->ThongTin[Cap3->SoLuong - 1].SDT);
	fflush(stdin);
	printf("Nhap Diem Toan:  "); scanf("%f", &Cap3->ThongTin[Cap3->SoLuong - 1].Toan);
	printf("Nhap Diem Ly:  "); scanf("%f", &Cap3->ThongTin[Cap3->SoLuong - 1].Ly);
	printf("Nhap Diem Hoa:  "); scanf("%f", &Cap3->ThongTin[Cap3->SoLuong - 1].Hoa);
	fflush(stdin);
}
char* ChonVsThongBao()
{
	char *Choose;
	Choose = (char *)malloc(sizeof(char));
	printf("\n\nDO YOU CHOOSE ?  ");
	printf("\n\nYes : Enter 'y'. ");
	printf("\n\nNo  : Enter 'n'. ");
	printf("\n\nYou want to stop Reparing : Enter 'b'. ");
	printf("\n\nThis You Choose: ");
	scanf("%c", Choose);
	fflush(stdin);
	return Choose;
}
void Sua(char *VanBan)
{
	printf("\nSua Lai La: ");
	gets(VanBan);
	printf("Sua Lai Thanh Cong.");
	printf("\n\n\t Xuat Ra De Xem ....%s.....", VanBan);

}
void XetDKSua(char *VanBan, char *chon)
{
	if(*chon == 'y')  Sua(VanBan);
	if(*chon == 'n')	 return;
}
void SuaHocSinh(NhaTruong *Cap3)
{
	int *vitrihocsinh;
	vitrihocsinh = (int *)malloc(sizeof(int));
	char *chon;
	chon = (char *)malloc(sizeof(char));
	printf("\nMoi Ban Chon Hoc Sinh Muon Sua.");
	printf("\nBan Chon Hoc Sinh: ");
	scanf("%d", vitrihocsinh);
	fflush(stdin);
	printf("\n\nThong Tin Cua Hoc Sinh: %d", *vitrihocsinh);

	printf("\nMa So Ban Dau: %s",Cap3->ThongTin[*vitrihocsinh].maso);	
	chon = ChonVsThongBao();
	if( *chon == 'b') return;
	XetDKSua(Cap3->ThongTin[*vitrihocsinh].maso,chon);

	printf("\n\nHo Va Ten Ban Dau: %s",Cap3->ThongTin[*vitrihocsinh].HovaTen);	
	chon = ChonVsThongBao();
	if( *chon == 'b') return;
	XetDKSua(Cap3->ThongTin[*vitrihocsinh].HovaTen,chon);
	
	printf("\n\nEmail Ban Dau: %s",Cap3->ThongTin[*vitrihocsinh].Email);	
	chon = ChonVsThongBao();
	if( *chon == 'b') return;
	XetDKSua(Cap3->ThongTin[*vitrihocsinh].Email,chon);

	printf("\n\nSo Dien Thoai Ban Dau: %s",Cap3->ThongTin[*vitrihocsinh].SDT);	
	chon = ChonVsThongBao();
	if( *chon == 'b') return;
	XetDKSua(Cap3->ThongTin[*vitrihocsinh].SDT,chon);

	printf("\n\n\t Ban Da Hoan Thanh Qua Trinh Sua.");

	free(chon);
	free(vitrihocsinh);
}
void TinhTrungBinh(NhaTruong *Cap3)
{
	bool check = true;
	float Average = 0;
	char *temp ;
	temp = (char *)malloc(100*sizeof(char));
	printf("\n\nMoi Ban Nhap Ma So:  ");
	gets(temp);
	for( int i = 0 ; i < Cap3->SoLuong ; i++)
		if( strcmp(temp,Cap3->ThongTin[i].maso) == 0) // so sanh 2 chuoi
		{
			Average += Cap3->ThongTin[i].Toan;
			Average += Cap3->ThongTin[i].Hoa;
			Average += Cap3->ThongTin[i].Ly;
			check = false;
			break;
		}
	if( check ==  false ) printf("\n\nDiem Trung Binh Cua Ma So %s : %f ", temp, Average / 3);
	else printf("\n\nKhong Co Ma So Do Trong Bang.");
	free(temp);
	
}

void XuatCacHocSinhTrung(NhaTruong *Cap3)
{
	bool check = true;
	char *temp;
	temp = (char *)malloc(100*sizeof(char));
	printf("\n\nMoi Ban Nhap Ten :  ");
	gets(temp);
	printf("\nNhung Nguoi Ban Tim Kiem ?");
	for( int i = 0 ; i < Cap3->SoLuong ; i++)
	{
		if( strstr(temp,Cap3->ThongTin[i].HovaTen) != NULL ) // so sanh 2 chuoi
		{
			printf("\n%s", Cap3->ThongTin[i].HovaTen);
			check = false;
		}
	}
	if(check == true ) printf("\nKhong Co Ten : '%s' ", temp);
	free(temp);
}
void XetHS(NhaTruong *Cap3, int chon)
{
	if(chon == 7) TinhTrungBinh(Cap3);
	if(chon == 8) XuatCacHocSinhTrung(Cap3);
}
void main()
{
	NhaTruong *Cap3;
	int chon,dem = 0;
	Cap3 = (NhaTruong *)malloc(sizeof(NhaTruong));
	Cap3->SoLuong = 0;
	do 
	{
		system("cls");
		printf("Quan Ly Thong Tin Hoc Sinh.");
		printf("\n\nBam 1 : Nhap So Luong Hoc Sinh.");
		printf("\n\nBam 2 : Nhap Thong Tin Sinh Vien.");
		printf("\n\nBam 3 : Xuat Danh Sach Sinh Vien.");
		printf("\n\nBam 4 : Xuat Sinh Vien Yeu Cau.");
		printf("\n\nBam 5 : Them Hoc Sinh (New).");
		printf("\n\nBam 6 : Sua Thong Tin Hoc Sinh.");
		printf("\n\nBam 7 : Tinh Trung Binh.");
		printf("\n\nBam 8 : Tim Kiem Hoc Sinh");
		printf("\n\n\n <<< Bam 0 : De Thoat Khoi Chuong Trinh.");
		printf("\n\nMoi Ban Chon:  ");
		scanf("%d", &chon);
		fflush(stdin);
		switch(chon)
		{
				case 0 : goto h;
				case 1 :
						nhapSoluong(Cap3); 
						printf("\nNhap So Luong Thanh Cong. Bam Enter De Tiep Tuc");
						fflush(stdin);
						dem++;
						getch();
						break;
				case 2 :
						nhap(Cap3);
						printf("\nNhap Thong Tin Hoan Tat");
						dem++;
						getch();
						break;

				case 3 :
						XuatDanhSach(Cap3);
						getch();
						break;

				case 4 :
						XuatHocSinh(Cap3);
						getch();
						break;
				case 5 :
						ThemHocSinh(Cap3);
						getch();
						break;
				case 6 : 
						SuaHocSinh(Cap3);
						getch();
						break;
				case 7 : 
						XetHS(Cap3,chon);
						getch();
						break;
				case 8 : 
						XetHS(Cap3,chon);
						getch();
						break;
						
		}
	} while (chon);
	free(Cap3);
h:;
}
