我有一个输入文件,其中有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循环中以完成计算。
谢谢, 杰西
答案 0 :(得分:1)
我一直在查看你的代码,你还有很多问题。
p
声明为变量,但这是您的函数名称 - 因此会导致代码冲突。你不需要这个变量。s
&amp; n
为uint
,方法p
为int p(int s, int n)
。您也应该将变量声明为int
。Math.Round(..., 4)
将结果限制为最多四位小数,但我怀疑您确实希望确保输出中有四位小数。它们是有区别的。因此Math.Round(1.5, 4).ToString()
变为1.5
,但您希望1.500
使您的列排成一行。您应该使用(1.5).ToString("0.000")
代替1.500
。Math.Round(..., 4)
也可能会在“收件人数”的值中引入错误。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
答案 1 :(得分:0)
您必须使用一致的变量类型。您已在顶部声明uint s,n,p
,但您尝试将s
和n
传递给p
作为int,而不是uint。你知道为什么要使用uint
吗?我认为int
可能很好。
如果您要声明方法p
,请不要声明变量p
;你不需要一个变量来获得回报。如果您尝试声明一个变量来保存返回以便稍后使用它,请将其命名为不同的名称。
这两个问题导致了你得到的错误。
我想也许这就是你要做的事情:
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 answer和official documentation,以便更好地格式化表格输出。