should have done

“should have + 动词的完成式”表示本应该做而实际上没有做,它的否定形式表示某种行为本不该发生但却发生了。有责备的意味。

You should have started earlier, but you didn't.
你本应该早点儿出发,但是你没有。

You should have washed the wound.
你应该已经洗好了伤口。

She shouldn't have taken away my dictionary, for I wanted to use it.
她本不应该拿走我的词典,因为我要用它。

You shouldn't have been so rude to him.
你本不应该对他那么粗鲁。

注:“should have + 完成式”虽然可以表猜测,但因为会造成歧义,应少用。

ought to have done

1、“ought to have + 动词的完成式”表示过去应做某事而实际未做,它的否定形式表示本不应该做某事却做了(用法和should相同)。

You ought to have helped him, but you didn't.
你本应该帮助他但你没有。

You ought to have studied harder.
你本应该更努力学习的。

He ought not to have stopped his work halfway.
他本不应该做这项工作时半途而废。

He oughtn't to have done that.
他本来就不该做那件事。

2、“ought to have + 动词的完成式”还可以用来表猜测。

They ought to have arrived by now.
现在他们想必已经到达。

If he had started at nine o'clock, he ought to have been in London by eleven o'clock.
如果他在九点出发,那他十一点钟该到达伦敦了。