Добавление отдельных цифр из строки - PullRequest
3 голосов
/ 21 июня 2020

Я пытаюсь сложить 13 отдельных цифр из строки. Я думал, что использование while l oop будет лучшим способом сделать это, но я думаю, что я что-то напортачил. Вот мой код:

import java.util.Scanner;

public class ISBNChecker{
    public static void main(String [] args){
        String isbnNumber;
        int isbnTotal= 0;
        int index = 0;

        Scanner scnr = new Scanner(System.in);
        System.out.println("Enter a 13 digit ISBN Number:");
        isbnNumber = scnr.nextLine();
        if (isbnNumber.length() != 13) {
            System.out.println("Error- 13 numerical digits required");
        }
        char num = isbnNumber.charAt(index);
        while (index <13) {
        if (index % 2 == 0) {
            isbnTotal = isbnTotal + num;
            index =index + 1;
        }
        else { 
            isbnTotal = isbnTotal + (3 * num);
            index = index + 1;
        }
        }
        System.out.println(isbnTotal);
        if (isbnTotal % 10 == 0) {
            System.out.println("Valid ISBN Number");
        }
        else {
            System.out.println("Invalid ISBN Number");
        }
    }
}

Я использую ввод 9780306406157, который должен быть недопустимым номером ISBN. Значение isbnTotal в конце программы должно быть 100, но вместо этого оно равно 1425. Мы будем благодарны за любую помощь в выяснении того, как это исправить. Кроме того, для справки я использую формулу x1 + 3x2 + x3 + 3x4 ... + x 13!

Ответы [ 3 ]

5 голосов
/ 21 июня 2020

Я нашел вашу ошибку, вы допустили ошибку.

int index = 0;
while (index < 13) {
    char num = (char) (isbnNumber.charAt(index) - '0');
    
    if (index % 2 == 0) {
        isbnTotal = isbnTotal + num;
    } else {
        isbnTotal = isbnTotal + (3 * num);
    }
    
    index++;
}

Проблема №1

Код

 char num = isbnNumber.charAt(index);

Не было у вас пока l oop, в результате чего ваш код всегда запускается с одним и тем же символом.

Проблема № 2

При выполнении

char num = isbnNumber.charAt(index);

Фактически вы получаете значение ASCII символа. Что вы не можете получить, так это значение числа, верно? Итак, вам нужно сделать:

char num = (char) (isbnNumber.charAt(index) - '0');

Обратите внимание, что ноль находится между двумя одинарными кавычками, потому что нам нужно значение ZERO ASCII CHARACTER (которое равно 38).

'1 '-' 0 '= 1

' 9 '-' 0 '= 9

РЕДАКТИРОВАТЬ: я забыл упомянуть, что вы должны проверить перед тем, является ли символ числом, иначе вы, возможно, попробуйте сделать что-то вроде 'A' - '0', что будет равно 17

0 голосов
/ 21 июня 2020

Вот подробный рабочий код для вашего средства проверки ISBN.

import java.util.Scanner;

public class ISBNChecker{
    public static void main(String [] args){
        String isbnNumber;
        int isbnTotal= 0;
        int index = 0;

        Scanner scnr = new Scanner(System.in);
        System.out.println("Enter a 13 digit ISBN Number:");
        isbnNumber = scnr.nextLine();
        if (isbnNumber.length() != 13) {
            System.out.println("Error- 13 numerical digits required");
        }
        //Perform other operations if it's length is 13
                else{
        //initiliizing num for 1st time + convert the character at index to 
        number
        int num = Character.getNumericValue(isbnNumber.charAt(index));
        while (index <13) {
        if (index % 2 == 0) isbnTotal = isbnTotal + num;
        else isbnTotal = isbnTotal + (3 * num);
    
        //increment outside of if else - less code
        index = index + 1;
        //verify if index is not out of bounds for charAt() 
        //then change num value + conversion
        if(index<13 )
        num = Character.getNumericValue(isbnNumber.charAt(index));
    
        }
          
        System.out.println(isbnTotal);
        if (isbnTotal % 10 == 0)   System.out.println("Valid ISBN Number");
        else  System.out.println("Invalid ISBN Number");
        }
        

    }
}

Как упоминалось в ответе ниже, nextLine () вводится в символах ASCII, и важно преобразовать его в числа, когда есть числовые необходимые вычисления.

0 голосов
/ 21 июня 2020

Ну, похоже, вы разрешаете ввод строк длиннее или короче 13.

Затем вы должны вернуться после этой строки: -

System.out.println("Error- 13 numerical digits required");  

В противном случае код будет работать даже если длина не соответствует желаемой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...