[go: up one dir, main page]

0% found this document useful (0 votes)
33 views15 pages

Expense Managar Using LL

The document defines C functions and structures for managing income and expense records in a linked list and saving them to binary files. Key functions create nodes, add income/expense, display records, and read/write from files. It implements a basic menu-driven program to interactively add, view and save financial records.

Uploaded by

Nikhil Djn
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
33 views15 pages

Expense Managar Using LL

The document defines C functions and structures for managing income and expense records in a linked list and saving them to binary files. Key functions create nodes, add income/expense, display records, and read/write from files. It implements a basic menu-driven program to interactively add, view and save financial records.

Uploaded by

Nikhil Djn
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 15

#include <stdio.

h>

#include <stdlib.h>

#include <string.h>

#define N 50

#define M 30

double currentincome = 0;

double currentexpense = 0;

struct node

    char date[M];

    double amount;

    char category[N];

    struct node *next;

} *income = NULL, *expense = NULL;

struct record

    double x, y;

} *point = NULL;

void create(char x[], double y, char z[], struct node **temp);

void display(int a3);

struct node *readnext(struct node *ptr, FILE *fpointer);

void writeincome(struct node *ptr);

void writeexpense(struct node *ptr);

void deleterecord(struct node *ptr);

struct node *readincome(struct node *ptr);

struct node *readexpense(struct node *ptr);

void write(struct record *point);

struct record *readrecord();


int main()

    int option, value;

    double b;

    char c[N], a[M];

    char s1[15], s2[15], s3[15];

    if (fopen("Record.bin", "rb") != NULL) /*first time it will give null bcoz there is no file name
record.bin,therefor it will not take income

                     and expense from file,assign value will be displayed i.e 0,0..after creating income and
expense first time

                      user exits then record.bin

                     will be create and again  when user runs program then this if will execute and take
income and expense from file*/

  {

        point = readrecord();

        currentincome = point->x;

        currentexpense = point->y;

  }

    if (fopen("myincome.bin", "rb") != NULL) /*it means file is already created and some data is
already there,and we have to get that and create

                                         linked list,address of first node will be in income pointer. step bcoz if we dont
do this than

                                     after closing terminal if we create inome and saved it than previous data will be
deletedand it

                                   overrtites in file...after doing this income will point to first node and all data will
be come in ram

                                    in form linked list*/

  {

        income = readincome(income);
  }

    if (fopen("myexpense.bin", "rb") != NULL)

  {

        expense = readexpense(expense);

  }

    do

  {

        printf("                                           _______________________________________________\n  ");

        printf("                                         |     YOUR INCOME   =      %.2lf INR      \n ", currentincome);

        printf("                                          |     YOUR EXPENSE  =      %.2lf INR     \n ", currentexpense);

        printf("                                          |     YOUR BALANCE  =      %.2lf INR     \n ", currentincome -


currentexpense);

        printf("                                          |_______________________________________________\n");

        printf("ENTER THE OPTION FROM THE BELOW \n\n");

        printf("1.INSERT INCOME \n");

        printf("2.INSERT EXPENSE \n");

        printf("3.VIEW INCOME RECORD \n");

        printf("4.VIEW EXPENSE RECORD \n");

        printf("5.EXIT\n");

        scanf("%d", &option);

        printf("\n\n\n");

        switch (option)

    {

        case 1:

            printf("**************   ADD INCOME   *****************\n\n");

            printf("Enter The Date(e.g day month year)\n");

            scanf("%s %s %s", s1, s2, s3); //gets,fgets and other functions are not working thats why these
stepes have done

            strcpy(a, "");
            strcat(a, s1);

            strcat(a, " ");

            strcat(a, s2);

            strcat(a, " ");

            strcat(a, s3);

            printf("Enter The Amount\n");

            scanf("%lf", &b);

            printf("Enter the Category\n");

            scanf("%s", c);

            currentincome = currentincome + b;

            create(a, b, c, &income);

            writeincome(income);

            break;

        case 2:

            printf("**************    ADD EXPENSE   *****************\n\n");

            printf("Enter The Date(e.g day month year)\n");

            scanf("%s %s %s", s1, s2, s3);

            strcpy(a, "");

            strcat(a, s1);

            strcat(a, " ");

            strcat(a, s2);

            strcat(a, " ");

            strcat(a, s3);

            printf("Enter The Amount\n");

            scanf("%lf", &b);

            printf("Enter The Category\n");

            scanf("%s", c);
            currentexpense = currentexpense + b;

            create(a, b, c, &expense);

            writeexpense(expense);

            break;

        case 3:

            printf("*********   YOUR INCOME RECORD IS   *******\n\n");

            display(3);

            break;

        case 4:

            printf("*********   YOUR EXPENSE RECORD IS   *******\n\n");

            display(4);

            break;

        case 5:

            point = (struct record *)malloc(sizeof(struct record));

            point->x = currentincome;

            point->y = currentexpense;

            write(point);

            break;

        default:

            printf("WRONG OPTION SELECTED -Enter Valid Option");

            break;

    }

    } while (option != 5);

    return 0;

void create(char x[], double y, char z[], struct node **temp) /* it isokay to write *temp if we pass
only income rather than &income*/
{

    struct node *newnode, *ptr;

    newnode = (struct node *)malloc(sizeof(struct node));

    if (*temp == NULL)

  {

        strcpy(newnode->date, x);

        newnode->amount = y;

        strcpy(newnode->category, z);

        newnode->next = NULL;

        *temp = newnode;

  }

    else

  {

        ptr = *temp;

        while (ptr->next != NULL)

    {

            ptr = ptr->next;

    }

        strcpy(newnode->date, x);

        newnode->amount = y;

        strcpy(newnode->category, z);

        newnode->next = NULL;

        ptr->next = newnode;

  }

void deleterecord(struct node *ptr)

    struct node *freeme = ptr;

    struct node *holdme = NULL;

    while (freeme != NULL)


  {

        holdme = freeme->next;

        free(freeme);

        freeme = holdme;

  }

struct node *readnext(struct node *ptr, FILE *fpointer)

    if (ptr == NULL)

  {

        ptr = (struct node *)malloc(sizeof(struct node));

        fread(ptr, sizeof(struct node), 1, fpointer);

        ptr->next = NULL;

  }

    else

  {

        struct node *ptr1 = ptr;

        struct node *ptr2 = (struct node *)malloc(sizeof(struct node));

        while (ptr1->next != NULL)

    {

            ptr1 = ptr1->next;

    }

        fread(ptr2, sizeof(struct node), 1, fpointer);

        ptr1->next = ptr2;

        ptr2->next = NULL;

  }

    return ptr;

}
struct node *readincome(struct node *ptr)

    FILE *fpointer;

    fpointer = fopen("myincome.bin", "rb");

    if (fpointer != NULL)

  {

        deleterecord(ptr);

        ptr = NULL;

        fseek(fpointer, 0, SEEK_END);

        long filesize = ftell(fpointer);

        rewind(fpointer);

        int entries = (int)(filesize / (sizeof(struct node)));

        for (int i = 0; i < entries; i++)

    {

            fseek(fpointer, (sizeof(struct node) * i), SEEK_SET);

            ptr = readnext(ptr, fpointer);

    }

  }

    else

  {

        printf("ERROR IN OPENINNG FILE\n");

  }

    return ptr;

void display(int a3)

    if (a3 == 3) //if case 3 is executed,we have to print income record

  {
        if (fopen("myincome.bin", "rb") == NULL) /*if user try to view record when there is no any
record,i.e when user runs program

                                                       first time and wants to view record i.e there is no any

                                                        file created yet as myincome.bin,then it will =NULL */

    {

            printf("NO RECORDS AVAILABLE\n\n");

      
printf("____________________________________________________________________________
____________________________________\n\n");

    }

        else

    {

            //income=readincome(income);

            struct node *ptr2 = income;

            while (ptr2 != NULL)

      {

                printf("Date: %s\nAmount: %.2lf INR\nCategory: %s\n\n", ptr2->date, ptr2->amount, ptr2-


>category);

                ptr2 = ptr2->next;

      }

      
printf("____________________________________________________________________________
____________________________________\n\n");

    }

  }

    else if (a3 == 4) //if case 4 is executed then we have to print expenese record

  {

        if (fopen("myexpense.bin", "rb") == NULL) /*if user try to view record when there is no any
record,i.e when user runs program

                                                       first time and wants to view record i.e there is no any

                                                        file created yet as myexpense.bin,then it will =NULL */


    {

            printf("NO RECORDS AVAILABLE\n\n");

      
printf("____________________________________________________________________________
____________________________________\n\n");

    }

        else

    {

            //   expense=readexpense(expense);

            struct node *ptr2 = expense;

            while (ptr2 != NULL)

      {

                printf("Date: %s\nAmount: %.2lf INR\nCategory: %s\n\n", ptr2->date, ptr2->amount, ptr2-


>category);

                ptr2 = ptr2->next;

      }

      
printf("____________________________________________________________________________
____________________________________\n\n");

    }

  }

void writeincome(struct node *ptr)

    FILE *fpointer;

    fpointer = fopen("myincome.bin", "wb");

    if (fpointer != NULL)

  {

        struct node *ptr1 = ptr;

        struct node *holdnext = NULL;


        while (ptr1 != NULL)

    {

            holdnext = ptr1->next;

            ptr1->next = NULL;

            fseek(fpointer, 0, SEEK_END);

            fwrite(ptr1, sizeof(struct node), 1, fpointer); /*everytime we write into file,it will overwrite
the data......                                                      whole data will be deleted and new data willl be written
intofile*/

            ptr1->next = holdnext;

            holdnext = NULL;

            ptr1 = ptr1->next;

    }

        fclose(fpointer);

        fpointer = NULL;

        printf("\nINCOME SAVED SUCCESSFULLY\n\n");

    
printf("____________________________________________________________________________
____________________________________\n\n");

  }

    else

  {

        printf("\nCANNOT SAVE INCOME..TRY AGAIN\n");

    
printf("____________________________________________________________________________
____________________________________\n\n");

  }

void writeexpense(struct node *ptr)

    FILE *fpointer;

    fpointer = fopen("myexpense.bin", "wb");

    if (fpointer != NULL)
  {

        struct node *ptr1 = ptr;

        struct node *holdnext = NULL;

        while (ptr1 != NULL)

    {

            holdnext = ptr1->next;

            ptr1->next = NULL;

            fseek(fpointer, 0, SEEK_END);

            fwrite(ptr1, sizeof(struct node), 1, fpointer); /*everytime we write into file,it will overwrite
the data.....

                                                     whole data will be deleted and new data willl be written intofile*/

            ptr1->next = holdnext;

            holdnext = NULL;

            ptr1 = ptr1->next;

    }

        fclose(fpointer);

        fpointer = NULL;

        printf("\nEXPENSE SAVED SUCCESSFULLY\n\n");

    
printf("____________________________________________________________________________
____________________________________\n\n");

  }

    else

  {

        printf("\nCANNOT SAVE EXPENSE..TRY AGAIN\n\n");

    
printf("____________________________________________________________________________
____________________________________\n\n");

  }

struct node *readexpense(struct node *ptr)

{
    FILE *fpointer;

    fpointer = fopen("myexpense.bin", "rb");

    if (fpointer != NULL)

  {

        deleterecord(ptr);

        ptr = NULL;

        fseek(fpointer, 0, SEEK_END);

        long filesize = ftell(fpointer);

        rewind(fpointer);

        int entries = (int)(filesize / (sizeof(struct node)));

        for (int i = 0; i < entries; i++)

    {

            fseek(fpointer, (sizeof(struct node) * i), SEEK_SET);

            ptr = readnext(ptr, fpointer);

    }

  }

    else

  {

        printf("cannonot open file\n");

  }

    return ptr;

void write(struct record *point)

    FILE *fpointer;

    fpointer = fopen("Record.bin", "wb");

    if (fpointer != NULL)

  {

        fseek(fpointer, 0, SEEK_END);
        fwrite(point, sizeof(struct record), 1, fpointer); /*everytime we write into file,it will overwrite
the data.....

                                                     whole data will be deleted and new data willl be written intofile*/

  }

    else

  {

        printf("FILEOPEN ERROR\n");

  }

    fclose(fpointer);

    fpointer = NULL;

struct record *readrecord()

    FILE *fpointer;

    fpointer = fopen("Record.bin", "rb");

    struct record *ptr = NULL;

    if (fpointer != NULL)

  {

        fseek(fpointer, 0, SEEK_SET);

        ptr = (struct record *)malloc(sizeof(struct record));

        fread(ptr, sizeof(struct record), 1, fpointer);

  }

    else

  {

        printf("CANNOT OPEN FILE\n");

  }

    return ptr;
}

You might also like