|
|
@@ -55,12 +55,12 @@ Console.WriteLine($"m={m}, n={n}");
|
|
|
переменная = выражение
|
|
|
```
|
|
|
|
|
|
-Знак «=» нужно читать как «присвоить».
|
|
|
+Знак `=` нужно читать как «присвоить».
|
|
|
|
|
|
Команда присваивания обозначает следующие действия, выполняемые компьютером:
|
|
|
|
|
|
1. Вычисляется выражение.
|
|
|
-2. Полученное значение присваивается переменной.
|
|
|
+1. Полученное значение присваивается переменной.
|
|
|
|
|
|
В приведенном выше алгоритме присутствуют две команды присваивания. В блок-схемах команда присваивания записывается в прямоугольнике. Такой блок называется вычислительным блоком.
|
|
|
|
|
|
@@ -87,7 +87,7 @@ Console.WriteLine($"m={m}, n={n}");
|
|
|
|
|
|
Поскольку присваивание является важнейшей операцией в вычислительных алгоритмах, обсудим ее более подробно.
|
|
|
|
|
|
-Рассмотрим последовательное выполнение четырех команд присваивания, в которых участвуют две переменные величины a и b.
|
|
|
+Рассмотрим последовательное выполнение четырех команд присваивания, в которых участвуют две переменные величины `a` и `b`.
|
|
|
|
|
|
В приведенной ниже таблице напротив каждой команды присваивания указываются значения переменных, которые устанавливаются после ее выполнения.
|
|
|
|
|
|
@@ -105,12 +105,12 @@ b=a+b | 2 | 4
|
|
|
* значение, присвоенное переменной, сохраняется в ней вплоть до выполнения следующей команды присваивания этой переменной;
|
|
|
* новое значение, присваиваемое переменной, заменяет ее предыдущее значение.
|
|
|
|
|
|
-Рассмотрим один очень полезный алгоритм, который приходится часто использовать при программировании. Даны две величины: Х и Y. Требуется произвести между ними обмен значениями. Например, если первоначально было Х=1, Y=2, то после обмена должно стать: Х=2, Y=1.
|
|
|
+Рассмотрим один очень полезный алгоритм, который приходится часто использовать при программировании. Даны две величины: `Х` и `Y`. Требуется произвести между ними обмен значениями. Например, если первоначально было `Х=1, Y=2`, то после обмена должно стать: `Х=2, Y=1`.
|
|
|
|
|
|
Хорошей моделью для решения этой задачи является следующая ситуация: имеются два стакана — один с молоком, другой с водой. Требуется произвести обмен их содержимым. Всякому ясно, что в этом случае нужен дополнительный третий пустой стакан. Последовательность действий будет следующей: 1) перелить из первого стакана в третий; 2) перелить из второго в первый;
|
|
|
3) перелить из третьего во второй. Цель достигнута!
|
|
|
|
|
|
-По аналогии для обмена значениями двух переменных нужна третья дополнительная переменная. Назовем ее Z. Тогда задача обмена решается последовательным выполнением трех команд присваивания:
|
|
|
+По аналогии для обмена значениями двух переменных нужна третья дополнительная переменная. Назовем ее `Z`. Тогда задача обмена решается последовательным выполнением трех команд присваивания:
|
|
|
|
|
|
Команда | X | Y | Z
|
|
|
----------|---|---|---
|
|
|
@@ -119,11 +119,11 @@ Z = X | 1 | 2 | 1
|
|
|
X = Y | 2 | 2 | 1
|
|
|
Y = Z | 2 | 1 | 1
|
|
|
|
|
|
-Аналогия со стаканами не совсем точна в том смысле, что при переливании из одного стакана в другой первый становится пустым. В результате же присваивания (Х = Y) переменная, стоящая справа (Y), сохраняет свое значение.
|
|
|
+Аналогия со стаканами не совсем точна в том смысле, что при переливании из одного стакана в другой первый становится пустым. В результате же присваивания (`Х = Y`) переменная, стоящая справа (`Y`), сохраняет свое значение.
|
|
|
|
|
|
Алгоритм для деления дробей имеет линейную структуру. В нем все команды выполняются в строго однозначной последовательности, каждая по одному разу. Линейный алгоритм составляется из команд присваивания, ввода, вывода и обращения к вспомогательным алгоритмам (об этом позже).
|
|
|
|
|
|
-При описании алгоритмов в блок-схемах типы, как правило, не указываются (но подразумеваются). В алгоритмах для всех переменных типы указываются явно. В них используются следующие обозначения типов: Int — целый тип, Float — вещественный тип, String — символьный (литерный) тип, Boolean — логический тип. В алгоритме для деления дробей для всех переменных указан тип Int.
|
|
|
+При описании алгоритмов в блок-схемах типы, как правило, не указываются (но подразумеваются). В алгоритмах для всех переменных типы указываются явно. В них используются следующие обозначения типов: `Int` — целый тип, `Float` — вещественный тип, `String` — символьный (литерный) тип, `Boolean` — логический тип. В алгоритме для деления дробей для всех переменных указан тип `Int`.
|
|
|
|
|
|
## Разветвляющийся алгоритм
|
|
|
|
|
|
@@ -135,28 +135,19 @@ Y = Z | 2 | 1 | 1
|
|
|
|
|
|
Составим алгоритм решения квадратного уравнения: ***ax<sup>2</sup>+bx+c=0***
|
|
|
|
|
|
-Задача хорошо знакома из математики. Исходными данными здесь являются коэффициенты а, b, с. Решением в общем случае будут два корня х1 и х2, которые вычисляются по формуле:
|
|
|
+Задача хорошо знакома из математики. Исходными данными здесь являются коэффициенты `а`, `b`, `с`. Решением в общем случае будут два корня `х1` и `х2`, которые вычисляются по формуле:
|
|
|
|
|
|
-
|
|
|
+$$x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$
|
|
|
|
|
|
```cs
|
|
|
-namespace oap
|
|
|
-{
|
|
|
- class Program
|
|
|
- {
|
|
|
- static void Main(string[] args)
|
|
|
- {
|
|
|
- Console.WriteLine("Введите a, b, c: ");
|
|
|
- var a = int.Parse(Console.ReadLine());
|
|
|
- var b = int.Parse(Console.ReadLine());
|
|
|
- var c = int.Parse(Console.ReadLine());
|
|
|
- var d = b * b - 4 * a * c;
|
|
|
- var x1 = (-b + Math.Sqrt(d)) / (2 * a);
|
|
|
- var x2 = (-b - Math.Sqrt(d)) / (2 * a);
|
|
|
- Console.WriteLine($"x1={x1}, x2={x2}");
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+Console.WriteLine("Введите a, b, c: ");
|
|
|
+var a = int.Parse(Console.ReadLine());
|
|
|
+var b = int.Parse(Console.ReadLine());
|
|
|
+var c = int.Parse(Console.ReadLine());
|
|
|
+var d = b * b - 4 * a * c;
|
|
|
+var x1 = (-b + Math.Sqrt(d)) / (2 * a);
|
|
|
+var x2 = (-b - Math.Sqrt(d)) / (2 * a);
|
|
|
+Console.WriteLine($"x1={x1}, x2={x2}");
|
|
|
```
|
|
|
|
|
|
```
|
|
|
@@ -171,7 +162,7 @@ x1=NaN, x2=NaN
|
|
|
|
|
|
Чтобы построить универсальный алгоритм, сначала требуется тщательно проанализировать математическое содержание задачи.
|
|
|
|
|
|
-Решение уравнения зависит от значений коэффициентов а, b, с. Вот анализ рассмотренной выше задачи (ограничиваемся только поиском вещественных корней):
|
|
|
+Решение уравнения зависит от значений коэффициентов `а`, `b`, `с`. Вот анализ рассмотренной выше задачи (ограничиваемся только поиском вещественных корней):
|
|
|
|
|
|
если а = 0, b = 0, с = 0, то любое х — решение уравнения;
|
|
|
если а = 0, b = 0, с <> О, то уравнение действительных решений не имеет;
|
|
|
@@ -179,6 +170,30 @@ x1=NaN, x2=NaN
|
|
|
если а<>0 и d=b<sup>2</sup>-4ac >= 0, то уравнение имеет два вещественных корня (формулы приведены выше);
|
|
|
если a<>0 и d<0, то уравнение не имеет вещественных корней.
|
|
|
|
|
|
+```mermaid
|
|
|
+flowchart TD
|
|
|
+ begin([Начало])
|
|
|
+ begin-->input[/Ввод a, b, c/]
|
|
|
+ input-->if1{a = 0}
|
|
|
+ if1-->|Да|if2{b = 0}
|
|
|
+ if2-->|Да|if3{c = 0}
|
|
|
+ if3-->|Да|out1[/Любое x/]
|
|
|
+ if3-->|Нет|out2[/Нет решений/]
|
|
|
+ out1-->finish([Конец])
|
|
|
+ out2-->finish
|
|
|
+ if2-->|Нет|case1[x := -c/b]
|
|
|
+ case1-->out3[/Вывод x/]
|
|
|
+ out3-->finish
|
|
|
+ if1-->|Нет|case2[d := b<sup>2</sup> - 4ac]
|
|
|
+ case2-->if4{d < 0}
|
|
|
+ if4-->|Да|out4[/Нет вещественных корней/]
|
|
|
+ out4-->finish
|
|
|
+ if4-->|Нет|case3["$${x1 := (-b + \sqrt{d}) / 2a}$$"]
|
|
|
+ case3-->proc1["$${x2 := (-b - \sqrt{d}) / 2a}$$"]
|
|
|
+ proc1-->out5[Вывод x1, x2]
|
|
|
+ out5-->finish
|
|
|
+```
|
|
|
+
|
|
|

|
|
|
|
|
|
Этот же алгоритм на Kotlin:
|