В настоящее время в некоторых школах ведется программирование не только на традиционных языках программирования высокого уровня типа Pascal и Си, но также преподают функциональные языки и языки программирования низкого уровня.
В данной работе на примере сортировки одномерного массива рассматриваются языки программирования С++ [4], Турбо Паскаль [2], функциональный язык Haskell [3].
Задача. Дан одномерный вещественный массив, содержащий n элементов. Отсортировать элементы массива по не убыванию.
Решение задачи на языке программирования С++. Здесь по условию нужно сортировать массив по не убыванию, так как в массиве могут встретиться одинаковые элементы.
#include#include /* На языке С++ сначала нужно подключить так называемые заголовочные файлы. В них содержатся переменные, объекты, классы, функции и т.д. В данном случае из файла iostream.h программе используются объекты cin и cout, которые, соответственно, предназначены для ввода и вывода данных. Из заголовочного файла conio.h> используется функция int getch(void), которая в этом случае считывает символ с клавиатуры. */ void main () { /* main () — это главная функция, с которой начинается выполнение программы */ int n; // переменная n используется для хранения количества элементов массива cout>n; /* Для ввода значения переменной с клавиатуры используем объект cin из заголовочного файла iostream.h */ double *mas=new double [n]; // Описание динамического массива вещественного типа cout>mas[j]; } // сортировка одномерного массива методом"пузырька" [1] // Здесь описываем вспомогательные переменные int p=n; int flag; double m; do { flag=0; // значение флага flag вначале равно нулю for (j=0;j mas[j+1]) { m=mas[j]; mas[j]=mas[j+1]; mas[j+1]=m; /* Если j-й элемент массива имеет большее значение, чем j+1-й элемент, то меняем местами эти элементы. При этом для удобства используем переменную m */ flag=1; /* Если переставили местами соседние элементы массива, то значение флага flag равно единице */ } p-; } while (flag); /* Если значение флага flag равно единице, т.е. хотя бы один раз меняли местами элементы, то внешний цикл повторяем ещё раз */ cout Теперь рассмотрим решение задачи на языке программирования Турбо Паскаль.
const n=15; //Описание константы n, которая определяет количество элемент массива var x:array [1..n] of real; //Описание массива х m : real; j, p : integer; f : boolean; //Описание вспомогательных переменных BEGIN writeln('Ввод элементов массива'); for j:=1 to n do begin write('Введите элемент массива x[', j, ']= '); readln(x[j]); end; writeln; p:=n; repeat {Начало внешнего цикла} f:=true; {Логическая переменная f используется в качестве флага} for j:=1 to p-1 do {Начало внутреннего цикла} if x[j]>x[j+1] then {Сравнение двух соседних элементов массива} begin m:=x[j];x[j]:=x[j+1];x[j+1]:=m; f:=false; end; {Конец внутреннего цикла} p:=p-1; until f; {Конец внешнего цикла} writeln('отсортированный массив'); for j:=1 to n do write(x[j]:2:2,' '); {Вывод отсортированных элементов одномерного массива в строку через пробел} readln; end.Решение задачи на функциональном языке программирования Haskell. Вообще на языке Haskell можно писать красивые и короткие программы. В данном случае в статье составлена программа, реализующая метод «пузырька» и причем эта реализация должна быть чем-то похожа на предыдущие реализации на языках С++ и Турбо Паскаль. В данном случае автор ставит задачу, чтобы в программе были использованы только самые простые функции Haskell и понятные для учащихся методы программирования. С этой целью вместо массива в программе используется список.
Программа по сути состоит из двух простых функций svap и m_sort. Третья функция priznak используется только, чтобы спрятать лишние параметры.
svap [m] f a= (f,a++[m]) svap (x:y:m) f a= if x>y then svap (x:m) False (a++[y]) else svap (y:m) f (a++[x]) priznak m = svap m True []Функция svap возвращает кортеж, который на первом месте содержит значение флага, а на втором — список, полученный после перестановок элементов. Флаг используется, чтобы определить была ли хотя бы одна перестановка элементов списка.
Svap последовательно сравнивает соседние элементы списка. При сравнении, если элемент стоящий левее больше чем правый, то правый и левый элементы меняются местами. При этом флаг устанавливается в значение «False». При выходе из функции наибольший элемент занимает последнее место. Если их несколько, то самый правый наибольший элемент занимает последнее место. Если при вызове функции svap перестановки элементов списка не было, то функция возвращает значения (True, список).
m_sort m= if (fst (priznak m)==False) then m_sort (snd (priznak m)) else snd (priznak m)Функция m_sort вызывает функцию priznak до тех пор, пока та не вернет кортеж типа (True, список).
Вывод. В статье рассмотрены наиболее популярные в школах языки программирования. Наиболее короткая программа получилась на функциональном языке программирования Haskell.