演習問題16解答例

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

[問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;
}
    
+++ Javaの場合 +++
/********************************/
/*     特定月のカレンダー表示   */
/*          coded by Y.Suganuma */
/********************************/
import java.io.*;
/*
     クラスDateの定義
*/
class Date {
	private int year;    // 年
	private int month;   // 月
	private int day;     // 日
	private int tu;      // 西暦1年1月1日からの通算日
					// コンストラクタ
	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 minus(Date b)
	{
		return tu - b.tu;
	}
}
/*
     main
*/
public class Test {
	public static void main(String args[]) throws IOException
	{
		int year, month, day = 1, m = 1, n, k, i1;
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
					// 西暦元年1月1日からの通算日
		System.out.print("年は? ");
		year = Integer.parseInt(in.readLine());
		System.out.print("月は? ");
		month = Integer.parseInt(in.readLine());
		Date a = new Date (year, month, day);
		Date b = new Date (1, 1, 1);
		n = a.minus(b);
					// 1日の曜日の決定
		n = n % 7 + 1;
		if (n == 7)
			n = 0;
					// 出力
		System.out.println("     " + year + "年" + month + "月");
		System.out.println(" 日 月 火 水 木 金 土");

		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) {
				System.out.print(" ");
				if (m > 9)
					System.out.print(m);
				else
					System.out.print(" " + m);
				m++;
			}
			else
				System.out.print("   ");
		}
		System.out.println();

		while (m <= k) {
			for (i1 = 0; i1 < 7 && m <= k; i1++) {
				System.out.print(" ");
				if (m > 9)
					System.out.print(m);
				else
					System.out.print(" " + m);
				m++;
			}
			System.out.println();
		}
	}
}
    
[問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;
}
    
+++ Javaの場合 +++
/********************************/
/*     任意の数のファイルの連結 */
/*          coded by Y.Suganuma */
/********************************/
import java.io.*;

public class Test {
	public static void main(String args[]) throws IOException
	{
		int i1;
		String line;

		for (i1 = 0; i1 < args.length; i1++) {

			BufferedReader in = new BufferedReader(new FileReader(args[i1]));

			while ((line = in.readLine()) != null)
				System.out.println(line);

			in.close();
		}
	}
}
    

ホームページ 目次 演習解答例目次 付録目次 索引