【发布时间】:2014-04-09 13:43:20
【问题描述】:
我对 C# 很陌生,您可能会从我的问题中注意到。我一直在制作“Røverspråk”翻译器来学习一些基础知识。 “Røverspråk”有点像 Pig Latin:规则是每个辅音都与辅音 + “o” + 辅音交换。到目前为止一切顺利,这部分有效。当我尝试将其翻译回来时,我的问题就出现了。
“totimom”应该返回“tim”,而是返回:"ttttttttttttttttttttttttttttttttttttttiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiimmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"。所以它返回每个字母 38 次 - 与我的 konsonant-string(挪威 konsonants)中的数量相同;
字符串 kons = "BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz";
为什么每次返回 38 次?据我所知,for 循环就像在我的翻译器中一样是分开的。给我带来麻烦的代码:
public void OversettTilbake(string vok, string kons)
{
string nyText = textBox2.Text.ToString().ToLower();
for (int e = 0; e < nyText.Length; e++)
{
for (int f = 0; f < kons.Length; f++)
{
if (nyText[e] == kons[f])
{
newText2.Add(nyText[e].ToString());
e = e + 2;
}
}
for (int g = 0; g < kons.Length; g++)
{
if (nyText[e] != kons[g])
{
newText2.Add(nyText[e].ToString());
}
}
}
}
有效的翻译器:
public int Oversetter(string text, string vok, string kons)
{
int Count = 0;
char tom = ' ';
for (int e = 0; e < text.Length; e++)
{
for (int i = 0; i < kons.Length; i++)
{
if (text[e] == kons[i])
{
newText.Add((text[e]).ToString() + "o" + (text[e]).ToString().ToLower());
Count = Count + 1;
}
}
for (int i = 0; i < vok.Length; i++)
{
if (text[e] == vok[i])
{
newText.Add((text[e]).ToString());
Count = Count + 1;
}
}
if (text[e] == tom)
{
newText.Add(text[e].ToString() + (text[e].ToString()));
}
for (int i = 0; i < tegn.Length; i++)
{
if (text[e] == tegn[i])
{
newText.Add((text[e]).ToString());
}
}
}
return Count;
}
编辑:感谢您在这里提供的所有精彩输入。我真的学到了很多。 @cahinton 的这个解决方案似乎工作得很好,对我来说理解和实施并不难:
for(var e = 0; e < nyText.Length; e += 1) {
newText2.Add(nyText[e].ToString);
if(kons.Contains(nyText[e])) {
e += 2;
}
}
EDIT2:我没有必要的声誉在这里投票。但是感谢你们所有人一百万次!我预计在下周内会得到一两个答案,所以我不得不说我被这里的社区淹没了。再次感谢!
【问题讨论】:
-
从不,never,NEVER 更改
for循环中的循环变量!请改用while循环。 -
@ThorstenDittmar 从来没有?如果我想跳过下一个元素怎么办?我需要一个额外的布尔值,现在你禁止我做
i++;。 -
您好!感谢您的快速回复。不过,您能详细说明一下吗?
-
@Gusdor 我知道有时有理由跳过元素,但在那种情况下(即使它是一个 while 循环的替代品)你不应该使用
for,而是真正的@987654329 @ 环形。当您更改for变量时,某些语言甚至无法编译。 -
@ThorstenDittmar 所以“从不,从不”实际上并不意味着有时,取决于语言,但在这种情况下可能不是。顶级建议...这个问题被标记为 c#,其中更改范围变量是合法的。