Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Алгоритмизация.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
445.44 Кб
Скачать

Тема 4. Организация выполнения программ на пк. Структуры данных: массивы. Множества. Записи. (2 часа)

План лекции 5:

  1. Работа с инструментальными интегрированными турбосистемами.

  2. реализация этапов трансля­ции, редактирования и выполнения программ.

  3. Запись выражений, операторов присваивания.

  4. Запись программ линей­ных структур алгоритмов на языке Паскаль.

Отладкадеятельность, направленная на установление точной природы известной ошибки, а затем на исправление этой ошибки.

Результаты тестирования являются исходными данными для отладки. Последовательность событий:

симптом (ошибки)  причина (ошибки)  исправление (ошибки).

Как искать ошибку?

  1. Поймите ошибку. Какие данные правильные, какие – неправильные?

  2. Постройте гипотезу о причине ошибки.

  3. Проверьте гипотезу (для этого пропустите новый тест).

  4. При подтверждении гипотезы следует внести исправление, а потом повторить все тесты (не внесли ли вы новую ошибку – вероятность этого от 0,2 до 0,5).

Можно пользоваться автоматизированными средствами отладки: в интегрированной среде Паскаля имеется отладчик debug, который предлагает средства отслеживания и трассировки программы (в том числе печать переменных, счетчиков, критических значений).

Парадоксы программной ошибки:

  • ошибка  не всегда результат недостатков;

  • ошибка не всегда может быть выявлена;

  • выявленная ошибка не всегда может быть описана;

  • описанная ошибка не всегда может быть понята;

  • понятая ошибка не всегда может быть исправлена;

  • исправленная ошибка не всегда может улучшить качество программы.

Известна некоторая статистика о программных ошибках.

  • Язык C++ дает на 25 % больше ошибок, чем традиционные Си или Паскаль.

  • Исправление ошибок в объектно-ориентированных программах на C++ требует в 23 раза большего времени. Наследование порождает в 6 раз больше ошибок, чем его отсутствие.

  • 33% всех ошибок случаются реже, чем 1 раз за 5000 лет работы системы.

  • Каждый Кбайт кода содержит 0,52 ошибки.

План лекции 6:

  1. Структуры данных: Массивы.

  2. Множества. Записи.

  3. Организация ввода-вывода массивов.

  4. Печать заголовков таблиц с разделением на графы, нумерацией строк, столбцов.

Составные типы задают множества «сложных» значений; каждое значение из такого множества образует некоторую структуру (совокупность) нескольких значений другого типа.

Каждое значение регулярного типа (массива) состоит из фиксированного числа элементов одного и того же базового типа (т.е. значение содержит фиксированное число однотипных компонент).

Для корректного определения регулярного типа необходимо задать две характеристики:

  • тип элементов массива,

  • количество и «способ нумерации» элементов.

type

<идентификатор - тип массива>= array[T1] of T2;

T1 - тип индекса:(ограниченный, литерный,

перечислимый);

T2 - тип элементов массива (любой тип).

Примеры:

const n=20;

type vector=array[1..100] of real;

m=array[char] of boolean;

matrix=array[1..n] of array[1..n] of integer;

var v:vector;

SymTab:m;

arr1,arr2:matrix;

s:array['a'..'z'] of boolean;

Мы можем «нумеровать» элементы массива не только целыми числами, но и значениями произвольного дискретного типа (типа, на котором действуют функции ord, succ, pred).

В том случае, когда определен тип массива, элементами которого являются снова массивы, можно использовать эквивалентное определение двухмерного массива.

Следующие два определения эквивалентны:

v:array[1..10] of array[1..20] of integer;

v:array[1..10,1..20] of integer;

Число индексов (размерность массива) не ограничена.

Синтаксис:

<регулярный тип>::=

---->array-->[----><тип индекса>--->]--->of--><тип>--->

| |

<---------,---<---

Единственное возможное действие над массивом в целом  это присваивание: v1:=v2;

Типы обоих массивов в данном случае должны совпадать.

Доступ к элементам массива:

<идентификатор массива>[<индекс>]

или

<идентификатор массива>[<список индексов через запятую>]

В качестве индексов  произвольные выражения, тип которых должен совпадать с типом индекса.

Примеры: v[1]

v[(i+2)*6]

Пусть

v2:array[1..10] of array[5..20] of integer

– двухмерный массив, тогда v2[k] - k-ый массив в группе из 10 массивов целых чисел, v2[k][5] – 5-ый элемент этого массива, тот же элемент получаем и так v[k,5].

Элемент массива считается переменной:

  • он может получать значения (например, в операторе присваивания);

  • он может участвовать в выражениях там, где может присутствовать переменная данного типа.

Ассортимент операций над элементами массива полностью определяется типом этих элементов.

Примеры:

v2[i,j]:=v2[i,j-1]+1;

SymTab['z']:=not SymTab['a'];

Ошибки в работе с массивами:

Выход индекса за допустимые пределы

var v:array[0..10] of real;

....

v[11]:=0.5; <==== транслятор обнаружит ошибку

i:=11;

v[i]:=0.5; <==== эта ошибка может быть обнаружена только во время исполнения и то, если осуществляется контроль диапазона, иначе это может привести к непредсказуемым последствиям

Множественный тип задается с помощью двух служебных слов – set и of – и следующего за ним базового типа. Например:

type digits = set of 1..5;

var s:digits;

Переменная s в качестве значений может принимать следующие множества целых чисел:пустое множество, {1}, …, {5}, {1,2}, …, {4,5}, {1,3,5}, …, {4,5,3,2}, …, {1,2,3,4,5} (всего 32 различных множества).

Обратите внимание:

  • Все значения базового типа в множестве должны быть различными.

  • Порядок «расположения» элементов в множестве никак не фиксируется.

Базовый тип множества может быть:

символьным, перечислимым, ограниченным.

Базовый тип должен содержать не более 256 значений. Если базовый тип – ограниченный целый, то значения должны быть в диапазоне от 0 до 255.

Пример:

type

elemColor =(red,yellow,blue);

color = set of elemColor;

Задача. Ввести последовательность из n чисел и распечатать ее с конца. var

i:integer;

s:array[1..100] of integer;

begin

writeln('Введите количество чисел');

readln(n);

writeln('Введите ',n,' чисел');

for i:=1 to n do read(s[i]); {ввод потоком}

writeln; writeln('Вывод:');

for i:=n downto 1 do write(s[i],' ') end.

В отличие от массивов, компоненты записи обозначаются идентификаторами.

type person = record

name,secondName,surName:string;

sex :(male,female);

speciality:integer

end;

Элементы записи называются полями. Каждое описание поля выглядит как описание простой переменной.

Структура записи:

  • фиксированное число полей;

  • каждое поле имеет имя (уникальное в пределах записи, но может совпадать с любым идентификатором вне этой записи);

  • каждое поле имеет произвольный тип.

Описание переменных комбинированного типа:

var Sasha,Masha:person;

Доступ к полям записи осуществляется с помощью селектора записи – конструкции вида

<переменная типа записи>.<идентификатор поля>

Использование:

Sasha.name:='Александр';

Masha.name:='Мария'; Masha.Speciality:=Sasha.Speciality;