66544

Освоение технологии структурного программирования и применения стандартных методов работы с одномерными массивами при разработке и создании программы на языке Турбо Паскаль

Лабораторная работа

Информатика, кибернетика и программирование

Освоение методов структурного программирования при разработке и создании программы на языке Турбо Паскаль для обработки одномерных массивов. Теоретические сведения Массив это регулярная структура последовательность однотипных данных объявляемых специальной конструкцией языка...

Русский

2014-08-22

224 KB

2 чел.

ЛАБОРАТОРНАЯ РАБОТА № 5

Освоение технологии структурного программирования

и применения стандартных методов работы с одномерными массивами

при разработке и создании программы на языке Турбо Паскаль.

Цели работы:

1. Освоение методики нисходящей разработки (проектирования) программы методом пошаговой детализации с помощью псевдокода при решении задач с помощью ПК.

2. Освоение методов структурного программирования при разработке и создании программы на языке Турбо Паскаль для обработки одномерных массивов.

3. Овладение выразительными средствами графики языка ТП для повышения читаемости программы.

4. Овладение навыками введения в программу необходимого количества комментариев.

5. Приобретение навыков алгоритмизации и программирования на алгоритмическом языке Паскаль

6. Освоение средств исследования программы.

7. Освоение методики тестирования программы.

Теоретические сведения

Массив – это регулярная структура (последовательность) однотипных данных, объявляемых специальной конструкцией языка ТП:

Array [<ДиапазонИндексов>] of <ТипКомпонентов>;

Под однотипностью данных, содержащихся в массиве, понимается принадлежность каждому конкретному массиву только однотипных элементов (Real, Integer и др.). То есть, в массиве не могут, к примеру, одновременно находиться числа вещественного и целого типов и т.д.

Доступ к любому компоненту массива обеспечивается простым указанием его порядкового номера.

Наиболее часто массивы используют для хранения вектор-столбцов и вектор-строк (одномерные массивы):

Var

Vector : Array [1..3] of Real; {одномерный массив Vector, аналог вектор-столбцов и вектор-строк из 3 элементов}

Таким образом мы объявляем структуру Vector – из трёх элементов типа Real, проиндексированных заданным диапазоном чисел от 1 до 3:

Vector[1], Vector[2], Vector[3]

Вам теперь должно быть понятно, как получить доступ к каждому из элементов массива. Этот факт позволяет использовать массивы для проведения вычислений с использованием вектор-строк и вектор-столбцов. Вместе с тем, Вы должны знать некоторые тонкости работы с массивами в ТП. Если индексация элементов задаётся числовым диапазоном, то необходимо выполнять только два требования:

– максимальные значения индексов в описании массивов не должны быть типа LongInt, то есть наибольшее значение индекса должно "вмещаться" максимум в типе Word и таким образом принимать максимальные значения не более 65535;

– произведение количества компонентов массива на размер компонентов, выраженный в байтах, не может превышать 65520 байт (64Кбайт).

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

Запомните, что ввод-вывод одномерных массивов является стандартной приемом и его просто необходимо запомнить и научиться применять (рис. 5.1).

При работе с матрицами, как правило, приходится иметь дело с набором стандартных приёмов либо их композицией. Поэтому Вам необходимо знать набор стандартных приемов, чтобы в будущем конструировать из него фрагменты алгоритмов программ, которые могут возникнуть из постановки конкретных задач.

Самым простым является суммирование элементов векторов. Для этого в программе необходимо описать переменную Sum такого же типа, что и элементы массива, и в цикле, по очереди, добавлять к ней элементы массива:

... {Суммирование элементов одномерного массива (вектора)}

      

Type

 VectorType = Array[1..20] of Real;

Var

 A: VectorType; {Массив для хранения вектора}

 i, m : Integer; {Параметр цикла и размер вектора}

 Sum  : Real;  {Переменная Sum для суммирования}

      

 Sum := 0; {Подготовка переменной Sum для суммирования!!!}

 for i: =1 to m do

   Sum;

Ещё одной распространённой задачей является использование счетчика для подсчёта элементов векторов с определёнными характеристиками, к примеру, положительных или отрицательных  элементов. Это требует введения в тело цикла условного оператора:

      

{Определим количество положительных элементов Count (типа Integer)}

 Count := 0; {Подготовка переменной Count для суммирования!!!}

 for i:= 1 to m do

   if A[i] > 0 then {Определение положительного элемента}

     Count := Count+1; {Увеличение количества положительных элементов}

      

Кроме этого, теперь Вы можете использовать этот алгоритм для определения:

  1.  числа отрицательных или нулевых элементов;
  2.  числа элементов, равных заданному числу;
  3.  числа элементов массива, содержащих числа превышающие или не превышающие заранее заданное число;
  4.  числа элементов, содержащих значения, находящиеся в заданном интервале и т.д.

Очень часто программирование алгоритмов работы с векторами требует определения максимального или минимального элемента. Для этого существует очень простой алгоритм, который Вы должны знать:

      

Max := A[1]; {Считаем, что первый элемент массива – максимальный }

for i:= 2 to n do {Поэтому начинаем обработку со второго элемента}

 if A[i] > Max then {Сравниваем каждый следующий элемент с текущим максимальным значением }

   Max:= A[i];{Заменяем старое значение Max новым бŏльшим }

{После выполнения цикла в Max находится максимальное значение из A }

      

Ещё одним достаточно полезным алгоритмом, который может Вам понадобиться при работе с массивами, является поиск чётных/нечётных элементов целых массивов и их суммирование. Для этого в Турбо Паскале существует специальная встроенная логическая функция Odd(x), которая при целом аргументе x возвращает значение True при x нечётном и False в случае чётного числа:

      

{Находим сумму нечётных элементов с использованием функции Odd(i)}

 Sum := 0;

 for i:=1 to n do

   if Odd(i) then {для чётных – условиеnot Odd(i)}

      Sum := Sum + A[i];

        

Рассмотрим теперь последовательно все этапы создания программы обработки одномерного массива.

1. Условие задачи:

Массив Х содержит 10 целых чисел. Переписать четные элементы массива Х в массив А, нечетные в массив В, и найти максимальный элемент массива А и минимальный элемент массива В.

2. Решение задачи в ее предметной области, в данном случае этого не требуется.

3. Проектируем структуры данных (их имена и типы). Понятно, что все имена масивов с их типами, входящие в условие задачи, нужно описать в программе. Кроме того, нам понадобятся: переменная цикла i, количество четных элементов KolChet, количество нечетных элементов KolNech, значение максимального элемента Max, его индекс MaxInd, значение минимального элемента Min и его индекс MinInd все типа Integer.

Значит в разделе описаний программы, назовем ее MaxMin, с учетом требований о необходимости обеспечения легкочитаемости программы и размещения необходимых комментариев, поместим следующие описания:

Type

 VectorType = Array[1..10] of Integer;

Var

 X,              {Массив для хранения вектора}

 A,              {Массив для хранения четных чисел}

 B : VectorType; {Массив для хранения нечетных чисел}

 i,              {Параметр цикла}

 KolChet,        {Количество четных элементов}

 KolNech,        { Количество нечетных элементов }

 Max,            {Максимальное значение}

 MaxInd,         {Его индекс}

 Min,            {Минимальное значение}

 MinInd : Integer; { Его индекс}

4. Проводим нисходящую разработку (проектирование) программы методом пошаговой детализации с помощью псевдокода. Воспользуемся результатами (рис. 1) для получения первой версии алгоритма:

Ввести данные MaxMin

Выполнить вычисления MaxMin

Вывести результаты MaxMin

С учетом требований к «дружественности» интерфейса, детализация псевдокода Ввести данные MaxMin дает следующее:

Вывести на экран приглашение для ввода массива Х

Ввести массив Х

Детализация псевдокода Выполнить вычисления MaxMin дает следующее:

Определить четные элементы Х и переписать в А

Определить нечетные элементы Х и переписать в В

Найти максимальный элемент массива А

Найти минимальный элемент массива В

Детализация псевдокода Вывести результаты MaxMin дает следующее:

Вывести название максимального эл-та и его содержимое

Вывести название минимального эл-та и его содержимое

5. Выполняем структурное программирование с использованием стандартных приемов:

BEGIN

 ClrScr; { Очищаем экран }

 WriteLn(Введите 10 элементов вектора Х:’);

 for i:=1 to 10 do {Организуем цикл по количеству элементов}

   begin

     Write (‘ X[‘,i,’] = ’); {Удобно видеть номера элементов}

     ReadLn (X[i])

   end;

 WriteLn; {Устанавливаем курсор на новую строку}

{Переносим чётные элементы из Х в А с использованием функции Odd(i)}

 KolChet := 0; 

 for i:=1 to 10 do

   if not Odd(X[i]) then {для чётных – условиеnot Odd(X[i])}

     begin

       KolChet := KolChet+1; {Определяем номер очередного эл-та}

       A[KolChet] := X[i]    {Заносим по этому номеру}

     end;

{Переносим нечётные элементы из Х в В с использованием функции Odd(i)}

 KolNech := 0; 

 for i:=1 to 10 do

   if Odd(X[i]) then {для нечётных – условиеOdd(X[i])}

     begin

       KolNech := KolNech+1; {Определяем номер очередного эл-та}

       A[KolNech] := X[i]    {Заносим по этому номеру}

     end;

{Определяем максимальный элемент массива А из KolChet элементов}

 Max := A[1]; {Считаем, что первый элемент массива – максимальный }

 for i:= 2 to KolChet do {Поэтому начинаем обработку со второго элемента}

   if A[i] > Max then {Сравниваем с текущим максимальным значением }

     begin

       Max := A[i]; {Запоминаем максимальное значение}

       MaxInd := i  { Запоминаем его индекс}

     end;

{Определяем минимальный элемент массива В из KolNech элементов}

 Min := B[1]; {Считаем, что первый элемент массива – минимальный }

 for i:= 2 to KolNech do {Поэтому начинаем обработку со второго элемента}

   if B[i] < Min then {Сравниваем с текущим минимальным значением }

     begin

       Min := B[i]; {Запоминаем минимальное значение}

       MinInd := i  { Запоминаем его индекс}

     end;

{ Выводим результат }

 WriteLn(‘Максимальный элемент A[’, MaxInd, ‘] = ‘,

                                A[MaxInd]);

 WriteLn(‘Минимальный элемент B[’, MinInd, ‘] = ‘,

                                A[MinInd]);

 ReadLn

END.

6. Отладка программы. Отладка программы – это процесс поиска и устранения синтаксических ошибок в готовой программе. Обычно отладка предшествует стадии тестирования. В этом пункте необходимо привести скриншот результата работы готовой программы (см. п. 5 Лаб. раб № 1).

7. Тестирование программы. Цель тестирования всякой программы состоит в том, чтобы убедиться, что она решает действительно ту задачу, для которой предназначена, и выдаёт правильный ответ при любых значениях из области решений. Тестовые данные должны обеспечивать проверку всех возможных условий возникновения ошибок. Подготовьте тестовый набор данных для вектора Х.

Исследуйте Вашу программу при необходимых тестовых значениях.

8. Перед защитой лабораторной работы Вам необходимо подготовить отчет (Приложение 2). Перед распечаткой обязательно продемонстрируйте его преподавателю в электронном виде, чтобы избежать ошибок в оформлении!

9. Для защиты лабораторной работы:

9.1. Представить отчет по лабораторной работе в печатном виде.

9.2. Продемонстрировать умение исследовать свою программу.

9.3. Решить любую другую задачу из списка заданий.

9.4. Ответить на вопросы:

9.4.1. Что такое массив?

9.4.2. Как обеспечивается доступ к элементам массива?

9.4.3. Какие основные стандартные методы работы с массивами Вы знаете?


ЗАДАНИЯ К

ЛАБОРАТОРНОЙ РАБОТЕ № 5

  1.  Даны два вектора и  найти длины векторов X, Y, X+Y, X-Y.
  2.  Вычислить 20 значений функции на отрезке [a,b] и сохранить значение аргумента функции в массиве X, а соответствующие ему значения функции - в массиве Y.
  3.  Вычислить 25 значений функции на отрезке [e,f], сохранить их в массиве Y и найти минимальное и максимальное значения в этом массиве.
  4.  Вычислить 12 значений функции на отрезке [e,f], сохранить их в массиве Y и определить, является ли функция убывающей, возрастающей или немонотонной на этом отрезке.
  5.  Вычислить 18 значений функции на отрезке [e,f], сохранить их в массиве Y и определить, имеет ли уравнение  на отрезке [e,f] по крайней мере хотя бы один корень.
  6.  Вычислить 30 значений функции на отрезке [e,f], сохранить их в массиве Y. Отрицательные компоненты массива Y скопировать в массив Ynegative, а положительные - в массив Ypozitive.
  7.  Вычислить 30 значений функции на отрезке [e,f], сохранить их в массиве Y. Вычислить количество отрицательных и положительных компонент массива.
  8.  В массиве Time(20) хранятся результаты(в секундах) забега на 100 метров для 20 спортсменов. Определить три лучших результата и скорость каждого из спортсменов.
  9.  В массиве Time(20) хранятся результаты(в секундах) забега на 100 метров для 20 спортсменов. Определить среднюю скорость пробега для каждого из спортсменов.
  10.  В массиве X хранится стоимость (в рублях) 1кг 7 основных продуктов питания. В массиве Y хранится суточная потребность (в граммах) человека в этих продуктах. Определить стоимость суточного рациона.
  11.  В массиве Urogai(20) хранится урожайность (в центнерах с гектара) пщеницы в колхозе “Заря” с 1970 по 1990гг. Определить самый урожайный и самый неурожайный год в колхозе “Заря”.
  12.  В массиве Kurs1(7) хранится курс покупки доллара по отношению к гривне для 7 различных банков. В массиве Kurs2(7) хранится курс продажи доллара по отношению к гривне для тех же банков. Определить самый выгодный курс обмена и банки, производящие обмен по этому курсу.
  13.  В массиве Meat(5) хранится стоимость (в гривнах) 1кг мяса на 5 различных рынках г. Днепропетровска. Определить среднюю, минимальную и максимальную стоимость мяса. Вывести на экран “черный” список рынков, стоимость мяса на которых превышает среднюю.
  14.  В массиве T(10) хранится температура воздуха на 1 января 1996г. в 10 различных городах мира. Определить количество городов, в которых температура была отрицательной, положительной и равной нулю.
  15.  В массиве G(10) хранятся гипотенузы 10 прямоугольных треугольников, а в массиве C(10) - их катеты. Для каждого из треугольников найти второй катет и площадь и записать эти значения в массивы с именами B и S.
  16.  В массивах Tmin(15) и Tmax(15) хранятся минимальная и максимальная температуры, приемлемые для жизни 15 различных растений. Определить количество растений, которые погибнут при температуре t и которые будут находится на грани гибели. Гранью гибели считать температуру, равную граничной.
  17.  В массиве Tair(10) храниться среднеиюльская температура воды в Черном море для 10 различных городов Крыма, а в масссиве Twater(10) - среднеиюльская температура воздуха в тех же городах. Определить город, в котором разница между температурой воздуха и воды минимальна.
  18.  В массиве Square(6) хранится площадь 6 областей Украины, а в массиве Population(6) - храниться количество населения в тех же областях. Определить самую густонаселенную и самую малонаселенную области.
  19.  В массиве T(12) хранится среднемесячная температура для каждого из 12 месяцев в г. Днепропетровске. Определить самую большую отрицательную и самую маленькую положительную температуры.
  20.  Записать в массив Х 25 целых чисел. Переписать положительные из них подряд в массив P, а отрицательные - в массив N.
  21.  Записать в массив Z значения функции  для x от 0 до 2 с шагом 0.1 (при заданном значении ). Переписать положительные элементы массива Z подряд в массив Y, а их номера - в массив X.
  22.  Записать в массив X 25 целых чисел. Переписать четные из них в массив Y в порядке возрастания.
  23.  Массив A содержит 20 вещественных чисел. Записать в первый элемент массива сумму его положительных элементов, а в последний - отрицательных.
  24.  Массивы A и B содержат компоненты двух N-мерных векторов. Записать в массив C длины векторов A и B (,  ) и их скалярное произведение ( ).
  25.  Массив А состоит из 20 целых чисел. Упорядочить массив по убыванию и записать в массив В номера соответствующих элементов массива А до сортировки.
  26.  Массивы X и Y содержат по 25 вещественных чисел. Записать в массив Z подряд числа , удовлетворяющие условию .
  27.  Массив Х содержит 30 целых чисел. Переписать четные элементы массива Х в массив А, нечетные - в массив В, и найти максимальный и минимальный элементы массивов А и В.
  28.  Записать в массив Y неотрицательные значения функции  для  от 0 до 2  с шагом 0.1 (при заданном значении ), а в массив Х - соответствующие значения аргумента .
  29.  Массив Z состоит из 25 вещественных чисел. Записать в массив А подряд отрицательные элементы массива Z, а в массив В - номера его неотрицательных элементов.
  30.  Массив Х содержит 20 целых чисел. Ко всем положительным элементам массива Х добавить значение его максимального элемента, а к отрицательным - минимального.
  31.  Записать в массив Х 20 вещественных чисел. Переписать в массив Р подряд положительные из чисел , а в массив N - отрицательные из этих чисел.
  32.  Массив А содержит 25 целых чисел. Добавить к каждому элементу массива его номер и найти максимальный и минимальный элементы полученного массива.
  33.  Массив Х содержит 40 действительных чисел. Переписать в массив Y положительные элементы массива Х с четными номерами и отсортировать его по возрастанию.
  34.  Поменять местами максимальный и минимальный элементы массива С, содержащего 25 вещественных чисел.
  35.  Даны два вектора и  найти скалярное произведение векторов и угол между ними. При вычислении использовать формулу:
  36.  Даны два вектора и  найти угол между ними и модуль векторного произведения векторов X и Y. При вычислении использовать формулу: , где с - векторное произведение векторов X и Y.
  37.  Даны два вектора и  найти сумму векторов X+Y и разность векторов X-Y и сохранить их в векторах Z и F.
  38.  Даны два вектора и  найти произведение векторов X и Y на число и сохранить их в векторах G и H.
  39.  Даны два вектора и  найти линейную комбинацию векторов X+Y и сохранить ее в векторе U.
  40.  

Рис. 5.1. Ввод и вывод массивов на языке Турбо Паскаль (продолжение)

 WriteLn(Введите m элементов вектора А:’);

 for i:=1 to m do {Организуем цикл по количеству n элементов}

   begin

     Write (‘ A[‘,i,’] = ’); {Удобно видеть номера элементов}

     ReadLn (A[i])

   end;

 WriteLn; {Устанавливаем курсор на новую строку}

 { == Вывод-вектора  А ==}

 WriteLn (‘Введённные значения вектора А: ’);

 for i:= 1 to m do {Используем оператор Write с форматированием}

   Write (‘ А[‘,i,’] = ’,A[i]:9);{чтобы экономить пр-во экрана}

 WriteLn; {Устанавливаем курсор на новую строку}

 ReadLn

End.

Рис. 5.1. Ввод и вывод массивов на языке Турбо Паскаль

Program ArrayInputOutput;

Uses Crt;

Type

 VectorType = Array[1..50] of Real;

Var

 A : VectorType; {Массив А вещественного типа из 50 элементов}

 i : Integer; {Параметр цикла для обработки вектора }

 m : Integer; {К-во элементов массива в строке }

Begin

 ClrScr;

{ == Ввод-вектора  А ==}

WriteLn(‘Введите (m) к-во элементов вектора А, которые будут обрабатываться (не более 50-и)');

ReadLn(m);


 

А также другие работы, которые могут Вас заинтересовать

603. Программная оболочка Norton Commander. Назначение и возможности сервисной программы оболочки Norton Commander 69.5 KB
  Программная оболочка Norton Commander и основные функции. Основные функциональные клавиши Norton Commander. Копирование файлов и каталогов. Переименование файлов и каталогов. Удаление файлов и каталогов Поиск файлов на диске. Структура файла nc.ext и его редактирование.
604. Обработка текстовых электронных документов. Подготовка документов на ПЭВМ 72.5 KB
  Классификация документов. Виды и структура текстовых документов, принятых в делопроизводстве органов внутренних дел. Текстовые и графические редакторы ПЭВМ.
605. Особенности ценовой политики фирмы 70.5 KB
  Понятие ценовой политики в системе маркетинга. Ценовая политика является неотъемлемой частью стратегии маркетинга и представляет собой систему принципов и методов управления деятельностью по установлению цен в процессе достижения целей предприятия на рынке.
606. Процесса адиабатного истечения газа через суживающееся сопло 75.5 KB
  Снять опытные характеристики процесса истечения при различных давлениях газа за сопловым каналом. Провести обработку экспериментальных данных и определить области докритического и критического истечения. Построить опытную и теоретическую характеристики суживающегося сопла в координатах.
607. Основные принципы антидотной терапии 68 KB
  Противоядия, действие которых основано на физических процессах (активированный уголь и другие сорбенты). Противоядия, образующие в организме соединения, обладающие особенно высоким средством к яду (амилнитрит, метиленовый спирт и др.)
608. Исследование показателей надежности и рисков нерезервированной технической системы 93 KB
  Определить показатели надежности и риск нерезервированной технической системы. Исследовать функцию риска: представить функцию риска в виде таблицы и графика. Дать качественный и количественный анализ соотношения риска, вычисленного по точной и приближенной зависимостям в MathCAD или табличном процессоре Microsoft Excel.
609. Изучение и освоение практики работы с управленческими корпоративными информационными системами на примере системы Галактика 70 KB
  В работах требуется смоделировать наиболее распространенную в экономической практике ситуацию – а именно: сформировать ряд взаимосвязанных операционных и сводных отчетных документов, отражающих бизнес-процессы и результаты сделок предприятия с контрагентами по покупке и продаже товаров.
610. Однофакторные регрессионные модели 339 KB
  Рассчитать линейный коэффициент парной корреляции и среднюю ошибку аппроксимации. Оценить статистическую значимость параметров регрессии и корреляции с помощью критерия Фишера и Стьюдента.
611. Маркеры доступа 71.5 KB
  В результате данной работы были изучены основные возможности мониторинга и управления маркерами доступа Windows. Так же были получены навыки реализации взаимодействия созданной программы с процессами и их настройками безопасности.