Я провел следующий эксперимент: в 9 группах на первом занятии предложил студентам написать алгоритм нахождения корней квадратного уравнения. Все студенты сказали, что это элементарная задача, и они легко с ней справятся. Тогда я просил одного студента составить алгоритм решения этой задачи (нахождения корней квадратного уравнения), после чего 2-ой студент должен был быть Исполнителем. Исполнитель умеет выполнять арифметические операции (сложить, вычесть, умножить и т.д.), логические операции (сравнивать на больше, меньше, равно) и вводить/выводить значения. Автор алгоритма должен был выдавать первому команды - действия, из которых состоял алгоритм. Исполнитель - должен был выполнить их и получить ответ. Кроме одной группы, ни в одной группе Исполнитель не смог выполнить даже первое действие, несмотря на то, что большинство студентов действительно более-менее помнили, как искать корни квадратного уравнения.

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

Многие начинали общение с Исполнителем так: "Давай напишем квадратное уравнение ax2+bx+c=0". Сказывалась школьная привычка начинать решение с записи исходного уравнения. Но ведь для решения задачи НЕ НУЖНО само уравнение! Для решения нужны только значения коэффициентов!

Следующее замечание. Для нахождения дискриминанта предлагали Исполнителю "написать выражение D=b2-4ac" или "записать в D выражение b2-4ac". Но исполнитель не умеет писать! Это не входит в список его операций. Исполнитель может вычислить значения выражения b2-4ac и запомнить его в переменной (ячейке) D. Далее предлагалось Исполнителю сравнить D с 0.Но и это глупый Исполнитель не сможет выполнить! Он умеет выполнять (вычислять!) логические операции, значением которых является ИСТИНА или ЛОЖЬ. Тогда предлагалось определить, больше значение D 0, равно 0 или меньше. Но ведь это 3 разных действия! И в каждом случае пойдет своя ветка решения!

Вывод - для составления алгоритма важно не просто представлять, как решается задача, а очень четко понимать ход решения ПО ШАГАМ! Очень полезно решить задачу, фиксируя на бумаге свои действия, четко отделяя их друг от друга. Ведь это и есть алгоритм!

Не вдаваясь в математические тонкости, запишем ход решения. Первое действие - нахождение дискриминанта D=b2-4ac. Можем мы выполнить это действие? Нет! Мы не знаем, чему равно произведение буквы a на букву c, так же как и остальные операции в этом выражении. Мы не знаем значения переменных a,b,c! Т.е. на самом деле первым действием исполнителя алгоритма будет получение исходных данных (значений переменных)!

Итак:

1. Ввод значений коэффициентов.

2. Вычисление значения выражения b*b-4*a*c и запоминание его в переменной D (Исполнителю неважно, что это есть значение дискриминанта!).

3. Определение значения логического выражения D<0.

4. Если оно есть ИСТИНА, то вывод сообщения об отсутствии корней и закончить работу.

5. В противном случае вычислить значения выражений:

6. Вывести значения переменных x1 и x2 и закончить работу.

(Для упрощения мы пропустили вариант, когда коэффициент a равен 0). Этот алгоритм состоит из 6 действий. Каждое действие - из списка допустимых операций Исполнителя. Каждое действие выполняется только после того, как закончилось предыдущее. Можно предположить, что наш Исполнитель сможет выполнить этот алгоритм, если написать его на языке Исполнителя.

Еще одно замечание. Уже перед составлением алгоритма ясно, что Исполнителю придется помнить значения коэффициентов, значения корней и значение дискриминанта. Поэтому придется выделить в его памяти 6 ячеек - переменных. Имена переменным логично задать в соответствии с тем, что в них хранится: a,b,c,D,x1,x2. Теперь перепишем этот алгоритм в виде программы на языке Fortran.



1.	Program sq_root
2.	! Программа нахождения корней кв. уравнения.
3.	implicit none
4.	! опишем (определим) требуемые для выполнения программы переменные
5.	real x1,x2		! значения корней
6.	real a,b,c		! значения коэффициентов
7.	real D		! дискриминант

8.	 print *,'enter coefficients'	! подсказка бестолковому пользователю о 
					! том,  что программа ждет от него 3 числа
9.	 read (*,*) a,b,c		! ввод значений в переменные a,b,c

10.	 D=b*b-4*a*c		! вычисление дискриминанта

11.	 if (D<0) then
12.		print *,'The equation has no roots!'	
13.	 else
14.		x1=(-b+sqrt(D)) /(2*a)
15.		x2=(-b-sqrt(D)) /(2*a)
16.		print *, 'x1=',x1,'  x2=',x2
17.	 end if
18.	end

  

Программа состоит из неисполняемой части (строки 1- 7) и исполняемой. Первая часть нужна компилятору для правильного перевода программы на язык процессора. Оператор implicit none говорит компилятору, чтобы он любую неописанную переменную расценивал как ошибку. Это позволит уменьшит количество ошибок, получающихся в результате случайных описок, ошибок при наборе текста и т.д. Операторы (5,6,7) описывают имена и типы переменных, используемых в программе.

Оператор в 10-ой строке - оператор ПРИСВАИВАНИЯ. При его выполнении компьютер вычислит значение выражения справа от знака = и присвоит его переменной D. Операторы 14 и 15 также являются операторами присваивания.

В 11 строке начинается условный блочный оператор. Если выражение D<0 в скобках после ключевого слова if истинно, выполняются операторы, стоящие на следующих строках до else (в данном случае только оператор вывода 12). В противном случае выполняются операторы после else до end if (14,15,16). Программа заканчивается единственным обязательным оператором end. Надо отметить, что программа не является идеальной. Например, в ней не рассматривается случай, когда значение a=0. В данном случае произойдет деление на 0 в 14-м операторе, что приведет к непредсказуемым последствиям. Реальная (не учебная) программа должна предусмотреть и этот случай!

Hosted by uCoz