人格测试MATLAB

时间:2014-09-29 16:33:40

标签: matlab if-statement switch-statement strtok

我很抱歉问这些家伙,但这个问题一直是我存在的祸根一周。我本来应该能够解决它,但我似乎无法让它工作。我需要做的是进行性格测试的代码。它基于这个圈子:

                            1
                        10        2

                     9               3

                     8               4

                        7         5
                             6        

所以我已经把我的意见交给了我。我有三个:type1,pVec1和subType1。 pVec是我假设我必须索引的向量。 type1被赋予我作为我的主导或隐性特征。我要做的就是确定我的其他特征是什么。如果他们给了我我的主导特征,那么第一个字母将被大写。如果它是隐性的,它是小写的。主导和隐性特征总是相互对立。如果我有一个显性人格类型3,我的隐性将是8型(使用圆圈)。此外,我的翅膀个性类型是基于我的主导类型。它们是左右数字(在这种情况下,2和4将是我的翅膀个性类型)。子类型只是告诉我是否要添加关于我的主导类型的东西。

 Test Cases:
      type1 = 'helper';
      pVec1 = ['Reformer Helper Achiever Individualist Dreamer Investigator    
               Loyalist Enthusiast Challenger Peacemaker'];
    subType1 = 'alone';
[dom1, rec1, wings1] = personalityTest(type1,pVec1,subType1);
      dom1 > 'Loyalist_a'
      rec1 => 'Helper'
       wings1 => 'Enthusiast Investigator'

所以我必须让它做那样的事情。到目前为止,我有:

 function[dominant, recessive, wings] = personalityTest(type, pVec, subtype)
 type_list = strsplit(pVec);

 position = find(strcmpi(type, type_list), 1, 'first');
 dominant = upper(type(1));
 dominant = char(type);
 recessive = lower(type(1));
 recessive = char(type);
 switch type
case recessive
    dominant = position + 5;
case dominant
    recessive = char(dominant - 5);
 end

 leftwing = char(dominant + 1);
 rightwing = char(dominant - 1);

 wings = [leftwing rightwing];
 if strcmp(subtype, 'alone')
    dominant = [dominant '_a'];
elseif strcmp(subtype, 'smallGroup')
    dominant = [dominant, '_s'];
else 
    dominant = [dominant, '_1'];
end

我的功能一直让我为显性(或只是_a)留空。我该如何解决这个问题?我想让它在第五个位置给我这个词。

1 个答案:

答案 0 :(得分:3)

单步执行代码将有助于向您显示错误。

type = 'helper';
pVec = ['Reformer Helper Achiever Individualist Dreamer Investigator    
          Loyalist Enthusiast Challenger Peacemaker'];
subType = 'alone';

执行功能的以下行

 type_list = strsplit(pVec);

 position = find(strcmpi(type, type_list), 1, 'first');
 dominant = upper(type(1));
 dominant = char(type);
 recessive = lower(type(1));
 recessive = char(type);

dominantrecessive的结果设置为这些值

dominant = 'helper'
recessive = 'helper'

我认为,这里的意图是确定类型字符串的第一个字符是大写还是小写。换句话说,我们想要TrueFalse的{​​{1}}或dominant值。

函数recessive将输入upper()string转换为大写。要检查第一个字符是大写还是小写,请尝试

char

作业

dominant  = type(1) == upper(type(1))
recessive = type(1) == lower(type(1))

是不必要的(它们会覆盖以前的计算!)。

现在接下来的代码行将更接近于产生正确的输出。

dominant = char(type);
recessive = char(type);

这里有三个(可能是四个)问题。

  1. switch type case recessive dominant = position + 5; case dominant recessive = char(dominant - 5); end 。如果dominant = position + 5的值为position,则9将等于dominant。由于此处的目的是使用14索引到类型列表,因此可能会导致数组索引超出边界错误。解决这个问题的方法是使用模数(余数)函数,即dominant。余数函数基本上是“除dominant = (position + 4) % 10 + 1之后(p + 5)的余数是多少。奇怪的1和4是将可能分配给10的值的范围保持在[1}之内,10]。

  2. 如果人格特质向量(dominant)总是长度为pVec,那么将5硬编码到计算中就可以了。但是,如果10的长度可以变化,那么您需要确定正确的值来增加位置。如果长度是偶数,则应为pVec

  3. 在您当前的代码迭代中,行length(pVec)/2将评估为recessive = char(dominant - 5)。当你从字符串中减去一个整数然后再次转换为字符串时,这并没有多大意义。而是在类型列表中计算隐性特征的索引。这与2中概述的程序完全相同。

  4. 使用表明其功能的变量名称可以帮助您更清楚地思考代码。

  5. 目标是使用recessive = char('helper' - 5)dominant作为recessive的索引。您忘记在每个交换机案例中设置2个索引中的1个。

  6. 下一行代码:

    type_list

    索引到leftwing = char(dominant + 1); rightwing = char(dominant - 1); 以获得左翼和右翼的正确值。注意数组索引越界错误。

    下一行:

    type_list

    再次,索引问题。解决这些问题,你就可以免费回家了。