祝我们这些表面风光,内心彷徨;容颜未老,心已沧桑;似乎有才,实为江郎;成就难有,郁闷经常;比骡子累,比蚂蚁忙 ,比鸡起的早,比狗睡的晚;比驴干的多,比猪吃的差;比岳飞忠良,比赖昌星紧张的老中青年六一快乐
呵呵 今天无聊贴点代码
开始是用java写的 输入7为数字获取年月日 7为数字是太阳日的表示方法
有常规的 输入校验 比较详细的逻辑分析 后来又用cobol写了下来 贴出来看看 霍霍
java代码如下
package arithmeticForCobol;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test {
BufferedReader br;
String str;
final int MAX_YEAR = 3000;
final int MIN_YEAR = 1000;
final int MAX_DAY_Y = 366;
final int MAX_DAY_NY = 365;
final int MIN_DAY = 1;
final int IMPORTANT_P_WHOLE_DAY = 335;
final int IMPORTANT_Y_WHOLE_DAY = 336;
int a[] = new int[] { 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
365 };
int b[] = new int[] { 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
366 };
// public Test() {
// }
// the constructor function start the whole program
public Test() {
try {
br = new BufferedReader(new InputStreamReader(System.in));
System.out
.println("this application is just for the year between 1000 to 3000");
System.out.println("input data");
for (;;) {
str = br.readLine();
if (checkLength(str)) {
if (allNumeral(str)) {
if (yearMatch(str)) {
if (isYunnian(str)) {
System.out.println("yun nian");
if (day_y_Match(str)) {
System.out.println(" yun nian day match");
int realDay = getDays(str);
System.out.println("month is : "
+ getMonth(realDay,
IMPORTANT_Y_WHOLE_DAY, b)
+ " day is : "
+ getDay(realDay,
IMPORTANT_Y_WHOLE_DAY, b));
}
} else {
System.out.println("pin nian");
if (dayMatch(str)) {
System.out.println("pin nian day match");
int realDay = getDays(str);
System.out.println("month is : "
+ getMonth(realDay,
IMPORTANT_P_WHOLE_DAY, a)
+ " day is : "
+ getDay(realDay,
IMPORTANT_P_WHOLE_DAY, a));
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// check the length which the data you input, whether it's length is 7
boolean checkLength(String str) {
if (str.trim().length() != 7) {
System.out.println("lenth error,input again");
return false;
}
return true;
}
// check the whole data are numeric
boolean allNumeral(String str) {
char[] chararray = str.toCharArray();
for (int i = 0; i < chararray.length; i++) {
if ((int) (chararray[i]) < 48 || (int) (chararray[i]) > 57) {
System.out.println("you put the unallow character,input again");
return false;
}
}
return true;
}
// check the year is between 1000 to 3000 ,this simple prgram is just for
// the year between 1000 to 3000
boolean yearMatch(String str) {
String ys = str.substring(0, 4);
int ysday = Integer.parseInt(ys);
if (ysday < 1000 || ysday > 3000 || str.substring(0, 1).equals("0")) {
System.out
.println("the year must between 1000 to 3000,input again");
return false;
}
return true;
}
// check when it's ping year, whether the day match to 1 to 365
boolean dayMatch(String str) {
int days = getDays(str);
if (days < 1 || days > 365) {
System.out
.println("days error,this year is pin nian , day must between 1 to 365,input again");
return false;
}
System.out.println("day ok");
return true;
}
// check when it's yun year, whether the day match to 1 to 366
boolean day_y_Match(String str) {
int days = getDays(str);
if (days < 1 || days > 366) {
System.out
.println("days error,this year is yun nian , day must between 1 to 366,input again");
return false;
}
System.out.println("day ok");
return true;
}
// check when it's ping year,whether the day match to 1 to 365
int getDays(String str) {
int location = getTheLocationNotFirstZero(str);
String daystring = str.substring(location);
int days = Integer.parseInt(daystring);
return days;
}
// get the last three character form the data, then get the first place
// which it's not zero, then
// I can get the real day.
int getTheLocationNotFirstZero(String str) {
String s = str.substring(4);
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] != '0') {
return i + 4;
}
}
return 1;
}
// check the data input of year , whether is's a yun nian.
boolean isYunnian(String str) {
int yearnumber = Integer.parseInt(str.substring(0, 4));
if ((yearnumber % 4 == 0 && yearnumber % 100 != 0)
|| yearnumber % 400 == 0) {
System.out.println("input year is ren nian");
return true;
}
System.out.println("input year is not ren nian");
return false;
}
// get the correct month from the last three character
int getMonth(int day, int importantWholeDay, int[] m) {
if (day <= 31) {
return 1;
} else if (day >= importantWholeDay) {
return 12;
} else {
for (int i = 0; i < m.length; i++) {
if (m[i] < day && m[i + 1] >= day) {
return i + 2;
}
}
return 1;
}
}
// get the correct day from the last three character
int getDay(int day, int importantWholeDay, int[] m) {
if (day >= 1 && day <= 31) {
return day;
}
int whichMonth = getMonth(day, importantWholeDay, m);
int whichDay = day - m[whichMonth - 2];
return whichDay;
}
public static void main(String[] args) {
new Test();
}
}
然后下面就是 用cobol实现同样作用的cobol代码 了
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. TEST4.
000003 AUTHOR. GLANCER.
000004 ENVIRONMENT DIVISION.
000005 DATA DIVISION.
000006 WORKING-STORAGE SECTION.
000007 01 S-DATA.
000008 05 S-YUN-SUB PIC Z9.
000009 05 S-PING-SUB PIC Z9.
000010 01 W-SIGN PIC X VALUE 'N'.
000011 01 S-SIGN PIC X VALUE 'N'.
000012 01 SOURCE-DATA PIC X(30).
000013 01 PART-SOURCE-DATA PIC X(7).
000014 01 DATA-REAL-LENGTH PIC 99.
000015 01 ERR-MSG PIC X(60).
000016 01 MSG-DATA.
000017 05 MONTH-MSG PIC X(20).
000018 05 DAY-MSG PIC X(20).
000019 05 TIP-SIGN PIC 9 VALUE ZERO.
000020 01 TIME-DATA.
000021 05 YEAR-SIGN PIC X VALUE 'N'.
000022 05 SYEAR-DATA PIC X(4).
000023 05 SDAY-DATA PIC X(3).
000024 05 YEAR-DATA PIC 9(4).
000025 05 DAY-DATA PIC 9(3).
000026 05 MONTH-DAY-DATA PIC 9(3).
000027 05 S-MONTH-DAY-DATA PIC ZZ9.
000028 05 S-DAY-DATA PIC ZZ9.
000029 01 INPUT-TABLE.
000030 05 INPUT-ITEMS PIC X OCCURS 30 TIMES.
000031 05 INPUT-ITEMS-SUB PIC 99 USAGE IS COMP.
000032 01 PING-YEAR-DATA VALUE
000033 '031059090120151181212243273304334365'.
000034 05 PING-YEAR-ITEMS PIC 9(3) OCCURS 12 TIMES.
000035 05 PING-SUB PIC 99.
000036 01 YUN-YEAR-DATA VALUE
000037 '031060091121152182213244274305335366'.
000038 05 YUN-YEAR-ITEMS PIC 9(3) OCCURS 12 TIMES.
000039 05 YUN-SUB PIC 99.
000040 01 REM-TEST-DATA.
000041 05 TEST-DATA1 PIC 9(4).
000042 05 TEST-DATA2 PIC 9(4).
000043 05 TEST-DATA3 PIC 9(4).
000044 05 TEST-DATA11 PIC 9(4).
000045 05 TEST-DATA22 PIC 9(4).
000046 05 TEST-DATA33 PIC 9(4).
000047 PROCEDURE DIVISION.
000048 PERFORM 000-PERFORM-SEQUENCE.
000049 STOP RUN.
000050 000-PERFORM-SEQUENCE.
000051 PERFORM 100-ACCEPT-DATA.
000052 PERFORM 200-CHECK-LENGTH.
000053 PERFORM 400-CHECK-ALPHANUM.
000054 PERFORM 500-SHOW-SPECIFIC-DATA.
000055 PERFORM 700-CHECK-YEAR.
000056 PERFORM 800-CHECK-DAY.
000057 PERFORM 1000-GET-INFO.
000058 100-ACCEPT-DATA.
000059 IF TIP-SIGN = ZERO
000060 DISPLAY 'PLS INPUT THE DATA'
000061 END-IF.
000062 ACCEPT SOURCE-DATA.
000063 MOVE SOURCE-DATA TO INPUT-TABLE.
000064 PERFORM VARYING INPUT-ITEMS-SUB FROM 1 BY 1
000065 UNTIL W-SIGN = 'Y'
000066 IF INPUT-ITEMS (INPUT-ITEMS-SUB) = SPACE
000067 MOVE 'Y' TO W-SIGN
000068 END-IF
000069 IF W-SIGN = 'N'
000070 ADD 1 TO DATA-REAL-LENGTH
000071 END-IF
000072 END-PERFORM.
000073 200-CHECK-LENGTH.
000074 IF DATA-REAL-LENGTH NOT = 7
000075 MOVE 'INPUT ERROR ,LENGTH SHOULD BE 7,INPUT AGAIN'
000076 TO ERR-MSG
000077 DISPLAY ERR-MSG
000078 MOVE 'N' TO W-SIGN
000079 MOVE ZERO TO DATA-REAL-LENGTH
000080 MOVE 1 TO TIP-SIGN
000081 GO TO 000-PERFORM-SEQUENCE
000082 END-IF.
000083 300-SHOW-ERR-MSG.
000084 DISPLAY ERR-MSG.
000085 STOP RUN.
000086 400-CHECK-ALPHANUM.
000087 MOVE SOURCE-DATA (1:7) TO PART-SOURCE-DATA.
000088 IF PART-SOURCE-DATA IS NOT NUMERIC
000089 MOVE 'YOU PUT IS NOT NUMERIC,INPUT AGAIN' TO ERR-MSG
000090 DISPLAY ERR-MSG
000091 MOVE ZERO TO DATA-REAL-LENGTH
000092 MOVE 'N' TO W-SIGN
000093 GO TO 000-PERFORM-SEQUENCE
000094 END-IF.
000095 500-SHOW-SPECIFIC-DATA.
000096 MOVE PART-SOURCE-DATA (1:4) TO SYEAR-DATA.
000097 MOVE PART-SOURCE-DATA (5:3) TO SDAY-DATA.
000098 COMPUTE YEAR-DATA = FUNCTION NUMVAL (SYEAR-DATA).
000099 COMPUTE DAY-DATA = FUNCTION NUMVAL (SDAY-DATA).
000100 PERFORM 600-CHECK-TIMEDATA.
000101 600-CHECK-TIMEDATA.
000102 IF YEAR-DATA > 3000 OR YEAR-DATA < 1000
000103 MOVE 'YEAR SHOULD BETWEEN 1000 TO 3000 ,INPUT AGAIN '
000104 TO ERR-MSG
000105 DISPLAY ERR-MSG
000106 MOVE ZERO TO DATA-REAL-LENGTH
000107 MOVE 'N' TO W-SIGN
000108 GO TO 000-PERFORM-SEQUENCE
000109 END-IF.
000110 700-CHECK-YEAR.
000111 DIVIDE YEAR-DATA BY 4 GIVING TEST-DATA1
000112 REMAINDER TEST-DATA11.
000113 DIVIDE YEAR-DATA BY 100 GIVING TEST-DATA2
000114 REMAINDER TEST-DATA22.
000115 DIVIDE YEAR-DATA BY 400 GIVING TEST-DATA3
000116 REMAINDER TEST-DATA33.
000117 IF TEST-DATA11 = 0 AND TEST-DATA22 NOT = 0
000118 MOVE 'Y' TO YEAR-SIGN
000119 END-IF.
000120 IF TEST-DATA33 = 0
000121 MOVE 'Y' TO YEAR-SIGN
000122 END-IF.
000123 800-CHECK-DAY.
000124 IF YEAR-SIGN = 'Y'
000125 IF DAY-DATA > 366 OR DAY-DATA = 0
000126 MOVE 'THE MAX DAY OF THIS YEAR IS 366,INPUT AGAIN'
000127 TO ERR-MSG
000128 DISPLAY ERR-MSG
000129 MOVE ZERO TO DATA-REAL-LENGTH
000130 MOVE 'N' TO W-SIGN
000131 MOVE 'N' TO YEAR-SIGN
000132 GO TO 000-PERFORM-SEQUENCE
000133 END-IF
000134 END-IF.
000135 IF YEAR-SIGN = 'N'
000136 IF DAY-DATA > 365 OR DAY-DATA = 0
000137 MOVE 'THE MAX DAY OF THIS YEAR IS 365,INPUT AGAIN'
000138 TO ERR-MSG
000139 DISPLAY ERR-MSG
000140 MOVE ZERO TO DATA-REAL-LENGTH
000141 MOVE 'N' TO W-SIGN
000142 GO TO 000-PERFORM-SEQUENCE
000143 END-IF
000144 END-IF.
000145 1000-GET-INFO.
000146 IF YEAR-SIGN = 'Y'
000147 IF DAY-DATA <= 31
000148 MOVE 'MONTH IS 1' TO MONTH-MSG
000149 MOVE DAY-DATA TO S-DAY-DATA
000150 STRING 'DAY IS' S-DAY-DATA DELIMITED BY SIZE
000151 INTO DAY-MSG
000152 PERFORM 1100-SHOW-MSG
000153 END-IF
000154 IF DAY-DATA >= 336
000155 MOVE 'MONTH IS 12' TO MONTH-MSG
000156 COMPUTE MONTH-DAY-DATA = DAY-DATA - YUN-YEAR-ITEMS (11)
000157 MOVE MONTH-DAY-DATA TO S-MONTH-DAY-DATA
000158 STRING 'DAY IS ' S-MONTH-DAY-DATA DELIMITED BY
000159 SIZE INTO DAY-MSG
000160 PERFORM 1100-SHOW-MSG
000161 END-IF
000162 IF DAY-DATA > 31 AND DAY-DATA < 336
000163 PERFORM VARYING YUN-SUB FROM 1 BY 1 UNTIL
000164 S-SIGN = 'Y'
000165 IF DAY-DATA > YUN-YEAR-ITEMS(YUN-SUB)
000166 AND DAY-DATA <= YUN-YEAR-ITEMS(YUN-SUB + 1)
000167 MOVE 'Y' TO S-SIGN
000168 COMPUTE YUN-SUB = YUN-SUB + 1
000169 MOVE YUN-SUB TO S-YUN-SUB
000170 STRING 'MONTH IS ' S-YUN-SUB DELIMITED BY
000171 SIZE INTO MONTH-MSG
000172 COMPUTE MONTH-DAY-DATA
000173 = DAY-DATA - YUN-YEAR-ITEMS (YUN-SUB - 1)
000174 MOVE MONTH-DAY-DATA TO S-MONTH-DAY-DATA
000175 STRING 'DAY IS' S-MONTH-DAY-DATA DELIMITED BY SIZE
000176 INTO DAY-MSG
000177 PERFORM 1100-SHOW-MSG
000178 END-IF
000179 END-PERFORM
000180 END-IF
000181 MOVE 'APPLICATION OVER ,THANK YOU !' TO ERR-MSG
000182 PERFORM 300-SHOW-ERR-MSG
000183 END-IF.
000184 IF YEAR-SIGN = 'N'
000185 IF DAY-DATA <= 31
000186 MOVE 'MONTH IS 1 ' TO MONTH-MSG
000187 MOVE DAY-DATA TO S-DAY-DATA
000188 STRING 'DAY IS ' S-DAY-DATA DELIMITED BY SIZE INTO
000189 DAY-MSG
000190 PERFORM 1100-SHOW-MSG
000191 END-IF
000192 IF DAY-DATA >= 335
000193 MOVE 'MONTH IS 12 ' TO MONTH-MSG
000194 COMPUTE MONTH-DAY-DATA = DAY-DATA - PING-YEAR-ITEMS (11)
000195 MOVE MONTH-DAY-DATA TO S-MONTH-DAY-DATA
000196 STRING 'DAY IS' S-MONTH-DAY-DATA DELIMITED BY
000197 SIZE INTO DAY-MSG
000198 PERFORM 1100-SHOW-MSG
000199 END-IF
000200 IF DAY-DATA > 31 AND DAY-DATA < 335
000201 PERFORM VARYING PING-SUB FROM 1 BY 1 UNTIL
000202 S-SIGN = 'Y'
000203 IF DAY-DATA > PING-YEAR-ITEMS(PING-SUB)
000204 AND DAY-DATA <= PING-YEAR-ITEMS(PING-SUB + 1)
000205 MOVE 'Y' TO S-SIGN
000206 COMPUTE PING-SUB = PING-SUB + 1
000207 MOVE PING-SUB TO S-PING-SUB
000208 STRING 'MONTH IS ' S-PING-SUB DELIMITED BY
000209 SIZE INTO MONTH-MSG
000210 COMPUTE MONTH-DAY-DATA
000211 = DAY-DATA - PING-YEAR-ITEMS (PING-SUB - 1)
000212 MOVE MONTH-DAY-DATA TO S-MONTH-DAY-DATA
000213 STRING 'DAY IS ' S-MONTH-DAY-DATA DELIMITED BY SIZE
000214 INTO DAY-MSG
000215 PERFORM 1100-SHOW-MSG
000216 END-IF
000217 END-PERFORM
000218 END-IF
000219 MOVE 'APPLICATION OVER, THANK YOU !' TO ERR-MSG
000220 PERFORM 300-SHOW-ERR-MSG
000221 END-IF.
000222 1100-SHOW-MSG.
000223 DISPLAY '****************' .
000224 DISPLAY '* ' MONTH-MSG .
000225 DISPLAY '* ' DAY-MSG .
000226 DISPLAY '****************'.
第一次在博客里面贴代码 。。。 呵呵