【自顶向下】设计一个打印当月日历的程序

  1. 打印当月日历,可以被分为两个子问题:获取用户输入、打印日历。
  2. 使用cin来读取输入,而打印日历再次分为两个子问题:打印日历头、打印日历主体。
  3. 日历头又包含:月份、年份、星期。
  4. 打印日历体需要知道:当月第一天是星期几、当月有多少天、哪一年是闰年、每个月有多少天。

根据上面四步,给出思维导图。

 

根据思维导图,先给出代码框架。

#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;

void printMonth(int year, int month);
void printMonthTitle(int year, int month);
void printMonthName(int month);
void printMonthBody(int year, int month);
int getStartDay(int year, int month);
int getTotalNumberOfDays(int year, int month);
int getNumberOfDaysInMonth(int year, int month);
bool isLeapYear(int year);

int main()
{
	//Prompt the user to enter year
	cout << "Enter year (e.g. 2019): ";
	int year;
	cin >> year;

	//Prompt the user to enter month
	cout << "Enter month in number between 1 and 12: ";
	int month;
	cin >> month;

	//Print calendar for the month of the year
	printMonth(year, month);

	return 0;
}

void printMonth(int year, int month)
{

}

 

 

完整代码:

 

#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;

// Function prototypes
void printMonth(int year, int month);
void printMonthTitle(int year, int month);
void printMonthName(int month);
void printMonthBody(int year, int month);
int getStartDay(int year, int month);
int getTotalNumberOfDays(int year, int month);
int getNumberOfDaysInMonth(int year, int month);
bool isLeapYear(int year);

int main()
{
	// Prompt the user to enter year
	cout << "Enter year (e.g. 2019): ";
	int year;
	cin >> year;

	// Prompt the user to enter month
	cout << "Enter month in number between 1 and 12: ";
	int month;
	cin >> month;

	// Print calendar for the month of the year
	printMonth(year, month);

	return 0;
}

// Print the calendar for a month in a year. 
// Month calendar consists of heading and body.
void printMonth(int year, int month)	
{
	printMonthTitle(year, month);
	printMonthBody(year, month);
}

// Print the month title, e.g. February, 2019
void printMonthTitle(int year, int month)
{
	printMonthName(month);
	cout << " " << year << endl;
	cout << "-----------------------------" << endl;
	cout << " Sun Mon Tue Wed Thu Fri Sat" << endl;
}

// Get English name for the month
void printMonthName(int month)
{
	switch (month)
	{
	case 1:
		cout << "January";
		break;
	case 2:
		cout << "February";
		break;
	case 3:
		cout << "Match";
		break;
	case 4:
		cout << "April";
		break;
	case 5:
		cout << "May";
		break;
	case 6:
		cout << "June";
		break;
	case 7:
		cout << "July";
		break;
	case 8:
		cout << "August";
		break;
	case 9:
		cout << "September";
		break;
	case 10:
		cout << "October";
		break;
	case 11:
		cout << "November";
		break;
	case 12:
		cout << "December";
	}
}

// Print month body
void printMonthBody(int year, int month)
{
	// Get start day of the week for the first date in the month
	int startDay = getStartDay(year, month);	
	
	// Get number of days in the month
	int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);	

	// Pad space before the first day of the month
	int i = 0;
	for (i = 0; i < startDay; i++)
		cout << "    ";
	for (i = 1; i <= numberOfDaysInMonth; i++)
	{
		cout << setw(4) << i;	// set width
		if ((i + startDay) % 7 == 0)
			cout << endl;
	}
}

// Get the start day of the first day in a month
int getStartDay(int year, int month)
{
	// Get total number of days since 1800-01-01
	int startDay1800 = 3;
	int totalNumberOfDays = getTotalNumberOfDays(year, month);

	// Return the start day
	return (totalNumberOfDays + startDay1800) % 7;
}

// Get the total number of days since January 1, 1800
int getTotalNumberOfDays(int year, int month)
{
	int total = 0;

	// Get the total days from 1800 to year - 1
	for (int i = 1800; i < year; i++)
		if (isLeapYear(i))
			total = total + 366;
		else
			total = total + 365;

	// Add days from Jan to the month prior to the calendar month
	for (int i = 1; i < month; i++)
		total = total + getNumberOfDaysInMonth(year, i);

	return total;
}

// Get the number of days in a month
int getNumberOfDaysInMonth(int year, int month)
{
	if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		return 31;
	if (month == 4 || month == 6 || month == 9 || month == 11)
		return 30;
	if (month == 2)
		return isLeapYear(year) ? 29 : 28;

	return 0;	// If month is incorrect
}

//Determine if it is a leap year
bool isLeapYear(int year)
{
	return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

效果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值