3日間魚を打って2日間ネットJavaコードを干して実現します

2404 ワード

一:テーマの要求:
中国には「三日坊主」ということわざがある.ある人は2010年1月1日から「3日間魚を打って2日間網を干す」ことを始め、その人にその後のある日に「魚を打つ」か「網を干す」かを聞いた.CまたはC++言語/java/python実装プログラムで問題を解決します.キーボードで日付を入力し、ファイルを読み、網を干すか魚を打つかを判断し、結果を書く必要があります.
 
まず解決しなければならないのは入力日のフォーマットの問題で、問題の要求によって、入力した日付のフォーマットは8桁の純数字で、例えば2010年1月1日は2010,0101で、それでは入力した日付は8桁の純数字で自然に考えたのは正規表現String regex="\d{8}";Stringクラスのmatchesメソッドを呼び出すと、入力日が8桁の純数値フォーマットであるかどうかを簡単に判断できます.8桁の純数字と判断して終了しなかったのは、2010年1月1日からであるため、入力した日付は必ず2010年1月1日より大きくなければならない.次に、月は12ヶ月、大月の日数は31日、小月の日数は30日、閏年の2月は29日、平年の2月は28日である.これらは日付フォーマットの正しいかどうかに影響し、次の日付操作に影響する.StringクラスのsubString()でそれぞれ1-4ビット,5-6ビット,7-8ビットをIntegerクラスのparseInt()メソッドで切り取ったサブストリングをintタイプに変換すればそれぞれ上から下へ日付の具体的なフォーマット判断が可能になると思います.
 
次はキーボードで日付を入力する必要がありますが、判断する日付の個数は確定していません.while(true)サイクルでは、入力を継続するか否かでループから飛び出したか否かを判断することで、入力する日付の具体的な個数を決定します.また、キーボードに入力された各日付文字列を不定長の配列で保存する必要があります.集合でいいです.あまり考えずにArrayListセットを使えばいいし、他のセットも選べます.
 
入力が終了し、入力された日付文字列がセットに格納されると、各文字列をin.txtに遍歴し、println()メソッドを直接使用して文字列を書くことができるPrintStreamを書きます.このプログラムの実装に便利で、in.txtに文字列を書くのは簡単です.
 
次はin.txtの内容を読み込んで魚を打ったり網を干したりする判断をしてout.txtに結果を書けばいいです.同じくPrintStreamのprintln()メソッドを使用します.
プログラムをより人間的にするために、out.txtに結果を書いた後、java.awt.Desktop.getDesktop().open()メソッドを呼び出して、プログラムの実行の最後にout.txtを直接開き、結果をより直感的にします.
ここまで、プログラムのほぼ実現は、言い換えればまだ実現されていないが、本プログラムが具体的に実現しなければならないのは魚を打つか網を干すかの判断であり、実現の方法は、与えられた日付と初期日付の時間2010年1月1日までの日数の差によって、さらに3日間の魚を打つか2日間の網を干すかの5日間の循環によって、残りを取ることである.与えられた日付が魚を打つか網を干すかを判断するには、平年閏年、2月の日数を判断する必要があります.入力フォーマットの判断では、閏年平年の判断が行われているため、JavaのCalendarを直接使うことを考えました.Calendar類自体は抽象類で、抽象的な方法を実現するサブクラスの対象で、その1つの値は2010年1月1日です.もう1つは指定された日付で、2つのオブジェクトがgettimeInMillis()メソッドを呼び出してミリ秒差を取得し、ミリ秒と日の単位換算に基づいて日数の差を求めることができます.
long day = (now.getTimeInMillis() - first.getTimeInMillis())/1000/60/60/24;
2010年1月1日という日を含めるために5日一巡の判断ができるday++;
もう1つの考え方は、最初に私が考えたのは、このクラスのオブジェクトを呼び出すaddメソッドが2010年1月1日から所定の日付と同じになるまで1日増加し続けていることです.このメソッドは非常にインテリジェント化されているため、属性Calendar.DATEの増加は、1ヶ月31日または30日または29日の上限を超えずに自動的に年月の変化を行います.しかし、この考え方は、与えられた日付が長くなると、時間がかかります.
int count = 0;
while (true) {
    if (first.get(Calendar.YEAR) == now.get(Calendar.YEAR) && first.get(Calendar.MONTH) == now.get(Calendar.MONTH) && first.get(Calendar.DATE) == now.get(Calendar.DATE)) {
        break;
    }
    first.add(Calendar.DATE, 1);
    count++;
}
count++;

以上は私が3日魚を打って2日網を干すjavaコードに対して実現する構想です