Code:
/*header file inclusion*/
#include <stdio.h> /*for I/O*/
#include <string.h> /*for string operation*/
#include <ctype.h> /*or isalpha()*/
#include <stdlib.h> /*for atoi and atof*/
/************************************************************************/
/* function : readstring(char *s) */
/* reads a string from the user */
/* Parameter : the char array to read in */
/* read_type: 0:first read 1: second read */
/* Return value : None */
/************************************************************************/
void readstring(char *s,int read_type){
char c; /*holds the character*/
int i; /*counter variable*/
fflush(stdout); /*clears the buffers*/
i=0;
if(read_type==0) /*previous newline remains*/
c=getchar(); /*skip it*/
while((c=getchar())!='\n'){ /*reads until enter*/
/*fflush(stdout);*/ /*flushes buffer*/
if(c=='\b'){ /*backspace pressed*/
if(i>0) { /*not at the beginning of string*/
i--; /*reduce counter variable*/
/*printf("\b \b");*/ /*clears the printed char*/
} /*endif*/
} /*endif*/
else{ /*not backspace*/
/*printf("%c",c); */ /*print the character in the screen*/
s[i]=c; /*place the character in array*/
i++; /*increase counter*/
} /*end while*/
}
s[i]=0; /*terminating the string*/
/*printf("\n"); */ /*prints a newline*/
}
/************************************************************************/
/* function : main() */
/* Starting point of the program and does the actual work */
/* Parameter : None */
/* Return value: None */
/************************************************************************/
main(){
int transaction_account[20]; /*holds account no. for transaction*/
char transaction_description[20][31]; /*holds the description of the transaction*/
float transaction_amount[20]; /*holds amount for transaction*/
char transaction_type[20]; /*holds type of transaction debit or credit*/
int active_account[10]; /*holds active account list*/
char account_description[10][31]; /*description of the account*/
float account_balance[10]; /*holds the balance of the account*/
int choice; /*selection from main menu*/
char option; /*selection from main menu temporary*/
int tot_transactions; /*total number of transactions recorded*/
int tot_accounts; /*total number of account encountered*/
int ac_no; /*temporary storage for current account number*/
float amount; /*temporary storage for current amount*/
char type; /*temporary storage for current transaction type*/
int i; /*counter variable*/
int j;
float tot_asset; /*total balance of asset accounts*/
float tot_liability; /*total balance of liability accounts*/
float tot_equity; /*total balance of equity accounts*/
float tot_revenue; /*total balance of revenue accounts*/
float tot_expense; /*total balance of expense accounts*/
char input[100]; /*reads the user input directly*/
int isinvalid; /*if an user input is invalid*/
int gotdot; /*how many dots already encountered*/
FILE *fp_account; /*pointer for handling account file*/
FILE *fp_transaction; /*pointer for handling transaction file*/
char c; /*temporary variable used for file reading*/
int new_account; /*a new account has been created*/
tot_accounts=tot_transactions=0; /*initializing total accounts and total transactions*/
/*checking for accounts file*/
fp_account=fopen("accounts.dat","rt");
if(!fp_account){ /*accounts.dat does not exist*/
printf(" **File \"accounts.dat\" could not be read\n"); /*prompt message*/
printf(" **Previously entered account titles are not available\n");
printf(" **Any previously entered transactions will not be used\n\n");
fp_transaction=fopen("transactions.dat","wt"); /*clearing/creating transaction file*/
if(fp_transaction) /*transaction file created/cleared*/
fclose(fp_transaction); /*close it*/
} /*end if*/
else{ /*account file exist*/
while(!feof(fp_account)){ /*read until file finishes*/
c=getc(fp_account); /*reads a character*/
if(c==EOF) /*End of file reached*/
break; /*completed reading*/
i=0; /*initialize counter*/
while(c!=':'){ /*read until : is found*/
input[i]=c; /*store in array*/
c=getc(fp_account); /*read next char*/
i++; /*increase counter*/
} /*end while*/
input[i]=0; /*end of string*/
active_account[tot_accounts]=atoi(input); /*store account name*/
i=0; /*initialize counter*/
c=getc(fp_account); /*read a character from file*/
while(c!='\n'){ /*look for newline*/
input[i]=c; /*store in array*/
c=getc(fp_account); /*read next char*/
i++; /*increment counter*/
} /*end while*/
input[i]=0; /*end of string*/
strcpy(account_description[tot_accounts],input); /*save account description*/
account_balance[tot_accounts]=0; /*initialize balance*/
tot_accounts++; /*increase total number of accounts encountered*/
} /*end else*/
fclose(fp_account); /*closing account file*/
fp_transaction=fopen("transactions.dat","rt"); /*opening transactions file*/
if(fp_transaction){ /*transaction file opened*/
while(!feof(fp_transaction)){ /*read until file ends*/
c=getc(fp_transaction); /*read the first character*/
if(c==EOF) /*end of file reached*/
break; /*reading done*/
i=0; /*initialize counter*/
while(c!=':'){ /*read until : is found*/
input[i]=c; /*store in array*/
c=getc(fp_transaction); /*read next char*/
i++; /*increase counter*/
} /*end while*/
input[i]=0; /*end of string*/
transaction_account[tot_transactions]=atoi(input); /*load transaction account*/
i=0; /*initialize counter*/
c=getc(fp_transaction); /*read a char*/
while(c!=':'){ /*read until : is found*/
input[i]=c; /*load in array*/
c=getc(fp_transaction); /*read next char*/
i++; /*increment counter*/
} /*end while*/
input[i]=0; /*end of string*/
strcpy(transaction_description[tot_transactions],input); /*load transaction description*/
c=getc(fp_transaction); /*read next char*/
transaction_type[tot_transactions]=c; /*load transaction type*/
c=getc(fp_transaction); /*skip next :*/
i=0; /*initialize counter*/
c=getc(fp_transaction); /*read a char*/
while(c!='\n'){ /*read until newline*/
input[i]=c; /*load in array*/
c=getc(fp_account); /*read next char*/
i++; /*increment counter*/
} /*end while*/
input[i]=0; /*end of string*/
transaction_amount[tot_transactions]=atof(input); /*load transaction amount*/
/*updating account balance*/
for(j=0;j<tot_accounts;j++){ /*search all accounts */
if(active_account[j]==transaction_account[tot_transactions]){ /*corresponing account found*/
if(transaction_type[tot_transactions]=='d') /*debit transaction*/
account_balance[j]+=transaction_amount[tot_transactions]; /*increase balance*/
else /*credit transaction*/
account_balance[j]-=transaction_amount[tot_transactions]; /*decrement balance*/
} /*end if*/
} /*end for*/
tot_transactions++; /*increase no.of transactions encountered*/
} /*end while*/
fclose(fp_transaction); /*close transaction file*/
} /*end if*/
} /*end else*/
while(1){ /*main menu repeats forever*/
/*printing the main menu*/
printf("Options available:\n\n");
printf("1 - Enter a transaction\n");
printf("2 - View the general ledger\n");
printf("3 - View the balance sheet\n");
printf("4 - View the income statement\n");
printf("q - Quit the program\n\n");
/*prompting user for choice*/
printf("Please enter 1, 2, 3, 4, or q: ");
/*user choice*/
while(1){ /*repeat until correctly entered*/
scanf("%s",input); /*reads in input*/
if(strlen(input)>1){ /*more than one characters*/
printf(" **Trailing character encountered\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt for reenter*/
}
else{ /*single character entered*/
option=input[0]; /*store the character in option*/
if(option=='q' || option=='Q'){ /*user choose to quit*/
choice=5; /*choice = 4 indicates quit*/
break;
}
else if(option > '0' && option < '5' ){ /*user chooses from 1 to 3*/
choice=option-'0'; /*convert to corresponding digit*/
break;
}
else{ /*any other character than 1, 2, 3, or q*/
printf(" **Invaid input\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt for reenter*/
} /*end else*/
} /*end else*/
} /*end while*/
/*take action based on choice*/
switch(choice){
case 5: /*user choose to quit*/
return; /*quit program*/
case 1: /*insert a transaction*/
new_account=0;
if(tot_transactions==20){ /*maximum transaction already done*/
printf(" **Maximum number of transactions has been entered\n");
break; /*can not do more transaction*/
}
/*getting the account number*/
printf("\nPlease insert account number (between 1000 and 5999) : ");
while(1){ /*read the account number*/
scanf("%s",input); /*read in input*/
isinvalid=0; /*initialize isinvalid*/
if(isalpha(input[0])){ /*first digit is alphabet*/
printf(" **Invaid input\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
}
else{
for(i=0;i < strlen(input); i++){ /*check the whole string*/
if(isalpha(input[i]) || input[i]=='.'){ /*alphabet or dot found*/
isinvalid=1; /*mark invalid*/
printf(" **Trailing character encountered\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
break;
}
}
if(!isinvalid){ /*it is an integer*/
ac_no=atoi(input); /*convert to integer*/
if(ac_no < 1000 || ac_no > 5999){ /*out of range*/
printf(" **Out of range\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
}
else /*valid input found*/
break;
} /*end if*/
} /*end else*/
} /*end while*/
/*checking for new account*/
for(i=0;i<tot_accounts;i++){ /*checking all accounts*/
if(active_account[i]==ac_no){ /*found in existing*/
break;
} /*end if*/
} /*end for*/
if(i==tot_accounts){ /*new account found*/
if(tot_accounts==10){ /*maximum number of accounts are already there*/
printf(" **Maximum number of accounts has been entered\n"); /*print error message*/
break;
} /*end if*/
new_account=1;
printf("\nEnter title for new account %d: ",ac_no); /*user inputs title of account*/
while(1){ /*repeat until correctly entered*/
readstring(input,0); /*reads a line*/
if(strlen(input) > 30){ /*too long string*/
printf(" **Title entered is longer than 30 characters\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt for reenter*/
} /*end if*/
else{ /*correctly entered*/
strcpy(account_description[tot_accounts],input); /*store account description*/
break; /*o need to repeat */
} /*end else*/
} /*end while*/
} /*end for*/
printf("\nEnter title for transaction: "); /*user input title*/
while(1){ /*repeat until correctly entered*/
if(new_account==0)
readstring(input,0); /*reads a line*/
else
readstring(input,1);
if(strlen(input) > 30){ /*too long string*/
printf(" **Title entered is longer than 30 characters\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt for reenter*/
} /*end if*/
else{ /*valid string*/
strcpy(transaction_description[tot_transactions],input); /*store account description*/
break; /*no need to report*/
} /*end else*/
} /*end while*/
/*getting the account type*/
printf("\nEnter d (debit) or c (credit): "); /*prompt the user*/
while(1){ /*reading the input*/
scanf("%s",input); /*loading in input*/
if(strlen(input)>1){ /*more than one characters entered*/
printf(" **Trailing character encountered\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
} /*end if*/
else if(input[0]=='c' || input[0]=='C'){ /*credit transaction*/
type='c'; /*setting type of transaction to credit*/
break;
} /*end else if*/
else if(input[0]=='d' || input[0]=='D'){ /*debit transaction*/
type='d'; /*setting type of transaction to debit*/
break;
} /*end else if*/
else{ /*anything other than c or d*/
printf(" **Invaid input\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
} /*end else*/
} /*end while*/
/*getting transaction amount*/
printf("\nEnter transaction amount: "); /*prompt the user*/
while(1){ /*repeat until valid input*/
scanf("%s",input); /*reading in input*/
isinvalid=0; /*initialize isinvalid*/
gotdot=0; /*dot encountered 0*/
if(isalpha(input[0])){ /*first character is alphabet*/
printf(" **Invaid input\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
} /*end if*/
else{ /*first character is number*/
for(i=0;i<strlen(input);i++){ /*check the entire string*/
if(isalpha(input[i])){ /*is the digit alphabetic*/
isinvalid=1; /*invalid number found*/
printf(" **Trailing character encountered\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
break;
} /*end if*/
if(input[i]=='.'){ /*found dot*/
gotdot++; /*increase number of dots*/
if(gotdot==2){ /*more than one dot*/
isinvalid=1; /*number is invalid*/
printf(" **Trailing character encountered\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
break;
} /*end if*/
} /*end if*/
} /*end for*/
if(!isinvalid){ /*for not invalid numbers*/
amount=(float)atof(input); /*convert to float*/
if(amount < 0){ /*negative number inserted*/
printf(" **Out of range\n"); /*print error message*/
printf(" **Please reenter : "); /*prompt to reenter*/
} /*end if*/
else /*valid number found*/
break;
} /*end if*/
} /*end else*/
} /*end while*/
/*storing the transaction*/
transaction_account[tot_transactions]=ac_no; /*store the transaction acc no.*/
transaction_type[tot_transactions]=type; /*store the transaction acc type*/
transaction_amount[tot_transactions]=amount; /*store the transaction amount*/
tot_transactions++; /*increase total transactions*/
for(i=0;i<tot_accounts;i++){ /*check all accounts*/
if(active_account[i]==ac_no){ /*the current account found*/
if(type=='c'){ /*credit transaction*/
account_balance[i]-=amount; /*update balance*/
break;
} /*end if*/
else if(type=='d'){ /*debit transaction*/
account_balance[i]+=amount; /*update balance*/
break;
} /*end else*/
} /*end if*/
} /*end for*/
if(i==tot_accounts){ /*new account encountered*/
active_account[tot_accounts]=ac_no; /*save account no. of new account*/
if(type=='c') /*credit transaction*/
account_balance[tot_accounts]=0-amount; /*initialize balance*/
else /*debit transaction*/
account_balance[tot_accounts]=amount; /*initialize balance*/
tot_accounts++; /*increase total number of accounts*/
fp_account=fopen("accounts.dat","at"); /*open account file in append mode*/
sprintf(input,"%d",active_account[tot_accounts-1]); /*write account no. in string*/
fprintf(fp_account,"%s:",input); /*write account no. to file*/
fprintf(fp_account,"%s\n",account_description[tot_accounts-1]); /*writing account description to file*/
fclose(fp_account); /*close account file*/
} /*end if*/
fp_transaction=fopen("transactions.dat","at"); /*open transaction file in append mode*/
if(!fp_transaction){ /*transaction file can not be opened for writing*/
printf(" **File \"transactions.dat\" could not be written\n"); /*prompt message*/
printf(" **Transaction title \"%s\" will not be saved\n",transaction_description[tot_transactions-1]);
} /*end if*/
else{ /*transaction file opened*/
sprintf(input,"%d",transaction_account[tot_transactions-1]); /*write account no. in string*/
fprintf(fp_account,"%s:",input); /*write account no. to file*/
fprintf(fp_transaction,"%s:",transaction_description[tot_transactions-1]); /*write description to file*/
fprintf(fp_transaction,"%c:",transaction_type[tot_transactions-1]); /*write transaction type*/
sprintf(input,"%.2f",transaction_amount[tot_transactions-1]); /*write transaction amount to string*/
fprintf(fp_account,"%s\n",input); /*write transaction amount to file*/
fclose(fp_transaction); /*close transaction file*/
} /*end else*/
break; /*case 1 ends*/
case 2: /*show general ledger*/
printf("\n\t\t\tGeneral Journal\n"); /*header for ledger*/
printf("Account Description Debit Credit\n");
printf("------- ------------------------------ ----------- -----------\n");
for(i=0;i<tot_transactions;i++){ /*for each transaction*/
printf("%7d",transaction_account[i]); /*print account number*/
printf(" %s",transaction_description[i]); /*printing description*/
for(j=30-strlen(transaction_description[i]);j>=0;j--) /*printing blanks*/
printf(" ");
if(transaction_type[i]=='d') /*debit*/
printf("%11.2f\n",transaction_amount[i]); /*print at debit column*/
else{ /*credit*/
printf(" %11.2f\n",transaction_amount[i]); /*print at credit column*/
}
} /*end for*/
break; /*case 2 ends*/
case 3: /*show balance sheet*/
tot_asset=tot_liability=tot_equity=0; /*initialize asset, liability and equity*/
printf("\n\t\t\tBalance Sheet\n"); /*header for balance sheet*/
printf("Account Description Debit Credit\n");
printf("------- ------------------------------ ----------- -----------\n");
for(i=0;i<tot_accounts;i++){ /*for each transaction*/
if(active_account[i]>=1000 && active_account[i]<=1999){ /*asset accounts*/
tot_asset+=account_balance[i]; /*update total asset*/
printf("%7d",active_account[i]); /*print account number*/
printf(" %s",account_description[i]); /*printing description*/
for(j=30-strlen(account_description[i]);j>=0;j--) /*printing blanks*/
printf(" ");
if(account_balance[i]>0) /*debit*/
printf("%11.2f\n",account_balance[i]); /*print at debit column*/
else /*credit*/
printf(" %11.2f\n",(-1)*account_balance[i]); /*print at credit column*/
} /*end if*/
} /*end for*/
printf(" ----------- -----------\n");
printf(" Total Assets "); /*total of asset accounts*/
if(tot_asset>0) /*debit major*/
printf("%11.2f\n\n",tot_asset); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n\n",(-1)*tot_asset); /*print at credit column*/
for(i=0;i<tot_accounts;i++){ /*for each transaction*/
if(active_account[i]>=2000 && active_account[i]<=2999){ /*liability accounts*/
tot_liability+=account_balance[i]; /*update total liability*/
printf("%7d",active_account[i]); /*print account number*/
printf(" %s",account_description[i]);
for(j=30-strlen(account_description[i]);j>=0;j--) /*printing blanks*/
printf(" ");
if(account_balance[i]>0) /*debit*/
printf("%11.2f\n",account_balance[i]); /*print at debit column*/
else /*credit*/
printf(" %11.2f\n",(-1)*account_balance[i]); /*print at credit column*/
} /*end if*/
} /*end for*/
printf(" ----------- -----------\n");
printf(" Total Liabilities "); /*total liabilities printing*/
if(tot_liability>0) /*debit major*/
printf("%11.2f\n\n",tot_liability); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n\n",(-1)*tot_liability); /*print at credit column*/
for(i=0;i<tot_accounts;i++){ /*for each transaction*/
if(active_account[i]>=3000 && active_account[i]<=3999){ /*equity accounts*/
tot_equity+=account_balance[i]; /*update total equity*/
printf("%7d",active_account[i]); /*print account number*/
printf(" %s",account_description[i]); /*printing description*/
for(j=30-strlen(account_description[i]);j>=0;j--) /*printing blanks*/
printf(" ");
if(account_balance[i]>0) /*debit*/
printf("%11.2f\n",account_balance[i]); /*print at debit column*/
else /*credit*/
printf(" %11.2f\n",(-1)*account_balance[i]); /*print at credit column*/
} /*end if*/
} /*end for*/
printf(" ----------- -----------\n");
printf(" Total Equity "); /*printing total equity*/
if(tot_equity>0) /*debit major*/
printf("%11.2f\n",tot_equity); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n",(-1)*tot_equity); /*print at credit column*/
printf(" ----------- -----------\n");
printf(" Total Liabilities and Equity "); /*total liabilities and equity printing*/
if((tot_equity+tot_liability)>0) /*debit major*/
printf("%11.2f\n",(tot_equity+tot_liability)); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n",(-1)*(tot_equity+tot_liability)); /*print at credit column*/
break; /*case 3 ends*/
case 4: /*printing income statement*/
tot_revenue=tot_expense=0; /*initialize asset, liability and equity*/
printf("\n\t\t\tIncome Statement\n"); /*header for balance sheet*/
printf("Account Description Debit Credit\n");
printf("------- ------------------------------ ----------- -----------\n");
for(i=0;i<tot_accounts;i++){ /*for each transaction*/
if(active_account[i]>=4000 && active_account[i]<=4999){ /*revenue accounts*/
tot_revenue+=account_balance[i]; /*update total revenue*/
printf("%7d",active_account[i]); /*print account number*/
printf(" %s",account_description[i]); /*printing description*/
for(j=30-strlen(account_description[i]);j>=0;j--) /*printing blanks*/
printf(" ");
if(account_balance[i]>0) /*debit*/
printf("%11.2f\n",account_balance[i]); /*print at debit column*/
else /*credit*/
printf(" %11.2f\n",(-1)*account_balance[i]); /*print at credit column*/
} /*end if*/
} /*end for*/
printf(" ----------- -----------\n");
printf(" Total Revenue "); /*total liabilities printing*/
if(tot_revenue>0) /*debit major*/
printf("%11.2f\n\n",tot_revenue); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n\n",(-1)*tot_revenue); /*print at credit column*/
for(i=0;i<tot_accounts;i++){ /*for each transaction*/
if(active_account[i]>=5000 && active_account[i]<=5999){ /*equity accounts*/
tot_expense+=account_balance[i]; /*update total expense*/
printf("%7d",active_account[i]); /*print account number*/
printf(" %s",account_description[i]); /*printing description*/
for(j=30-strlen(account_description[i]);j>=0;j--) /*printing blanks*/
printf(" ");
if(account_balance[i]>0) /*debit*/
printf("%11.2f\n",account_balance[i]); /*print at debit column*/
else /*credit*/
printf(" %11.2f\n",(-1)*account_balance[i]); /*print at credit column*/
} /*end if*/
} /*end for*/
printf(" ----------- -----------\n");
printf(" Total Expense "); /*printing total equity*/
if(tot_expense>0) /*debit major*/
printf("%11.2f\n",tot_expense); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n",(-1)*tot_expense); /*print at credit column*/
printf(" ----------- -----------\n");
printf(" Net Income "); /*total liabilities and equity printing*/
if((tot_expense+tot_revenue)>0) /*debit major*/
printf("%11.2f\n",(tot_expense+tot_revenue)); /*print at debit column*/
else /*credit major*/
printf(" %11.2f\n",(-1)*(tot_expense+tot_revenue)); /*print at credit column*/
break; /*case 4 ends*/
} /*switch ends*/
printf("\n\n"); /*printing two line space*/
} /*end main while loop*/
} /*end main function*/