Calendar Application In C

It is a method for organizing daily schedules. This involves assigning labels to specific time intervals, commonly including days, weeks, months, and years. Within this framework, a specific day is denoted by a date. A physical manifestation of this system is a calendar, usually crafted from paper. Additionally, the term "calendar" can also denote a schedule of upcoming events, like a court schedule, or a compilation of records arranged chronologically, such as a wills schedule.

Program Breakdown

Example

struct Date {

    int dd ;

    int mm ;

    int yy ;

} ;

We are developing a class to represent dates, with private attributes for day, month, and year.

Example

struct Remainder {

    int dd ;

    int mm ;

    char note [ 50 ] ;

} ;

We are developing a class for storing remainders, with private attributes including date, month, and a character array named note.

Example

void SetColor ( int ForgC )

{

     WORD wColor ;

     //We will need this handle to get the current background attribute

     HANDLE hStdOut = GetStdHandle ( STD_OUTPUT_HANDLE ) ;

     CONSOLE_SCREEN_BUFFER_INFO csbi ;



     //We use csbi for the wAttributes word.

     if ( GetConsoleScreenBufferInfo ( hStdOut , & csbi ) )

     {

        //Mask out all but the background attribute, and add in the forgournd color

          wColor = ( csbi.wAttributes & 0xF0 ) + (ForgC & 0x0F ) ;

          SetConsoleTextAttribute ( hStdOut , wColor ) ;

     }

     return ;

}

This function will establish the foreground color for displaying text in a console window.

Example

void ClearConsoleToColors ( int ForgC , int BackC )

{

     WORD wColor = ( ( BackC & 0x0F ) < < 4 ) + ( ForgC & 0x0F ) ;

     //Get the handle to the current output buffer ...

     HANDLE hStdOut = GetStdHandle ( STD_OUTPUT_HANDLE ) ;

     //This is used to reset the carat/cursor to the top left.

     COORD coord = { 0 , 0 } ;

     //A return value ... indicating how many chars were written

     //   not used but we need to capture this since it will be

     //   written anyway ( passing NULL causes an access violation ).

     DWORD count ;

     //This is a structure containing all of the console info

     // it is used here to find the size of the console.

     CONSOLE_SCREEN_BUFFER_INFO csbi ;

     //Here we will set the current color

     SetConsoleTextAttribute ( hStdOut , wColor ) ;

     if ( GetConsoleScreenBufferInfo ( hStdOut , & csbi ) )

     {

          //This fills the buffer with a given character (in this case 32=space).

          FillConsoleOutputCharacter ( hStdOut , ( TCHAR ) 32 , csbi . dwSize . X * csbi.dwSize.Y , coord , &count ) ;

          FillConsoleOutputAttribute ( hStdOut , csbi . wAttributes , csbi . dwSize . X * csbi . dwSize . Y , coord , & count ) ;

          //This will set our cursor position for the next print statement.

          SetConsoleCursorPosition ( hStdOut , coord ) ;

     }

     return ;

}

This arrangement comprises all the console information utilized to determine the console size.

Example

void SetColorAndBackground ( int ForgC , int BackC )

{

     WORD wColor = ( ( BackC & 0x0F ) < < 4 ) + ( ForgC & 0x0F ) ;

     SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE ) , wColor ) ;

     return ;

}

The preceding function is employed to establish the background color of the console.

Example

int check_leapYear ( int year ) {  //checks whether the year passed is leap year or not

    if ( year % 400 = = 0 || ( year % 100 ! = 0 & & year % 4 = =0 ) )

       return 1 ;

    return 0 ;

}

The code snippet above is employed to verify whether the year input by the user is a leap year or not.

Example

int getNumberOfDays ( int month , int year ){ //returns the number of days in given month

   switch ( month ) {                          //and year

      case 1 : return ( 31 ) ;

      case 2 : if ( check_leapYear ( year ) = = 1 )

		 return ( 29 ) ;

	       else

		 return ( 28 ) ;

      case 3 : return ( 31 ) ;

      case 4 : return ( 30 ) ;

      case 5 : return ( 31 ) ;

      case 6 : return ( 30 ) ;

      case 7 : return ( 31 ) ;

      case 8 : return ( 31 ) ;

      case 9 : return ( 30 ) ;

      case 10 : return ( 31 ) ;

      case 11 : return ( 30 ) ;

      case 12 : return ( 31 ) ;

      default : return ( -1 ) ;

   }

}

The function mentioned above will provide the count of days in the given month.

Example

char * getName ( int day ) { //returns the name of the day

   switch ( day ) {

      case 0 : return ( " Sunday " ) ;

      case 1 : return ( " Monday " ) ;

      case 2 : return ( " Tuesday " ) ;

      case 3 : return ( " Wednesday " ) ;

      case 4 : return ( " Thursday " ) ;

      case 5 : return ( " Friday " ) ;

      case 6 : return ( " Saturday " ) ;

      default : return ( " Error in getName ( ) module.Invalid argument passed " ) ;

   }

}

The function mentioned above is in charge of providing the day's name.

Example

void AddNote ( ) {

    FILE * fp ;

    fp = fopen ( " note.dat " , " ab+ " ) ;

    system ( " cls " ) ;

    gotoxy ( 5 ,7 ) ;

    printf ( " Enter the date ( DD / MM ) : " ) ; 

    scanf ( " % d % d " , & R . dd , & R . mm ) ;

    gotoxy ( 5 , 8 ) ;

    printf ( " Enter the Note ( 50 character max ) : " ) ;

    fflush ( stdin ) ;

    scanf ( " % [ ^ \ n ] " , R.note ) ;

    if ( fwrite ( & R , sizeof ( R ) , 1 , fp ) ) {

        gotoxy ( 5 , 12 ) ;

        puts ( " Note is saved sucessfully " ) ;

        fclose ( fp ) ;

    }else {

        gotoxy ( 5 , 12 ) ;

        SetColor ( 12 ) ;

        puts ( " \ a Fail to save!! \ a " ) ;

        ClearColor ( ) ;

    }

    gotoxy ( 5 , 15 ) ;

    printf ( " Press any key............" ) ;

    getch ( ) ; 

    fclose ( fp ) ;

}

If an individual intends to insert a note on a specific date, they can achieve this using the function described above.

Example

void showNote ( int mm ) {

    FILE * fp ;

    int i = 0 , isFound = 0 ;

    system ( " cls " ) ;

    fp = fopen ( " note . dat " , " rb " ) ;

    if ( fp = = NULL ) {

        printf ( " Error in opening the file " ) ;

    }

    while ( fread ( &R , sizeof ( R ) , 1 , fp ) = = 1 ) {

        if ( R.mm = = mm ) {

            gotoxy ( 10 , 5 + i ) ;

            printf ( " Note % d Day = % d : % s " , i + 1 , R . dd ,  R . note ) ;

            isFound = 1 ;

            i + + ;

        }

    }

    if ( isFound = = 0 ) {

        gotoxy ( 10 ,5 ) ;

        printf ( " This Month contains no note " ) ;

    }

    gotoxy ( 10 , 7 + i ) ;

    printf ( " Press any key to back....... " ) ;

    getch ( ) ; 



}

The function mentioned above is utilized to display the note that has been added by the user.

Program for Calendar Application in C

Example

#include<stdio.h>

#include<conio.h>

#include<windows.h>



/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

struct Date{

    int dd;

    int mm;

    int yy;

};

struct Date date;



struct Remainder{

    int dd;

    int mm;

    char note[50];

};

struct Remainder R;



COORD xy = {0, 0};



void gotoxy (int x, int y)

{

        xy.X = x; xy.Y = y; // X and Y coordinates

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), xy);

}

//This will set the forground color for printing in a console window.

void SetColor(int ForgC)

{

     WORD wColor;

     //We will need this handle to get the current background attribute

     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

     CONSOLE_SCREEN_BUFFER_INFO csbi;



     //We use csbi for the wAttributes word.

     if(GetConsoleScreenBufferInfo(hStdOut, &csbi))

     {

        //Mask out all but the background attribute, and add in the forgournd color

          wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);

          SetConsoleTextAttribute(hStdOut, wColor);

     }

     return;

}



void ClearColor(){

    SetColor(15);

}



void ClearConsoleToColors(int ForgC, int BackC)

{

     WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);

     //Get the handle to the current output buffer...

     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

     //This is used to reset the carat/cursor to the top left.

     COORD coord = {0, 0};

     //A return value... indicating how many chars were written

     //   not used but we need to capture this since it will be

     //   written anyway (passing NULL causes an access violation).

     DWORD count;



     //This is a structure containing all of the console info

     // it is used here to find the size of the console.

     CONSOLE_SCREEN_BUFFER_INFO csbi;

     //Here we will set the current color

     SetConsoleTextAttribute(hStdOut, wColor);

     if(GetConsoleScreenBufferInfo(hStdOut, &csbi))

     {

          //This fills the buffer with a given character (in this case 32=space).

          FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);



          FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count );

          //This will set our cursor position for the next print statement.

          SetConsoleCursorPosition(hStdOut, coord);

     }

     return;

}



void SetColorAndBackground(int ForgC, int BackC)

{

     WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;

     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);

     return;

}

int check_leapYear(int year){ //checks whether the year passed is leap year or not

    if(year % 400 == 0 || (year % 100!=0 && year % 4 ==0))

       return 1;

    return 0;

}

void increase_month(int *mm,  int *yy){ //increase the month by one

    ++*mm;

    if(*mm > 12){

        ++*yy;

        *mm = *mm - 12;

    }

}



void decrease_month(int *mm,  int *yy){ //decrease the month by one

    --*mm;

    if(*mm < 1){

        --*yy;

        if(*yy<1600){

            printf("No record available");

            return;

        }

        *mm = *mm + 12;

    }

}



int getNumberOfDays(int month,int year){ //returns the number of days in given month

   switch(month){                          //and year

      case 1 : return(31);

      case 2 : if(check_leapYear(year)==1)

         return(29);

           else

         return(28);

      case 3 : return(31);

      case 4 : return(30);

      case 5 : return(31);

      case 6 : return(30);

      case 7 : return(31);

      case 8 : return(31);

      case 9 : return(30);

      case 10: return(31);

      case 11: return(30);

      case 12: return(31);

      default: return(-1);

   }

}



char *getName(int day){ //returns the name of the day

   switch(day){

      case 0 :return("Sunday");

      case 1 :return("Monday");

      case 2 :return("Tuesday");

      case 3 :return("Wednesday");

      case 4 :return("Thursday");

      case 5 :return("Friday");

      case 6 :return("Saturday");

      default:return("Error in getName() module.Invalid argument passed");

   }

}



void print_date(int mm, int yy){ //prints the name of month and year

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

    gotoxy(25,6);

    switch(mm){

        case 1: printf("January"); break;

        case 2: printf("February"); break;

        case 3: printf("March"); break;

        case 4: printf("April"); break;

        case 5: printf("May"); break;

        case 6: printf("June"); break;

        case 7: printf("July"); break;

        case 8: printf("August"); break;

        case 9: printf("September"); break;

        case 10: printf("October"); break;

        case 11: printf("November"); break;

        case 12: printf("December"); break;

    }

    printf(" , %d", yy);

    gotoxy(20,7);

    printf("---------------------------");

}

int getDayNumber(int day,int mon,int year){ //retuns the day number

    int res = 0, t1, t2, y = year;

    year = year - 1600;

    while(year >= 100){

        res = res + 5;

        year = year - 100;

    }

    res = (res % 7);

    t1 = ((year - 1) / 4);

    t2 = (year-1)-t1;

    t1 = (t1*2)+t2;

    t1 = (t1%7);

    res = res + t1;

    res = res%7;

    t2 = 0;

    for(t1 = 1;t1 < mon; t1++){

        t2 += getNumberOfDays(t1,y);

    }

    t2 = t2 + day;

    t2 = t2 % 7;

    res = res + t2;

    res = res % 7;

    if(y > 2000)

        res = res + 1;

    res = res % 7;

    return res;

}



char *getDay(int dd,int mm,int yy){

    int day;

    if(!(mm>=1 && mm<=12)){

        return("Invalid month value");

    }

    if(!(dd>=1 && dd<=getNumberOfDays(mm,yy))){

        return("Invalid date");

    }

    if(yy>=1600){

        day = getDayNumber(dd,mm,yy);

        day = day%7;

        return(getName(day));

    }else{

        return("Please give year more than 1600");

    }

}



int checkNote(int dd, int mm){

    FILE *fp;

    fp = fopen("note.dat","rb");

    if(fp == NULL){

        printf("Error in Opening the file");

    }

    while(fread(&R,sizeof(R),1,fp) == 1){

        if(R.dd == dd && R.mm == mm){

            fclose(fp);

            return 1;

        }

    }

    fclose(fp);

    return 0;

}



void printMonth(int mon,int year,int x,int y){ //prints the month with all days

    int nod, day, cnt, d = 1, x1 = x, y1 = y, isNote = 0;

    if(!(mon>=1 && mon<=12)){

        printf("INVALID MONTH");

        getch();

        return;

    }

    if(!(year>=1600)){

        printf("INVALID YEAR");

        getch();

        return;

    }

    gotoxy(20,y);

    print_date(mon,year);

    y += 3;

    gotoxy(x,y);

    printf("S   M   T   W   T   F   S   ");

    y++;

    nod = getNumberOfDays(mon,year);

    day = getDayNumber(d,mon,year);

    switch(day){ //locates the starting day in calender

        case 0 :

            x=x;

            cnt=1;

            break;

        case 1 :

            x=x+4;

            cnt=2;

            break;

        case 2 :

            x=x+8;

            cnt=3;

            break;

        case 3 :

            x=x+12;

            cnt=4;

            break;

        case 4 :

            x=x+16;

            cnt=5;

            break;

        case 5 :

            x=x+20;

            cnt=6;

            break;

        case 6 :

            x=x+24;

            cnt=7;

            break;

        default :

            printf("INVALID DATA FROM THE getOddNumber()MODULE");

            return;

    }

    gotoxy(x,y);

    if(cnt == 1){

        SetColor(12);

    }

    if(checkNote(d,mon)==1){

            SetColorAndBackground(15,12);

    }

    printf("%02d",d);

    SetColorAndBackground(15,1);

    for(d=2;d<=nod;d++){

        if(cnt%7==0){

            y++;

            cnt=0;

            x=x1-4;

        }

        x = x+4;

        cnt++;

        gotoxy(x,y);

        if(cnt==1){

            SetColor(12);

        }else{

            ClearColor();

        }

        if(checkNote(d,mon)==1){

            SetColorAndBackground(15,12);

        }

        printf("%02d",d);

        SetColorAndBackground(15,1);

    }

    gotoxy(8, y+2);

    SetColor(14);

    printf("Press 'n'  to Next, Press 'p' to Previous and 'q' to Quit");

    gotoxy(8,y+3);

    printf("Red Background indicates the NOTE, Press 's' to see note: ");

    ClearColor();

}



void AddNote(){

    FILE *fp;

    fp = fopen("note.dat","ab+");

    system("cls");

    gotoxy(5,7);

    printf("Enter the date(DD/MM): ");

    scanf("%d%d",&R.dd, &R.mm);

    gotoxy(5,8);

    printf("Enter the Note(50 character max): ");

    fflush(stdin);

    scanf("%[^\n]",R.note);

    if(fwrite(&R,sizeof(R),1,fp)){

        gotoxy(5,12);

        puts("Note is saved sucessfully");

        fclose(fp);

    }else{

        gotoxy(5,12);

        SetColor(12);

        puts("\aFail to save!!\a");

        ClearColor();

    }

    gotoxy(5,15);

    printf("Press any key............");

    getch();

    fclose(fp);

}



void showNote(int mm){

    FILE *fp;

    int i = 0, isFound = 0;

    system("cls");

    fp = fopen("note.dat","rb");

    if(fp == NULL){

        printf("Error in opening the file");

    }

    while(fread(&R,sizeof(R),1,fp) == 1){

        if(R.mm == mm){

            gotoxy(10,5+i);

            printf("Note %d Day = %d: %s", i+1, R.dd,  R.note);

            isFound = 1;

            i++;

        }

    }

    if(isFound == 0){

        gotoxy(10,5);

        printf("This Month contains no note");

    }

    gotoxy(10,7+i);

    printf("Press any key to back.......");

    getch();



}



int main(){

    ClearConsoleToColors(15, 5);

    SetConsoleTitle("Calender Project - ITSOURCECODE.COM");

    int choice;

    char ch = 'a';

    while(1){

        system("cls");

        printf("1. Find Out the Day\n");

        printf("2. Print all the day of month\n");

        printf("3. Add Note\n");

        printf("4. EXIT\n");

        printf("ENTER YOUR CHOICE : ");

        scanf("%d",&choice);

        system("cls");

        switch(choice){

            case 1:

                printf("Enter date (DD MM YYYY) : ");

                scanf("%d %d %d",&date.dd,&date.mm,&date.yy);

                printf("Day is : %s",getDay(date.dd,date.mm,date.yy));

                printf("\nPress any key to continue......");

                getch();

                break;

            case 2 :

                printf("Enter month and year (MM YYYY) : ");

                scanf("%d %d",&date.mm,&date.yy);

                system("cls");

                while(ch!='q'){

                    printMonth(date.mm,date.yy,20,5);

                    ch = getch();

                    if(ch == 'n'){

                        increase_month(&date.mm,&date.yy);

                        system("cls");

                        printMonth(date.mm,date.yy,20,5);

                    }else if(ch == 'p'){

                        decrease_month(&date.mm,&date.yy);

                        system("cls");

                        printMonth(date.mm,date.yy,20,5);

                    }else if(ch == 's'){

                        showNote(date.mm);

                        system("cls");

                    }

                }

                break;

            case 3:

                AddNote();

                break;

            case 4 :

                exit(0);

        }

    }

    return 0;

}

Output:

Output

. Find Out the Day

2. Print all the day of month

3. Add Note

4. EXIT

ENTER YOUR CHOICE :1

Enter date (DD MM YYYY) : 22 08 2022

ENTER YOUR CHOICE :2

---------------------------

                         August , 2022

                    ---------------------------

                    S   M   T   W   T   F   S

                        01  02  03  04  05  06

                    07  08  09  10  11  12  13

                    14  15  16  17  18  19  20

                    21  22  23  24  25  26  27

                    28  29  30  31



        Press 'n'  to Next, Press 'p' to Previous and 'q' to Quit

        Red Background indicates the NOTE, Press 's' to see note:

ENTER YOUR CHOICE: 3

Enter the date(DD/MM): 22 08

     Enter the Note(50 character max): All you need is Logic Practice

     Note is saved sucessfully

     Press any key............

--------------------------------

Process exited after 393.4 seconds with return value 0

Press any key to continue . . .

Input Required

This code uses input(). Please provide values below: