Главная » Java, Web » Разработка алгоритмов Java

0

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

Программа выражает идею. Программист начинает с того, что формулирует идею, которая должна затем превратиться в задание, выполняемое компьютером. Вероятно, программист имеет представление о том, как в принципе можно было бы решить поставленную задачу, например, вручную, какие действия шаг за шагом должны были бы при этом быть предприняты. Последовательность таких действий, общая схема выполнения задачи — это алгоритм. Он скрыт внутри логической структуры пока не существующей программы. Алгоритм не должен содержать все детальные шаги, которые будут описаны в программе. Он всего лишь вспомогательное средство. Алгоритм в случае необходимости может быть создан и записан на любом языке, например, на русском, или с использованием графических построений.

Зачем нужен алгоритм? Часто задача оказывается достаточно трудной и требует большой концентрации и большого количества работы. Составление алгоритма позволяет взглянуть на задачу в целом, понять ее более глубоко, найти и использовать более эффективные подходы.

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

1.     Получить данные от пользователя.

2.     Вычислить баланс по истечении первого года.

3.     Показать баланс.

4.       Вычислить баланс после 2 лет.

5.       Показать баланс.

6.       Вычислить баланс после 3 лет.

7.       Показать баланс.

8.       Вычислить баланс после 4 лет.

9.       Показать баланс.

10.     Вычислить баланс после 5 лет.

Такой алгоритм верен, но в нем очень много повторов. Его можно упростить:

1.      Получить данные от пользователя.

2.      До тех пор, пока необходимо считать:

•                 вычислить баланс на следующий год;

•                 показать баланс.

Этот алгоритм достаточно схематичен. Для компьютера следует указывать более детальные инструкции. Такие инструкции не обязательно записывать при составлении алгоритма. Степень детализации алгоритма зависит от конкретных потребностей разработчика. Вот, например, как можно записать алгоритм, детализируя пункт 1 ("Получить данные от пользователя"), сделав его более приближенным к языку программирования, т. е. тем инструкциям, которые должны быть указаны для машины:

1.      Запросить у пользователя величину начального вложения.

2.       Прочитать ответ пользователя.

3.      Запросить у пользователя величину годового процента.

4.       Прочитать ответ пользователя.

Оставшиеся три пункта алгоритма можно расписать следующим образом: ? до тех пор, пока следует вычислять:

•                 вычислить годовой процент;

•                 прибавить годовой процент к балансу;

•                 показать баланс.

Для того чтобы проверить, следует ли продолжать процесс вычисления (пункт 5 в последнем примере), можно записать алгоритм:

1.      years = 0.

2.      while years < 5.

3.      years = years + 1.

4.       Вычислить процент.

5.      Прибавить процент к балансу.

6.      Показать баланс.

Итак, весь алгоритм будет выглядеть следующим образом:

1.     Запросить у пользователя величину начального вложения.

2.      Прочитать ответ пользователя.

3.      Запросить у пользователя величину годового процента.

4.      Прочитать ответ пользователя.

5.      years = 0.

6.     while years < 5.

7.      years = years + 1.

8.      Вычислить процент.

9.      Прибавить процент к балансу.

10.    Показать баланс.

Такой алгоритм (он весьма детален) можно перевести в программу, написанную с соблюдением всех правил синтаксиса:

double principal, rate, interest; // объявление переменных int years;

System.out.print("Pervonachalnoe vlozhenie: ");

principal = TextIO.getInDouble();

System.out.print("Godovoj protsent: ");

rate = TextIO.getInDouble();

years = 0;

while (years < 5) {

years = years + 1;

interest = principal * rate;

principal = principal + interests-

System, out .println (principal) ; }

Инструкция whiledo..while

Инструкция do..while выполняет инструкция до тех пор, пока условие принимает значение true:

do

инструкция while (условие);

Или в виде

do {

инстуркция } while (условие);

В конце мы пишем точку с запятой. Точка с запятой — это часть инструкции. Каждая инструкция в Java заканчивается либо точкой с запятой, либо правой фигурной скобкой "}".

Пример

boolean wantsToContinue;

// True — если пользователь желает повторить игру, do {

Checkers.playGame() ;

Text10.put("Do you want to play again? "); wantsToContinue = TextlO.getlnBoolean(); } while (wantsToContinue == true);

Слово проверяется уже после того, как инструкция будет выполнена (хотя бы один раз). Иными словами, две ниже приведенные конструкции выполняют одно и то же действие:

do {

doSomething

} while (boolean-expression); doSomething

while (boolean-expression) { doSomething

Конструкцию

while (boolean-expression) { doSomething

можно заменить следующей конструкцией:

if (boolean-expression) { do {

doSomething } while (boolean-expression);

такие замены не изменят смысл программы.

Внутри циклов while и do. .while можно использовать инструкцию break; . Эта инструкция приводит к прекращению выполнения цикла. При этом программа переходит к следующей после цикла инструкции, например:

while (true) { // походит на бесконечный цикл! Text10.put("Enter a positive number: "); N = Text10.getlnlnt();

if (N > 0) // ввод верен, выходим из цикла break;

TextlO.putln("Your answer must be > 0. ") ;

}

// продолжение программы

Можно использовать инструкцию continue. Эта инструкция прекращает выполнение текущего шага цикла и переходит к следующему шагу цикла.

Инструкция for

Многие циклы имеют следующий вид:

инициализация while (уловие) { инструкции

обновление }

В качестве примера можно привести следующий код:

years = 0;

while (years < 5) {

interest = principal * rate; principal += interests-

System, out .print In (principal); years++;

}

Этот код можно записать более компактно с использованием цикла for:

for (years = 0; years < 5; years++) { interest = principal * rate; principal += interests- System, out.println (principal) ;

}

Общий вид цикла for следующий:

for (инициализация переменной; условие; обновление переменной) инструкция

Или, что то же самое, но с блоком:

for (инициализация переменной; условие; обновление переменной) { инструкции

Вывод 10 чисел натурального ряда может быть осуществлен следующим образом:

for (N = 1; N <= 10; N++) { System.out.println(N);

Вложенные циклы

Циклы можно вкладывать друг в друга. Для решения задачи вывода, например, такой таблицы, как показана ниже, можно использовать два цикла — при этом один цикл будет вложен в другой.

Задача: вывести таблицу

1

2

3

4

5

6

7

8

9

10

11

12

2

4

6

8

10

12

14

16

18

20

22

24

3

6

9

12

15

18

21

24

27

30

33

36

4

8

12

16

20

24

28

32

36

40

44

48

5

10

15

20

25

30

35

40

45

50

55

60

6

12

18

24

30

36

42

48

54

60

66

72

7

14

21

28

35

42

49

56

63

70

77

84

8

16

24

32

40

48

56

64

72

80

88

96

9

18

27

36

45

54

63

72

81

90

99

108

10

20

30

40

50

60

70

80

90

100

110

120

11

22

33

44

55

66

77

88

99

110

121

132

12

24

36

48

60

72

84

96

108

120

132

144

Решение

for (rowNumber = 1; rowNumber <= 12; rowNumber++) { for (N = 1; N <= 12; N++) {

// print in 4-character columns TextIO.put(N * rowNumber, 4);

Text IO. put in () ;

Здесь же мы приведем еще один пример, в котором используется условие if.

Пример с If

public class LengthConverter {

public static void main(String[] args) {

double measurement; // Численое значение, вводится пользователем.

String units;             // Единицы измерения,

// также задаются пользователем.

double inches, feet, yards, miles; // Значения во всех допустимых

// единицах измерений.

TextlO.putln("Enter measurements in inches, feet, yards, or miles.");

TextlO.putln("For example: 1 inch 17 feet 2.73 miles");

TextlO.putln("You can use abbreviations: in ft yd mi");

TextlO.putln("I will convert your input into the other units");

TextlO.putln("of measure.");

Text 10. put In () ;

while (true) {

/* Информация от пользователя переводится в нижний регистр. */

TextlO.put("Enter your measurement, or 0 to end: "); measurement = TextlO.getDouble(); if (measurement == 0)

break; // прекращение цикла while units = TextlO.getlnWord(); units = units.toLowerCase();

/* преобразование введенных значений в дюймы */

if (units.equals("inch") || units.equals("inches")

II units.equals("in")) {

inches = measurement;

else if (units.equals("foot") || units.equals("feet")

II units.equals("ft")) {

inches = measurement * 12;

}

else if (units.equals("yard") || units.equals("yards")

II units.equals("yd")) {

inches = measurement * 36;

}

else if (units.equals("mile") || units.equals("miles")

II units.equals("mi")) { inches = measurement * 12 * 5280;

}

else {

TextlO.putln("Sorry, but I don’t understand V"

+ units + .");

continue;

}

/* Преобразование из дюймов в футы, ярды и мили. */

feet = inches / 12; yards = inches / 36; miles = inches / (12*5280);

/* Вывод значений. */

Text 10. put In () ;

TextlO.putln("That’s equivalent to:");

TextlO.put(inches, 15);

Text10.putIn(" inches");

TextlO.put(feet, 15);

Text10.putIn(" feet");

TextlO.put(yards, 15);

Text10.putIn(" yards");

TextlO.put(miles, 15);

Text10.putIn(" miles");

Text 10. put In () ;

}

Text 10. put In () ;

TextlO.putln("OK! Bye for now."); }

}

Эта программа запрашивает у пользователя ввод длины с указанием единиц, переводит введенную длину в другие единицы и выводит информацию пользователю.

Переключатель switch

Условие if направляет поток программы по одному из двух направлений. В том случае, когда следует сделать выбор, состоящий из нескольких возможностей, можно использовать переключатель switch.

Инструкция switch используется следующим образом:

switch (выражение) { case constant-1: statements-1 break; case constant-2: statements-2 break;

// (еще варианты) case constant-N: statements-N breaks-

default : // необязательные инструкции statements-(N+l)

}

Если выражение — целое число, то переключатель можно записать так:

switch (N) { // N — целое case 1:

System.out.println("The number is 1."); break; case 2: case 4: case 8:

System.out.println("The number is 2, 4, or 8."); System.out.printIn("(That’s a power of 2!)"); break; case 3: case 6: case 9:

System.out.println("The number is 3, 6, or 9."); System.out.printIn("(That’s a multiple of 3 !) ") ; break; case 5:

System.out.println("The number is 5."); breaks- default :

System.out.println("The number is 7,");

System.out.println(" or is outside the range 1 to 9.");

}

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии