先上效果图由于课程设置,选修了一门非常非常小众的REBOL语言的程序设计概论,就自己观点来看,这门语言小众,语法晦涩,教材也不太好,书中作者试图一直把我们以门外汉这样灌输知识给我们,我觉得这点作者做的不是特别好,比如说流行语言中的变量,用书中作者的话就变成了单字。。。赋值就是设字。。。这看来非常的不专业,而且某种程度上貌似在拐弯,这是我对这本教材不能接受的地方。当然,对于初学者来说,这无可厚非。欸,怪我怪我,来了这么渣的专业,全机电学大物3,就我们班学大物2(2比3难),你说一堆搞机器人的学的比一堆学影视动画广告特技的还简单,这课程设置真是呵呵哒。 好了,吐槽完了,说正事吧。这个日历是课程大作业,占总成绩30分。由于本系不是每个人都喜欢程序设计,就像我讨厌画画一样,欸,所以,在家靠父母,出门靠朋友,能帮的尽量帮咯。作业要求是本程序中的第二种输出,我多做了几个功能,源码也贴上吧。看到博客的相信你们都有需求,能改的尽量改咯,全抄的后果是啥我没试过。。。欸,也考考你们的动手能力啦
REBOL
[
title: "Calendar"
version: 1.0.0
author:wizChen
]
;判断数据是否合法
validata: func["判断数据是否合法"
year [integer!]
month [integer!]
day [integer!]
]
[
if( (year < 1) or (year > 9999) or (month < 1) or (month > 12))
[
return FALSE
]
if( day < 0)
[
return FALSE
]
if(day == 29)
[
return ( (month == 2) and (isLeapYear year) or (month != 2))
]
if(day == 30)
[
return ((month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12))
]
if(day > 31)
[
return FALSE
]
return TRUE
]
;如果输入某年某月某日,进行'1'操作处理
setDays: func["如果输入某年某月某日,进行'1'操作处理"]
[
weekDay: 0
year: str2int ask { please input the year:}
month: str2int ask { please input the month:}
day: str2int ask { please input the day:}
while[ ! validata year month day ]
[
year: str2int ask { please input the year:}
month: str2int ask { please input the month:}
day: str2int ask { please input the day:}
]
weekDay: remainder ( getAllDays year month day ) 7
switch/default weekDay
[
0
[
print [ year"/"month"/"day"/" "today is Sunday" ]
outThreeLines
]
1
[
print [ year"/"month"/"day"/" "today is Monday" ]
outThreeLines
]
2
[
print [ year"/"month"/"day"/" "today is Tuesday" ]
outThreeLines
]
3
[
print [ year"/"month"/"day"/" "today is Wednesday" ]
outThreeLines
]
4
[
print [ year"/"month"/"day"/" "today is Thursday" ]
outThreeLines
]
5
[
print [ year"/"month"/"day"/" "today is Friday" ]
outThreeLines
]
6
[
print [ year"/"month"/"day"/" "today is Saturday" ]
outThreeLines
]
][print "data is illegal!"]
]
;如果选输入某年某月,进行'2'操作处理
setMonth: func["如果选输入某年某月,进行'2'操作处理"]
[
weekDay: 0
year: str2int ask { please input the year:}
month: str2int ask { please input the month:}
day: 1
while[ ! validata year month day ]
[
year: str2int ask { please input the year:}
month: str2int ask { please input the month:}
]
weekDay: ( remainder ( getAllDays year month day ) 7 + 1 )
outPrint year month
]
;如果输入某年,进行'3'操作处理
setYear: func["如果输入某年,进行'3'操作处理"]
[
m: 1
year: str2int ask { please input the year:}
month: 1
day: 1
while[ ! validata year month day ]
[
year: str2int ask { please input the year:}
]
while[ m <= 12 ]
[
outPrint year m
m: m + 1
]
]
;函数功能:提示用户输入,进行操作选择
inputData: func ["提示用户输入,进行操作选择"]
[
flag: TRUE
while[flag]
[
print "Welcome to my Calendar,please input the selections below"
print ""
print "1:input the year,month and day,showing what day is it today"
print ""
print "2:input the year and month,showing the month calendar"
print ""
print "3:input the year,showing the year calendar"
print ""
print "4:exit"
print ""
choose: str2int ask { please input a number: }
switch/default choose
[
1 [ setDays ]
2 [ setMonth ]
3 [ setYear ]
4 [ quit ]
]
[
print "wrong input,please input again!"
inputData
]
]
]
;得到这一天距离公元1年1月1日多少天
getAllDays: func ["得到这一天距离公元1年1月1日多少天"
year [integer!]
month [integer!]
day [integer!]
]
[
i: 1
j: 1
monthDays: 0
yearDays: 0
sumDays: 0
mEveryMonth: [ 31 28 31 30 31 30 31 31 30 31 30 31 ]
;while循环自加计算年数对天数的影响
while[ i < year ]
[
either isLeapYear i
[
yearDays: yearDays + 366
]
[
yearDays: yearDays + 365
]
i: i + 1
]
;while循环自加计算月数对天数的影响
while[ j < month]
[
monthDays: monthDays + ( pick mEveryMonth j)
if(isLeapYear year )
[
monthDays: monthDays + 1
]
j: j + 1
]
sumDays: yearDays + monthDays + day
return sumDays
]
;判断是否为闰年
isLeapYear: func["判断是否为闰年"
year [integer!]
]
[
;取余运算符 remainder arg1 arg2
return ((( remainder year 4 ) == 0) and (( remainder year 100 ) != 0) or (( remainder year 400 ) == 0 ))
]
;string类型转integer类型
str2int: func["string类型转integer类型"
str [string!]
]
[
return ( to-integer str )
]
;月份翻译转换
monthTrans: func["月份翻译转换"
month [integer!]
]
[
switch/default month
[
1 [return "January"]
2 [return "February"]
3 [return "March"]
4 [return "April"]
5 [return "May"]
6 [return "June"]
7 [return "July"]
8 [return "August"]
9 [return "September"]
10 [return "October"]
11 [return "November"]
12 [return "December"]
]
[
print "data is illegal!"
]
]
;格式化输出
outPrint: func["格式化输出"
year [integer!]
month [integer!]
]
[
weekDay: 0
day :1
n: 1
isFisrtLine: TRUE
print [" "year"A.D"(monthTrans month)]
print " SUN MON TUE WES THU FRI SAT"
weekDay: (remainder (getAllDays year month day) 7)
switch/default weekDay
[
0 [
prin ""
]
1 [
prin " "
]
2 [
prin " "
]
3 [
prin " "
]
4 [
prin " "
]
5 [
prin " "
]
6 [
prin " "
]
][print "data is illegal!"]
mEveryMonth: [ 31 28 31 30 31 30 31 31 30 31 30 31 ]
while[ n <= (pick mEveryMonth month) ]
[
weekDay: remainder weekDay 7
either weekDay == 0
[
either isFisrtLine
[
prin ""
]
[
print ""
]
isFisrtLine: FALSE
prin " "
outChar n
]
[
either isFisrtLine
[
prin ""
]
[
prin " "
]
isFisrtLine: FALSE
outChar n
]
weekDay: weekDay + 1
n: n + 1
]
outThreeLines
]
;格式化输出字符串
outChar: func["格式化输出字符串"
dayNum[integer!]
]
[
either dayNum < 10
[
prin [" "dayNum]
]
[
prin[" "dayNum]
]
]
;输出三行空字符
outThreeLines: func["输出三行空字符"]
[
i: 0
while[i <= 2]
[
print ""
i: i + 1
]
]
;执行脚本
inputData
这个同样功能的日历用C++写的时候200多行,用这门语言写用了300行。欸,C++已经够繁重了,这们脚本语言看起来真不咋地,比他强的一抓一大把,个人觉得学python都比学这好。至少人家用的python人数比rebol多多少。。。欸,吐槽归吐槽,然后又有什么卵用呢。
最后几个内建REBOL函数解释一下吧,免得看的云里雾里(也可以自己去官方文档查看用法,或者直接在REBOL输入? FunctionName即可查看函数的功能,这儿FunctionName指的是函数的名字,比如说你要查exit函数的功能,输入? exit,它便会返回此函数的功能): 1.remainder函数功能:取余 2.pick函数功能:简单讲就是从一个block中取出对应下标的数据 好像其他的也没什么好讲了,就这样吧
版权声明:本文为博主原创文章,未经博主允许不得转载。
原博发布在,地址:http://blog.csdn.net/wiz_Chen/article/details/46780533
转载于:https://www.cnblogs.com/wiz-Chen/p/4625740.html
相关资源:REBOL编程语言 3.0