2016-01-05 50 views
0

我正在学习C语言,我必须制作一个程序,在其中输入一个字符串并调用函数,该函数会告诉您在字符串中重复次数最多的两个字母。但该函数返回错误的字母。事情是,我已经使用了我之前制作的程序片段,所以我不知道为什么它现在不工作。C - 程序不能正常工作,我错过了什么?

这里是困扰我的功能,我认为问题出现在第二个循环中,因为如果我printf字母表中每个字母的重复次数,它应该是完全一样的,重复次数每个字母与字符串相比是正确的。但第二个for循环仍然不会返回正确的字母。

void najcescaSlova(char *niz, int *znak) { 
    int i, slova[26]={0}, duljina=0, znak1, znak2; 

    while (niz[duljina] != '\0') 
     ++duljina; 

    for (i=0; i < duljina; ++i) { 
     if (niz[i] >= 'A' && niz[i] <= 'Z') 
      ++slova[niz[i] - 65]; 

     if (niz[i] >= 'a' && niz[i] <= 'z') 
      ++slova[niz[i] - 97]; 
    } 

    znak1 = znak2 = -1; 

    for (i=0; i < 26; ++i) { 
     if (slova[i] != 0) { 
      if (slova[i] == znak1) { 
       znak2 = i; 
      } 

      if (slova[i] > znak1) { 
       znak2 = znak1; 
       znak1 = i; 
      } 

      if (slova[i] < znak1 && slova[i] > znak2) { 
       znak2 = i; 
      } 
     } 
    } 

    znak[0] = znak1; 
    znak[1] = znak2; 

    return; 
} 

对不起,该方案是我的母语,但我可以关闭,如果你想重新讨论这个问题。

slova [26]是保存每个字母的重复次数的数组。

niz是输入字符串。

znak1和znak2是两个最大的字母,而znak1被认为是最大的。

这里的事情是,slova [0]是7,而slova [2]是5,所以当i = 0时,znak1设置为0,因为0代表A,但是当i = 2时,znak1设置为2,代表C,即使if(slova [i]> znak1)条件不满足,则为5的slova [i]小于先前设置为7的znak1。

对不起这太长了,谢谢你的时间。

+2

请编辑您的问题,以便它包含有意义的信息。 *程序不能正常工作*已经清除(如果它正常工作,您不需要在此发布),以及*我缺少什么*是简单的无意义噪声。您的标题应该描述您遇到的实际问题,这对未来在搜索结果中看到它的读者会有意义。 –

+0

硬编码值'65'和'97'是'魔术'数字。 '魔术'数字使得代码更难理解,调试和维护。建议使用:'A'和'a'分别代替65和97 – user3629249

+0

硬编码值'26'是一个'魔术'数字。 '魔术'数字使得代码更难理解,调试和维护。建议使用#define为该号码提供一个有意义的名称,并在整个代码/ – user3629249

回答

1

当你写slova[i] == znak1znak1 = i你混淆了由i举行的0-25字母索引的概念和发生次数的计数,在slova[i]举行。

在你的第二个for回路则需要两个变量保持第一和第二最高寻到计数,并且还另外两个持有对应于那些计数(可以使用这些znak[0]znak[1]字母的索引,但我'不知道这个变量命名是否变得奇怪)。一个例子是在这里(假定znak阵列被正确初始化):

for (i=0; i < 26; ++i) { 
     if (slova[i] != 0) { 
      if (slova[i] == znak1) { 
       znak[1]= i; 
       znak1 = slova[i]; 
      } 

      if (slova[i] > znak1) { 
       znak[1] = znak[0]; 
       znak[0]= i; 
       znak2 = znak1; 
       znak1 = slova[i]; 
      } 

      if (slova[i] < znak1 && slova[i] > znak2) { 
       znak[1]= i; 
       znak2 = slova[i] 
      } 
     } 
    } 

在这里,我已经用于第一和第二位最常见的字母znak[0]znak[1]和,和znak1znak2这些字母的频率。

1

你的问题是不清楚znak1znak2是什么意思?它们是最大的字母的指数还是值?

如果它们是索引,则比较如slova[i] == znak1是错误的。应该是slova[i] == slova[znak1]

但是如果它们是值,那么分配如znak1 = i是错误的。它应该是znak1 = slova[i]

0

您已将znak1znak2用作数组索引(integers)和最大字母(char)的值。

如果您的意思是将它们用作数组索引,则将slova[i] == znak1更改为slova[i] == slova[znak1]

如果它们被认为是最大的字母值,那么znak1 = i和类似任务是不正确的。相反,你应该使用znak1 = slova[i]

在以下答案
0

,代码将挑选的高值的第一次出现,当存在具有相同的高值的多个条目。

  1. 总是试图本地化数据
  2. 总是试图写仍然没有工作

最简单的代码开始与所有的复杂代码:

znak1 = znak2 = -1; 

和当地znak1和znak2

的声明可以用下面的SIMPL取代e代码:

for (int i=0, znak_x = -1; i < 26; ++i) 
    { 
     if (slova[i] > znak_x) 
     { 
      znak_x = i; 
     } 
    } 

    // eliminate this high count from the slova[] array 
    slova[znak_x] = 0; 

    // save the high count index into the caller's array 
    znak[0] = znak_x; 

    for (int i=0, znak_x = -1; i < 26; ++i) 
    { 
     if (slova[i] > znak_x) 
     { 
      znak_x = i; 
     } 
    } 

    // save the second high count index into the caller's array 
    znak[1] = znak_x; 
} // end function: najcescaSlova 
相关问题