嵌套循环计算多边形倒数

Nested for Loop Calculating Polygonal Reciprocals

我有一个包含 24 行多边形名称的输入文件。在我的代码中,在 s 的 writeline 标题下,我将列出多边形边,然后在多边形名称下列出形状的名称。例如:

s 多边形名称

2个三角形

3 个矩形

接下来我必须使用 static int p () 的最终函数,它是计算 n=1、n=2 等我的 writeline 部分的公式。但我不知道如何将它合并到我的内部 for 循环根据我的第一列 s 进行这些计算,然后是边数。

static void GenReport()
{


  uint s, n, p;
  string shapeName;


  fileOut.WriteLine();
  fileOut.WriteLine("       Polygon                                          Sum of ");
  fileOut.WriteLine(" s      Name        n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8 n=9 Recip  ");
  fileOut.WriteLine("--- --------------- --- --- --- --- --- --- --- --- --- ------ ");
  for (s = 3; s <= 24; s++)
  {
   shapeName = fileIn.ReadLine().Trim();
   fileOut.WriteLine("{0,3} {1}", s, shapeName);
    for (n = 1; n <= 9; n++)
    {
      fileOut.WriteLine("{0}");
      Math.Round(1.0/p(s,n),4)
    }

  }

}

static int p(int s, int n)
{
  return (n * n * (s - 2) - n * (s - 4)) / 2;
}

上面的 static int p 是计算 n=1 n=2 等的倒数的公式。我需要帮助将其放入我的内部 for 循环中以完成计算。

谢谢, 杰西

编辑:我不得不用你的原始代码修复一些问题……我应该先测试一下。

  1. 您必须使用一致的变量类型。您已在顶部声明了 uint s,n,p,但您试图将 sn 作为 int 而不是 uint 传递给 p。您知道为什么要使用 uint 吗?我认为 int 可能没问题。

  2. 如果你要声明一个方法p,不要同时声明一个变量p; return 不需要变量。如果您试图声明一个变量来保存 return 以便稍后使用它,请将其命名为不同的名称。

这两个问题导致了您遇到的错误。

我想也许这就是你想要做的:

static void GenReport()
{
    uint s, n;
    string shapeName;


    Console.WriteLine();
    Console.WriteLine("       Polygon                                          Sum of ");
    Console.WriteLine(" s      Name        n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8 n=9 Recip  ");
    Console.WriteLine("--- --------------- --- --- --- --- --- --- --- --- --- ------ ");
    for (s = 3; s <= 24; s++)
    {
        shapeName = Console.ReadLine().Trim();
        Console.WriteLine("{0,3} {1}", s, shapeName);
        double sum = 0; // declare a variable outside the loop for the sum
        for (n = 1; n <= 9; n++)
        {
            double currentNumber = Math.Round(1.0/p(s, n), 4);
            Console.Write("{0} ", currentNumber);
            sum += currentNumber;
        }
        Console.Write("{0}", sum);
    }
}

static uint p(uint s, uint n)
{
    return (n * n * (s - 2) - n * (s - 4)) / 2;
}

你必须在你的内部循环之外声明一个变量,以保存你的 'p' 方法的累积输出(考虑命名一些更具描述性的东西以及它的参数,顺便说一句)。

请注意对 Console.Write 的调用而不是 Console.WriteLine,这使您可以稍后继续使用同一行。

您还应该查看 this answer and the official documentation 以获得更好的格式化 table 输出的方法。

我一直在查看您的代码,您遇到了很多问题。

  1. 不要在代码的顶部声明变量。它们的声明应尽可能接近它们的使用,以便更轻松地重构和提高代码的可读性。
  2. 您将 p 声明为一个变量,但那是您的函数的名称 - 因此它会导致您的代码发生冲突。你不需要这个变量。
  3. 您将 sn 声明为 uint,方法 p 的签名为 int p(int s, int n)。您也应该将变量声明为 int
  4. 您使用 Math.Round(..., 4) 将结果限制为 至多 小数点后四位,但我怀疑您真的想确保结果中有小数点后四位你的输出。它们是有区别的。所以 Math.Round(1.5, 4).ToString() 变为 1.5,但您希望 1.500 使您的列对齐。您应该使用 (1.5).ToString("0.000") 代替,因为这会给出 1.500.
  5. 使用 Math.Round(..., 4) 也会在 "Sum of Recip" 的值中引入错误。
  6. 您需要填充形状名称的长度以确保您的列对齐。
  7. 下一次写入需要换行时使用fileOut.WriteLine,下一次写入从当前行开始使用fileOut.Write

这是清理后的代码:

fileOut.WriteLine();
fileOut.WriteLine("    Polygon                                                                        Sum of");
fileOut.WriteLine("s   Name            n=1    n=2    n=3    n=4    n=5    n=6    n=7    n=8    n=9    Recip");
fileOut.WriteLine("--- --------------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------");
for (int s = 3; s <= 24; s++)
{
    string shapeName = fileIn.ReadLine().Trim();
    fileOut.Write("{0,3} {1}", s, shapeName.PadRight(16));
    double sum = 0.0;
    for (int n = 1; n <= 9; n++)
    {
        double r = 1.0 / p(s, n);
        Console.Write("{0:0.0000} ", r);
        sum += r;
    }
    fileOut.WriteLine("{0:0.0000}", sum);
}

这给了我这样的输出:

    Polygon                                                                        Sum of
s   Name            n=1    n=2    n=3    n=4    n=5    n=6    n=7    n=8    n=9    Recip
--- --------------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
  3 Triangle        1.0000 0.3333 0.1667 0.1000 0.0667 0.0476 0.0357 0.0278 0.0222 1.8000
  4 Pentagon        1.0000 0.2500 0.1111 0.0625 0.0400 0.0278 0.0204 0.0156 0.0123 1.5398
  5                 1.0000 0.2000 0.0833 0.0455 0.0286 0.0196 0.0143 0.0109 0.0085 1.4107
  6                 1.0000 0.1667 0.0667 0.0357 0.0222 0.0152 0.0110 0.0083 0.0065 1.3323
  7                 1.0000 0.1429 0.0556 0.0294 0.0182 0.0123 0.0089 0.0068 0.0053 1.2793
  8                 1.0000 0.1250 0.0476 0.0250 0.0154 0.0104 0.0075 0.0057 0.0044 1.2411
  9                 1.0000 0.1111 0.0417 0.0217 0.0133 0.0090 0.0065 0.0049 0.0038 1.2121
 10                 1.0000 0.1000 0.0370 0.0192 0.0118 0.0079 0.0057 0.0043 0.0034 1.1894
 11                 1.0000 0.0909 0.0333 0.0172 0.0105 0.0071 0.0051 0.0038 0.0030 1.1711
 12                 1.0000 0.0833 0.0303 0.0156 0.0095 0.0064 0.0046 0.0035 0.0027 1.1560
 13                 1.0000 0.0769 0.0278 0.0143 0.0087 0.0058 0.0042 0.0032 0.0025 1.1434
 14                 1.0000 0.0714 0.0256 0.0132 0.0080 0.0054 0.0039 0.0029 0.0023 1.1326
 15                 1.0000 0.0667 0.0238 0.0122 0.0074 0.0050 0.0036 0.0027 0.0021 1.1234
 16                 1.0000 0.0625 0.0222 0.0114 0.0069 0.0046 0.0033 0.0025 0.0019 1.1154
 17                 1.0000 0.0588 0.0208 0.0106 0.0065 0.0043 0.0031 0.0023 0.0018 1.1083
 18                 1.0000 0.0556 0.0196 0.0100 0.0061 0.0041 0.0029 0.0022 0.0017 1.1021
 19                 1.0000 0.0526 0.0185 0.0094 0.0057 0.0038 0.0027 0.0021 0.0016 1.0966
 20                 1.0000 0.0500 0.0175 0.0089 0.0054 0.0036 0.0026 0.0020 0.0015 1.0916
 21                 1.0000 0.0476 0.0167 0.0085 0.0051 0.0034 0.0025 0.0019 0.0014 1.0871
 22                 1.0000 0.0455 0.0159 0.0081 0.0049 0.0033 0.0023 0.0018 0.0014 1.0830
 23                 1.0000 0.0435 0.0152 0.0077 0.0047 0.0031 0.0022 0.0017 0.0013 1.0793
 24                 1.0000 0.0417 0.0145 0.0074 0.0044 0.0030 0.0021 0.0016 0.0012 1.0759

我从这个文件开始:

3 Triangle
5 Pentagon

这突出表明您实际上并未阅读第一个数字。所以有更好的方法来做到这一点。

试试这个代码:

var header = new []
{
    "    Polygon                                                                        Sum of",
    "s   Name            n=1    n=2    n=3    n=4    n=5    n=6    n=7    n=8    n=9    Recip",
    "--- --------------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------",
};

var query =
    from line in File.ReadAllLines(@"file.txt")
    let space = line.IndexOf(' ')
    let s = int.Parse(line.Substring(0, space))
    let shapeName = line.Substring(space + 1)
    let ns = Enumerable.Range(1, 9).Select(n => 1.0 / p(s, n)).ToArray()
    let sum_text = ns.Sum().ToString("0.0000")
    let ns_text = String.Join(" ", ns.Select(n => n.ToString("0.0000")))
    select String.Format("{0, 3} {1} {2} {3}", s, shapeName.PadRight(15), ns_text, sum_text);

File.WriteAllLines(@"output.txt", header.Concat(query));

所以,如果我从这个文件开始:

3 Triangle
4 Rectangle
20 Icosagon

...我得到这个输出:

    Polygon                                                                        Sum of
s   Name            n=1    n=2    n=3    n=4    n=5    n=6    n=7    n=8    n=9    Recip
--- --------------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
  3 Triangle        1.0000 0.3333 0.1667 0.1000 0.0667 0.0476 0.0357 0.0278 0.0222 1.8000
  4 Rectangle       1.0000 0.2500 0.1111 0.0625 0.0400 0.0278 0.0204 0.0156 0.0123 1.5398
 20 Icosagon        1.0000 0.0500 0.0175 0.0089 0.0054 0.0036 0.0026 0.0020 0.0015 1.0916