Иначе если и делать пока не работает как задумано - PullRequest
1 голос
/ 09 марта 2012

РЕДАКТИРОВАТЬ: Недавние события, когда я компилировал программу, которую я не мог скомпилировать, привели меня к мысли, что у меня одновременно возникла проблема с моим компилятором. Без сомнения, из-за того, что я запустил его в WINE на Mac, в отличие от нативного приложения. Спасибо за ваши ответы. Я правильно протестирую все ответы и внесу все изменения, когда исправлю указанную ошибку с помощью компилятора или переместил компьютеры на один с рабочим.

Я относительно новичок в программировании, а также на этом сайте, поэтому, пожалуйста, потерпите меня. Я получаю сообщение об ошибке с моими двумя из моих утверждений If и одним «делом / пока», которое мне не удается устранить.

Вся программа работает так, как задумано, но два блока приведены ниже. Проблема заключается в том, что когда я ввожу символ «у», все работает как положено, и («Results =» + Arrays.toString (row)) печатает, как я и ожидал. Это также продолжается, чтобы продолжить через оригинальный цикл For и запустить программу снова.

Однако, когда я ввожу любой другой символ (т.е. не 'y' или 'n'), код не печатает «Ввод должен быть либо« y », либо« n »», а просто ждет другого ввода. Даже когда вводится «n», он не следует из цикла, как я хотел, он просто продолжает цикл и не переходит к другому, если я думал, что так и будет. Он делает это бесконечно, не принимая никаких других входных данных, кроме 'y', чтобы продолжить проходить цикл, так что я никогда не смогу получить отпечаток "негатив".

У кого-нибудь есть мысли о том, почему это происходит? Хотя технически это не домашнее задание, я пометил его так, как я хочу знать, если возможно, что происходит, а не просто как это исправить.

        do {
            ans = input.next().charAt(0);
                if (!ans.equals('y')  ||  !ans.equals('n')) {
                    System.out.println ("Input must be either 'y' or 'n'");
                }
        } while (!ans.equals('y')  ||  !ans.equals('n'));

и

if (ans.equals('y')) {
            for (Object[] row : prevResults) {
                    System.out.println("Results = " + Arrays.toString(row));
            }
        } //
        else if (ans.equals('n')) {
            System.out.println("Negative");
            //System.exit(0); 
        }

Полный код указан ниже

import java.util.*;

public class Averages {
    public static void main (String [] args) {

        //declare variables
        int course, exam, average = 0;
        char ans;
        String pass;

        //creating objects
        Scanner input =  new Scanner(System.in);
        List<Object[]> prevResults = new ArrayList<Object[]>();

        //full loop
        for (int i = 0; i < 5; i++ ) {

            System.out.println ("Loop " + (++i) + " out of 5");

            //Course loop
            do {
            System.out.println ("Please enter a course mark out of 100");
            course = input.nextInt();
                if (course > 100) {
                    System.out.println ("Number entered is over 100");
                }
            } while (course > 100);

            //Exam loop
            do {
            System.out.println ("Please enter an exam mark out of 100");
            exam = input.nextInt();
                if (exam > 100) {
                    System.out.println ("Number entered is over 100");
                }
            } while (exam > 100);


            average = (course + exam)/2;

            // Final Grade
            System.out.println ("The average mark is " + average);

            if ( average >= 50 && course > 40 && exam > 40)  {
                System.out.println ("The final grade is pass");
                pass = "Pass";
            }
            else {
                System.out.println ("The final grade is fail");
                pass = "Fail";
            }

            //add to array
            prevResults.add(new Object[] { "Course mark: " + course, "Exam mark: " + exam,"Average: " + average, "Grade: " + pass});


            System.out.println ("Would you like to see previous results? y/n");


            //'Previous results' question loop
            do {
                ans = input.next().charAt(0);
                    if (!ans.equals('y')  ||  !ans.equals('n')) {
                        System.out.println ("Input must be either 'y' or 'n'");
                    }
            } while (!ans.equals('y')  ||  !ans.equals('n'));


            // Close or Array if statement
            if (ans.equals('y')) {
                for (Object[] row : prevResults) {
                        System.out.println("Results = " + Arrays.toString(row));
                }
            } //
            else if (ans.equals('n')) {
                System.out.println("Negative");
                //System.exit(0); 
            }
        }// end for 
    }//end main
}//end class

РЕДАКТИРОВАТЬ 2: У меня есть переключение компьютеров и все предложенные ответы действительно работают. Они существо

while (ans != 'y' && ans != 'n');

И

while (!(ans.equals('y')  ||  ans.equals('n')));

И

Создание отдельного метода, предложенного Крисом Брауном.

В интересах всех, кто читает это, эти решения работают замечательно, хотя у меня не было времени взглянуть на BufferedReader, предложенный Грегом Хьюгиллом, я, скорее всего, реализую его, потому что он кажется лучшим вариантом из того, что он заявил .

Ответы [ 5 ]

4 голосов
/ 09 марта 2012

Во-первых, ошибка в вашем коде:

System.out.println ("Loop " + (++i) + " out of 5");

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

Далее ваш не должен использовать equals для сравнения char значений - вместо этого используйте ==. Когда вы используете equals, происходит много ненужных вещей из-за автобокса , что в итоге приводит к characterObject.equals(anotherCharacterObject), объектам типа java.lang.Character. Просто используйте, например, ans == 'y' вместо.

Наконец, как указали люди, вы должны переписать свое задание как:

do {
    ans = input.next().charAt(0);
    if (ans != 'y' && ans != 'n') {
        System.out.println ("Input must be either 'y' or 'n'");
    }
} while (ans != 'y' && ans != 'n');

или даже есть отдельный метод для проверки состояния (спасибо Крису Брауну).

2 голосов
/ 09 марта 2012

Условие должно быть:

while (!(ans.equals('y')  ||  ans.equals('n')));

потому что условие, которое вы впервые написали:

while (!ans.equals('y')  ||  !ans.equals('n'));

всегда равно true (каждый символ не y или не n).

И скажи спасибо Де Морган , также см. мой ответ здесь .

1 голос
/ 09 марта 2012

Ваша условная логика перевернута, вы говорите:

if (!ans.equals('y') || !ans.equals('n'))

Семантически, это очень сложная строка для анализа, потому что вы говорите "если ответ не y или ответ не n", что является множеством логических операторов в одном выражении. Возможно, поэтому ваша ошибка закралась.

Действительно, быстрое решение заключается в том, чтобы поменять местами «или» на «и», но это не поможет вам понять проблему. Вы должны изменить его, чтобы использовать другой подход, такой как:

if(isLegalAnswer(ans))

, где isLegalAnswer определяется как:

private static boolean isLegalAnswer(char ans) {
  return (ans=='y' || ans=='n');
}

Это позволяет вам отрицать все выражение (! IsLegalAnswer (ans)), используя одно отрицание.

Традиционно я запрещаю себе использовать более одного отрицания в одном выражении или выражении, это помогает сделать код легким для чтения, практически не влияя на скорость выполнения.

1 голос
/ 09 марта 2012
  } while (!ans.equals('y')  ||  !ans.equals('n'));

говорит, что ans не равен 'y', а ans не равен 'n'.Это всегда будет правдой (всегда будет не равным одному из них)

1 голос
/ 09 марта 2012

Ваше состояние должно быть

if (!ans.equals('y')  &&  !ans.equals('n'))

вместо

if (!ans.equals('y')  ||  !ans.equals('n'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...