嵌套用于循环计算多边形倒数

时间:2016-01-27 00:39:41

标签: c# console-application

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

多边形名称

2个三角形

3个矩形

接下来我必须使用static int p()的最终函数,这是计算我的n = 1,n = 2等写作线的部分的公式。但我仍然坚持如何将其纳入我的内心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;
}

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

谢谢, 杰西

2 个答案:

答案 0 :(得分:1)

我一直在查看你的代码,你还有很多问题。

  1. 不要在代码顶部声明变量。应尽可能将它们声明为使用它们,以便更轻松地重构代码并使代码具有可读性。
  2. 您将p声明为变量,但这是您的函数名称 - 因此会导致代码冲突。你不需要这个变量。
  3. 您宣布s&amp; nuint,方法pint 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)也可能会在“收件人数”的值中引入错误。
  6. 您需要填充形状名称的长度以确保列的排列。
  7. 如果要为下一次写入开始新行,则需要使用fileOut.WriteLine;如果希望在当前行开始下一次写入,则需要fileOut.Write
  8. 这是你的代码清理完毕:

    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
    

答案 1 :(得分:0)

编辑:我必须用原始代码解决一些问题......我应该先测试一下。

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

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

  3. 这两个问题导致了你得到的错误。

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

    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'方法的累积输出(考虑命名一些更具描述性的东西及其参数,BTW)。

    请注意拨打Console.Write而不是Console.WriteLine的电话,这些电话允许您稍后转到同一行。

    您还应该查看this answerofficial documentation,以便更好地格式化表格输出。