2015-06-20 4 views
1

Я пишу цикл, чтобы заполнить массив. Я думаю, что у меня есть кодирование, но когда я запускаю скомпилированный код через Java, он не появляется в командной строке.Loop-> Array Output

Вот код:

import java.util.Scanner; 
import java.io.*; 
public class Pr42 
{ 
    public static void main(String[]args) throws IOException 
{ 
    int k,m,g; 
    String n; 
    //double g; 
    Scanner input1=new Scanner(System.in); 
    String[]Name=new String [5]; 
    double[]Grade=new double[Name.length]; 
    k=0; 
    while (k<Name.length) 
     { 
     m=k+1; 
     System.out.print("Enter the name of student "+m+": "); 
     Name[k]=input1.nextLine(); 
     System.out.print(""); 
     System.out.print("Please enter the grade of student "+m+": "); 
     Grade[k]=input1.nextInt(); 
     k++; 
     } 
    } 
} 

Вот вывод в командной строке:

Введите имя студента 1:

Пожалуйста, введите класс студента 1:

Пожалуйста, введите имя студента 2: Пожалуйста, введите оценку студентки 2:

Проблема в том, что линия касается второго ученика.

Что я сделал не так в коде, чтобы получить такой вывод?

+0

Получает ли он правильный ввод? можете ли вы проверить правильность названия ученика 2 и его оценки? – Amirag

+0

Возможный дубликат [Проблема с сканером при использовании nextLine после следующегоXXX] (http: // stackoverflow.com/questions/7056749/scanner-issue-when-use-nextline-after-nextxxx) – Tom

+0

, приводящий к тому, что декларация сканера внутри цикла также должна ее исправить. Но я предпочел бы прочитать nextLine() вместо nextInt() для оценки и проанализировать его/обработать исключение соответственно. – Jimmy

ответ

1

Вам нужно определить имя имеет вход в следующей строке с Name[k] = input1.nextLine();

int k, m, g; 
String n; 
//double g; 
Scanner input1 = new Scanner(System.in); 
String[] Name = new String[5]; 
double[] Grade = new double[Name.length]; 
k = 0; 
while (k < Name.length) { 
    m = k + 1; 
    System.out.print("Enter the name of student " + m + ": "); 
    Name[k] = input1.nextLine(); 
    System.out.print(""); 
    System.out.print("Please enter the grade of student " + m + ": "); 
    Grade[k] = input1.nextDouble(); 
    input1.nextLine(); 
    k++; 
} 

EDITED: Согласно упомянуто в Том комментарий по этому вопросу, когда у вас есть Name[k] = input1.nextLine(); вместо input1.nextLine(); программа работает правильно, но она перепуталась со значением массива.

+0

Интересно, почему OP принял этот ответ. Не оба ли, Салех и ОП проверили этот код? В качестве подсказки вы должны распечатать содержимое 'Name' после цикла while. – Tom

+0

@Saleh Parsa, зачем использовать syso ("") ?? Что нужно здесь? –

+0

@SudhansuChoudhary Заявление 'System.out.print (" ");' принято из исходного кода OPs, и здесь нет смысла. Я думаю, Салех не коснулся этой линии, потому что он не собирался оптимизировать этот код (что понятно). – Tom

0

Проблема в том, что: Grade[k] = input1.nextInt(); не считывает конец строки или что-либо после номера.

Попробуйте разместить input1.nextLine(); после Grade[k]=input1.nextInt(); должен решить вопрос:

while (k<Name.length) 
{ 
     m=k+1; 
     System.out.print("Enter the name of student "+m+": "); 
     Name[k]=input1.nextLine(); 
     System.out.print(""); 
     System.out.print("Please enter the grade of student "+m+": "); 
     Grade[k]=input1.nextInt(); 
     input1.nextLine(); 
     k++; 
} 
+0

Даже с println он по-прежнему показывает неправильный вывод. Он добавит новую строку после последнего ввода, который не исправит начальную проблему –

+0

@SalehParsa я отредактировал свой ответ, пожалуйста, посмотрите –

+0

Делает больше приятеля :-) –

1

nextInt Scanner не читает символ «новой строки».
есть 2 способа исправить это.
1. позвонить input1.nextLine(); после input1.nextInt(); игнорировать то, что вы получаете здесь, просто перевести его на следующую строку.

Grade[k] = input1.nextInt(); 
input1.nextLine(); 

2. позвонить input1.nextLine(); для оценки. String вы можете бросить на int и сохранить в Grade[k].

String str = input1.nextLine(); 
Grade[k] = Integer.parseInt(str); 
+0

Существует и другой способ (назовем его 2.5: D): OP может использовать 'Name [k] = input1.next() 'вместо' Name [k] = input1.nextLine(); '. Это позволяет избежать упомянутой проблемы, но каждое имя может быть либо именем, либо фамилией, поскольку 'next()' перестает читать пробелы. – Tom

+0

@ Тома да. Я не предлагаю этого, потому что, когда я начал использовать java, я использовал 'next();' и остался с ним, не зная его недостатка (читайте до пробела). я закончил с ответом и много потерял время, чтобы понять это. во всяком случае, хорошая идея :) – Amirag

1

Это работает:

public static void main(String[] args) throws IOException { 
    int k, m, g; 
    String n; 
    // double g; 
    Scanner input1 = new Scanner(System.in); 
    String[] Name = new String[5]; 
    double[] Grade = new double[Name.length]; 
    k = 0; 

    while (k < Name.length) { 

     m = k + 1; 
     System.out.print("Enter the name of student " + m + ": "); 
     Name[k] = input1.nextLine(); 
     System.out.print("Please enter the grade of student " + m + ": "); 
     Grade[k] = input1.nextInt(); 
     input1.nextLine(); 
     k++; 
    } 
} 

Я рекомендую вам, пожалуйста, пройти через this question, вы должны иметь ваши сомнения выяснены. Выдержка из ответа, данного в этой должности:

Scanner#nextInt метод не читает последний символ новой строки вашего входа, и, таким образом, что новая строка потребляется в следующем вызове Scanner#nextLine.