演習問題16解答例

問1 カレンダーの出力
問2 ファイルの連結

[問1]特定の月のカレンダーを出力するプログラムを,cout を利用して書け.
/****************************/
/* 特定月のカレンダー表示   */
/*      coded by Y.Suganuma */
/****************************/
#include <iostream>
using namespace std;
/*
     クラスDateの定義
*/
class Date {
		int year;    // 年
		int month;   // 月
		int day;     // 日
		int tu;      // 西暦1年1月1日からの通算日
	public:
					// コンストラクタ
		Date() {}
					// コンストラクタ(年月日入力)
		Date(int n, int m, int l)
		{
			int i1;

			year  = n;
			month = m;
			day   = l;
			tu    = day;

			for (i1 = 1; i1 < year; i1++) {
				if ((i1%4 == 0 && i1%100 != 0) || i1%400 == 0)
					tu += 366;
				else
					tu += 365;
			}

			for (i1 = 1; i1 < month; i1++) {
				if (i1 == 2) {
					if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
						tu += 29;
					else
						tu += 28;
				}
				else {
					if (i1 == 4 || i1 == 6 || i1 == 9 || i1 == 11)
						tu += 30;
					else
						tu += 31;
				}
			}
		}
					// コンストラクタ(通算日入力)
		Date(int n)
		{
			int k = 0, sw = 0;

			tu    = 0;
			year  = 1;
			month = 1;

			while (sw == 0) {
				if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
					k += 366;
				else
					k += 365;
				if (k < n) {
					tu = k;
					year++;
				}
				else
					sw = 1;
			}

			while (sw > 0) {
				if (month == 2) {
					if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
						k = 29;
					else
						k = 28;
				}
				else {
					if (month == 4 || month == 6 || month == 9 || month == 11)
						k = 30;
					else
						k = 31;
				}
				if (tu+k < n) {
					tu += k;
					month++;
				}
				else {
					sw   = 0;
					day  = n - tu;
					tu  += day;
				}
			}
		}
					// -のオーバーロード
		int operator - (const Date &b)
		{
			return tu - b.tu;
		}
};
/*
     main
*/
int main()
{
	int year, month, day = 1, m = 1, n, k, i1;
					// 西暦元年1月1日からの通算日
	cout << "年,月は? ";
	cin >> year >> month;
	Date a(year, month, day);
	Date b(1, 1, 1);
	n = a - b;
					// 1日の曜日の決定
	n = n % 7 + 1;
	if (n == 7)
		n = 0;
					// 出力
	cout.width(4);
	cout << "     " << year << "年";
	cout.width(2);
	cout << month << "月\n";
	cout << " 日 月 火 水 木 金 土\n";

	if (month == 2) {
		if ((year%4 == 0 && year%100 != 0) || year%400 == 0)
			k = 29;
		else
			k = 28;
	}
	else {
		if (month == 4 || month == 6 || month == 9 || month == 11)
			k = 30;
		else
			k = 31;
	}

	for (i1 = 0; i1 < 7; i1++) {
		if (i1 >= n) {
			cout.width(3);
			cout << m;
			m++;
		}
		else
			cout << "   ";
	}
	cout << endl;

	while (m <= k) {
		for (i1 = 0; i1 < 7 && m <= k; i1++) {
			cout.width(3);
			cout << m;
			m++;
		}
		cout << endl;
	}

	return 0;
}
		
[問2]任意の数のテキストファイルを連結して出力する,つまり,
cat file1 file2 ・・・
を実現するプログラムを書け.
/****************************/
/* 任意の数のファイルの連結 */
/*      coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <fstream>
using namespace std;

#define MAX_LINE 300

int main(int argc, char *argv[])
{
	int i1;
	char line[MAX_LINE];

	for (i1 = 1; i1 < argc; i1++) {

		ifstream in(argv[i1]);

		while (!in.eof()) {
			in.getline(line, MAX_LINE);
			cout << line << endl;
		}

		in.close();
	}

	return 0;
}
		

菅沼ホーム 演習解答例目次 本文目次 付録 索引