ПОРЯДОК ВЫПОЛНЕНИЯ ДОМАШНЕЙ РАБОТЫ «Структурные типы данных: массивы»
Составил: к.т.н., доц. А.Ю. Уразбахтина
НЕСТРУКТУРНЫЕ АЛГОРИТМЫ И ИХ РЕАЛИЗАЦИЯ В ПАСКАЛЕ
С точки зрения теории программирования неструктурный оператор и процедуры передачи управления являются ‘лишними’, так как любой алгоритм может быть преобразован в структурный и реализован без них. Однако интуитивно построенные алгоритмы часто получаются неструктурными, и для их реализации может потребоваться использование неструктурных вариантов передач управления. Чаще всего проблема разработки структурного варианта алгоритма возникает при работе с поисковыми циклами.
Для организации неструктурных передач управления программой в Паскале используют оператор безусловной передачи управления GoTo и специальные процедуры.
1.1. Оператор безусловной передачи управленияGoTo
Этот оператор передает управление в точку, определенную специальной меткой (рис. 1). Все метки в программе должны быть описаны инструкцией объявления меток Label (рис. 2). Метка ставится перед любым выполняемым оператором программы, после метки пишется знак ²:², причем, на один оператор можно ставить несколько меток.
Рис. 1. Синтаксическая диаграмма <Оператор безусловной передачи управления>
Рис. 2. Синтаксическая диаграмма <Объявление меток>
Меткой может быть целое число без знака или идентификатор вида А1, МЕТКА77. Например,
Program FFHGF; Uses CRT; Label M4, 789, Stop1;
Var a, b, c, r:Real; Begin ClrScr;…
789: c:=0; …If c<0 Then GoTo M4 else c:=b+a; …
If c>=1000 Then GoTo Stop1 else GoTo 789; …Stop1: End.
Процедуры неструктурной передачи управления
· Break – реализует выход из цикла любого типа;
· Continue – осуществляет переход на следующую итерацию цикла, игнорируя оставшиеся до конца тела цикла операторы;
· Exit – осуществляет выход из программы.
СТРУКТУРНЫЕ ТИПЫ ДАННЫХ
Достаточно часто возникает необходимость программирования обработки однотипных данных: таблиц, текстов, множеств и т.д. Для их представления используют структурные типы данных. В Паскале определены следующие структурные типы данных:
· массивы – для представления однотипных или табличных данных;
· строки – для представления символьной (текстовой) информации;
· множества – для представления абстрактных математических множеств;
· записи – для представления таблиц с данными различных типов.
Массив
Массив – это упорядоченная совокупность однотипных данных (рис. 3). Каждому элементу массива соответствует один или несколько индексов, определяющих положение элемента в массиве. Индексы образуют упорядоченные последовательности.
Рис. 3. Синтаксическая диаграмма <Объявление массива>
Тип индекса определяет его допустимые значения. В качестве типа индекса может быть указан любой порядковый тип (boolean, char, integer, перечисляемый тип, а также диапазоны этих типов), кроме типа longint и его производных.
В зависимости от количества типов индексов различают: одномерные, двумерные, трехмерные и n – мерные массивы. Двумерные массивы обычно называют матрицами, считая первый индекс - номером строки, а второй – номером столбца.
Тип элементов массива – любой, кроме файла. Объявление переменных типа массив выполняется двумя способами:
· в операторе объявления переменных, например,
Var a: array[1..10] of integer; {массив из 5 целых чисел}
b: array[byte] of char; {массив из 256 символов, индекс элемента массива изменяется от 0 до 255}
c: array[‘A’..’C’,-5..-3] of byte; {матрица из 9 чисел}
d: array[‘A’..’C’] of array [-5..-3] of byte; {матрица из 9 чисел, по структуре эквивалентная предыдущей}
· с предварительным объявлением типа, например:
Type mas=array[1..10] of integer; {объявляем тип}
Var a: mas; {объявляем переменную}
Ограничения на количество индексов в Паскале нет. Однако суммарная длина массива не должна превышать 65537 байт.
Значения элементов массива в программе можно определить тремя способами.
Во-первых, массив может быть инициализирован с использованием типизированных констант или просто присваиваний значений элементам, например:
Const a: array[1..5] of real=(0.0, -3.6, 6.0, 2.1, -100.8); или
a[1]:=0; a[2]:=-3.6; a[3]:=6; a[4]:=2.1; a[5]:=-100.8;
Во-вторых, элементы массива могут быть введены с клавиатуры или из файла, например:
For j:=1 to 5 do Read(a[j]); Readln;
В-третьих, элементы массива могут быть вычислены, например, сгенерированы с использованием датчика случайных чисел, рассчитаны по заданным формулам и закономерностям, а также скопированы из другого массива, например:
Randomaze; a[1]:=random(10); a[2]:=random(5); a[3]:=a[1]+a[2]; a[4]:=a[3]+a[2]; a[5]:=a[4]+a[3];
Ввод-вывод массивов выполняют поэлементно, используя счетные циклы (с заданным числом повторений). При выполнении операций ввода-вывода матриц и массивов большой размерности целесообразно вводить и выводить значения построчно, например:
For i:=1 to n do Begin For j:=1 to m do Read(b[I,j]); Readln; End;
For i:=1 to n do Begin For j:=1 to m do Write(b[I,j]:4:1,’ ‘); Writeln; End;
ПОРЯДОК ВЫПОЛНЕНИЯ ДОМАШНЕЙ РАБОТЫ «Структурные типы данных: массивы»
Этап 1. Постановка задачи 1.Разработать алгоритм, спецификацию, тестовый пример и программу обработки статистических данных: вычисления среднего арифметического, дисперсии и стандартного отклонения для числового ряда , состоящего из n(=12) членов, где массив а: ежемесячные данные за 2004 год о реально отработанных в России часах в расчете на одного занятого человека.
Этап 2. Анализ поставленной задачи. Из теории математики и математической статистики определяем необходимые для вычисления формулы: сумма ряда ; среднее арифметическое ; дисперсия , где .
Сумма элементов массива S определяется методом накопления. Количество суммируемых чисел известно, поэтому используем цикл с заданным количеством повторений. При каждом проходе к сумме будем добавлять значение , где i будет изменяться от 1 до n(=12). Перед началом цикла необходимо переменную суммы обнулить. Затем определим значение среднего арифметического. Сумма U определяется аналогично сумме S.
В последнюю очередь вычисляем значение дисперсии.
Этап 3. Проектирование и определение спецификаций. В данных методических указаниях предлагается производить расчет тестовых (контрольных) примеров в EXCEL.
На рис. 5 приведена схема алгоритма. Результаты расчета тестового примера занесем в табл. 1. Спецификация к алгоритму представлена в табл. 2.
Рис. 5. Блок – схема алгоритма решения задачи 1.
Таблица 1.
Тестовые примеры для задачи 1.
Н№ теста
| n
| Массив а
| Результат
| Результат
U
| Дисперсия
g2
|
|
| 120; 130; 140; 150; 160; 123; 145; 156; 167; 144; 122; 177
| 144,5
|
| 313,75
|
Таблица 2.
Спецификация к алгоритму на рис. 5.
№
| Наименование
| Обозначение в алгоритме
| Обозначение в программе
| Статус переменной
| Тип переменной
|
| Количество элементов массива
| n
| N
| Входная
| Целый
|
| Параметр цикла
| i
| i
| Расчетная
| Целый
|
| Значение суммы
| S
| S
| Выходная
| Не целый
|
| Значение суммы
| U
| U
| Выходная
| Не целый
|
| Среднее арифметическое
|
| a_1
| Выходная
| Не целый
|
| Массив
| а
| а
| Входная
| Не целый
|
| Дисперсия
|
| g2
| Выходная
| Не целый
|
Этап 4. Реализация. Разрабатываем программу:
Program Massiv; Uses Crt;
Var a:array[1..12] of Real;
U, S, a_1, g2: Real;
i, n: Byte;
Begin
ClrScr;
Writeln('Введите n:'); Readln(n);
Writeln('Введите массив a:'); с м
S:=0;
For i:=1 to n do
Begin
Read(a[i]);
S:=S+a[i];
End;
Readln;
a_1:=S/n;
Writeln('Среднее арифметическое а_1=',a_1:4:1);
U:=0;
For i:=1 to n do
U:=U+Sqr(a[i]-a_1);
g2:=U/n;
Writeln('U=',U:5:2);
Writeln('Дисперсия g2=',g2:5:2);
Readln;
End.
Результат работы программы:
Введите n:
Введите массив a:
120 130 140 150 160 123 145 156 167 144 122 177
Среднее арифметическое а_1=144.5
U=3765.00
Дисперсия g2=313.75
Сверяем полученные результаты с тестовым примером.
Вывод: Результаты работы программы на Паскале совпадают со значениями, рассчитанными в среде MATHCAD.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|