Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

svetoslav_halachev avatar svetoslav_halachev 1 Точки

Относно задача Concatenate Data

Здравейте, решавам задачата по 2 начина, но при единия начин след въвеждане на първите 3 входа (като третия вход са годините) в конзолата, прогрмата изписва дирекно резултата без последния вход. Ето и двете решения:

import java.util.Scanner;
public class ConcatenateData {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String firstName = scanner.nextLine();
        String lastName = scanner.nextLine();
        int age = Integer.parseInt(scanner.nextLine());
        String town = scanner.nextLine();
        System.out.printf("You are %s %s, a %d-years old person from %s.", firstName, lastName, age, town);
    }
}

Така написана програмата работи нормално, но ако я напиша така:

import java.util.Scanner;
public class ConcatenateData {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String firstName = scanner.nextLine();
        String lastName = scanner.nextLine();
        int age = scanner.nextInt();
        String town = scanner.nextLine();
        System.out.printf("You are %s %s, a %d-years old person from %s.", firstName, lastName, age, town);
    }
}

При симулацията не ми позволява да въведа стринг "town" и резултатът се изписва без него.

Някакви идеи защо е така.

Тагове:
0
Programming Basics with Java
Quake3 avatar Quake3 546 Точки

Здравей,

nextInt взема всичко до (но без) новия ред. Съответно следващият nextLine взема само командата за нов ред. Ако искаш да прочетеш и самият нов ред, ще ти трябва още един nextLine за града.

0
08/06/2018 11:50:54
svetoslav_halachev avatar svetoslav_halachev 1 Точки

Здравей, тествах наново кода който е във вида:

import java.util.Scanner;
public class ConcatenateData {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String firstName = scanner.nextLine();
        String lastName = scanner.nextLine();
        int age = scanner.nextInt();
        String town = scanner.nextLine();
        System.out.printf("You are %s %s, a %d-years old person from %s.", firstName, lastName, age, town);
    }
}

Оказа се че работи просто, когато въвеждам входовете в конзолата след годините, не давам "Enter", а давам табулация и след това изписвам и града на същия ред, и така съобщението излиза цялото, както трябва да е. Ако дам "Enter" прогамата слиза на нов ред (scanner.nextLine() ), но не довършва целия текс.

Сега обаче ми изкочи нов въпрос, при една още по проста задачка за лице на правоъгълник, ако напишем кода така:

import java.util.Scanner;

public class LiveDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        System.out.println(a * b);

    }
}
Тук при въвеждането на входовете в конзолата не ги въвеждам и двата (a и b) на един ред за да ми изкара резултата, а ги въвеждам всеки на нов ред т.е както трябва да е, а по пътя на логиката от предния пример и тук би трябвало след въвеждане на "а" и натискане на "Enter" програмата да приключи и да даде резултат равен на "а" или някаква грешка. 
Има нещо, което пропускам. Ще се радвам ако можеш да обясниш.
0
Quake3 avatar Quake3 546 Точки

Да, това не противоречи на по-горното. next() чете до първия интервал и оставя курсора там. след това nextLine(), чете до края на реда. В задачата с правоъгълника няма nextLine(), а точно с него става проблема.

  • Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace.
  • next(): Finds and returns the next complete token from this scanner.
  • nextLine(): Advances this scanner past the current line and returns the input that was skipped.

Пробвай следното:
 

int a = scanner.nextInt();
String b = scanner.nextLine();
System.out.println("a: " + a +" b: " + b);

с вход:   "2     AAA" и с вход: "2" и Enter.

Повече инфо: тук и тук

0
svetoslav_halachev avatar svetoslav_halachev 1 Точки

при вашия пример се получава същото, както при примера с годините и града

0
Quake3 avatar Quake3 546 Точки

Мисли за входа като за поток/stream или още по-добре за текст.

Ето тук:

        String str = "1 2\n 3 4";
        // System.out.println(str); 
        Scanner scanner = new Scanner(str);
        scanner.nextInt();
        scanner.nextInt();
        
        String s = scanner.nextLine();
        System.out.println("s: " + s);

Сравни изхода при  str = "1 2\n 3 4";  и при   str = "1 2 3 4";

\n e нов ред.  nextLine() взема от там където сме свършили да вземаме докато стигне до \n.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.