计算机组织 家庭作业(第二次截止)
关于处理和提交的说明
订阅DeepL Pro以翻译大型文件。 欲了解更多信息,请访问www.DeepL.com/pro。
作业的解决方案必须是独立创建的。如果提交的材料与其他材料相同或惊人的相似,将被评估为抄袭抄袭 是一种欺骗行为,会导致整个模块考试的成绩为 “不及格”。
• 请使用MARS来模拟你的解决方案。请确保你提交的方案能在MARS中执行。
• 你将收到每个任务的单独文件,包括默认和解决方案部分。请在所提供的空间中加入你的姓名
和预科生编号。要解决该任务,只需在标记下面的解决方案部分工作。 #+ 解决方案部分 #+
• 你的解决方案也必须能在给定值之外的其他输入值下工作。为了用其他输入值测试你的代码, 你可以改变解决方案部分的样本数据。
• 请不要对默认部分做任何修改,保留默认标记(以#+开头的行)不做任何修改。
• 一个正确的解决方案必须符合已知的注册惯例。通常情况下,尽管
如果不遵守登记簿的惯例,就会产生正确的结果。在这种情况下,仍然会被扣分。
• 如果你想在你的解决方案中为数据使用额外的内存区域,请只使用堆栈,而不是数据部分(
.data)的静态数据。使用堆栈可能是必要的,以符合寄存器的惯例。
• 要实现的函数必须使用参数寄存器($a0-$a3)中的值作为输入。汇编文件的数据部分的数据不能直
接用它们的标签来引用。
• 请以可理解的方式设计你的汇编代码,并使用详细的注释来解释你的汇编代码如何工作。
• 提交是通过ISIS进行的。分别上传两个提交文件。
任务1:计算资本化(10分) 任务:实现函数cap_words,该函数返回字符串中大写字母的数量。要实现的函数的C语言签名是。
袠褑袠袠褑 爷 爷 爷 爷 爷 爷 cap_words( char* string)。
$v0 $a0 String是一个指向字符串的第一个字符的指针。这个字符串以空结尾。每个字符的大小是一个字节,
可以用ASCII数字值来检查。例如,在MIPS绿卡上可以找到一个ASCII表。 如果单词的第一个字母是大写字母,那么该单词将被算作大写字母。单词之间总是用空格隔开。不
作为单词的第一个字母出现的大写字母不应计算在内。除了字母之外
Programming Help
和空格、标点符号和特殊字符可能会出现,这些都应被忽略。不允许出现冒号。 例子。默认包含用于测试的字符串test_string,欢迎你编辑它,用进一步的例子来检查你的解决方案
。下表包含了输入和预期返回值的例子,可用于测试。 输入字符串
“这里只有名词是大的:猴子、香蕉、小丑、思考”。 “一个1,两个2,三个3,A,B,C” “短,但很多,因为。Aa A A AaaaAa” “一个好的团队是不可能的”。 “只有部分字母ZAll可以写成gROss。”
任务2:通过排列组合运行(10分)
背景:交换(“swap”)是一个指令。 一个数组的元素如何被重新排列。有n个!安排n个元素的可能性1。因
此,有n个长度为n的不同per-mutations。对于某些应用,有所有的 按一定顺 序排列的一定长度的排列组合- – – – – – 。
叠加。例如,排列组合可以按照词典的顺序进行,即按照它们在词典中的 排列顺序进行2。
任务:实现函数 nextperm。该函数将确定所传递的长度为perm的 lexicographic继承者。perm将通过一系列调用给定的辅助函数swap( 就地)转换为lexicographic继承者。必须使用给定的辅助函数swap。 如果成功,nextperm应返回值1。如果perm是所传递长度的最后一个 permutation,nextperm将返回值0。要实现的函数的C签名是。
int nextperm( char *perm, int length)。 $v0 $a0 $a1
例子:表1显示了长度为4的排列组合。
顺序。这是测试程序对给定的起始排列组合(0 1 2 3)的预期输出。 你可以改变你的
也可以通过以下方式测试其他启动方式的程序代码
调整默认文件中test_perm和test_perm_length的值。 一旦nextperm返回0或者nextperm被调用1000次,测试程序就会终止
1 n!是n的阶乘,即所有自然数≥1且≤n的积。
表1:长度为4的排列组合,按 词汇表顺序排列。
迭代 迭代(0)。 0 1 2 3
1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 0 2 3 0 3 2 2 0 3 2 3 0 3 0 2 3 2 0 0 1 3 0 3 1 1 0 3 1 3 0 3 0 1 3 1 0 0 1 2 0 2 1 1 0 2 1 2 0
2 词法顺序可以在数学上定义为。当且仅当存在p(k)k,同时perm[l]>perm[k]。
3. 第三步包括交换索引k和l的元素。这必须通过调用互换函数来完成。
4. 第四步,也是最后一步,是将数组中k元素之后的部分,即k+1到数组的长度,按相反的顺序排 列。为此再次使用交换函数,这次是在一个循环中。例如,可以使用两个指数i和j,每一步都是i递增, j递减,直到i等于或大于j。
• 与先前的家庭作业不同,这次作业中的排列组合被存储在一个字节数组(char[] / char *)中
• 每一个长度为n的有效排列组合都恰好包含了0和n-1之间的每一个整数一次。
• 你可以假设排列组合的长度在1到127之间。数组中只有正数。
• 算法的工作原理:如果把一个排列组合看作是由0到n-1的n个不同数字组成的序列,即排列组合 的每个元素都是以n为基数的数制中的一个数字,那么下一个排列组合就是也有n个不同数字 的第一个后续自然数。与自然数不同的是,数字在一个排列组合中不得出现超过一次。一个数 字的下一个值会跳过所有已经出现在它左边的数字值,而把下一个更大的数字值往右移。当所有较 大的数字值都不再可用时,即所有向右的数字值都较小时,就会发生进位。与普通加法一样, 进位后,左边的下一个数字也会增加。溢出后,只有当一个数字左边的所有数字都被确定后, 才能确定该数字的值。
为了计算类似于一个数字的下一个排列组合,而不检查每一个后续数字,该算法首先搜索最后 一个数字,该数字在增加时不会产生另一个套利。这是一个从左到右的最后一个数字,它的右 边还有一个更大的数字。在找到的数字通过与更右边的最小的大数字互换而增加后,所有有套利 的数字位置从左到右取下一个自由值,这就导致了数字的上升序列,从而使之前的数字下降序 列发生逆转。
3 所述的算法也可以在维基百科上找到。 https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
程序代写 CS代考 加QQ: 749389476