Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчет по лабораторной работе №4

.docx
Скачиваний:
9
Добавлен:
17.02.2023
Размер:
1.01 Mб
Скачать

Министерство образования и науки РФ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра автоматизированных систем управления (АСУ)

ОТЧЕТ

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

по дисциплине «Программирование»

Выполнил студент:

Доценко Илья Сергеевич

специальность 09.03.01

СОДЕРЖАНИЕ

1. Введение 3

2. Решение задачи №1 4

2.1. Описание используемых переменных 4

2.2. Описание алгоритма 5

2.3. Блок-схема алгоритма 6

2.4. Тестирование программы 7

3. Решение задачи №2 8

3.1. Описание используемых переменных 8

3.2. Описание алгоритма 8

3.3. Блок-схема алгоритма 9

3.4. Тестирование программы 10

4. Заключение 10

ПРИЛОЖЕНИЕ А ЛИСТИНГ ПРОГРАММЫ №1 12

ПРИЛОЖЕНИЕ B ЛИСТИНГ ПРОГРАММЫ №2 13

1. Введение

Лабораторная работа № 4 состоит из двух задач. Первая задача посвящена созданию программ, отражающих приемы работы со списками.

Второе задание посвящено созданию программ в графическом режиме.

2. Решение задачи №1

Используйте линейные списки для хранения последовательности вещественных чисел. Опишите процедуру или функцию, которая:

а) находит среднее арифметическое элементов непустого списка;

б) заменяет в списке все вхождения элемента E1 на элемент E2.

2.1. Описание используемых переменных.

Глобальные:

s, l: list;

Функция AVG:

Процедура change:

2.2. Описание алгоритма

  1. Создаем список;

  2. Вычисляем его среднее арифметическое;

  3. Запрашиваем элемент, который нужно заменить и элемент на который необходимо заменить;

  4. При наличии вхождений элемента e заменяем его на e1;

  5. Выводим полученный список;

2.3. Блок-схема алгоритма

Рис 2.3.1 Блок-схема основной части программы.

Рис 2.3.2 Блок-схема процедуры out_spisok.

Рис 2.3.3 Блок-схема процедуры avg.

Рис 2.3.3 Блок-схема процедуры change.

Рис. 2.3Блок-схема алгоритма основной программы Блокх

2.4. Тестирование программы

Введенный список «10 101 94 94 94 95 96 97 98 99».

Среднее арифметическое 87,8.

Элемент 94 заменен на элемент 111.

Рис. 2.4.1. Результат

Введенный список «2 3 2 2».

Среднее арифметическое 2.25.

Элемент 2 заменен на элемент 9.

Рис. 2.4.4. Результат

3. Решение задачи №2

Даны целые числа t1, t2, ... t31, — задающие график температур за март месяц. Построить график температур. Отрезки прямых, лежащие выше 0 градусов Цельсия и лежащие ниже 0 градусов Цельсия, должны быть окрашены в разные цвета.

3.1. Описание используемых переменных и констант.

n Номер последнего элемента массива

input_file - Имя файла с входными данными

3.2. Описание алгоритма

  1. Рисуем оси координат;

  2. Загружаем данные из файла;

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

  4. Рисуем график.

3.3. Блок-схема алгоритма

Рис 3.1 Блок-схема основной части программы.

Рис 3.2 Блок-схема процедуры draw_coordinate_lines.

Рис 3.3 Блок-схема процедуры read_from_file.

Рис 3.4 Блок-схема функции min.

Рис 3.5 Блок-схема функции min.

Рис 3.6 Блок-схема функции max_.

Рис 3.7 Блок-схема функции max1.

Рис 3.8 Блок-схема процедуры get_scale.

Рис 3.8 Блок-схема процедуры draw_chart.

3.4. Тестирование программы

Данные из файла 2_temperatures_1.txt

-15 -15 -15 -14 -13 -12 -11 -5 -5 -4 -4 -3 0 0 0 0 0 0 1 2 2 2 2 5 5 6 7 7 7 10 60

Результат.

Рис 4.1 График температур.

Данные из файла 2_temperatures_2.txt

-15 -15 -15 -14 -13 -12 -11 -5 -5 -4 -4 -3 0 0 0 0 0 0 1 2 2 2 2 5 5 6 7 7 7 10 60

Результат.

Рис 4.2 График температур.

4. Заключение

В процессе выполнения задания №1 изучены возможности списков.

В процессе выполнения задания №2 использован модуль graphABC, а так же применен рекурсивный метод поиска минимального и максимального значений, изученный в рамках лабораторной работы №3

Надеюсь, мне никогда больше не придется использовать Pascal PL.

ПРИЛОЖЕНИЕ А ЛИСТИНГ ПРОГРАММЫ №1

(*

Задача 1

Используйте линейные списки для хранения последователь-

ности вещественных чисел. Опишите процедуру или функ-

цию, которая:

а) находит среднее арифметическое элементов непустого

списка;

б) заменяет в списке все вхождения элемента E1 на элемент E2.

*)

type

telem = 0..999;

list = ^node;

node = record

info: telem;

next: list

end;

var

s, l: list;

x, e, e1: telem;

n, i: integer;

procedure change(l: list; e, e1: telem);

var

p: list;

{ссылка на очерeдное звено}

begin

p := L;

while p <> nil do

begin

if p^.info = e then p^.info := e1;

p := p^.next

{переход к следующему звену}

end;

end;

function avg(l: list): real;

var

p: list; counter, sum: integer;

begin

counter := 0;

sum := 0;

p := L;

while p <> nil do

begin

inc(counter);

sum := sum + p^.info;

p := p^.next

{переход к следующему звену}

end;

if counter <> 0 then

avg := sum / counter

else

avg := 0;

end;

procedure out_spisok(l: list);

begin

while l <> nil do

begin

s := l^.next;

write(l^.info, ' ');

l := s;

end;

writeln;

end;

begin

{формируем список}

s := nil;

writeln('Введите количесто элементов списка');

readln(n);

for i := 1 to n do

begin

writeln('Ввдите элемент списка №', i);

new(l);

l^.next := s;

readln(x);

l^.info := x;

s := l;

end;

{выводим список на экран}

writeln('Введенный список');

out_spisok(l);

writeln('Среднее арифметическое элементов списка равно ', avg(l));

writeln('Введите элемент, вхождения которого необходимо заменить');

readln(e);

writeln('Введите элемент, на который необходимо заменить');

readln(e1);

change(l, e, e1);

// insert(l, e, e1);

writeln('Полученный список');

out_spisok(l);

{освобождаем динамическую память}

while l <> nil do

begin

s := l^.next;

dispose(l);

l := s;

end;

end.

ПРИЛОЖЕНИЕ B ЛИСТИНГ ПРОГРАММЫ №2

graphABC;

const

n = 31; // НОмер последнего элемента массива

input_file = '2_temperatures_2.txt'; // Имя файла с входными данными

var

x_scale, y_scale, i: integer; // Масштаб по оси Х, масштаб по оси У, счетчик

f: textFile; //файл с входными данными

tempereatures: array [1..n] of integer; //Массив с значениями температуры

// Определяем минимальное значение температуры для задания масштаба графика

function min1(a, b: integer): integer;

begin

min1 := a;

if b < a then min1 := b;

end;

function min(k: integer): integer;

begin

if k = n then

min := tempereatures[k]

else

min := min1(tempereatures[k], min(k + 1));

end;

function max1(a, b: integer): integer;

begin

max1 := a;

if b > a then max1 := b;

end;

function max_(k: integer): integer;

begin

if k = n then

max_ := tempereatures[k]

else

max_ := max1(tempereatures[k], max_(k + 1));

end;

procedure read_from_file;

begin

assign(f, input_file);

reset(f);

i := 1;

while not eof(f) do

begin

readln(f, tempereatures[i]);

inc(i);

end;

close(f);

end;

procedure draw_coordinate_lines;

begin

setPenColor(clBlack);

setPenWidth(2);

line(0, window.Height div 2, window.Width, window.Height div 2); // ось x

line(0, 0, 0, window.Height); // ось y

end;

procedure draw_chart;

begin

setPenWidth(2);

for var i := 1 to n - 1 do

begin

setPenColor(clGreen);

if (tempereatures[i] < 0) or (tempereatures[i + 1] < 0) then setPenColor(clBlue);

if (tempereatures[i] > 0) or (tempereatures[i + 1] > 0) then setPenColor(clRed);

line(i * x_scale, window.Height - (tempereatures[i] * y_scale) - window.Height div 2, (i + 1) * x_scale, window.Height - (tempereatures[i + 1] * y_scale) - window.Height div 2);

end;

end;

procedure get_scale;

var

tmp_min, tmp_max: integer;

begin

x_scale := window.Width div n - 1;

tmp_min := min(1);

tmp_max := max_(1);

if tmp_max > abs(tmp_min) then

y_scale := window.Height div abs(tmp_max * 2)

else

y_scale := window.Height div abs(tmp_min * 2);

end;

begin

window.Maximize;

draw_coordinate_lines;

read_from_file;

get_scale;

draw_chart;

end.

2023 г.