Générateur de somme de contrôle Java ISBN-boucle infinie?


J'ai besoin de construire ce générateur de somme de contrôle ISBN (pour ISBN-10 et ISBN-13) pour ma classe CS en utilisant des chaînes, des caractères et un tas de boucles imbriquées et d'instructions conditionnelles. Quelque part dans ce gâchis, je pense que quelque chose déclenche une boucle infinie parce que quand on me demande une entrée, je donne l'entrée et appuie sur Entrée et il va juste à une nouvelle ligne et s'attend à ce que j'entre un tas plus de données Je suppose quand à la place il devrait me demander à nouveau entrée et sinon dites-moi que c'est incorrect, puis demandez à nouveau une autre entrée. Et quand je tape quit, il ne termine pas le programme et n'affiche pas les résultats de la somme de contrôle comme il est censé le faire, à la place, il présente le même comportement que les autres entrées. Si je tape quit la première fois sans donner de chiffres au programme, il termine le programme correctement, mais bien sûr, les valeurs des variables de sortie sont nulles.

Mon code ainsi loin:

/******************************************************************************
 * Program Name:          Lab05A - ISBN
 * Program Description:   Calculate ISBN-10 AND ISBN-13
 * Program Author:        xxxxxxxxx
 * Date Created:          10/10/2018
 * Change#        Change Date      Programmer Name        Description
 * -------        ------------     -------------------    ---------------------
******************************************************************************/
package lab05a;
import java.util.Scanner;
public class Lab05A {
    public static void main(String[] args) {
        // Input for s
        Scanner input = new Scanner(System.in); // Create new scanner
        System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: "); // our ever-lasting prompt
        String s = input.next(); // declare string variable "s" and set it equal to next input from user.
        String output10 = null; // Declaring string output10
        String output13 = null; // Declaring string output13
        // main while loop
        while (!"QUIT".equals(s)) { //this will run as long as the program does not receive an input of "QUIT", not case sensitive.
            char checkDigit;
            char checkSum = '0';
            if (s.length() == 9) { //if the length of the inputted string is 9 characters...
                int sum = 0; // initialize sum variable
                for (int i=0; i <= s.length();) {
                    sum = sum + ((s.charAt(i) - '0') * (i + 1));
                }
                if (sum % 11 == 10) {
                    checkDigit = 'X';
                }
                else {
                    checkDigit = (char) ('0' + (sum % 11));
                }
                output10 = output10 + "\n" + s + checkDigit;
                System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
                s = input.next();
            }
            else if  (s.length() == 12) {
               int sum = 0;
                for (int i=0; i <= s.length();) {
                    if (i % 2 == 0) {
                        sum = sum + (s.charAt(i) - '0');
                    }
                    else {
                        sum = sum + (s.charAt(i) - '0') * 3;
                    }
                    checkSum = (char) (10 - sum % 10);
                    if (checkSum == 10) {
                        checkSum = 0;
                    }
                    output13 = "\n" + output13 + checkSum;
                    System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
                    s = input.next();
                }
            }
            else if (!s.toUpperCase().equals("QUIT")) {
                System.out.println(s + " is invalid input.");
                System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
                s = input.next();
            }
        }
        System.out.println("The 10 digit ISBNs are \n" + output10);
        System.out.println("The 13 digit ISBNs are \n" + output13);
    }
}

Instructions

Organigramme en tant qu'image séparée car il est un peu petit dans les instructions doc

Merci pour votre aide.

Author: Ryan L., 2018-10-11

2 answers

Oui, il vous manque l'incrémenteur dans cette boucle for

for (int i=0; i <= s.length();) {

Passer à

for (int i=0; i <= s.length(); i++) {

Je suis sûr que vous ne voulez pas <=, peut-être juste <

Donc

for (int i=0; i < s.length(); i++) {

BTW c'est facile à résoudre si vous déboguer votre code - une compétence essentielle --

Modifier

Si vous avez le code ci-dessous (et s. length == 12)

for (int i=0; i < s.length(); i++) {
    System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
    s = input.next();
}

Alors il s'exécutera 12 fois. Fixez votre boucle

 0
Author: Scary Wombat, 2018-10-11 03:03:03

CODE MIS À JOUR depuis que j'ai implémenté certaines des suggestions ici:

package lab05a;
import java.util.Scanner;
public class Lab05A {
    public static void main(String[] args) {
        // Input for s
        Scanner input = new Scanner(System.in); // Create new scanner
        System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: "); // our ever-lasting prompt
        String s = input.next(); // declare string variable "s" and set it equal to next input from user.
        String output10 = ""; // Declaring string output10
        String output13 = ""; // Declaring string output13
        // main while loop
        while (!"QUIT".equalsIgnoreCase(s)) { //this will run as long as the program does not receive an input of "QUIT", not case sensitive.
            char checkDigit;
            char checkSum = '0';
            if (s.length() == 9) { //if the length of the inputted string is 9 characters...
                int sum = 0; // initialize sum variable
                for (int i=0; i < s.length(); i++) {
                    sum = sum + ((s.charAt(i) - '0') * (i + 1));
                }
                if (sum % 11 == 10) {
                    checkDigit = 'X';
                }
                else {
                    checkDigit = (char) ('0' + (sum % 11));
                }
                output10 = output10 + "\n" + s + checkDigit;
                System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
                s = input.next();
            }
            else if  (s.length() == 12) {
               int sum = 0;
                for (int i=0; i < s.length(); i++) {
                    if (i % 2 == 0) {
                        sum = sum + (s.charAt(i) - '0');
                    }
                    else {
                        sum = sum + (s.charAt(i) - '0') * 3;
                    }
                    checkSum = (char) (10 - sum % 10);
                    if (checkSum == 10) {
                        checkSum = 0;
                    }
                    output13 = "\n" + output13 + s + checkSum;
                    System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
                    s = input.next();
                }
            }
            else if (!"QUIT".equalsIgnoreCase(s)) {
                System.out.println(s + " is invalid input.");
                System.out.println("Enter the first 9 or 12 digits of an ISBN number. Enter QUIT to exit: ");
                s = input.next();
            }
        }
        System.out.println("The 10 digit ISBNs are \n" + output10);
        System.out.println("The 13 digit ISBNs are \n" + output13);
    }
}
 -1
Author: Ryan L., 2018-10-11 02:13:04