Анимация
JavaScript
|
Главная Библионтека whLle(my $1л1е=<ЗШШ>) { По окончании блока его приватные переменные аннулируются. Упражнение: подсчет статистики После того как вы столько узнали о функциях, перейдем к практическому использованию функций в реальном приложении. Код функций легко может быть использован повторно. В этом упражнении три функции предназначены для анализа групп цифр. Для начала немного теории. Как вы должны помнить из курса средней школы, среднее арифметическое группы цифр - это их сумма, деленная на количество цифр. Медиана - это средний элемент всей группы, отсортированной по значению. При четном количестве элементов берется среднее арифметическое двух средних элементов. Стандартное отклонение характеризует распределение элементов вокруг среднего значения. Высокое значение стандартного отклонения означает, что разброс чисел велик, а малое - что они сосредоточены вокруг среднего значения, Если отложить влево и вправо от среднего значения интервал, равный стандартному отклонению, то в нем будет сосредоточено 68% чисел из набора, а если удвоить этот интервал, то в него попадет 95% всех чисел из набора. А теперь, вооружившись теоретическими сведениями, наберите в текстовом редакторе программу, приведенную в листинге 8.1, и сохраните ее под именем Stats. Не забудьте сделать файл выполняемым, воспользовавшись инструкциями из 1-го занятия, "Начало работы с Perl". После этого попытайтесь запустить программу, набрав в командной строке perl Stats В листинге 8.2 содержится пример диалога с этой программой. ст 1. Иой текст згра1 Stats in/perl -w 3: use stic; 4: £Lb пбэп { 5: iny(§data)=e ; 6: ny fei:; 7: foreach (edata) { 8: ?sum+=$ ; 9: ) 10: return{Ssum/edata); 11: } 12: submEriiai { 13: my(edata)=sort { $a <=> $b} i ; 14: if {scalar(edata)%2) { 15: return(Sdata(§data/2]); 16: } el£e { 17: my(Supper, $lower); 18: $lower=5data[gdata/2]; 19: Supper=$data[edata/2 - IJ; 20: return (mean (Slower, 56)1; 21: 22: 23: su dev { 24: 25: 26: 27 28: iiy(edata)=e ; . my{Ssq dev sua, $avg)=(0,0); $avg=mean(gdata); foreach my $elan (*data) { 29: $sq dev suin+=($avg-Selem)**2; 30: } 31: returnf sqrt($sq dev sum/(Sdata-l))); 32: } 33: w($data, Sdataset); 34: print "дцте данн, раздбленн запять: "; 35: $data=<SITnN>; dhoip $data; 36: edataBet=split(/[\s,]+/, $data); 37: 38: print "Меднана: ", median(Mataset}, "\n"; 39: print "С&едЕзве: ", mean( Jdataset), "\n"; 40: print "Станд. откл.: ", std dev(*dataset), "\n"; Лист 8.2. диалога с згрмой stats ведите данные, разделенно за: 14.5,6,8,9,10,34 медиана: .5 Среднее: 13.5833333333333 Станд. откп.: 10.3943093405318 Проведем анализ программы. Строка 1. В этой строке указывается путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим вывода предупреждений! Строка 3. Директива use strict указывает, что все переменные должны быть явно объявлены в программе с помощью оператора ту и строки должны быть заключены в кавычки. Строка Функция mean{) находит среднее арифметическое группы чи- сел. С помощью цикла foreach вычисляется сумма чисел а затем она делится на количество чисел. Строк 21. Функции ап О вычисляет данные двумя способами. При нечетном количестве вводимых элементов она просто выбирает средний элемент. Для этого количество элементов делится на 2, получившееся значение округляется до ближайшего целого и используется в качестве индекса предварительно отсортированного массива с нашими числами. При четном количестве элементов функция находит два средних элемента. Эти числа - Supper wer. Их среднее находится с помощью функции mean(). Это значение и возвращается функцией вычисления медиан. 132 Часть I. ;Ei Perl Строки Функция очень проста и состоит в основном из ма- тематического выражения. В этом выражении из каждого элемента массива §data вычитается среднее значение всех элементов и получившееся число возводится в квадрат. Все подобные результаты суммируются в переменной Для нахождения стандартного отклонения сумма всех квадратичных отклонений делится на количество элементов минус единица, и из получившегося значения берется квадратный корень. Строки Все необходимые переменные основной программы объявляются с помощью оператора Пользователь вводит данные, которые помещаются в скаляр Sdata. Затем с помощью функции split и шаблона /[\s,]+/ введенные пользователем данные разделяются и помещаются в массив Этот шаблон определяет в качестве разделителя символы пробела и запятую. Дополнительные пробелы и запятые игнорируются. СтрокШ Генерируется вывод. Не забывайте, что это не единственное место, где можно вызвать функции mean(), median() и std dev(). Они могут вызывать друг друга: обе функции std dev() и median{} используют функцию mean(). Это ненлохой пример новторного иснользования кода. Подробнее о функциях Многие технические приемы программирования, как, например, рекурсивный вызов функций, могут быть эффективно реализованы только с учетом области видимости переменных. К этому вопросу непосредственное отношение имеет оператор use strict, ужесточающий синтаксический контроль в Perl, что позволяет избежать некоторых грубых ошибок. Объявление переменных с помощью оператора local Perl версии 4 не было по-настоящему приватных переменных. Вместо них в Perl 4 были "почти" приватные переменные. Концепция "почти" приватных переменных до сих пор присутствует и в Perl 5. Мы будем называть такие переменные локальными. Для объявления этих переменных используется оператор local: sub { Icral {$foo)=56f t 0СШГЫВЯХВС1ЬНКЦ41... > В этом примере объявляется локальная переменная $foo подпрограммы Поведение переменной, объявленной с помощью оператора local, почти не отличается от поведения переменной, объявленной с помощью оператора ту. Областью видимости локальной переменной может быть подпрограмма, блок или конструкция eval. При завершении подпрограммы или блока эта переменная аннулируется. Отличие состоит в том, что переменная, объявленная локальной, видима не только в пределах того блока, в котором она объявлена, но и во всех подпрограммах, вызванных из этого блока. В табл. 8.1 приведено сравнение приватных и локальных переменных. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [ 38 ] 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |