我的名字是Michael Boutros,我现在是高中的高年级学生。明年我将参加滑铁卢大学,并作为他们CS课程的入门读物,我一直在做一些任务。他们使用的语言是Scheme,我一直在学习它。我来自PHP和Ruby背景,所以我担心从这些语言中学到的一些习惯被错误地应用到我正在使用的方案中。以下是作业中的问题(顺便提一下在线提供):
编写一个名为子时间的函数,它消耗表示时间的字符串开始时间,以及a 自然数分钟,表示之前的分钟数。该函数产生一个 表示在给定时间开始时间之前的分钟的字符串。
消耗的字符串格式如下:两位数字,后跟“小时”, 接着是两位数字,然后是“分钟”。消耗的时间是24小时 格式。如果小时数或分钟数小于10,则该数字将包括前导0。 生成的字符串必须采用以下格式:数字,后跟“小时”, 接下来是一个数字,然后是“分钟”。请注意,生成的字符串没有 数字小于10之前的前导0.生成的时间可能代表一个时间 在前一天。
例如,
•(子时间“03小时15分钟”0)产生
“3小时15分钟”,
•(子时间“13小时05分钟”845)产生
“23小时0分钟”,和 •(分时“13小时05分钟”2881)产生了 “13小时4分钟”内置的Scheme函数string-> number和number->字符串可能很有用。
完全按照描述生成字符串非常重要,否则自动测试将失败。特别是,所有字符必须是小写字母,并且必须是单个字符 字符串所有部分之间的空格。
请勿在解决方案中使用任何cond表达式。
(老实说,直到现在我才注意到最后一行,我的解决方案确实使用了条件表达式。有什么方法可以避免它们吗?)
这是我的解决方案:
;; Assignment 1 Question 4
(define (convert-to-string hours minutes)
(string-append (number->string hours) " hours " (number->string minutes) " minutes"))
(define (subtract_hours start_hours sub_hours minutes)
(let ((hours (- start_hours (modulo sub_hours 24))))
(if (< hours 0)
(convert-to-string (+ 24 hours) minutes)
(convert-to-string hours minutes))))
(define (subtract_minutes start_hours start_minutes sub_hours sub_minutes)
(let ((minutes (- start_minutes sub_minutes)))
(if (< minutes 0)
(subtract_hours start_hours (+ 1 sub_hours) (+ 60 minutes))
(subtract_hours start_hours sub_hours minutes))))
(define (sub-time start-time mins)
(let ((start_hours (string->number (substring start-time 0 2)))
(start_minutes (string->number (substring start-time 9 11)))
(sub_hours (quotient mins 60))
(sub_minutes (modulo mins 60)))
(subtract_minutes start_hours start_minutes sub_hours sub_minutes)))
我对Scheme非常不熟悉,虽然我的解决方案有效(来自我的有限测试),但我想知道一些经验丰富的退伍军人必须说些什么。谢谢你的时间!
答案 0 :(得分:2)
是的,您可以在没有任何条件的情况下编写此代码。考虑将小时+分钟转换为分钟数,然后进行减法,然后将结果转换回小时+分钟。
答案 1 :(得分:0)
我使用分钟转换的想法做了回答,并提出了似乎有用的东西。关于我们是否被允许使用条件似乎存在争议,所以我玩得很安全并且没有使用任何条件。
不幸的是,我对Scheme一无所知,但希望这段代码足够香草,你应该可以转换。
int offset; //the mins we are going to subtract
int startTimeInMins = inputHours * 60;
startTimeInMins += inputMins;
int offsetDayRolled = offset mod 1440;
int newTime = startTimeInMins - offsetDayRolled;
newTime += 1440;
newTime = newTime mod 1440;
int newHours = newTime / 60;
int newMins = newTime mod 60;