2013-05-16 4 views
0

나를 괴롭히기 시작하는 무언가를 이루려고합니다. 텍스트 상자를 사용하여 입력 된 정수를 사용자 정의했습니다. 사용자가 입력하는 번호는 7 자리 숫자 여야하며 목록에 7 개의 숫자를 각각 추가합니다. 사용자 입력 4,565,457 후 최초의 번호가 4 × 8지면 I는 예컨대 아래 2루프가 예상보다 많은 목록 상자를 추가합니다.

행 8 다중 사용자 정의 개수의 첫 번째 자리부터 원하는 :

4 x 8 
5 x 7 
6 x 6 
5 x 5 
4 x 4 
5 x 3 
7 x 2 

I 가지고 시도이하지만 난 내 목록 상자에서 얻을 출력이 7 개 져야 할 엔트리보다 더 많이 더 여러 번호를 가지고

List<int> integerList = new List<int>(); 
    for (int a = 0; a < textBox1.Text.Length; a++) 
    { 
      integerList.Add(int.Parse(textBox1.Text[a].ToString())); 

      foreach (int item in integerList) 
      { 
       for (int b = 8; b > 1; b--) 
       { 
        listBox1.Items.Add(item * b); 
       } 
      } 
    } 

답변

2

내가 무엇 일어나고있는 것은 당신의 내부 루프는 외부 루프 내부에서 실행되며, 그들이 함께해야한다는 생각 이렇게 :

List<int> integerList = new List<int>(); 
for (int a = 0; a < textBox1.Text.Length; a++) 
{ 
    integerList.Add(int.Parse(textBox1.Text[a].ToString())); 
} 

foreach (int item in integerList) 
{ 
    for (int b = 8; b > 1; b--) 
    { 
     listBox1.Items.Add(item * b); 
    } 
} 

가장 바깥 쪽 루프를 확인하십시오. 첫 번째 반복에서는 integerList에 한 자리가 추가됩니다. 그런 다음 가장 안쪽 루프는 integerList에있는 한 자리 숫자를 사용하여 8 번 반복합니다.

다음에 외부 루프를 반복 할 때 integerList에 다음 자릿수를 추가하므로 두 자릿수가 추가됩니다. 그리고 우리는 내부 루프로 들어갑니다. 내부 루프는 다시 8 번 반복되지만, 이번에는 integerList에 두 개의 항목이 있습니다.

기타 등등.

하지만 여전히 오류가 있습니다. (OP에서 사양을 잘못 읽었 기 때문에 처음에는 이것을 놓쳤습니다)

루프 당 하나의 루프 만 곱하면됩니다.

그래서 우리가 정말 다음과 같이 코드를 수정해야합니다 : 우리는 지금 입력 자리에 한 번 반복하고

List<int> integerList = new List<int>(); 

for (int a = 0; a < textBox1.Text.Length; a++) 
{ 
    integerList.Add(int.Parse(textBox1.Text[a])); // Note: Didn't need the ToString()! 
} 

int b = 8; // Will be 8 for the first multiplication. 

foreach (int item in integerList) // Loop once per input digit. 
{ 
    listBox1.Items.Add(item * b); 
    --b; // So now it will be correct for the next loop iteration. 
} 

. 그리고 b은 8에서 시작하여 각 루프 반복마다 1 씩 감소합니다.

+0

AHHHHH, Mathew에게 감사드립니다. –

+0

나는 당신의 방법을 사용하여 약 28 개의 엔트리를 얻는다 : : S 귀하의 설명은 위대한 tho입니다 :) –

+1

@JungleBoogie 좋아, 루프에서 두 번째 오류가 수정되었습니다. 희망은 당신에게 이해가 되네요! –

0

중첩 된 for 루프 때문에 7 개 이상의 항목이 나타납니다. 내부 루프를 첫 번째 루프 외부에 배치하십시오.

for (int a = 0; a < textBox1.Text.Length; a++) 
{ 
    ... 
} 

foreach (int item in integerList) 
{ 
    ...    
} 
+0

비슷한 답변이'@Matthew Watson'에 게시되었습니다. – Veer

2

어떻게 지금 this

YourText.Select((character, index) => character + "x" + (YourText.Length - index))); 

같은 것에 대해, 당신은 당신의 텍스트 인덱서와 함께 그것을 가지고 다시 매핑해야합니다. if로 감싸서 특정 인덱스에서 멈추십시오.

모든 것은 여기에서 무슨 일이 일어나고 나는 주어진 텍스트를 복용하고 수 있도록 각 character를 매핑을 말하고 있는지 : 인덱스의 0 인덱스되기 때문에

`character` 
plus the multiplier symbol 
plus the length of the original text minus the `index` 

마지막 부분은 문자열, 그래서 당신이 이것을 뒤집 었으면합니다.

그래서 본질적으로 이것은 일반적으로 루프 용으로 쓰이는 것을 하나의 라이너로 마무리하는 것입니다. 또 다른 이점은 실제 값을 요청할 때까지 실행되지 않는다는 것입니다.

+0

나는 그가 C#에 대해 처음 접했을뿐입니다. ;)하지만 아마 그럴 수 있습니다. –

+0

아마도이 IMO를 처리하는 데 훨씬 쉬운 방법 일 수 있습니다. –

+0

그래, 전 완전히 동의합니다.하지만 그의 게시물에서 그는 지금 C#과 루프를 배우고있는 중이라는 것을 알고 있습니다. 그래도 이것이 참으로 좋은 해결책이긴하지만 OP의 가치가 있습니다. 그런 일들이 존재한다는 것을 아는 ... 그것은 지금 그에게 많이 가르치지 않을 것입니다. –

1

의견이 너무 많습니다.

// at this point, it's assumed that inputText characters are all digits. 
// you should have code that confirms this (var shouldContinue = inputText.All(char.IsDigit);) 
var inputText = "4565457"; 
var input = inputText.Select(c => c - 48); // quick and dirty "ToInt" per char 

var multipliers = Enumerable.Range(2, inputText.Length).Reverse(); 

var multiplied = input.Zip(multipliers, (a, b) => a*b); 

listBox1.Items.AddRange(multiplied.ToArray()); 

당신이 그것을 무너 뜨리는 경우가 아주 간단하게 .

각 문자 숫자의 정수 값이 필요합니다. ASCII를 가정하면, 이것은 단순히 문자에서 48을 빼는 것입니다 (asciitable.com에서 이것을 이해할 수 있습니다). .Select을 사용하여 lazily 결과를 얻습니다.

var toInt = givenText.Select(digit => digit - 48); 

값 2에서 8을 반대로 사용해야합니다.

// can really only be used once 
var multipliers = new [] {8, 7, 6, 5, 4, 3, 2}; 

// can be used with any length string > 0 
var multipliers = Enumerable.Range(2, givenText.Length).Reverse(); 

각 값에 대해, I는 승산기 어레이에서의 보수 곱해야한다.Zip은 배열 (더 일반적으로 IEnumerable) 항목을 쌍으로 만들고 소스 중 하나가 모두 없어지면 종료합니다. 당신이 쌍으로 무엇을 하든지 리턴하는 함수를 필요로합니다. 이 경우 그들을 곱하십시오.

Func<int, int, int> multiply = (a,b) => a*b; 
var multiplied = toInt.Zip(multipliers, multiply); 

// ... and inlined. 
var multiplied = toInt.Zip(multipliers, (a,b) => a*b); 

이러한 값을 내 ListBox에 추가하려고합니다. 위의 코드는 실제로 아직 아무 것도 평가하지 않았습니다. .ToArray()이 호출되면 모든 작업이 실행됩니다.

//listBox1.Items.Clear() //maybe? 
listBox1.Items.AddRange(multiplied.ToArray()); 

끝나면 위의 코드로 끝납니다.

관련 문제