我正在学习C,我必须创建一个程序,你输入一个字符串并调用函数,它告诉你2个字母在字符串中重复次数最多。但该函数返回错误的字母。问题是,我使用过我之前制作的程序片段,所以我不知道为什么它现在不起作用。
这是困扰我的功能,我认为问题出现在第二个for循环中,因为如果我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)条件未满足,slova [i](即5)小于znak1,之前设置为7。
对不起,如果这太长了,谢谢你的时间。
答案 0 :(得分:1)
当您编写slova[i] == znak1
和znak1 = 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]
作为第一和第二常见字母,znak1
和znak2
作为这些字母的频率。
答案 1 :(得分:1)
您的问题是,znak1
和znak2
的含义不明确?它们是最大字母的索引还是值?
如果它们是索引,则slova[i] == znak1
之类的比较是错误的。它应该是slova[i] == slova[znak1]
。
但如果它们是值,则znak1 = i
等分配是错误的。它应该是znak1 = slova[i]
。
答案 2 :(得分:0)
您已使用znak1
和znak2
作为数组索引(integers
)和最大字母(char
)的值。
如果您想将它们用作数组索引,请将slova[i] == znak1
更改为slova[i] == slova[znak1]
。
如果它们应该是最大的字母值,那么znak1 = i
和类似的分配是不正确的。相反,您应该使用znak1 = slova[i]
。
答案 3 :(得分:0)
在以下答案中,当有多个具有相同高值的条目时,代码将选择第一次出现的高值。
以...开头的所有复杂代码:
znak1 = znak2 = -1;
以及znak1和znak2的本地声明
可以替换为以下简单代码:
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