要求输入几个年份,然后输入每个年,求每个年两两之间相差的天数,lua语言

来源:互联网 发布:ubuntu 备份系统 编辑:程序博客网 时间:2024/05/16 08:01

首先输入要求的是多少年,然后再输入各个年,再求每个年两两之间相差的天数,lua语言:

总共是两个类

第一个是:


require("YearPrint")
--require("StartPrintYearMonthDay")
--1、输入方法:a、输入;b、数据存储;c、输入结束
--2、判断闰年
--3、判断输入日期是否正确:a,年份是否正确;b,月份是否正确;c,判断日期是否正确
--4、计算日期差:a,整年计算;b,非整年计算




monthDays ={31,28,31,30,31,30,31,31,30,31,30,31} --初始化12个月,每个月的天数
local dateTable = {} --本地化的一个数组,并接受了YearPrint累里的数据


--[[--
--输入有多少个年份,分别计算两两之间相差的天数
--@return #number 返回输入的年份
--]]
local function inPutCountYear()
print("\n请输入想要多少个年份进行比较,然后按回车:")
local inPutYear = io.read();
local countYear = tonumber(inPutYear)
if countYear == nil or countYear <= 1 then
print("格式错误,请重新输入!")
countYear = inPutCountYear()
end
return countYear
end
--[[--
--获取输入的第一个日期
--@param #number index 标示当先输入的是第几个数据
--]]
local function inPutDate(index)
print("请输入第 ".. index .." 个日期:");
dateTable[index] = {}
dateTable[index] = YMDPrint.getDate()
dateTable[index].Year = tonumber(dateTable[index].Year);
dateTable[index].Month = tonumber(dateTable[index].Month);
dateTable[index].Day = tonumber(dateTable[index].Day);
print("输入的第"..index.."个数据已存储================")
end
--[[--
--判断是否是闰年
--@param #number Year 年份
--@return #boolean true 是闰年,false 不是
--]]
function isleapYear(Year)
return (tonumber(Year)%4==0 and tonumber(Year)%100 ~=0) or tonumber(Year)%400==0;
end


--[[--
--计算本年已经过了多少天
--@param #number year 传递过来的参数是年数
--@param #number month 传递过来的参数是月份
--@param #number day 传递过来的参数是日期
--@return #day 返回的是这一年的天数
--]]
local function getDays(year,month,day)
--判断是否是闰年,如果为闰年,改变2月是29,否则改变2月是28
if ((year%4==0 and year%100 ~= 0) or year%400==0) then
monthDays[2] = 29
else
monthDays[2] = 28
end
for i = 1,month-1 do
day = day + monthDays[i];
end
-- 返回的结果是这一年到月份的天数
return day;
end


--[[--
--@param #number year 传递多来的年数
--@return #number 判断年数是否为闰年,如果是闰年,返回366天,反之则返回365天
--]]
local function returnYearDays(year)
--判断是否闰年,如果闰年,返回366天,如果不是闰年,返回365天
return ((year%4==0 and year%100 ~=0) or year%400==0) and 366 or 365;
end


--[[--
--@param #number year 输入的年份
--@param #number month 输入的月份
--@param #number day 输入的日期
--@return #number 是两个年份相差的天数
--]]
local function sumDay(dateTableOne, dateTableTwo)
local sum = 0;--两个年月份相差的天数
if dateTableOne.Year < dateTableTwo.Year then
-- 小于nYear年
for x = dateTableOne.Year, dateTableTwo.Year - 1 do
-- 传递年数过去,number型
sum = sum + returnYearDays(x);
end
-- 传递的是number型
sum = sum + getDays(dateTableTwo.Year, dateTableTwo.Month, dateTableTwo.Day);
sum = sum - getDays(dateTableOne.Year, dateTableOne.Month, dateTableOne.Day);
elseif dateTableOne.Year == dateTableTwo.Year then
-- 如果是同一年,判断月份的大小,然后去绝对值
sum = math.abs(getDays(dateTableOne.Year, dateTableOne.Month, dateTableOne.Day) - getDays(dateTableTwo.Year, dateTableTwo.Month, dateTableTwo.Day));
else
-- 大于nYear年
for i = dateTableTwo.Year + 1 ,dateTableOne.Year do
sum = sum + returnYearDays(i);
end
sum = sum + getDays(dateTableOne.Year, dateTableOne.Month, dateTableOne.Day);
sum = sum - getDays(dateTableTwo.Year, dateTableTwo.Month, dateTableTwo.Day);


end
return sum
end


--[[--
--计算日期差
--@param #type name description
--@param #type name description
--]]
local function getDateDif(dateTableOne, dateTableTwo)
print("第一个日期为:")
print(dateTableOne["Year"].."-"..dateTableOne["Month"].."-"..dateTableOne["Day"])
print("第二个日期为:")
print(dateTableTwo.Year.."-"..dateTableTwo.Month.."-"..dateTableTwo.Day)
local num = sumDay(dateTableOne, dateTableTwo)
print("相差天数为:" .. num .. "\n");
end


--[[--
--计算两两之间相差的天数
--]]
local function countDate(dateMaxNum)
local count = 0
for i = 1, dateMaxNum do
for j =  i + 1, dateMaxNum do
getDateDif(dateTable[i], dateTable[j])
count = count + 1
end
end
print("\n总的组合为 :" ..count)
end


--[[--
--结果输出
--]]
function main()
local dateMaxNum = inPutCountYear()
while #dateTable < dateMaxNum do
inPutDate(#dateTable + 1);
end
countDate(dateMaxNum)
end

main()


第二个类:

module("YMDPrint",package.seeall);


--[[--
--判断年份是否合法
--@param #number year 年份
--@return #boolean 如果为true,年份合法,如果为false,不合法
--]]
local function logicYear(year)
local isTrue = true;
if tonumber(year) == nil or tonumber(year) < 0 or tonumber(year) > 9999 then
isTrue = false;
end
return isTrue;
end


--[[--
--判断月份是否合法
--@param #number month 月份
--@return #boolean 如果为true,月份合法,如果为false,不合法
--]]
local function logicMonth(month)
local isTrue = true;
if tonumber(month) == nil or tonumber(month) < 0 or tonumber(month) > 12 then
isTrue = false;
end
return isTrue;
end


--[[--
--判断日期是否合法
--@param #number year 年份
--@param #number month 月份
--@param #number day 日期
--@return #boolean 如果为true,月份合法,如果为false,不合法
--]]
local function logicDay(year, month, day)
local isTrue = true;
if tonumber(year) == nil or tonumber(month) == nil or tonumber(day) == nil then
isTrue = false;
return isTrue;
end


if isleapYear(year) then
--是闰年
monthDays[2] = 29
else
--不是闰年
monthDays[2] = 28
end


if monthDays[tonumber(month)] < tonumber(day) then
isTrue = false;
end


return isTrue;
end


--[[--
--输入年份
--@return #number 返回输入的年份
--]]
local function inPutYear()
print("请输入年份(0-9999),然后按回车:")
local year = io.read()
return year;
end


--[[--
----输入月份
--@return #number 返回输入的月份
--]]
local function inPutMonth()
print("请输入月份,然后按回车:")
local month = io.read()
return month;
end


--[[--
----输入日期
--@return #day 返回输入的日期
--]]


local function inPutDay()
print("请输入日期,然后按回车:")
local day = io.read()
return day;
end


--[[--
--判断输入日期是否合法
--]]
local function printDayLogic(Year, Month)
local Day = inPutDay();
-- 判断输入的年份是否合法
if logicDay(Year, Month, Day) then
print("输入成功!")
print("=======================")
else
print("日期格式错误,请重新输入!")
Day = printDayLogic(Year, Month);
end
return Day;
end


--[[--
--判断输入月份是否合法
--]]
local function printMonthLogic()
local Month = inPutMonth();
-- 判断输入的年份是否合法
if not logicMonth(Month) then
print("月份格式错误,请重新输入!")
Month = printMonthLogic();
end
return Month;
end


--[[--
--输入年月日
--]]
local function printYearLogic()
local Year = inPutYear();
-- 判断输入的年份是否合法
if not logicYear(Year) then
print("年份格式错误,请重新输入!")
Year = printYearLogic();
end
return Year;
end


function getDate()
local data = {};--data.Year 输入的年份;data.Month 输入的月份;data.Day 输入的日期
-- data是保存输入的年月日
data.Year = printYearLogic();
data.Month = printMonthLogic();
data.Day = printDayLogic(data.Year, data.Month);
return data;
end


如果输入的年数是3个年份

然后输入的是2014-7-1,2014-7-2,2014-7-4

得出的结果是2014-7-1,2014-7-2,相差1天

2014-7-1,2014-7-4,相差3天

2014-7-2,2014-7-4,相差2天


组合为:3


这是一个年月份的算法题,做起来那没那么简单,提供给那些想学Lua语言的人,这是我实习的时候我师傅教我的,

非常感谢我的师傅,哈哈哈

思维的确和敏捷,继续学习,欢迎交流

0 0
原创粉丝点击