#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>


#define Max 10  //وضع الحد الأعلى لعدد الطلبة


//تركيبة الطالب

struct  Student
{
	int   Number;
	char  Name[80];
	float Test1,Test2;
	float Sum ;

};


typedef struct Student STT;
 


//دالة قراءة البيانات
void ReadRecord( STT * pst );

//دالة إضافة سجل واحد فقط
void AddOneRecord( STT * pst );

//دالة تعديل سجل واحد فقط
void ModfyRecord( STT * pst );

//دالة عرض السجلات على الشاشة من الملف
void DasplayOneRecord( STT * pst );

//دالة إضافة عدد من السجلا يحدده المستخدم
void AddAllRecord( );

//استخراج كل السجلات من الملف
void DasplayAllRecord();

void DeleteOneRecord( STT * pst );

//دالة عمل قائمة بالدوال التي يمكن للمستخدم  التعامل معها
void  Menu();

int main()
{

	Menu();

	return  0;
}




void ReadRecord( STT * Pst )
{
	FILE * Ptr;

	Ptr = fopen("ABC.txt","a" );
	

	printf("\n Enter Name : ");
	scanf("%s",Pst->Name );
	printf(" Enter Number : ");
	scanf("%d",&Pst->Number );
	printf(" Enter Test1 Grade = ");
	scanf("%f",&Pst->Test1 );
	printf(" Enter Test2 Grade : ");
	scanf("%f",&Pst->Test2 );

	Pst->Sum = 0;
	Pst->Sum = Pst->Test1 + Pst->Test2;   //جمع درجات الاختبارين

	
	fprintf(Ptr,"\n%s",Pst->Name );		 //طباعة الاسم
	fprintf(Ptr,"\n%d",Pst->Number );	 //طباعة الرقم
	fprintf(Ptr,"\n%.2f",Pst->Test1 );   //طباعة درجة الاختبار الأول
	fprintf(Ptr,"\n%.2f",Pst->Test2 );  //طباعة درجة الاختبار الثاني 
	fprintf(Ptr,"\n%.2f",Pst->Sum);     //طباعة مجموع الدرجات
	
	fclose(Ptr);  //اغلاق الملف بعد الاستخدام



}


void AddOneRecord( STT * pst )
{

	FILE * Ptr;

	Ptr = fopen("ABC.txt","a+" );


	printf("\n Enter Name : ");
	scanf("%s",pst->Name );
	printf(" Enter Number : ");
	scanf("%d",&pst->Number );
	printf(" Enter Test1 Grade = ");
	scanf("%f",&pst->Test1 );
	printf(" Enter Test2 Grade : ");
	scanf("%f",&pst->Test2 );

	pst->Sum = 0;
	pst->Sum = pst->Test1 + pst->Test2;   //جمع درجات الاختبارين


	fprintf(Ptr,"\n%s\n%d\n%.2f\n%.2f\n%.2f",pst->Name,pst->Number,pst->Test1,pst->Test2,pst->Sum);

	fclose(Ptr);



}

	

void DasplayOneRecord( STT * pst )
{	

	char NameSarch[80];

	FILE * ptr = fopen("ABC.txt","r" );


	printf("\n Enter Name Search : ");
	scanf("%s",NameSarch);
	
	while( fscanf(ptr,"%s",pst->Name) != EOF  )
	{
		if( strcmp( NameSarch,pst->Name ) == 0 )
		{
			fscanf(ptr,"%d",&pst->Number);
			fscanf(ptr,"%f",&pst->Test1);
			fscanf(ptr,"%f",&pst->Test2);
			fscanf(ptr,"%f",&pst->Sum);

			printf("\n ************* Display [ %s ] Record *************\n",pst->Name);
			printf("\n\tName   is   %s",pst->Name );
			printf("\n\tNumber is   %d",pst->Number );
			printf("\n\tTest1  is   %.2f",pst->Test1 );
			printf("\n\tTest2  is   %.2f",pst->Test2 );
			printf("\n\tSum    is   %.2f",pst->Sum);
			printf("\n\n\n");



		}
	}

	fclose(ptr);
}



void AddAllRecord( )
{
	STT  student[Max];
	int  N;
	int  i;

	printf("\n How Many Enter Record ? \n");
	printf(" N = ");
	scanf("%d",&N);

	//شرط للتاكد من صحة المدخل
	if( N > 0 && N <= Max )
	{
		for( i=0; i<N; i++ )
		{
			ReadRecord( &student[i] );
		}
	}
	else
	{
		printf("\a\n ************* Error Input ***********\nEnter Number > 0 And Number <= %d \n",Max);
	}

}


void DasplayAllRecord()
{

	STT * pst ;
	STT student;
	int i = 0;   //عداد للسجلات الموجودة في الملف
	FILE * ptr = fopen("ABC.txt","r" );

	pst = & student;

	while( fscanf(ptr,"%s",pst->Name) != EOF  )
	{
			fscanf(ptr,"%d",&pst->Number);
			fscanf(ptr,"%f",&pst->Test1);
			fscanf(ptr,"%f",&pst->Test2);
			fscanf(ptr,"%f",&pst->Sum);

			printf("\n ************* Display [%d] Record *************\n",i+1);
			printf("\n\tName   is   %s"  ,pst->Name );
			printf("\n\tNumber is   %d"  ,pst->Number );
			printf("\n\tTest1  is   %.2f",pst->Test1 );
			printf("\n\tTest2  is   %.2f",pst->Test2 );
			printf("\n\tSum    is   %.2f",pst->Sum);
			printf("\n\n\n");


			i++;  //زيادة العداد 
	
	}

	fclose(ptr);
}


	

//دالة عمل قائمة بالدوال التي يمكن للمستخدم  التعامل معها
void  Menu()
{
	int  chose;
	STT  AnyStudent;


	
	while( 1 )
	{
 
		printf("\n *********** Menu from Chose ************ \n");
		printf("\n \t[1]- Add All Records"
			  "\n  \t[2]- Add One Record Only"
			  "\n  \t[3]- Dasplay All Records"
			  "\n  \t[4]- Dasplay One Record Only"
			  "\n  \t[5]- Exit "
			  "\n Chose = ");
		scanf("%d",&chose);

		switch( chose )
		{
			case 1:
				{
					AddAllRecord( );
					break;
				}
			case 2:
				{
					AddOneRecord( &AnyStudent );
					break;
				}
			case 3:
				{
					DasplayAllRecord();
					break;
				}
			case 4:
				{
					DasplayOneRecord( &AnyStudent );
					break;
				}
			case 5:
				{
					exit(1);
					break;
				}
			default:
				{
					printf("\n ************ Error is Cohse ************\n");
				}
		}
		
		
	}


}