⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calendar.c

📁 The art and science of c_source code!
💻 C
字号:
/* * File: calendar.c * ---------------- * This program is used to generate a calendar for a year * entered by the user. */#include <stdio.h>#include "genlib.h"#include "simpio.h"/* * Constants: * ---------- * Days of the week are represented by the integers 0-6. * Months of the year are identified by the integers 1-12; * because this numeric representation for months is in * common use, no special constants are defined. */#define Sunday     0#define Monday     1#define Tuesday    2#define Wednesday  3#define Thursday   4#define Friday     5#define Saturday   6/* Function prototypes */void GiveInstructions(void);int GetYearFromUser(void);void PrintCalendar(int year);void PrintCalendarMonth(int month, int year);void IndentFirstLine(int weekday);int MonthDays(int month, int year);int FirstDayOfMonth(int month, int year);string MonthName(int month);bool IsLeapYear(int year);/* Main program */main(){    int year;    GiveInstructions();    year = GetYearFromUser();    PrintCalendar(year);}/* * Function: GiveInstructions * Usage: GiveInstructions(); * -------------------------- * This procedure prints out instructions to the user. */void GiveInstructions(void){    printf("This program displays a calendar for a full\n");    printf("year.  The year must not be before 1900.\n");}/* * Function: GetYearFromUser * Usage: year = GetYearFromUser(); * -------------------------------- * This function reads in a year from the user and returns * that value.  If the user enters a year before 1900, the * function gives the user another chance. */int GetYearFromUser(void){    int year;    while (TRUE) {        printf("Which year? ");        year = GetInteger();        if (year >= 1900) return (year);        printf("The year must be at least 1900.\n");    }}/* * Function: PrintCalendar * Usage: PrintCalendar(year); * --------------------------- * This procedure prints a calendar for an entire year. */void PrintCalendar(int year){    int month;    for (month = 1; month <= 12; month++) {        PrintCalendarMonth(month, year);        printf("\n");    }}/* * Function: PrintCalendarMonth * Usage: PrintCalendarMonth(month, year); * --------------------------------------- * This procedure prints a calendar for the given month * and year. */void PrintCalendarMonth(int month, int year){    int weekday, nDays, day;    printf("    %s %d\n", MonthName(month), year);    printf(" Su Mo Tu We Th Fr Sa\n");    nDays = MonthDays(month, year);    weekday = FirstDayOfMonth(month, year);    IndentFirstLine(weekday);    for (day = 1; day <= nDays; day++) {        printf(" %2d", day);        if (weekday == Saturday) printf("\n");        weekday = (weekday + 1) % 7;    }    if (weekday != Sunday) printf("\n");}/* * Function: IndentFirstLine * Usage: IndentFirstLine(weekday); * -------------------------------- * This procedure indents the first line of the calendar * by printing enough blank spaces to get to the position * on the line corresponding to weekday. */void IndentFirstLine(int weekday){    int i;    for (i = 0; i < weekday; i++) {        printf("   ");    }}/* * Function: MonthDays * Usage: ndays = MonthDays(month, year); * -------------------------------------- * MonthDays returns the number of days in the indicated * month and year.  The year is required to handle leap years. */int MonthDays(int month, int year){    switch (month) {      case 2:        if (IsLeapYear(year)) return (29);        return (28);      case 4: case 6: case 9: case 11:        return (30);      default:        return (31);    }}/* * Function: FirstDayOfMonth * Usage: weekday = FirstDayOfMonth(month, year); * ---------------------------------------------- * This function returns the day of the week on which the * indicated month begins.  This program simply counts * forward from January 1, 1900, which was a Monday. */int FirstDayOfMonth(int month, int year){    int weekday, i;    weekday = Monday;    for (i = 1900; i < year; i++) {        weekday = (weekday + 365) % 7;        if (IsLeapYear(i)) weekday = (weekday + 1) % 7;    }    for (i = 1; i < month; i++) {        weekday = (weekday + MonthDays(i, year)) % 7;    }    return (weekday);}/* * Function: MonthName * Usage: name = MonthName(month); * ------------------------------- * MonthName converts a numeric month in the range 1-12 * into the string name for that month. */string MonthName(int month){    switch (month) {      case  1: return ("January");      case  2: return ("February");      case  3: return ("March");      case  4: return ("April");      case  5: return ("May");      case  6: return ("June");      case  7: return ("July");      case  8: return ("August");      case  9: return ("September");      case 10: return ("October");      case 11: return ("November");      case 12: return ("December");      default: return ("Illegal month");    }}/* * Function: IsLeapYear * Usage: if (IsLeapYear(year)) . . . * ---------------------------------- * This function returns TRUE if year is a leap year. */bool IsLeapYear(int year){    return ( ((year % 4 == 0) && (year % 100 != 0))             || (year % 400 == 0) );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -