由于我正在学习使用C#进行编程,因此我尝试解决以下问题,对我来说,这似乎有点困难,请提供帮助:
创建一个由三部分连续的相同元素组成的数组。
以下是我到目前为止提出的内容:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Array3NumbersApp
{
class Program
{
static void Main(string[] args)
{
int n = 99;
int[] buffer = new int[n];
Random rnd = new Random();
for (int i = 2; i < buffer.Length; i++)
{
if (i % 3 == 0)
{
int k = rnd.Next(1, 30);
buffer[i] = k;
buffer[i-1] = k;
buffer[i-2] = k;
}
}
for (int i = 2; i < buffer.Length; i++)
{
Console.Write(buffer[i -2 ] + " " + buffer[i-1] + " " + buffer[i] + " ");
}
}
}
}
任何人都可以建议我在该程序中做错了什么吗?
我得到的结果,例如:
0 29 29 29 29 29 29 29 1 29 1 1 1 1 1 1 1 18 1 18 18 18 18 18 18 18 18 20 18 20 20 20 20 20 20 20 20 25 20 25 25 25 ...
这不是预期的,对吧?
请注意,这不是家庭作业,而是我尝试掌握数组的方法...预先感谢您的评论!非常感谢您的帮助。
答案 0 :(得分:3)
我知道您可能还没有学习LINQ,但是为了完整起见,这里是LINQ解决方案:
var list = Enumerable
.Range(0,100)
.Select( n => rnd.Next(1,30) )
.SelectMany( n => new int[] { n, n, n } )
.ToArray();
答案 1 :(得分:2)
嗯,您已接近解决方案。 我可以为您提供帮助,但是我想您可能想自己解决这个问题,所以我只给您提供一个提示:
您已经知道应该像这样向后三倍填充数组:
int k = rnd.Next(1, 30);
buffer[i] = k;
buffer[i-1] = k;
buffer[i-2] = k;
现在,我认为您已经知道要在这些索引上执行这些语句(2,5,8,...)
现在,您有了3个索引的“跳转”,算术级数很好。从i = 2开始。听起来,您需要对for循环进行小调整:)
编辑:
更多实践
如果您想进一步执行此任务,以便可以进行更多练习,请尝试避免在连续迭代中'rnd'生成相同数字的情况(这样一来,您将不会获得29 29 29 29 29 29不是三倍,而是连续六个相同)...
答案 2 :(得分:1)
您的第一个循环将丢失元素0,因为i的初始值不能被3整除。i == 3是您首次输入i-2的分配块,这意味着要初始化的第一个元素是1(第二个值)。您的第二个循环显然是错误的。您正在逐个遍历每个元素,但仍在进行写行,就好像只在执行第三个元素一样。这意味着即使基础数组将按预期填充,您也会多次输出元素。只需在第二个循环中写出当前值,然后在第一个循环中将i ++替换为i + = 3并按照Kalten的建议删除mod 3条件。
答案 3 :(得分:1)
我唯一要做的更改是删除对i % 3 == 0
的检查,然后将循环变量增加3。然后,最后,只按顺序输出数组(不需要在此做任何特殊的操作) )。
private static void Main()
{
int n = 99;
int[] buffer = new int[n];
Random rnd = new Random();
for (int i = 2; i < buffer.Length; i += 3)
{
int k = rnd.Next(1, 30);
buffer[i] = k;
buffer[i - 1] = k;
buffer[i - 2] = k;
}
foreach (int t in buffer)
{
Console.Write(t + " ");
}
Console.ReadKey();
}
答案 4 :(得分:1)
希望它可以帮助您了解;-)
for (int i = 0; i < buffer.Length; i += 3) // normally you should always start with i = 0
{
//if (i + 1 % 3 == 0) // no need for this anymore, we got i += 3
//{
//}
int k = rnd.Next(1, 30);
buffer[i] = k;
buffer[i+1] = k;
buffer[i+2] = k;
Console.Write($"{k} {k} {k} ");
}
//for (int i = 0; i < buffer.Length; i += 3) // skip the whole loop because it is/ was the same as the one above
//{
//}