演習問題10解答例

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

[問1]特定の月のカレンダーを出力するプログラムを書け.
/****************************/
/* 特定月のカレンダー表示   */
/*      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 */
/****************************/
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();
		}
	}
}
		

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