Signup/Sign In

Medical Store Management Using C Language

Introduction

This C Medical Store Management System small project is a console programme with no graphics. You may create, change, and remove customer, supplier, and drug records in this project. You may also look up information on customers or suppliers, as well as drugs that have been added to stock. A search can be conducted using a medication id, a customer id, or the name of a supplier.

Source Code

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<math.h>
#include<dos.h>
#include<time.h>
#include<ctype.h>
#include<windows.h>

COORD coord = {0, 0};
void gotoxy(int x, int y)
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int i;
//function for auto increment customer & supplier Id.
int getcust_id();
int getsupp_id();
//function for welcome & main menu
void welcome();
void main_menu();
//function for all box
void main_box();
void box1();
void wbox();
//function for bill slip
void bill();
//function for about menu
void about();
//function for medicine menu
void medicine();
void medi_sale();
void stock();
void update_stock();
void medi_entry();
void medi_search();
void remainder();
//function for supplier menu
void supplier();
void supp_entry();
void supp_list();
void sup_update();
void search();
void search_id();
void search_name();
//function for customer menu
void customer();
void cust_search();
void search_cid();
void search_cname();
void cust_entry();
void cust_list();
void cust_update();
//function for report menu
void report_menu();
void report();
void sale_rpt();
void sale_rpt_daily();
void profit_rpt();
void pur_rpt();
void pur_rpt_daily();
//===================================structures =========================
struct medical
{
	char id[6];
	char medi_name[20];
	int rack;
	char cabnit[2];
	int quantity;
	float sale;
	float total;
	float unit;
	float cost;
	float profit;
	float bye;
	int qty;
	char pur_date[15];
	char exp_date[15];
	char manu_date[15];
	int bill_no;
	char comp_name[20];
	char supp_name[30];
 };

struct medical temp;
struct medical x[20];
FILE *ptr;

char a[10];
struct supplier
{
	int supp_id;
	char supp_name[25];
	char city[20];
	char mob_no[11];
	char email[30];

};
struct supplier temp1;

struct customer
{
	int cust_id;
	char cust_name[30];
	char city[20];
	char mob_no[11];
	char email[50];

};
struct customer temp_c;
FILE *ptr1;

struct bill
{
	char billno[6];
	char cname[30];
	char mediname[30];
	int medi_qty;
	float medi_rate;
	float total;
	int day;
	int month;
	int year;

};
struct bill bil;
FILE *ptrbill;
struct sales_report
{
	char medi_id[6];
	char medir_name[20];
	char cust_name[30];
	int sDay,sMonth,sYear;
	int qty;
	float rate;
	float total;
};
struct sales_report s_r;
FILE *ptrs_r;

struct purchase_report
{
	char medi_id[6];
	char medir_name[20];
	char supp_name[30];
	int sDay,sMonth,sYear;
	int qty;
	float rate;
	float total;
};
struct purchase_report p_r;
FILE *ptrp_r;

struct profit_report
{
	char medi_id[6];
	char medir_name[20];
	int sDay,sMonth,sYear;
	int qty;
	float rate;
	float unit;
	float profit;
};
struct profit_report pr_r;
FILE *ptrpr_r;

void linkfloat()
{
	float f,*p;
	p=&f;
	f=*p;
}

//=========================Time & Date ====================
int t(void)
{
	//struct date d;
	//struct time t;

    time_t t = time(0);   // get time now
    struct tm * now = localtime( & t );
	//getdate(&d);
	//gettime(&t);
	gotoxy(55,46);
	printf("Date: %d-%d-%d ",now->tm_mday,now->tm_mon,now->tm_year);
	gotoxy(55,48);
	printf("Time: %d:%d:%d",now->tm_hour, now->tm_min,now->tm_sec);
	return 0;
}

//=======================Animation ==========================
void animation()
{
	for (i=45; i>=1; i--)
	{
		Sleep(30);
		gotoxy(1,i);
		//clreol();
	}
	for (i=1; i<=20; i++)
	{
		//clreol();
		Sleep(40);
		gotoxy(1,i);
	}
}
//=========================== validation =========================
void ventry(char t[],int code)
{
  int i=0;
	if(code==0)
	{
		while((t[i]=getch())!='\r' && i<30)
		if((t[i]>=97 && t[i]<=122) || (t[i]>=65 && t[i]<=90) || t[i]==32 || t[i]=='_')
		{
			printf("%c",t[i]);
			i++;
		}
		else if(t[i]==8 && i>0)
		{
			printf("%c%c%c",8,32,8);
			i--;              //Length counter is decremented.

		}
	}
	else if(code==1)
	{
		while((t[i]=getch())!='\r' && i<10 )
		if((t[i]>=48 && t[i]<=57) || t[i]==46 ||  t[i]=='-')
		{
			printf("%c",t[i]);
			i++;
		}
		else if(t[i]==8 && i>0)
		{
			printf("%c%c%c",8,32,8);
			i--;              //Length counter is decremented.

		}
	}
	else if(code==2)
	{
		while((t[i]=getch())!='\r' && i<30 )
		if((t[i]>=97 && t[i]<=122) || (t[i]>=65 && t[i]<=90) ||(t[i]>=48 && t[i]<=57) || t[i]==32 || t[i]==8 ||t[i]=='@'||t[i]=='.')
		{
			printf("%c",t[i]);
			i++;
		}
		else if(t[i]==8 && i>0)
		{
			printf("%c%c%c",8,32,8);
			i--;              //Length counter is decremented.

		}
	}

	t[i]='\0';
}
//============================================================================
void box()
{
   for(i=3;i<=79;i++) 	//This 'FOR' loop will print a combination of
	{
		gotoxy(i,3);    //the 79th column is reached.
		printf("%c",219);
		gotoxy(78,45);
		printf("%c",219);
		gotoxy(i,45);
		printf("%c",219);
	}

	for(i=3;i<=45;i++)      //This 'FOR' loop will print asterisks 'I'
	{                       //vertically till the 3th row is reached.
		gotoxy(3,i);
		printf("%c",219);
		gotoxy(79,i);
		printf("%c",219);
	}
}
void wbox()
{
	for(i=5;i<=75;i++) 	//This 'FOR' loop will print a combination of
	{
		gotoxy(i,5);    //the 75th column is reached.
		printf("%c",219);
		gotoxy(74,40);
		printf("%c",219);
		gotoxy(i,40);
		printf("%c",219);
	}

	for(i=5;i<=40;i++)      //This 'FOR' loop will print asteriks 'I'
	{                       //vertically till the 17th row is reached.
		gotoxy(5,i);
		printf("%c",219);
		gotoxy(75,i);
		printf("%c",219);
	}
}
//=========================getsupp_id =======================
int getsupp_id()
{

 FILE *fp;
	 fp=fopen("supplier.dat","r");
	 if(fp==NULL)
	 {
		gotoxy(22,15);
		printf("Data not Found.....");
		getch();
	 }
	 else
	 {
		temp1.supp_id=100;
		rewind(fp);
		while(fscanf(fp,"%d %s %s %s %s",&temp1.supp_id,temp1.supp_name,temp1.city, temp1.mob_no,temp1.email)!=EOF)
		{
		}
	 }
	 fclose(fp);
	 return temp1.supp_id+1;
}

//=========================getcust_id =======================
int getcust_id()
{
 FILE *fp;
	 fp=fopen("customer.dat","r");
	 if(fp==NULL)
	 {
		gotoxy(22,15);
		printf("Data not Found.....");
		getch();
	 }
	 else
	 {
		temp_c.cust_id=100;
		rewind(fp);
		while(fscanf(fp,"%d %s %s %s %s",&temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email)!=EOF)
		{
		}
	 }
	 fclose(fp);
	 return temp_c.cust_id+1;
}


//=========================welcome screen ==============

void welcome()
{
 int j,k,l,m;
 system("cls");
	for(m=0;m<16;m++)
	{
		//textcolor(m);
		wbox();
	for(i=0;i<16;i++)
	{
		//textcolor(i);
		gotoxy(35,20);
		printf("WELCOME");
		k=i+2;
		//textcolor(k);
		gotoxy(38,22);
		printf("TO");
		l=i+3;
		//textcolor(l);
		gotoxy(28,24);
		printf("MEDICAL");
		//textcolor(l);
		gotoxy(36,24);
		printf("STORE");
		//textcolor(l);
		gotoxy(42,24);
		printf("SYSTEM");
		gotoxy(52,45);
		j=i+1;
		//textcolor(j);
		printf("Loading......");
		Sleep(40);
	}
	}
}
//============================ box for label ==========
void lbox()
{
	gotoxy(25,6);
	printf("%c",201);
	for(i=26;i<55;i++)
	{
		gotoxy(i,6);
		printf("%c",205);
	}
	gotoxy(55,6);
	printf("%c",187);
	gotoxy(25,6);
	for(i=6;i<8;i++)
	{
		gotoxy(25,i+1);
		printf("%c",186);
	}
	gotoxy(25,9);
	printf("%c",200);
	for(i=26;i<55;i++)
	{
		gotoxy(i,9);
		printf("%c",205);
	}
	gotoxy(55,9);
	printf("%c",188);
	gotoxy(55,6);
	for(i=6;i<8;i++)
	{
		gotoxy(55,i+1);
		printf("%c",186);
	}

}
//============================small box ===============
void box1()
{
	gotoxy(1,3);
	printf("%c",201);
	for(i=1;i<79;i++)
	{
		gotoxy(1+i,3);
		printf("%c",205);
	}

	gotoxy(80,3);
	printf("%c",187);
	gotoxy(1,3);
	for(i=4;i<10;i++)
	{
		gotoxy(1,i);
		printf("%c",186);
	}
	gotoxy(1,9);
	for(i=4;i<8;i++)
	{
		gotoxy(80,i);
		printf("%c",186);
	}
}

//===========================main ===================

int main()
{
	char name[15];
	char pass[15];
	int count=0,i;

	system("cls");

	/*start:
	//textcolor(5);
	wbox();
	lbox();
	//textcolor(GREEN);
	gotoxy(35,8);
	printf(" LOGIN ");

	//textcolor(RED);
	gotoxy(32,18);
	printf("Enter user name :");
	gotoxy(32,22);
	printf("Enter password  :");
	gotoxy(51,18);
	strcpy(gets(name),name);

	gotoxy(51,22);

	i=0;
	do
	{
		pass[i] = getch();
		if(pass[i] == 13 )
		{
			break;
		}
		else if(pass[i]==8 && i>0)
		{
			printf("%c%c%c",8,32,8);
			i--;
		}
		else
		{
			printf("*");
			i++;
		}
	}while(pass[i]!=13);
	pass[i] = '\0';

	if(strcmp(name,"rana") || strcmp(pass,"singh"))
	{
	 system("cls");
	 gotoxy(20,20);
	 printf("Please Enter vailid Username & Passward!!!!!");
	 count++;
	 gotoxy(20,23);
	 printf("%d chance left!!!!",3-count);
	 getch();
	 system("cls");
	 if(count==3)
	 exit(0);
	 else
	 goto start;
	}
	else
	{*/
	 //welcome();
	 main_menu();
	//}

}

void main_box()
{
	gotoxy(1,6);
	printf("%c",201);
	for(i=1;i<79;i++)
	{
		gotoxy(1+i,6);
		printf("%c",205);
	}

	gotoxy(80,6);
	printf("%c",187);
	gotoxy(1,6);
	for(i=5;i<35;i++)
	{
		gotoxy(1,2+i);
		printf("%c",186);
	}
	gotoxy(1,37);
	printf("%c",200);
	for(i=1;i<79;i++)
	{
		gotoxy(1+i,37);
		printf("%c",205);
	}
	gotoxy(80,37);
	printf("%c",188);
	gotoxy(80,6);
	for(i=5;i<35;i++)
	{
		gotoxy(80,2+i);
		printf("%c",186);
	}
}

void main_menu()
{
  char ch;

	do
	{
		//window(1,1,80,50);
		//textbackground(BLACK);
		system("cls");
		//textcolor(4+BLINK);
		gotoxy(3,5);
		printf("S");
		//textcolor(WHITE);
		gotoxy(4,5);
		printf("upplier Info");
		//textcolor(4+BLINK);
		gotoxy(19,5);
		printf("C");
		//textcolor(15);
		gotoxy(20,5);
		printf("ustomer Info");
		//textcolor(4+BLINK);
		gotoxy(36,5);
		printf("M");
		//textcolor(15);
		gotoxy(37,5);
		printf("edicine");
		//textcolor(4+BLINK);
		gotoxy(48,5);
		printf("R");
		//textcolor(15);
		gotoxy(49,5);
		printf("Report");
		//textcolor(4+BLINK);
		gotoxy(57,5);
		printf("B");
		//textcolor(15);
		gotoxy(58,5);
		printf("ill");
		//textcolor(4+BLINK);
		gotoxy(64,5);
		printf("A");
		//textcolor(15);
		gotoxy(65,5);
		printf("bout");
		//textcolor(4+BLINK);
		gotoxy(72,5);
		printf("E");
		//textcolor(15);
		gotoxy(73,5);
		printf("xit");
		t();   //this function display date & time
		box1();
		main_box();
		gotoxy(30,10);
		//textcolor(GREEN);
		printf("Welcome To Medical Store ");
		gotoxy(2,28);
		//textcolor(15);

		remainder();//this function is active when medicine qty is less then 10.
		gotoxy(10,40);
		//textcolor(RED+BLINK);
		printf("Press ");
		gotoxy(16,40);
		//textcolor(15);
		printf("First Character for further Menu  ");

		ch=toupper(getche());
		switch(ch)
		{
			case 'S':supplier();
				 break;
			case 'C':customer();
				 break;
			case 'M':medicine();
				 break;
			case 'R':report_menu();
				 break;
			case 'B':bill();
				 break;
			case 'A':about();
				 break;
			case 'E':gotoxy(23,20);
				 //textcolor(4);
			printf("Do you want to exit now? Y/N :");
			Sleep(100);
			ch=(getche());
			ch=toupper(ch);
			if(ch=='Y')
			{
				animation();
				system("cls");
				//textcolor(2);
				gotoxy(35,20);
				printf(" Please wait.....");
				Sleep(2000);
				exit(0);
			}
			else
			{
				main_menu();
			}

			default://textcolor(4+BLINK);
			gotoxy(11,34);
			printf("Plese Enter right character ONLY (S,C,M,R,B,A).");
			getch();
		}
	}while(ch!='E');
}
//=========================For supplier ===========================
void supplier()
{
  char ch;
	do
	{
	  system("cls");
	  gotoxy(34,3);
	  //textcolor(GREEN);
	  printf("----------------");
	  gotoxy(35,4);
	  //textcolor(GREEN);
	  printf("Supplier MENU");
	  gotoxy(34,5);
	  //textcolor(GREEN);
	  printf("----------------");
	  gotoxy(25,11);
	  //textcolor(4+BLINK);
	  printf("A");
	  gotoxy(26,11);
	  //textcolor(15);
	  printf("dd New Supplier");

	  gotoxy(25,15);
	  //textcolor(4+BLINK);
	  printf("U");
	  gotoxy(26,15);
	  //textcolor(15);
	  printf("pdate Supplier");

	  gotoxy(25,19);
	  //textcolor(4+BLINK);
	  printf("S");
	  gotoxy(26,19);
	  //textcolor(15);
	  printf("earch Supplier");

	  gotoxy(25,23);
	  //textcolor(4+BLINK);
	  printf("L");
	  gotoxy(26,23);
	  //textcolor(15);
	  printf("ist of Existing Supplier");

	  gotoxy(25,27);
	  //textcolor(4+BLINK);
	  printf("M");
	  gotoxy(26,27);
	  //textcolor(15);
	  printf("ain Menu");
	  main_box();

	  gotoxy(10,40);
	  //textcolor(15);
	  printf("Press First Character for further Operation ");


	  ch=toupper(getche());
	  switch(ch)
	  {
		case 'A':animation();
			 supp_entry();
			 break;
		case 'U':animation();
			 sup_update();
			 break;
		case 'L':animation();
			 supp_list();
			 break;
		case 'S':search();
			 break;
		case 'M':main_menu();
			 break;
		default://textcolor(4+BLINK);
			gotoxy(11,34);
			printf("Plese Enter right character ONLY (A,L,U,S,M).");
			getch();
	  }
	}while(ch!='M');

}
//=========================For customer ===========================
void customer()
{
	char ch;
	do
	{
	  system("cls");

	  gotoxy(34,3);
	  //textcolor(GREEN);
	  printf("---------------");
	  gotoxy(35,4);
	  printf("Customer Menu.");
	  gotoxy(34,5);
	  printf("---------------");
	  gotoxy(25,11);
	  //textcolor(4+BLINK);
	  printf("A");
	  gotoxy(26,11);
	  //textcolor(15);
	  printf("dd New Customer");

	  gotoxy(25,15);
	  //textcolor(4+BLINK);
	  printf("U");
	  gotoxy(26,15);
	  //textcolor(15);
	  printf("pdate Customer");

	  gotoxy(25,19);
	  //textcolor(4+BLINK);
	  printf("S");
	  gotoxy(26,19);
	  //textcolor(15);
	  printf("earch Customer");

	  gotoxy(25,23);
	  //textcolor(4+BLINK);
	  printf("L");
	  gotoxy(26,23);
	  //textcolor(15);
	  printf("ist of Existing Customer");

	  gotoxy(25,27);
	  //textcolor(4+BLINK);
	  printf("M");
	  gotoxy(26,27);
	  //textcolor(15);
	  printf("ain Menu");
	  main_box();

	  gotoxy(10,40);
	  //textcolor(15);
	  printf("Press First Character for further Operations  ");


	  ch=toupper(getche());
	  switch(ch)
	  {
		case 'A':animation();
			 cust_entry();
			 break;
		case 'U':animation();
			 cust_update();
			 break;
		case 'L':animation();
			 cust_list();
			 break;
		case 'S':cust_search();
			 break;
		case 'M':main_menu();
			 break;
		default://textcolor(4+BLINK);
			gotoxy(11,34);
			printf("Plese Enter right character ONLY (A,L,U,S,M).");
			getch();
	  }
	}while(ch!='M');

}
//=========================For Medicine ===========================
void medicine()
{
	char ch;
	do
	{
	  system("cls");

	  gotoxy(34,3);
	  //textcolor(GREEN);
	  printf("---------------");
	  gotoxy(35,4);
	  printf("Medicine Menu.");
	  gotoxy(34,5);
	  printf("---------------");
	  gotoxy(25,15);
	  //textcolor(4+BLINK);
	  printf("P");
	  gotoxy(26,15);
	  //textcolor(15);
	  printf("urchase New Medicine");

	  gotoxy(25,19);
	  //textcolor(4+BLINK);
	  printf("S");
	  gotoxy(26,19);
	  //textcolor(15);
	  printf("ale Medicine");

	  gotoxy(25,23);
	  //textcolor(15);
	  printf("Sto");
	  gotoxy(28,23);
	  //textcolor(4+BLINK);
	  printf("c");
	  gotoxy(29,23);
	  //textcolor(15);
	  printf("k of Medicine");

	  gotoxy(25,27);
	  //textcolor(15);
	  printf("Se");
	  gotoxy(27,27);
	  //textcolor(4+BLINK);
	  printf("a");
	  gotoxy(28,27);
	  //textcolor(15);
	  printf("rch Medicine");

	  gotoxy(25,31);
	  //textcolor(4+BLINK);
	  printf("M");
	  gotoxy(26,31);
	  //textcolor(15);
	  printf("ain Menu");
	  main_box();

	  gotoxy(10,40);
	  //textcolor(15);
	  printf("Press First Character for further Operations  ");


	  ch=toupper(getche());
	  switch(ch)
	  {
		case 'P':medi_entry();
			 break;
		case 'S':medi_sale();
			 break;
		case 'C':stock();
			 break;
		case 'A':medi_search();
			 break;
		case 'M':main_menu();
			 break;
		default://textcolor(4+BLINK);
			gotoxy(11,34);
			printf("Plese Enter right character ONLY (P,S,C,M).");
			getch();
	  }
	}while(ch!='M');

}
//=========================For Report ===========================
void report_menu()
{
	char ch;
	do
	{
	  system("cls");

	  gotoxy(34,3);
	  //textcolor(GREEN);
	  printf("---------------");
	  gotoxy(35,4);
	  printf("Report Menu.");
	  gotoxy(34,5);
	  printf("---------------");
	  gotoxy(25,12);
	  //textcolor(4+BLINK);
	  printf("P");
	  gotoxy(26,12);
	  //textcolor(15);
	  printf("urchase Report");

	  gotoxy(25,16);
	  //textcolor(4+BLINK);
	  printf("S");
	  gotoxy(26,16);
	  //textcolor(15);
	  printf("ale Report");

	  gotoxy(25,20);
	  //textcolor(15);
	  printf("Pr");
	  gotoxy(27,20);
	  //textcolor(4+BLINK);
	  printf("o");
	  gotoxy(28,20);
	  //textcolor(15);
	  printf("fit Report");

	  gotoxy(25,24);
	  //textcolor(15);
	  printf("D");
	  gotoxy(26,24);
	  //textcolor(4+BLINK);
	  printf("a");
	  gotoxy(27,24);
	  //textcolor(15);
	  printf("ily Sale Report");

	  gotoxy(25,28);
	  //textcolor(4+BLINK);
	  printf("D");
	  gotoxy(26,28);
	  //textcolor(15);
	  printf("aily Purchase Report");

	  gotoxy(25,32);
	  //textcolor(4+BLINK);
	  printf("M");
	  gotoxy(26,32);
	  //textcolor(15);
	  printf("ain Menu");
	  main_box();

	  gotoxy(10,40);
	  //textcolor(15);
	  printf("Press First Character for further Operations  ");


	  ch=toupper(getche());
	  switch(ch)
	  {
		case 'P':pur_rpt();
			 break;
		case 'S':sale_rpt();
			 break;
		case 'A':sale_rpt_daily();
			 break;
		case 'O':profit_rpt();
			 break;
		case 'D':pur_rpt_daily();
			 break;
		case 'M':main_menu();
			 break;
		default://textcolor(4+BLINK);
			gotoxy(11,34);
			printf("Plese Enter right character ONLY (P,S,O,M).");
			getch();
	  }
	}while(ch!='M');

}

void about()
{  int c;
   system("cls");

   do
   {
//   window(1,1,80,50);

	//textcolor(LIGHTGRAY);
	gotoxy(28,4);
	//textcolor(RED+BLINK);
	printf("***** MEDICAL STORE *****");
	gotoxy(10,8);
	printf("=> This Project Is About Medical Store ");
	gotoxy(10,10);
	printf("=> In This Project we Can Add Medicine ,Customer,Supplier Details");
	gotoxy(10,12);
	printf("=> We Can Modifed & Delete Existing Record");
	gotoxy(10,14);
	printf("=> We Can Also Search Medicine ,Customer,Supplier Details");
	gotoxy(10,16);
	printf("=> It's Helpfull For Display Stock Of Medicine ");

	printf("<<<<-Press 1 for main menu->>>>");
	c = (getche());

	switch (c)      //This 'SWITCH' structure will ask the user for input from [1] to [7] and will display error on Invalid Entry.
		{
			case '1':animation(); main_menu();
				gotoxy(26,24);
				puts("<<--ENTER FROM 1 PLEASE-->>");	//This message will only print on INVALID ENTRY and Will ask again for input.
				getch();
		}

}while(c != '1');

}
//======================Remainder for medicine stock ===============
void remainder()
{
	ptr1=fopen("medical.dat","r");
	if(ptr1==NULL)
	{
	//	printf("\n\t Can not open File! ");
	}
	while((fread(&temp,sizeof(temp),1,ptr1))==1)
	{
		if(temp.quantity<10)
		{
			gotoxy(10,45);
			//textcolor(RED);
			printf("%s : ",temp.medi_name);
			printf("Quantity of this medicine is less then 10");
		}
	}
}

//========================for bill =============================
void bill()
{
//struct date d;
    time_t td = time(0);   // get time now
    struct tm * now = localtime( & td );

	   FILE *ptrbill;
	   char id[6];
	   int j=1,d1,m,y,k;
	   float netamt=0.0;
	   //getdate(&d);
	   d1=now->tm_mday;
	   m=now->tm_mon;
	   y=now->tm_year;
	   system("cls");
	   ptrbill=fopen("dbbill.dat","r");
	   gotoxy(13,4);
	   printf("Enter bill no : ");
	   scanf("%s",&id);
	   system("cls");
	   gotoxy(25,3);
	   ////textcolor(YELLOW+BLINK);
	  // printf("***** CareWell Medico *****");
	   box();
	   gotoxy(7,7);
	   printf("Bill No: ");
	   printf(" %s",id);
	   gotoxy(7,9);
	   printf("Customer Name: ");
	   gotoxy(50,7);
	   printf("Date : ");
	   printf("%d-%d-%d",d1,m,y);
	   gotoxy(7,12);
	   printf("Sr.No   Medicine Name       Qty          Rate         Total ");
	   gotoxy(6,14);
	   printf("---------------------------------------------------------------------");

	   i=15;
	   while(fscanf(ptrbill,"%s %s %s %d %f %f %d %d %d",bil.billno,bil.cname,bil.mediname,&bil.medi_qty,&bil.medi_rate,&bil.total,&bil.day,&bil.month,&bil.year)!=EOF)
	   {

		       do
		       {
			if(strcmp(id,bil.billno)==0)
			{
				gotoxy(7,i);
				printf(" %d",j);
				gotoxy(14,i);
				printf(" %s",bil.mediname);
				gotoxy(22,9);
				printf(" %s",bil.cname);
				gotoxy(35,i);
				printf(" %d",bil.medi_qty);
				gotoxy(47,i);
				printf(" %.2f",bil.medi_rate);
				gotoxy(60,i);
				printf(" %.2f",bil.total);
				netamt=netamt+bil.total;
				i++;
				j++;
				gotoxy(35,32);
				printf("                                ");
				gotoxy(20,50);
				//textcolor(YELLOW+BLINK);
				printf("Press Any key to go to  MENU ...........");

			       //	break;
			}


		}while(feof(ptrbill));

	   }


	   gotoxy(6,35);
	   printf("---------------------------------------------------------------------");
	   gotoxy(50,37);
	   printf("Net Amount : ");
	   printf("%.2f",netamt);

	   fclose(ptrbill);
	   getch();
}

//========FOR SUPPLIERS ENTRY=================
void supp_entry()
{
 int id;
 char ch;
 FILE *fp;
 system("cls");

	   fp=fopen("supplier.dat","a");
	   if(fp==NULL)
	   {
		printf("\n Can not open file!!");
		exit(0);
	   }
	   system("cls");
	   ch='y';
	   while(ch=='y')
	   {
		system("cls");
		//textcolor(14);
		t();
		box();
		lbox();
		gotoxy(30,8);
		printf(" SUPPLIER ENTRY ");
		gotoxy(8,13);
//		//flushall();
		temp1.supp_id=getsupp_id();
		printf("SUPPLIER ID : %d ",temp1.supp_id);
		//ventry(temp1.supp_id,1);
		//flushall();
		gotoxy(39,13);
		printf("SUPPLIER NAME : ");
		gotoxy(8,18);
		printf("CITY        : ");
		gotoxy(39,18);
		printf("CONTACT NO.   : ");
		gotoxy(8,23);
		printf("EMAIL ID    : ");

		gotoxy(55,13);
		//flushall();
		ventry(temp1.supp_name,0);
		gotoxy(22,18);
		ventry(temp1.city,0);
		//flushall();
		gotoxy(55,18);
		ventry(temp1.mob_no,1);
		//flushall();
		gotoxy(22,23);
		gets(temp1.email);
		//flushall();

		gotoxy(20,30);
		//textcolor(RED+BLINK);
		printf("S");
		//textcolor(WHITE);
		gotoxy(21,30);
		printf("ave");
		gotoxy(28,30);
		//textcolor(RED+BLINK);
		printf("C");
		//textcolor(WHITE);
		gotoxy(29,30);
		printf("ancel");
		gotoxy(18,36);
		printf("Press First charecter for the operation : ");
		ch=getch();
		if(ch=='s' || ch=='S')
		{
			fprintf(fp,"%d %s %s %s %s\n\n",temp1.supp_id,temp1.supp_name,temp1.mob_no,temp1.city,temp1.email);
			fprintf(fp,"\n");
			//flushall();
			system("cls");
			gotoxy(20,20);
			printf("Supplier Added successfully!!!!!");
			//textcolor(10);
			gotoxy(20,25);
			printf("More entries  [y/n]");
			ch=getche();
		}
	   }
	   fclose(fp);

}
//=========FOR SUPPLIER DISPLAY LIST ==========
void supp_list()
{
 char ch;
 int j;
 system("cls");
	   ptr1=fopen("supplier.dat","r");
	   if(ptr1==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   box();
	   t();
	   //textcolor(GREEN+BLINK);
	   gotoxy(8,48);
	   printf("Press Anykey to go to SUPPLIER MENU !!!");
	   //textcolor(GREEN);
	   lbox();
	   gotoxy(30,8);
	   printf(" SUPPLIER LIST ");
	   //textcolor(WHITE);
	   gotoxy(5,10);
	   printf("ID.  SUPPLIER NAME.      PH.NO.     CITY.         EMAIL");
	   gotoxy(4,12);
	   i=14;
	   printf("=================================================================");
	   while(fscanf(ptr1,"%d %s %s %s %s",&temp1.supp_id,temp1.supp_name,temp1.city,temp1.mob_no,temp1.email)!=EOF)
	   {
		gotoxy(4,i);
		printf(" %d",temp1.supp_id);
		gotoxy(9,i);
		printf(" %s",temp1.supp_name);
		gotoxy(29,i);
		printf(" %s",temp1.city);
		gotoxy(41,i);
		printf(" %s",temp1.mob_no);
		gotoxy(54,i);
		printf(" %s",temp1.email);
		i=i+2;
	   }
	   getche();
}
//======================search supplier==================
void search()
{
  int ch;

	do
	 {
	   system("cls");
	   //textcolor(WHITE);
	   gotoxy(17,10);
	   printf(" Two options Available for searching ");
	   gotoxy(15,15);
	   printf("Search by");
	   gotoxy(25,15);
	   //textcolor(RED+BLINK);
	   printf("I");
	   //textcolor(WHITE);
	   gotoxy(26,15);
	   printf("D number");

	   gotoxy(15,18);
	   printf("Search by");
	   gotoxy(25,18);
	   //textcolor(RED+BLINK);
	   printf("N");
	   //textcolor(WHITE);
	   gotoxy(26,18);
	   printf("ame");

	   gotoxy(15,21);
	   //textcolor(RED+BLINK);
	   printf("R");
	   //textcolor(WHITE);
	   gotoxy(16,21);
	   printf("eturn");
	   main_box();
	   gotoxy(17,24);
	   printf("Press First charecter for the operation : ");
	   ch=toupper(getche());
	   switch(ch)
	   {
		case 'I':
			animation();
			search_id();

			break;
		case 'N':
			animation();
			search_name();
			break;
		case 'R':
			animation();
			supplier();
			break;
		default:
			gotoxy(22,18);
			printf("You entered wrong choice!!!!!");
			getch();
	   }
	   }while(ch!='R');

}
//=============================== Search by id =============================
void search_id()
{
  int id;
  FILE *fp;

	   fp=fopen("supplier.dat","r");
	   if(fp==NULL)
	   {
	     printf("file can't open!!!!");

	   }
	   system("cls");
	   box();
	   gotoxy(13,8);
	   printf("Enter id to be searched:");
	   scanf("%d",&id);
	   gotoxy(20,35);
	   //textcolor(YELLOW);
	   printf("Press Any key to Return Back Menu ....");
	   gotoxy(12,14);
	   printf("ID.  SUPPLIER NAME.   CITY.     PH.NO.       EMAIL");
	   gotoxy(12,16);
	   i=18;
	   printf("==============================================================");
	   while(fscanf(fp,"%d %s %s %s %s",&temp1.supp_id,temp1.supp_name,temp1.mob_no,temp1.city,temp1.email)!=EOF)
	   {
		if(temp1.supp_id==id)
		{
			gotoxy(10,i);
			printf(" %d",temp1.supp_id);
			gotoxy(15,i);
			printf(" %s",temp1.supp_name);
			gotoxy(30,i);
			printf(" %s",temp1.city);
			gotoxy(40,i);
			printf(" %s",temp1.mob_no);
			gotoxy(53,i);
			printf(" %s",temp1.email);
			i++;
			break;
		}
	   }
	   if(temp1.supp_id!=id)
	   {
		gotoxy(20,30);
		printf("Record not found!");
	   }
	   fclose(fp);
	   getche();
}
//============================ Search by name =============================
void search_name()
{
  char name[20];
  FILE *fp;

	   fp=fopen("supplier.dat","r");
	   if(fp==NULL)
	   {
	     printf("file can't open!!!!");

	   }
	   system("cls");
	   box();
	   fp=fopen("supplier.dat","rb");
	   gotoxy(13,8);
	   printf(" Enter Supplier Name to be searched : ");
	   scanf("%s",&name);
	   gotoxy(20,35);
	   //textcolor(YELLOW);
	   printf("Press Any key to Return Back Menu ....");
	   gotoxy(12,14);
	   printf("ID. SUPPLIER NAME.   CITY.     PH.NO.       EMAIL");
	   gotoxy(12,16);
	   i=18;
	   printf("==============================================================");

	   while(fscanf(fp,"%d %s %s %s %s",&temp1.supp_id,temp1.supp_name,temp1.mob_no, temp1.city,temp1.email)!=EOF)
	   {
		if(strcmp(temp1.supp_name,name)==0)
		{
			gotoxy(11,i);
			printf(" %d",temp1.supp_id);
			gotoxy(15,i);
			printf(" %s",temp1.supp_name);
			gotoxy(30,i);
			printf(" %s",temp1.city);
			gotoxy(40,i);
			printf(" %s",temp1.mob_no);
			gotoxy(53,i);
			printf(" %s",temp1.email);
			i++;
			break;
		}
	   }
	   if(strcmp(temp1.supp_name,name)!=0)
	   {
		gotoxy(20,30);
		//textcolor(YELLOW);
		printf("Record not found!!!");
	   }
	   fclose(ptr1);
	   getche();
}
//============supp update=================
void sup_update()
{
  int i;
  char ch;
  int sid;
  FILE *ft;
  system("cls");
  box();
	   ptr1=fopen("supplier.dat","rb+");
	   if(ptr1==NULL )
	   {
		printf("\n\t Can not open file!! ");
		exit(0);
	   }
	   lbox();
	   gotoxy(30,8);
	   printf(" Modifying Supplier ");
	   gotoxy(12,13);
	   printf("Enter supplier ID :  ");
	  // //flushall();
	   scanf("%d",&sid);
	   gotoxy(12,15);

		ft=fopen("temp.dat","w");
		if(ft==NULL)
		{
			printf(" Can not open file");
			exit(1);
		}
		else
		{
			while(fscanf(ptr1,"%d %s %s %s %s",&temp1.supp_id,temp1.supp_name,temp1.mob_no, temp1.city,temp1.email)!=EOF)
			{
				if(temp1.supp_id==sid)
				{
					gotoxy(18,17);
					printf(" Existing Record  ");
					gotoxy(10,19);
					printf("%d\t %s \t%s \t%s \t%s",temp1.supp_id,temp1.supp_name,temp1.mob_no, temp1.city,temp1.email);
					gotoxy(12,22);
					printf("Enter New Name       : ");
					//flushall();
					ventry(temp1.supp_name,0);
					gotoxy(12,24);
					printf("Enter New mobile no  : ");
					//flushall();
					ventry(temp1.mob_no,1);
					gotoxy(12,26);
					printf("Enter New City       : ");
					//flushall();
					ventry(temp1.city,0);
					gotoxy(12,28);
					printf("Enter New email      : ");
					//flushall();
					ventry(temp1.email,2);
					gotoxy(20,32);
					//textcolor(RED+BLINK);
					printf("U");
					gotoxy(21,32);
					//textcolor(WHITE);
					printf("pdate");
					gotoxy(30,32);
					//textcolor(RED+BLINK);
					printf("C");
					gotoxy(31,32);
					//textcolor(WHITE);
					printf("ancel");
					gotoxy(18,36);
					printf("Press First charecter for the operation : ");
					ch=getch();
					if(ch=='u' || ch=='U')
					{
					    fprintf(ft,"%d %s %s %s %s\n",temp1.supp_id,temp1.supp_name,temp1.mob_no,temp1.city,temp1.email);
					    //flushall();
					    gotoxy(20,38);
					    printf("Supplier updated successfully...");
					    remove("supplier.dat");
					    rename("temp.dat","supplier.dat");

					}
				}
			else
			{
				fprintf(ft,"%d %s %s %s %s\n",temp1.supp_id,temp1.supp_name,temp1.mob_no,temp1.city,temp1.email);
				fflush(stdin);
			}
		}

	   fclose(ft);
	   fclose(ptr1);
	   }
}
//===============================END OF SUPPLIER FUNCTION===================
//========FOR CUSTOMER ENTRY=================
void cust_entry()
{
 char ch;
 int id;
 FILE *fp;
 system("cls");
	   fp=fopen("customer.dat","a");
	   if(fp==NULL)
	   {
		printf("\n Can not open file!!");
		exit(0);
	   }
	   system("cls");
	   ch='y';
	   while(ch=='y')
	   {
		system("cls");
		//textcolor(14);
		t();
		box();
		lbox();
		gotoxy(30,8);
		printf(" CUSTOMER ENTRY ");
		gotoxy(8,13);
		//flushall();
		temp_c.cust_id=getcust_id();
		printf("CUSTOMER ID :%d",temp_c.cust_id);
		//ventry(temp_c.cust_id,1);
		//flushall();
		gotoxy(39,13);
		printf("CUSTOMER NAME : ");
		gotoxy(8,18);
		printf("CITY        : ");
		gotoxy(39,18);
		printf("CONTACT NO.   : ");
		gotoxy(8,23);
		printf("EMAIL ID    : ");

		gotoxy(55,13);
		//flushall();
		ventry(temp_c.cust_name,0);
		gotoxy(22,18);
		ventry(temp_c.city,0);
		//flushall();
		gotoxy(55,18);
		ventry(temp_c.mob_no,1);
		//flushall();
		gotoxy(22,23);
		gets(temp_c.email);
		//flushall();

		gotoxy(20,30);
		//textcolor(RED+BLINK);
		printf("S");
		//textcolor(WHITE);
		gotoxy(21,30);
		printf("ave");
		gotoxy(28,30);
		//textcolor(RED+BLINK);
		printf("C");
		//textcolor(WHITE);
		gotoxy(29,30);
		printf("ancel");
		gotoxy(18,36);
		printf("Press First charecter for the operation : ");
		ch=getch();
		if(ch=='s' || ch=='S')
		{
			fprintf(fp,"%d %s %s %s %s\n",temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email);
			fprintf(fp,"\n");
			fflush(stdin);
			system("cls");
			gotoxy(20,20);
			printf("Customer Added Successfully!!!!!");
			//textcolor(10);
			gotoxy(20,25);
			printf("More entries  [y/n] ");
			ch=getche();

		}
	   }
	   fclose(fp);
}

//=========FOR CUSTOMER DISPLAY LIST ==========
void cust_list()
{
 char ch;
 system("cls");
	   ptr1=fopen("customer.dat","r");
	   if(ptr1==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   box();
	   //textcolor(GREEN+BLINK);
	   gotoxy(8,48);
	   printf("Press Anykey to go to CUSTOMER MENU!!!");
	   //textcolor(GREEN);
	   lbox();
	   gotoxy(30,8);
	   printf(" CUSTOMER LIST ");
	   //textcolor(WHITE);
	   i=14;
	   gotoxy(5,10);
	   printf(" ID. CUSTOMER NAME.    CITY.     MOBILE.NO.      EMAIL");
	   gotoxy(4,12);
	   printf("==============================================================");
	   while(fscanf(ptr1,"%d %s %s %s %s",&temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email)!=EOF)
	   {
		gotoxy(4,i);
		printf(" %d",temp_c.cust_id);
		gotoxy(11,i);
		printf(" %s",temp_c.cust_name);
		gotoxy(28,i);
		printf(" %s",temp_c.city);
		gotoxy(40,i);
		printf(" %s",temp_c.mob_no);
		gotoxy(53,i);
		printf(" %s",temp_c.email);
		i=i+2;
	   }
	   getche();
}
//======================search CUSTOMER==================
void cust_search()
{
  int ch;

	do
	 {
	   system("cls");
	   //textcolor(WHITE);
	   gotoxy(17,10);
	   printf(" Two options Available for searching ");
	   gotoxy(15,15);
	   printf("Search by");
	   gotoxy(25,15);
	   //textcolor(RED+BLINK);
	   printf("I");
	   //textcolor(WHITE);
	   gotoxy(26,15);
	   printf("D number");

	   gotoxy(15,18);
	   printf("Search by");
	   gotoxy(25,18);
	   //textcolor(RED+BLINK);
	   printf("N");
	   //textcolor(WHITE);
	   gotoxy(26,18);
	   printf("ame");

	   gotoxy(15,21);
	   //textcolor(RED+BLINK);
	   printf("R");
	   //textcolor(WHITE);
	   gotoxy(16,21);
	   printf("eturn");
	   main_box();
	   gotoxy(17,24);
	   printf("Press First charecter for the operation : ");
	   ch=toupper(getche());
	   switch(ch)
	   {
		case 'I':
			animation();
			search_cid();

			break;
		case 'N':
			animation();
			search_cname();
			break;
		case 'R':
			animation();
			customer();
			break;
		default:
			gotoxy(22,18);
			printf("You entered wrong choice!!!!!");
			getch();
	   }
	   }while(ch!='R');
       getche();
}
//===========================Search by CustomerId=========================
void search_cid()
{
  int id;
  system("cls");
  box();
	   ptr1=fopen("customer.dat","rb");
	   gotoxy(13,8);
	   printf("\xDB\xDB\xB2  Enter id to be searched:");
	   scanf("%d",&id);
	   //textcolor(GREEN);
	   //textcolor(WHITE);
	   i=18;
	   gotoxy(9,15);
	   printf(" ID. CUSTOMER NAME.    CITY.     MOBILE.NO.      EMAIL");
	   gotoxy(8,16);
	   printf("==============================================================");
	   while(fscanf(ptr1,"%d %s %s %s %s",&temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email)!=EOF)
	   {
		if(temp_c.cust_id==id)
		{
			gotoxy(8,i);
			printf(" %d",temp_c.cust_id);
			gotoxy(15,i);
			printf(" %s",temp_c.cust_name);
			gotoxy(28,i);
			printf(" %s",temp_c.city);
			gotoxy(40,i);
			printf(" %s",temp_c.mob_no);
			gotoxy(54,i);
			printf(" %s",temp_c.email);
			gotoxy(20,35);
			//textcolor(YELLOW);
			printf("Press Any key to go to CUSTOMER MENU ...........");
			break;
		}
	   }
	   if(temp_c.cust_id!=id)
	   {
		gotoxy(20,30);
		printf("Record not found!");
	   }
	   fclose(ptr1);
       getche();
}
/*****************************search by CUSTOMERname******************************/
void search_cname()
{
  char name[20];
  system("cls");
  box();
	   ptr1=fopen("customer.dat","rb");
	   gotoxy(12,8);
	   printf("\xDB\xDB\xB2  Enter Customer Name to be searched:");
	   scanf("%s",&name);
	   //textcolor(GREEN);
	   //textcolor(WHITE);
	   i=18;
	   gotoxy(9,15);
	   printf(" ID. CUSTOMER NAME.    CITY.     MOBILE.NO.      EMAIL");
	   gotoxy(8,16);
	   printf("==============================================================");
	   while(fscanf(ptr1,"%d %s %s %s %s",&temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email)!=EOF)
	   {
		if(strcmp(temp_c.cust_name,name)==0)
		{
			gotoxy(8,i);
			printf(" %d",temp_c.cust_id);
			gotoxy(15,i);
			printf(" %s",temp_c.cust_name);
			gotoxy(28,i);
			printf(" %s",temp_c.city);
			gotoxy(40,i);
			printf(" %s",temp_c.mob_no);
			gotoxy(54,i);
			printf(" %s",temp_c.email);
			gotoxy(20,35);
			//textcolor(YELLOW);
			printf("Press Any key to go to CUSTOMER MENU ...........");
			break;
		}
	   }
	   if(strcmp(temp_c.cust_name,name)!=0)
	   {
		gotoxy(5,10);
		//textcolor(YELLOW);
		printf("Record not found!");
	   }
	   fclose(ptr1);
	getche();
}
//============CUSTOMER update=================
void cust_update()
{
  int i;
  char ch;
  int cid;
  FILE *ft;
  system("cls");
  box();
	   ptr1=fopen("customer.dat","rb+");
	   if(ptr1==NULL)
	   {
		printf("\n\t Can not open file!! ");
		exit(0);
	   }
	   lbox();
	   gotoxy(30,8);
	   printf(" Modifying customer ");
	   gotoxy(12,13);
	   printf("Enter the CUSTOMER ID : ");
	   scanf("%d",&cid);
	   gotoxy(12,15);

		ft=fopen("temp.txt","w");
		if(ft==NULL)
		{
			printf("\n Can not open file");
			exit(0);
		}
		else
		{

			while(fscanf(ptr1,"%d %s %s %s %s",&temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email)!=EOF)
			{
				if(temp_c.cust_id==cid)
				{
					gotoxy(25,17);
					printf("*** Existing Record ***");
					gotoxy(10,19);
					printf("%d\t %s \t%s \t%s \t%s",temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email);
					gotoxy(12,22);
					printf("Enter New Name         : ");
					//flushall();
					ventry(temp_c.cust_name,0);
					gotoxy(12,24);
					printf("Enter New mobile no    : ");
					//flushall();
					ventry(temp_c.mob_no,1);
					gotoxy(12,26);
					printf("Enter New City         : ");
					//flushall();
					ventry(temp_c.city,0);
					gotoxy(12,28);
					printf("Enter New email        : ");
					//flushall();
					scanf("%s",temp_c.email);
					gotoxy(20,32);
					//textcolor(RED+BLINK);
					printf("U");
					gotoxy(21,32);
					//textcolor(WHITE);
					printf("pdate");
					gotoxy(30,32);
					//textcolor(RED+BLINK);
					printf("C");
					gotoxy(31,32);
					//textcolor(WHITE);
					printf("ancel");
					gotoxy(18,35);
					printf("Press First charecter for the operation : ");
					ch=getche();
					if(ch=='u' || ch=='U')
					{
					fprintf(ft,"%d %s %s %s %s\n",temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email);
				       //	fprintf(ft,"\n");
					fflush(stdin);
					gotoxy(20,36);
					printf("Customer updated successfully...");
					remove("customer.dat");
					rename("temp.txt","customer.dat");
					}					}
					else
					{
					fprintf(ft,"%d %s %s %s %s\n",temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email);
					fflush(stdin);
					}
				  }


	   fclose(ft);
	   fclose(ptr1);
      }

}

//============================ END OF CUSTOMER FUNCTION ===================
//============================ FOR MEDICINE PURCHASE    ===================
void medi_entry()
{
  char ch,id[6];
//  struct date d;
    time_t t = time(0);   // get time now
    struct tm * now = localtime( & t );
  int f;
  FILE *fp;
  system("cls");
	  //getdate(&d);

	  ptrp_r=fopen("purreport.dat","a");
	  ch='Y';
	  while(ch=='Y')
	  {
		system("cls");
		box();
		//textcolor(14);
//		t();  // THIS FUN IS USED FOR DISPLAY DATE & TIME.......
		lbox();
		gotoxy(30,8);
		////textcolor(GREEN+BLINK);
		printf(" MEDICINE PURSHASE  ");
		{
			//textcolor(WHITE);
			gotoxy(7,11);
			printf("MEDICINE ID    : ");

			gotoxy(40,11);
			printf("MEDICINE NAME  : ");

			gotoxy(7,14);
			printf("ENTER RACK NO  : ");

			gotoxy(40,14);
			printf("CABNIT NO      : ");

			gotoxy(7,18);
			printf("COMPANY NAME   : ");

			gotoxy(40,18);
			printf("SUPPLIER NAME  : ");

			gotoxy(7,21);
			printf("UNIT COST   Rs.:  ");

			gotoxy(40,21);
			printf("SALE COST   Rs.: ");

			gotoxy(7,24);
			printf("QUANTITY       :  ");

			gotoxy(7,27);
			printf("MFG.DATE(dd-mm-yyyy): ");

			gotoxy(7,29);
			printf("EXP.DATE(dd-mm-yyyy): ");

			gotoxy(25,11);
			ventry(temp.id,1);
			strcpy(id,temp.id);

			fp=fopen("medical.dat","r");
			while((fread(&temp,sizeof(temp),1,fp))==1)
			{

			if(strcmp(id,temp.id)==0)
			{
				f=1;
				break;
			}
			}
			fclose(fp);
			if(f==1)
			{
				gotoxy(20,31);
				printf("ID Allready Exists");
				getche();
				system("cls");
				medi_entry();
			}
			else
			{
			ptr=fopen("medical.dat","a+b");
			strcpy(temp.id,id);
			strcpy(p_r.medi_id,temp.id);
			}
			//flushall();
			gotoxy(58,11);
			ventry(temp.medi_name,0);
			strcpy(p_r.medir_name,temp.medi_name);
			//flushall();
			gotoxy(25,14);
			ventry(a,1);
			temp.rack= atoi(a);//atoi() used for convert str to int.
			//flushall();
			gotoxy(58,14);
			ventry(temp.cabnit,2);
			//flushall();
			gotoxy(25,18);
			ventry(temp.comp_name,0);
			//flushall();
			gotoxy(58,18);
			ventry(temp.supp_name,0);
			strcpy(p_r.supp_name,temp.supp_name);
			//flushall();
			gotoxy(25,21);
			ventry(a,1);
			temp.unit= atof(a);
			//flushall();
			p_r.rate=temp.unit;
			gotoxy(58,21);
			ventry(a,1);
			temp.sale= atof(a);
			//flushall();
			gotoxy(25,24);
			ventry(a,1);
			temp.quantity= atoi(a);
			p_r.qty=temp.quantity;
			//flushall();
			gotoxy(29,27);
			//flushall();
			ventry(temp.manu_date,1);
			gotoxy(29,29);
			//flushall();
			ventry(temp.exp_date,1);

			gotoxy(7,31);
			printf("==========================================================");
			temp.total=temp.quantity*temp.sale;

			//textcolor(10);
			gotoxy(10,33);
			printf("TOTAL SALE COST = Rs. %.2f",temp.total);
			temp.cost=(temp.unit*temp.quantity);
			gotoxy(40,33);
			printf("TOTAL UNIT COST = Rs. %.2f",temp.cost);
			p_r.total=temp.cost;
			p_r.sDay=now->tm_mday;
			p_r.sMonth=now->tm_mon;
			p_r.sYear=now->tm_year;
		 }
		gotoxy(20,35);
		//textcolor(RED+BLINK);
		printf("S");
		//textcolor(WHITE);
		gotoxy(21,35);
		printf("ave");
		gotoxy(28,35);
		//textcolor(RED+BLINK);
		printf("C");
		//textcolor(WHITE);
		gotoxy(29,35);
		printf("ancel");
		gotoxy(18,38);
		printf("Press First charecter for the operation : ");


		ch=toupper(getche());

		if(ch=='S')
		{
			fwrite(&temp,sizeof(temp),1,ptr);
			fflush(stdin);
			//textcolor(10);
			fprintf(ptrp_r,"%s %s %s %d %.2f %.2f %d %d %d\n",p_r.medi_id,p_r.medir_name,p_r.supp_name,p_r.qty,p_r.rate,p_r.total,p_r.sDay,p_r.sMonth,p_r.sYear);
			system("cls");
			gotoxy(20,20);
			printf("Medicine Added sucessfully!!!!!!");
			gotoxy(20,25);
			printf("More entries  [y/n]");
			ch=toupper(getche());
		       /*	if(ch=='Y')
			{
				system("cls");
				medi_entry();
			}*/
		}

	   }
	   fclose(ptr);
	   fclose(ptrp_r);
}
//===========FOR MEDICINE SALE=========================
void medi_sale()
{
  struct bill bil;
  //struct date d;
  time_t t = time(0);   // get time now
    struct tm * now = localtime( & t );
  int j,n,i,a,billno;
  int d1,m,y;
  float b,total,rate;
  char tar[30],ch,mediname[30],c_name[30],cname[30];
  FILE *fp,*fpc;
  int count=0;
  //getdate(&d);
  d1=now->tm_mday;
  m=now->tm_mon;
  y=now->tm_year;
	   ch='y';
	   while(ch=='y')
	   {
		fp = fopen("dbbill.dat","a");
		ptr1 = fopen("customer.dat","r");
		ptr = fopen("medical.dat","r");
		ptrs_r=fopen("saleRpt.dat","a");
		ptrpr_r=fopen("profitRpt.dat","a");
		system("cls");
		box();
		for(i=3;i<=45;i++)      //This 'FOR' loop will print asteriks 'I'
		{                       //vertically till the 3th row is reached.
		gotoxy(50,i);
		printf("%c",219);
		}
		i=9;
		gotoxy(52,7);
		printf("Cust_ID    Cust_Name");
		//flushall();
		while(fscanf(ptr1,"%d %s %s %s %s",&temp_c.cust_id,temp_c.cust_name,temp_c.mob_no, temp_c.city,temp_c.email)!=EOF)
		{
			gotoxy(53,i);
			printf("%d",temp_c.cust_id);
			gotoxy(64,i);
			printf("%s",temp_c.cust_name);
			i+=2;
		}

		gotoxy(9,7);
		printf("ENTER MEDICINE ID TO BE SOLD  : ");
		ventry(tar,1);
		//scanf("%s",&tar);
		j=0;
		while((fread(&temp,sizeof(temp),1,ptr))==1)
		{
			if((strcmp(temp.id,tar)<0) || (strcmp(temp.id,tar)>0))
			{
				x[j] = temp;
				j++;
			}
			else if((strcmp(temp.id,tar)==0))
			{

				gotoxy(8,10);
				printf(" Medicine Name        : %s",temp.medi_name);
				gotoxy(8,12);
				printf(" Quantity in stock    : %d",temp.quantity);
				gotoxy(8,14);
				printf(" Sales price          : %.2f",temp.sale);
				gotoxy(8,16);
				printf("Enter bill number     : ");
				//flushall();
				ventry(bil.billno,1);
				//scanf("%s",&bil.billno);
				gotoxy(8,18);
				printf("Enter customer Name   : ");
				//flushall();
				ventry(c_name,0);
				//scanf("%s",&c_name);
				gotoxy(8,20);
				printf("Quantity want to sale : ");
				//ventry(a,1);
				scanf("%d",&a);

				pr_r.profit=(temp.sale-temp.unit)*a;
				x[j]=temp;
				x[j].quantity=(x[j].quantity-a);
				x[j].total=(x[j].quantity*temp.sale);
				x[j].cost=(x[j].quantity*temp.unit);
				x[j].bye=(x[j].sale*a);
				b=x[j].bye;
				x[j].qty=a;
				j++;
				count++;
				strcpy(bil.cname,c_name);
				strcpy(s_r.cust_name,c_name);
				strcpy(bil.mediname,temp.medi_name);
				bil.medi_qty=a;
				bil.medi_rate=temp.sale;
				bil.total=temp.sale*a;

				bil.day=d1;
				bil.month=m;
				bil.year=y;

				fprintf(fp,"%s %s %s %d %.2f %.2f %d %d %d\n",bil.billno,bil.cname,bil.mediname,bil.medi_qty,bil.medi_rate,bil.total,bil.day,bil.month,bil.year);
				fflush(stdin);

				fclose(fp);

				s_r.sDay=d1;
				s_r.sMonth=m;
				s_r.sYear=y;
				strcpy(s_r.medi_id,tar);
				strcpy(s_r.medir_name,temp.medi_name);
				s_r.qty=a;
				s_r.rate=temp.sale;
				s_r.total=temp.sale*a;

				//sale report
				fprintf(ptrs_r,"%s %s %s %d %.2f %.2f %d %d %d\n",s_r.medi_id,s_r.medir_name,s_r.cust_name,s_r.qty,s_r.rate,s_r.total,s_r.sDay,s_r.sMonth,s_r.sYear);
				fflush(stdin);
				fclose(ptrs_r);
				//profit report

				pr_r.sDay=d1;
				pr_r.sMonth=m;
				pr_r.sYear=y;
				strcpy(pr_r.medi_id,tar);
				strcpy(pr_r.medir_name,temp.medi_name);
				pr_r.qty=a;
				pr_r.rate=temp.sale;
				pr_r.unit=temp.unit;
				fprintf(ptrpr_r,"%s %s %d %d %d %d %.2f %.2f  %.2f\n",pr_r.medi_id,pr_r.medir_name,d1,pr_r.sMonth,pr_r.sYear,pr_r.qty,pr_r.unit,pr_r.rate,pr_r.profit);
				fflush(stdin);
				fclose(ptrpr_r);

			}
		}
		if (count==0)
		{
			system("cls");
			gotoxy(33,10);
			printf("Not in stock!!!!!");
			getch();
			return;
		}
		fclose(ptr1);
		fclose(ptr);
		n = j;
		system("cls");
		ptr=fopen("medical.dat","wb");
		for(i=0; i<n; i++)
		fwrite(&x[i],sizeof(x[i]),1,ptr);
		fclose(ptr);
		system("cls");
		box();
		gotoxy(8,15);
		printf("* Price paid by customer = %.2f",b);
		gotoxy(8,17);
		printf("* Quantity sold          = %d",a);
		getch();
		gotoxy(10,20);
		printf("more enteries=(y/n) :");
		ch=getche();
	   }

}
//===========================MEDICINE STOCK=====================================
void stock()
{
  char ch;
  int i,c;
	   do
	   {
		system("cls");
		ptr1=fopen("medical.dat","r");
		if(ptr1==NULL)
		{
			printf("\n\t Can not open File! ");
			exit(1);
		}
		system("cls");
		box();
		lbox();
		//textcolor(GREEN);
		gotoxy(30,8);
		////textcolor(GREEN+BLINK);
		printf(" STOCK OF MEDICINE ");
		//textcolor(WHITE);
		i=14;
		gotoxy(9,10);
		printf("ID.   MEDICINE NAME.    QTY     Supplier Name     Exp.Date");
		gotoxy(9,12);
		printf("==================================================================\n");

		while((fread(&temp,sizeof(temp),1,ptr1))==1)
		{
			gotoxy(9,i);
			printf(" %s",temp.id);
			gotoxy(15,i);
			printf(" %s",temp.medi_name);
			gotoxy(32,i);
			printf(" %d",temp.quantity);
			gotoxy(43,i);
			printf(" %s",temp.supp_name);
			gotoxy(60,i);
			printf(" %s",temp.exp_date);
			i++;
		}
		gotoxy(10,42);
		printf("Press [1] for Update Medicine Stock  & [0] for main menu ");
		c = (getche());
		switch (c)
		{
			case '0':animation();
				 main_menu();
				 break;
			case '1':update_stock();
				 break;
		}

	   }while(c != '1');
	   getche();
}
//=============================== FOR MEDICINE SEARCH ====================
void medi_search()
{
  char mid[6];
  int i,c;
  system("cls");
	   ptr1=fopen("medical.dat","r");
	   if(ptr1==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   box();

	   gotoxy(10,7);
	   printf("Enter Medicine Id to be searched : ");
	   scanf("%s",&mid);
	   system("cls");
	   box();
	   lbox();
	   //textcolor(GREEN);
	   gotoxy(30,8);
	   //textcolor(GREEN+BLINK);
	   printf(" MEDICINE ");
	   //textcolor(WHITE);
	   i=14;
	   gotoxy(9,10);
	   printf("ID.   MEDICINE NAME.    QTY     Supplier Name     Exp.Date");
	   gotoxy(9,12);
	   printf("==================================================================\n");
	   while((fread(&temp,sizeof(temp),1,ptr1))==1)
	   {
		if(strcmp(mid,temp.id)==0)
		{
			gotoxy(9,i);
			printf(" %s",temp.id);
			gotoxy(15,i);
			printf(" %s",temp.medi_name);
			gotoxy(32,i);
			printf(" %d",temp.quantity);
			gotoxy(43,i);
			printf(" %s",temp.supp_name);
			gotoxy(60,i);
			printf(" %s",temp.exp_date);
			i++;
			break;
		}

	   }
	   if(strcmp(mid,temp.id)!=0)
	   {
		gotoxy(20,20);
		printf("Not in Stock.....");
	   }
	   getche();

}
//============================ FOR MEDICINE UPDATE =====================
void update_stock()
{
  char mid[6];
  int j,a,count=0,n;
  system("cls");
	   ptr=fopen("medical.dat","rb");
	   if(ptr==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   box();
	   gotoxy(20,45);
	   printf("Press Enter to go to MENU ...........");
	   //textcolor(GREEN);
	   gotoxy(27,8);
	   ////textcolor(GREEN+BLINK);
	   printf(" UPDATE MEDICINE QUANTITY ");
	   //textcolor(WHITE);
	   gotoxy(9,10);
	   printf("Enter medicine id to be update qty: ");
	   scanf("%s",&mid);
	   j=0;

	   while((fread(&temp,sizeof(temp),1,ptr))==1)
	   {
		if((strcmp(temp.id,mid)<0) || (strcmp(temp.id,mid)>0))
		{
			x[j] = temp;
			j++;
		}
		else
		{
			gotoxy(8,12);
			printf("Medicine Name     : %s",temp.medi_name);
			gotoxy(8,14);
			printf("Quantity in stock : %d",temp.quantity);
			gotoxy(8,16);
			printf("Quantity want to update : ");
			scanf("%d",&a);
			x[j]=temp;
			x[j].quantity=(x[j].quantity+a);
			x[j].total=(x[j].quantity*temp.sale);
			x[j].cost=(x[j].quantity*temp.unit);
			x[j].bye=(x[j].sale*a);
			x[j].qty=a;
			j++;
			count++;
		}
	   }
	   if (count==0)
	   {
		 system("cls");
		 gotoxy(33,10);
		 printf("Not in stock!!!!!!");
		 getch();
		 return;
	   }
	   fclose(ptr);
	   n = j;
	   system("cls");
	   ptr=fopen("medical.dat","wb");
	   for(i=0; i<n; i++)
	   fwrite(&x[i],sizeof(x[i]),1,ptr);
	   fclose(ptr);
}
//===================== view report =============================/
void sale_rpt()
{
  char ch;
  int j;
  system("cls");
	   ptrs_r=fopen("saleRpt.dat","r");
	   if(ptrs_r==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   box();
	   gotoxy(20,50);
	   printf("Press any key to go to REPORT MENU ...........");
	   lbox();
	   //textcolor(GREEN);
	   gotoxy(30,8);
	   ////textcolor(GREEN+BLINK);
	   printf("Sales Report");
	   //textcolor(WHITE);
	   gotoxy(7,10);
	   printf("ID. Medicine Name.  Customer Name.   Qty.  Rate.  Total.   Date");
	   gotoxy(7,12);
	   printf("===================================================================");
	   j=14;
	   while(fscanf(ptrs_r,"%s %s %s %d %f %f %d %d %d\n",s_r.medi_id,s_r.medir_name,s_r.cust_name,&s_r.qty,&s_r.rate,&s_r.total,&s_r.sDay,&s_r.sMonth,&s_r.sYear)!=EOF)
	   {
		gotoxy(6,j);
		printf("%s",s_r.medi_id);
		gotoxy(11,j);
		printf("%s",s_r.medir_name);
		gotoxy(28,j);
		printf("%s",s_r.cust_name);
		gotoxy(44,j);
		printf("%d",s_r.qty);
		gotoxy(50,j);
		printf("%.2f",s_r.rate);
		gotoxy(57,j);
		printf("%.2f",s_r.total);
		gotoxy(65,j);
		printf("%d-%d-%d",s_r.sDay,s_r.sMonth,s_r.sYear);
		j=j+2;
	   }
	   getche();
}
//======================= VIEW PURCHASE REPORT ===========================
void pur_rpt()
{
  char ch;
  int j;
  system("cls");
  t();
  box();
	   ptrp_r=fopen("purreport.dat","r");
	   if(ptrp_r==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   gotoxy(20,50);
	   printf("Press Enter to go to REPORT MENU ...........");
	   lbox();
	   //textcolor(GREEN);
	   gotoxy(30,8);
	   printf("Purchase Report");
	   //textcolor(WHITE);
	   gotoxy(7,10);
	   printf("ID. Medicine Name.  Supplier Name.   Qty.  Rate.  Total.   Date");
	   gotoxy(7,12);
	   printf("===================================================================");
	   j=14;
	   while(fscanf(ptrp_r,"%s %s %s %d %f %f %d %d %d\n",p_r.medi_id,p_r.medir_name,p_r.supp_name,&p_r.qty,&p_r.rate,&p_r.total,&p_r.sDay,&p_r.sMonth,&p_r.sYear)!=EOF)
	   {
		gotoxy(6,j);
		printf("%s",p_r.medi_id);
		gotoxy(11,j);
		printf("%s",p_r.medir_name);
		gotoxy(28,j);
		printf("%s",p_r.supp_name);
		gotoxy(44,j);
		printf("%d",p_r.qty);
		gotoxy(50,j);
		printf("%.2f",p_r.rate);
		gotoxy(57,j);
		printf("%.2f",p_r.total);
		gotoxy(65,j);
		printf("%d-%d-%d",p_r.sDay,p_r.sMonth,p_r.sYear);
		j+=2;
	   }
	   getche();
}
//========================= report of profit ===========================
void profit_rpt()
{
  char ch;
  int j;
  system("cls");
  t();
  box();
	   ptrpr_r=fopen("profitRpt.dat","r");
	   if(ptrpr_r==NULL)
	   {
		printf("\n\t Can not open File! ");
	       //	exit(0);
	   }
	   gotoxy(20,50);
	   printf("Press Enter to go to REPORT MENU ...........");
	   lbox();
	   //textcolor(GREEN);
	   gotoxy(30,8);
	   printf("Profit Report");
	   //textcolor(WHITE);
	   gotoxy(7,10);
	   printf("ID. Medicine Name.   Date        Qty.  Unit Price  Sale Price. Profit. ");
	   gotoxy(7,12);
	   printf("===================================================================");
	   j=14;
	   while(fscanf(ptrpr_r,"%s %s %d %d %d %d %f %f %f \n",pr_r.medi_id,pr_r.medir_name,&pr_r.sDay,&pr_r.sMonth,&pr_r.sYear,&pr_r.qty,&pr_r.unit,&pr_r.rate,&pr_r.profit)!=EOF)
	   {
		gotoxy(6,j);

		printf("%s",pr_r.medi_id);
		gotoxy(11,j);
		printf("%s",pr_r.medir_name);
		gotoxy(28,j);
		printf("%d-%d-%d",pr_r.sDay,pr_r.sMonth,pr_r.sYear);
		gotoxy(40,j);
		printf("%d",pr_r.qty);
		gotoxy(48,j);
		printf("%.2f",pr_r.unit);
		gotoxy(60,j);
		printf("%.2f",pr_r.rate);
		gotoxy(70,j);
		printf("%.2f",pr_r.profit);
		gotoxy(10,j);
		printf("%c",124);
		j+=2;

	   }
	   getche();
}

void sale_rpt_daily()
{
  char ch;
  int j,d,m,y;
  float total=0.00;
  system("cls");
	   ptrs_r=fopen("saleRpt.dat","r");
	   if(ptrs_r==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   gotoxy(15,10);
	   printf("Enter Date(dd-mm-yyyy):  ");
	   scanf("%d-%d-%d",&d,&m,&y);
	   system("cls");
	   gotoxy(20,50);
	   printf("Press any key to go to REPORT MENU ...........");
	   box();
	   lbox();
	   //textcolor(GREEN);
	   gotoxy(30,8);
	   ////textcolor(GREEN+BLINK);
	   printf("Sales Report");
	   //textcolor(WHITE);
	   gotoxy(7,10);
	   printf("ID. Medicine Name.  Customer Name.   Qty.  Rate.  Total.   Date");
	   gotoxy(7,12);
	   printf("===================================================================");
	   j=14;
	   while(fscanf(ptrs_r,"%s %s %s %d %f %f %d %d %d\n",s_r.medi_id,s_r.medir_name,s_r.cust_name,&s_r.qty,&s_r.rate,&s_r.total,&s_r.sDay,&s_r.sMonth,&s_r.sYear)!=EOF)
	   {
		if(d==s_r.sDay &&m== s_r.sMonth && y==s_r.sYear)
		{
		gotoxy(6,j);
		printf("%s",s_r.medi_id);
		gotoxy(11,j);
		printf("%s",s_r.medir_name);
		gotoxy(28,j);
		printf("%s",s_r.cust_name);
		gotoxy(44,j);
		printf("%d",s_r.qty);
		gotoxy(50,j);
		printf("%.2f",s_r.rate);
		gotoxy(57,j);
		printf("%.2f",s_r.total);
		gotoxy(65,j);
		printf("%d-%d-%d",s_r.sDay,s_r.sMonth,s_r.sYear);
		j=j+2;
		total=total+s_r.total;
		}
	   }
	   gotoxy(7,42);
	   printf("-------------------------------------------------------------------");
	   gotoxy(45,43);
	   printf("Total:        %.2f",total);
	   getche();
}
void pur_rpt_daily()
{
  char ch;
  int j,d,m,y;
  float total=0.00;

	   ptrp_r=fopen("purreport.dat","r");
	   if(ptrp_r==NULL)
	   {
		printf("\n\t Can not open File! ");
		exit(0);
	   }
	   system("cls");
	   gotoxy(15,10);
	   printf("Enter Date(dd-mm-yyyy):  ");
	   scanf("%d-%d-%d",&d,&m,&y);
	   system("cls");
	   gotoxy(20,50);
	   printf("Press Enter to go to REPORT MENU ...........");
	   t();
	   box();
	   lbox();
	   //textcolor(GREEN);
	   gotoxy(30,8);
	   printf("Purchase Report");
	   //textcolor(WHITE);
	   gotoxy(7,10);
	   printf("ID. Medicine Name.  Supplier Name.   Qty.  Rate.  Total.   Date");
	   gotoxy(7,12);
	   printf("===================================================================");
	   j=14;
	   while(fscanf(ptrp_r,"%s %s %s %d %f %f %d %d %d\n",p_r.medi_id,p_r.medir_name,p_r.supp_name,&p_r.qty,&p_r.rate,&p_r.total,&p_r.sDay,&p_r.sMonth,&p_r.sYear)!=EOF)
	   {
		if(d==p_r.sDay &&m== p_r.sMonth && y==p_r.sYear)
		{
		gotoxy(6,j);
		printf("%s",p_r.medi_id);
		gotoxy(11,j);
		printf("%s",p_r.medir_name);
		gotoxy(28,j);
		printf("%s",p_r.supp_name);
		gotoxy(44,j);
		printf("%d",p_r.qty);
		gotoxy(50,j);
		printf("%.2f",p_r.rate);
		gotoxy(57,j);
		printf("%.2f",p_r.total);
		gotoxy(65,j);
		printf("%d-%d-%d",p_r.sDay,p_r.sMonth,p_r.sYear);
		j+=2;
		total=total+p_r.total;
		}
	   }
	   gotoxy(7,42);
	   printf("-------------------------------------------------------------------");
	   gotoxy(45,43);
	   printf("Total:        %.2f",total);
	   getche();
}

Explanation

This is a highly complete small project. For practically all key functions, file management has been extensively and efficiently exploited. Because all medical records are maintained in files, the entire project is centred on file management.

To store and arrange records, data structure s were utilised. Overall, comprehending this project will offer you with useful information on how to use files to store, update, search, and remove data.

Output

Medical Store Management

Conclusion

In conclusion, the Medical Store Management project using the C programming language was a successful endeavor that allowed for the effective management of a medical store. The use of C allowed for the implementation of efficient algorithms and data structures, resulting in a user-friendly and streamlined system. The project was able to effectively handle various tasks such as inventory management, sales tracking, and customer information management. Additionally, the system was able to keep track of expiry dates and alert the user when a medication was about to expire. Overall, the project demonstrated the capabilities of C as a powerful programming language for developing effective and efficient medical store management systems.



About the author:
Adarsh Kumar Singh is a technology writer with a passion for coding and programming. With years of experience in the technical field, he has established a reputation as a knowledgeable and insightful writer on a range of technical topics.