2013-12-19 5 views
0

Мой код должен печатать массив целых чисел, в котором пользователь вводит столько элементов, сколько захочет, и введите -99 (как строку), чтобы выйти из цикла. Также допустимый диапазон записей - 0 - 10 с 0 и 10 включенными. Я получаю неправильные результаты при печати массива, когда он печатает только последнюю запись и нули после. Код находится в консоли C#. Любая помощь будет оценена. Спасибо.Ошибка печати массива C# Консоль

namespace ExeNo1Ch7 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     int numOfEntry; 
     int[] intNumbers = new int[100]; 

     numOfEntry = GetArrayOfIntegers(intNumbers); 
     Console.WriteLine("\t\n You have entered " + numOfEntry + " values " + "\t\n" + "They are:"); 
     for (int i = 0; i < numOfEntry; i++) 
     { 
      Console.WriteLine("\t\n" + intNumbers[i]); 
     } 

     Console.WriteLine("\t\n<< Press any key to Exit >> "); 

     Console.ReadKey(); 
    } 


    public static int GetArrayOfIntegers(int[] anArray) 
    { 
     string strValue; 
     int counter = 0; 
     Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
     strValue = Console.ReadLine(); 

     for (int i = 0; i < anArray.Length; i++) 
     { 
      while (strValue != "-99") 
      { 
       anArray[i] = int.Parse(strValue); 
       counter = counter + 1; 
       if (anArray[i] >= 0 && anArray[i] <= 10) 
       { 
        Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
        strValue = Console.ReadLine();     
       }     
       else 
       { 
        Console.WriteLine("\t\n Please try again entering an integer in the range (0 - 10) only,"); 
        Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
        strValue = Console.ReadLine(); 
       } 
      } 
     } 

     return counter; 
    } 
+0

Много пустых строк в коде сделать это ужасно читать. –

+0

Это просто так неправильно. Ваш учитель не будет счастлив. Чтобы ответить на ваш вопрос, причина, по которой вы печатаете только последний элемент, заключается в том, что вы фактически не увеличиваете 'i' вообще - все ваши« вращение »выполняется во время цикла внутри, поэтому вы назначаете только первый индекс , и когда вы наконец введете '-99', он выполнит оставшиеся 99 шагов (без чтения каких-либо целых чисел) и возвращает. – Luaan

+1

Вы не должны использовать цикл for и цикл while. Отбросьте цикл for и отслеживайте, какие записи в массиве были заполнены (через счет). Используйте count, чтобы определить, где в массиве хранить значение, которое вводит пользователь. – steveg89

ответ

2

Вы имеют такое поведение, потому что вы повторяете одно и то же значение снова и снова в своем цикле while.

В принципе, у вас есть это:

for (i = 0; i < anArray.Length; i++) 
{ 
    while (strValue != "-99") 
    { 
     anArray[i] = int.Parse(strValue); 
    } 
} 

Это означает, что вы зациклитесь на том же я до входов пользователей -99. Вы должны отказаться от цикла for и инкремента i в то время как:

public static int GetArrayOfIntegers(int[] anArray) 
{ 
    string strValue; 
    int counter = 0; 
    Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
    strValue = Console.ReadLine(); 

    int i = 0; 
    while (strValue != "-99") 
    { 
     anArray[i] = int.Parse(strValue); 
     counter = counter + 1; 
     if (anArray[i] >= 0 && anArray[i] <= 10) 
     { 
      Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
      strValue = Console.ReadLine(); 
     } 
     else 
     { 
      Console.WriteLine("\t\n Please try again entering an integer in the range (0 - 10) only,"); 
      Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
      strValue = Console.ReadLine(); 
     } 
     i++; 
    } 

Есть вторая проблема; вы назначаете значение перед сравнением диапазона. Вы должны переместить приращение переуступки и счетчика в if блок, как это:

public static int GetArrayOfIntegers(int[] anArray) 
{ 
    string strValue; 
    int counter = 0; 

    Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
    strValue = Console.ReadLine(); 
    while (strValue != "-99") 
    { 
     int value = int.Parse(strValue); 
     if (value >= 0 && value <= 10) 
     { 
      anArray[counter] = value; 
      counter = counter + 1; 
      Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
      strValue = Console.ReadLine(); 
     } 
     else 
     { 
      Console.WriteLine("\t\n Please try again entering an integer in the range (0 - 10) only,"); 
      Console.Write("\t\n Enter an enteger from 0 - 10 :"); 
      strValue = Console.ReadLine(); 
     } 
    } 
    return counter; 
} 
+0

Вы должны добавить внутри 'проверки (' if (anArray [ i]> = 0 && anArray [i] <= 10) '). И вам не нужно держать оба 'i' и' counter' в любом случае - они внезапно означают одно и то же :) – Luaan

+0

Вторая часть неверна - теперь вы не проверяете число вообще, просто ноль каждый раз. Назначение должно выполняться перед проверкой проверки. – Luaan

+0

@ Луаан Дерп, ты прав. Я отредактирую его быстро: P Fixx'd, похоже, я пошел слишком быстро на вторую часть, спасибо! –

0

Что у вас есть это for цикл происходит через вход, но внутри, что у вас также есть while цикл, проходящий через вход, что очень неудобно, и, похоже, это приведет вас в состоянии чтобы ввести -99 номер 100 раз.

вместо того, чтобы использовать как в for петли и while петлю, только && клаузулы вместе в цикл

for (int i = 0; i < anArray.Length && strValue != "-99"; i++) 
    { 

вы также должны разместить в strValue = Console.ReadLine(); в конце вашего цикла

+0

Это не удастся, если вы введете число за пределами диапазон 0-10 ('i' увеличивается, если он не должен). EDIT: И нет, '-99' игнорируется вообще, поэтому он не будет помещен в массив. Но да, он будет излишне повторять цикл for и просто пропустить каждую итерацию, кроме первой. – Luaan

+0

Да, это работает! Спасибо огромное ! – sunflower

+0

@ Luaan, вы бы не применяли ограничение '0-10' внутри сигнатуры цикла for в первую очередь. –

Смежные вопросы