Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Java] Cмена знака в последовательности чисел


Автор: Merhaba 13.5.2011, 22:52
Добрый Вечер!!!
Помогите Пожалуйста наисать программу которая будет считать, сколько раз в последовательности чисел меняется знак  (например, в последовательности –5, –2, 9, 1, 0, 4, –3 знак меняется дважды: с минуса на плюс, затем с плюса на минус).
Без использования массива! 
Код

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    Scanner con = new Scanner (System.in);
           int N;
    System.out.println("Здравствуйте, уважаемый пользователь!");
    System.out.print ("Введите количество чиcел N (N > 0) = ");
    N=con.nextInt();
    for (int i = 0; i < N; i++) {
       System.out.print("Введите число № " + i + ": ");
       d = con.nextInt();
  }

Автор: frikey 14.5.2011, 07:06
Пожалуйста:
Код

public class Main {

    public static void main(String[] args) {
        Scanner con = new Scanner(System.in);

        System.out.println("Здравствуйте, уважаемый пользователь!");
        System.out.print("Введите количество чиcел N, (N > 0) = ");

        int total = con.nextInt();
        int signChangeCounter = 0;

        boolean prevIsNegative = false;

        for (int i = 0; i < total; i++) {
            System.out.print("Введите число № " + (i + 1) + ": ");
            int parsed = con.nextInt();

            boolean curIsNegative = parsed < 0;

            if (i == 0) {
                prevIsNegative = curIsNegative;
            } else {
                if (prevIsNegative != curIsNegative) {
                    signChangeCounter++;
                }
            }
        }

        System.out.println("Количество смен знака в последовательности: " + signChangeCounter);
    }
}

Автор: Merhaba 15.5.2011, 07:05
frikey
Спасибо Вам Большое!!!

Автор: Merhaba 15.5.2011, 10:24
frikey
Почему-то неверно считает, когда ввёл последовательнсть из примера:
Код

Введите количество чиcел N, (N > 0) = 7
Введите число № 1: -5
Введите число № 2: -2
Введите число № 3: 9
Введите число № 4: 1
Введите число № 5: 0
Введите число № 6: 4
Введите число № 7: -3
Количество смен знака в последовательности: 4
BUILD SUCCESSFUL (total time: 39 seconds)

(например, в последовательности –5, –2, 9, 1, 0, 4, –3 знак меняется дважды: с минуса на плюс, затем с плюса на минус).


Автор: frikey 15.5.2011, 19:21
Прошу прощения. Глупейшая ошибка  smile 

Вот корректный код:
Код

public class SignsReader {

    public static void main(String[] args) {
        Scanner con = new Scanner(System.in);

        System.out.println("Здравствуйте, уважаемый пользователь!");
        System.out.print("Введите количество чиcел N, (N > 0) = ");

        int total = con.nextInt();
        int signChangeCounter = 0;

        boolean prevIsNegative = false;

        for (int i = 0; i < total; i++) {
            System.out.print("Введите число № " + (i + 1) + ": ");
            int parsed = con.nextInt();

            boolean curIsNegative = parsed < 0;

            if (i != 0) {
                if (prevIsNegative != curIsNegative) {
                    prevIsNegative = curIsNegative;
                    signChangeCounter++;
                }
            } else {
                prevIsNegative = curIsNegative;
            }
        }

        System.out.println("Количество смен знака в последовательности: " + signChangeCounter);
    }
}

Автор: Merhaba 15.5.2011, 21:46
frikey
Опишите Пожалуйста алгоритм, который реализуется вот в этом блоке:
 
Код

boolean curIsNegative = parsed < 0;

            if (i != 0) {
                if (prevIsNegative != curIsNegative) {
                    prevIsNegative = curIsNegative;
                    signChangeCounter++;
                }
            } else {
                prevIsNegative = curIsNegative;
            }
        }

Автор: frikey 16.5.2011, 05:38
Суть в следующем:
Есть два флага curIsNegative и prevIsNegative. Первый указывает на то является ли текущее введенное число отрицательным, второй, соответственно, указывает на отрицательность предыдущего введенного значения. На первой итерации цикла выполняется операция prevIsNegative = curIsNegative, по скольку предыдущих значений у нас ещё нет. На последующих итерациях происходит сравнение флагов и в случае их неравенства, это и означает что знак был изменен. А если знак был изменен, то, происходит инкремент счетчика.

Автор: Merhaba 16.5.2011, 06:29
frikey
Спасибо Вам большое за Помощь!!!
Если Вам не сложно, помогите Пожалуйста решить ещё одну задачу, выложенную мной в этом разделе!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)