w3resource

C Exercises: Calendar for any year


35. Text Calendar Generation Variants

Write a C program to generate a text calendar for any given year.

Sample Data:
C Programming: Colorful numbers.

C Code:

//#Source: shorturl.at/adgO5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int width = 80, year; 
int cols, lead, gap;

const char *wdays[] = { "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" };
struct months {
	const char *name;
	int days, start_wday, at;
} months[12] = {
	{ "January",	31, 0, 0 },
	{ "February",	28, 0, 0 },
	{ "March",	31, 0, 0 },
	{ "April",	30, 0, 0 },
	{ "May",	31, 0, 0 },
	{ "June",	30, 0, 0 },
	{ "July",	31, 0, 0 },
	{ "August",	31, 0, 0 },
	{ "September",	30, 0, 0 },
	{ "October",	31, 0, 0 },
	{ "November",	30, 0, 0 },
	{ "December",	31, 0, 0 }
};

void space(int n) { while (n-- > 0) putchar(' '); }

void init_months()
{
	int i;

	if ((!(year % 4) && (year % 100)) || !(year % 400))
		months[1].days = 29;

	year--;
	months[0].start_wday
		= (year * 365 + year/4 - year/100 + year/400 + 1) % 7;

	for (i = 1; i < 12; i++)
		months[i].start_wday =
			(months[i-1].start_wday + months[i-1].days) % 7;

	cols = (width + 2) / 22;
	while (12 % cols) cols--;
	gap = cols - 1 ? (width - 20 * cols) / (cols - 1) : 0;
	if (gap > 4) gap = 4;
	lead = (width - (20 + gap) * cols + gap + 1) / 2;
        year++;
}

void print_row(int row)
{
	int c, i, from = row * cols, to = from + cols;
	space(lead);
	for (c = from; c < to; c++) {
		i = strlen(months[c].name);
		space((20 - i)/2);
		printf("%s", months[c].name);
		space(20 - i - (20 - i)/2 + ((c == to - 1) ? 0 : gap));
	}
	putchar('\n');

	space(lead);
	for (c = from; c < to; c++) {
		for (i = 0; i < 7; i++)
			printf("%s%s", wdays[i], i == 6 ? "" : " ");
		if (c < to - 1) space(gap);
		else putchar('\n');
	}

	while (1) {
		for (c = from; c < to; c++)
			if (months[c].at < months[c].days) break;
		if (c == to) break;

		space(lead);
		for (c = from; c < to; c++) {
			for (i = 0; i < months[c].start_wday; i++) space(3);
			while(i++ < 7 && months[c].at < months[c].days) {
				printf("%2d", ++months[c].at);
				if (i < 7 || c < to - 1) putchar(' ');
			}
			while (i++ <= 7 && c < to - 1) space(3);
			if (c < to - 1) space(gap - 1);
			months[c].start_wday = 0;
		}
		putchar('\n');
	}
	putchar('\n');
}

void print_year()
{
	int row;
	char buf[32];
	sprintf(buf, "%d", year);
	space((width - strlen(buf)) / 2);
	printf("%s\n\n", buf);
	for (row = 0; row * cols < 12; row++)
		print_row(row);
}

int main(int c, char **v)
{ 
	int i, year_set = 0;
	printf("Input a valid year: ");
    scanf("%d", &year);
	for (i = 1; i < c; i++) {
		if (!strcmp(v[i], "-w")) {
			if (++i == c || (width = atoi(v[i])) < 20)
				goto bail;
		} else if (!year_set) {
			if (!sscanf(v[i], "%d", &year) || year <= 0)
				year = 1969;
			year_set = 1;
		} else
			goto bail;
	}

	init_months();
	print_year();
	return 0;

bail:	fprintf(stderr, "bad args\nUsage: %s year [-w width (>= 20)]\n", v[0]);
	exit(1);
}

Sample Output:

Input a valid year:                                       2022

            January                 February                 March        
      Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa
                         1           1  2  3  4  5           1  2  3  4  5
       2  3  4  5  6  7  8     6  7  8  9 10 11 12     6  7  8  9 10 11 12
       9 10 11 12 13 14 15    13 14 15 16 17 18 19    13 14 15 16 17 18 19
      16 17 18 19 20 21 22    20 21 22 23 24 25 26    20 21 22 23 24 25 26
      23 24 25 26 27 28 29    27 28                   27 28 29 30 31 
      30 31                                           

             April                    May                     June        
      Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa
                      1  2     1  2  3  4  5  6  7              1  2  3  4
       3  4  5  6  7  8  9     8  9 10 11 12 13 14     5  6  7  8  9 10 11
      10 11 12 13 14 15 16    15 16 17 18 19 20 21    12 13 14 15 16 17 18
      17 18 19 20 21 22 23    22 23 24 25 26 27 28    19 20 21 22 23 24 25
      24 25 26 27 28 29 30    29 30 31                26 27 28 29 30 

              July                   August                September      
      Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa
                      1  2        1  2  3  4  5  6                 1  2  3
       3  4  5  6  7  8  9     7  8  9 10 11 12 13     4  5  6  7  8  9 10
      10 11 12 13 14 15 16    14 15 16 17 18 19 20    11 12 13 14 15 16 17
      17 18 19 20 21 22 23    21 22 23 24 25 26 27    18 19 20 21 22 23 24
      24 25 26 27 28 29 30    28 29 30 31             25 26 27 28 29 30 
      31                                              

            October                 November                December      
      Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa
                         1           1  2  3  4  5                 1  2  3
       2  3  4  5  6  7  8     6  7  8  9 10 11 12     4  5  6  7  8  9 10
       9 10 11 12 13 14 15    13 14 15 16 17 18 19    11 12 13 14 15 16 17
      16 17 18 19 20 21 22    20 21 22 23 24 25 26    18 19 20 21 22 23 24
      23 24 25 26 27 28 29    27 28 29 30             25 26 27 28 29 30 31
      30 31 

Flowchart:

C Programming Flowchart: Colorful numbers.
C Programming Flowchart: Colorful numbers.
C Programming Flowchart: Colorful numbers.

For more Practice: Solve these Related Problems:

  • Write a C program to generate a text calendar for any given year, with weekends highlighted.
  • Write a C program to create a formatted text calendar for a given year with proper alignment and spacing.
  • Write a C program to generate a text calendar that marks the current date if the input year is the current year.
  • Write a C program to generate a text calendar for any year and export the calendar to a text file.

Go to:


PREV : Colorful Number Test Subroutine Variants.
NEXT : C Basic Declarations and Expressions Home

C Programming Code Editor:



Contribute your code and comments through Disqus.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Follow us on Facebook and Twitter for latest update.