2

我是编程新手,我的算法课上有一个项目。我们要做的是决定一个问题并解决它。除了 string、char 和 WriteLine,我们还没有学到更多。我们确实添加了一些东西,你很快就会看到!

我决定我要解决这个问题:用户插入一个单词,无论多长,程序都会自动将第一个字母变成大写字母。到目前为止,这就是我所拥有的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
    start:
        Console.WriteLine("Please enter a word below:");
        Console.WriteLine("");
        string str = Console.ReadLine();
        char char1;
        if (str[0] >= 97)
        {
            char1 = (char)(str[0] - 32);
        }
        else
        {
            char1 = (char)(str[0] + 32);
        }

        char char2 = (char)(str[1]);
        char char3 = (char)(str[2]);
        char char4 = (char)(str[3]);
        char char5 = (char)(str[4]);
        Console.WriteLine("");
        Console.Write(char1);
        Console.Write(char2);
        Console.Write(char3);
        Console.Write(char4);
        Console.WriteLine(char5);
        goto start;
}
}
}

该代码的问题是任何少于 5 个字母的单词都会导致程序崩溃。任何超过 5 个字母的东西都会在第 5 个字母处被删除……有人告诉我,使用数组应该可以解决这个问题。鉴于我在这方面完全是新手,我需要将其分解并尽可能简单地告知!

任何帮助使它工作将不胜感激。

谢谢 :)

4

4 回答 4

2
Console.WriteLine("Enter a word:");
string str = Console.ReadLine();
Console.WriteLine(str[0].ToString().ToUpper() + str.Substring(1));

这将起作用。

或者...如果您需要遍历整个字符串并找到第一个实际的字母字符,您可以执行以下操作:

Console.WriteLine("Please enter a word:");
string s = Console.ReadLine();
bool found = false;
char[] chars = new char[s.Length];
for (int i = 0; i < s.Length; i++)
{
    if (Char.IsLetter(s[i]) && !found)
    {
         chars[i] = s[i].ToString().ToUpper()[0];
         found = true;
    }
    else
    {
        chars[i] = s[i];
    }
}
s = new String(chars);
Console.WriteLine(s);
于 2012-10-25T22:05:10.283 回答
1

在将 char1 写入控制台后使用这样的 for 循环:

if (str.Length > 1)
{
    for (int i = 1; i < str.Length; i++)// Start at 1 to skip char1
    {
        Console.Write(str[i]);
    }
}
于 2012-10-25T22:15:42.563 回答
1

您可以调用一些string有用的方法:

  • Substring
  • ToUpper

实际上,您不必担心字符;仅使用字符串即可解决此问题。

还要注意检查您的代码是否处理了字符串为空的情况(使用if语句),如果用户只是按下Enter而不输入任何内容,就会发生这种情况。

于 2012-10-25T22:35:04.540 回答
0

您正在学习算法课程,他们让您选择要解决的问题?对学习的人来说听起来很危险。

Console.WriteLine("Please enter a word below:");
Console.WriteLine("");
string inputString = Console.ReadLine();    // try to use meaningful variable names

// shorthand for the if ... else block:
// type variableName = (true/false condition) ? "is true" : "is false";
char firstChar = inputString[0] >= 97 ? (char)(inputString[0] - 32) : (char)(inputString[0] + 32);

Console.WriteLine("");
Console.Write(firstChar);

for (int i = 1; i < inputString.Length; i++)    // skip firstChar
{
    Console.Write(inputString[i]);
}

正如其他人所提到的,如果您想要任何类似于通用解决方案的东西,则需要为此使用循环。

此外,您需要避免使用 goto 语句。有很多原因,一个是它们(在我看来)使代码难以阅读和维护。

此外,如果您的代码按照编写的方式运行,它将永远不会结束。您编写的程序将执行,然后重新开始,永不停止。如果您想要这种行为,那么您应该将您的代码包装在一个无限循环中,该循环会在某些条件下退出。这可能看起来像:

bool keepRunning = true;
while(keepRunning){
    //code here
    Console.Write("go again? (y/n) ");
    keepRunning = (string)(Console.ReadLine()).equals("y") ? false : true;  
}

在最后一条语句中,我忘记了在调用.equals方法之前是否需要将 ReadLine 的输出转换为字符串……我没有启动 IDE。我想你应该已经明白了。

编辑:我看到另一个关于使用该.ToUpper方法的回应。我想到了这一点,但假设您可能需要使用该char类型。

于 2012-10-25T22:39:39.570 回答