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

км4

.pdf
Скачиваний:
0
Добавлен:
25.05.2026
Размер:
558.51 Кб
Скачать

ФГБОУ ВО

Национальный исследовательский университет

«МЭИ»

Институт дистанционного и дополнительного образования

Практическая работа № КМ 4

по курсу «Технологии и методы программирования» Тема: «Надёжная обработка массивов и структурированных данных»

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

группы

Вариант 7

Москва, 2026

Оглавление

 

Задание 1.........................................................................................................................................

3

Задание 2.........................................................................................................................................

6

Задание 3.......................................................................................................................................

10

2

Задание 1.

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

Написать программу для вычисления разностей между соседними элементами массива.

Постановка задачи:

1)Считать числа из входного файла

2)Вычислить разность между соседними элементами

3)Записать результаты в выходной файл

 

Входные/выходные данные

 

 

 

Входные данные

 

Выходные данные

файл с числами input.txt

 

Файл с разностями output.txt

97 25 64 48

 

-72 39 -16

 

 

Табл. №1

 

Функции и их значения

Функция

 

Значение

Read_numbers

 

Чтение чисел из файла

Calculate_differences()

 

Вычисление разностей между соседними

 

 

элементами

Save_result()

 

Записывает список разностей в файл

 

 

Табл. №2

Код программы:

def read_numbers(filename): try:

with open(filename, 'r') as file:

numbers = list(map(float, file.read().split())) return numbers

except FileNotFoundError:

print(f"Ошибка: файл {filename} не найден") return []

except Exception as e:

print(f"Произошла ошибка при чтении файла: {e}") return []

def calculate_differences(numbers): differences = []

for i in range(1, len(numbers)): differences.append(numbers[i] - numbers[i-1])

return differences

def save_results(data, filename): try:

with open(filename, 'w') as file: for diff in data:

file.write(f"{diff}\n")

print(f"Данные успешно записаны в {filename}") except Exception as e:

print(f"Ошибка записи в файл: {e}")

if __name__ == "__main__": input_file = 'input.txt' output_file = 'output.txt'

3

numbers = []

try:

numbers = read_numbers(input_file) if not numbers:

print("Нет данных для обработки.") else:

differences = calculate_differences(numbers) save_results(differences, output_file)

except Exception as e: print(f"Критическая ошибка: {e}")

else:

print("Обработка завершена без критических ошибок.") finally:

print("Завершение работы программы.")

Рис. №1. Вычисление разности между соседними элементами массива Результат тестирования

Входные данные

Выходные данные

Ожидаемый

Смысл теста

теста

 

 

результат

 

1

Отсутствуют, пустой

Файл не создаётся

Нет вывода

Нет данных

 

файл

 

 

 

2

10

Пустой файл

Нет вывода

1 элемент,

 

 

 

 

разности не

 

 

 

 

будет

3

97 25 64 48

-72 39 -16

-72 39 -16

Массив из 4

 

 

 

 

чисел

 

 

 

 

Табл. №3

4

Рис. № 1. Вычисление разности между соседними элементами массива

5

Задание 2.

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

Работать с входным файлом, используя списки, кортежи и словари. Применять try-except- else-finally, обрабатывать некорректные элементы, выполнить минимум два прохода по данным, сохранить результат в output.txt а ошибки в errors.txt

Постановка задачи:

1)Загрузить данные из файла

2)Первый проход: проверить формат каждой строки

3)Второй проход: для корректных подмассивов определить монотонность

4)Сохранить результаты

 

Функция – назначение

функция

 

Назначение

Load_subarrays(filename)

 

Загрузка данных из файла

Check_monotonycity(subarray)

 

Проверка монотонности подмассива

First_pass(data)

 

Первый проход: проверяет корректность

 

 

типов и длину

Second_pass(data)

 

Второй проход: вычисляет монотонность

 

 

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

Save_results(results, filename)

 

Сохраняет результаты в файл

Save_errors(errors, filename)

 

Сохраняет ошибки в файл

 

 

Табл. № 4

Входные/выходные данные

Входные данные

 

Выходные данные

 

4 9 2

 

Подмассив 0: NON_MONOTONIC

 

7 5 1

 

Подмассив 1: DECREASING

 

6 2 5

 

Подмассив 2: NON_MONOTONIC

 

 

 

Табл. № 5

Код программы:

def load_subarrays(filename): data = []

load_errors = [] try:

with open(filename, 'r') as file: lines = file.readlines()

except FileNotFoundError:

return None, ["Файл не найден"] except Exception as e:

return None, [f"Ошибка чтения: {str(e)}"] else:

for i, line in enumerate(lines): line = line.strip()

if not line: continue

parts = line.split() try:

subarray = list(map(float, parts)) data.append(subarray)

except ValueError:

6

load_errors.append(f"Строка {i+1}: нечисловые данные") return data, load_errors

finally:

pass # можно добавить закрытие, но with уже закрыл

def check_monotonicity(subarray): if len(subarray) < 2:

return 'SHORT' increasing = True decreasing = True

for i in range(1, len(subarray)): if subarray[i] > subarray[i-1]:

decreasing = False

if subarray[i] < subarray[i-1]: increasing = False

if increasing:

return 'INCREASING' elif decreasing:

return 'DECREASING' else:

return 'NON_MONOTONIC'

def first_pass(data):

"""Первый проход: проверка корректности (длина, тип)""" valid = []

errors = []

for idx, sub in enumerate(data): if len(sub) < 2:

errors.append(f"Подмассив {idx}: недостаточно элементов ({len(sub)})") else:

valid.append((idx, sub)) return valid, errors

def second_pass(valid_subarrays):

"""Второй проход: определение монотонности"""

results = []

for orig_idx, sub in valid_subarrays: status = check_monotonicity(sub) results.append((orig_idx, status))

return results

def save_results(results, filename): try:

with open(filename, 'w') as f: for idx, status in results:

f.write(f"Подмассив {idx}: {status}\n") except Exception as e:

print(f"Ошибка записи результатов: {e}")

def save_errors(errors, filename): try:

with open(filename, 'w') as f: for err in errors:

f.write(f"{err}\n") except Exception as e:

print(f"Ошибка записи ошибок: {e}")

if __name__ == "__main__": input_file = 'input.txt' output_file = 'output.txt' error_file = 'errors.txt'

7

try:

data, load_errors = load_subarrays(input_file) if data is None:

save_errors(load_errors, error_file) else:

# Два прохода

valid_subarrays, format_errors = first_pass(data) all_errors = load_errors + format_errors

if all_errors:

save_errors(all_errors, error_file) results = second_pass(valid_subarrays) save_results(results, output_file)

except Exception as e: print(f"Критическая ошибка: {e}")

else:

print("Обработка успешно завершена.") finally:

print("Программа завершена.")

Результат тестирования

Входные данные

Выходные данные

Ожидаемый

Смысл теста

теста

 

 

результат

 

1

4 9 2

Подмассив 0:

Соответствует

Нормальный:

 

7 5 1

NON_MONOTONIC

Выходным

все строки

 

6 2 5

Подмассив 1:

данным

корректны

 

 

DECREASING

 

 

 

 

Подмассив 2:

 

 

 

 

NON_MONOTONIC

 

 

2

5

Подмассив 1:

Ошибка для

Короткий

 

2 8

INCREASING

подмассива 0

массив

 

 

Подмассив 0:

 

 

 

 

недостаточно

 

 

 

 

элементов (1)

 

 

 

 

 

 

Табл. № 6

8

Рис. № 2. Проверка монотонности каждого подмассива

9

Задание 3.

Условия задачи:

Работать с двумя входными файлами

Использовать списки, кортежи, словари

Применять try-except-else-finally

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

Формировать массивы результатов и ошибок

Сохранять файл результата и ошибок Постановка задачи:

1) Загрузить данные из двух файлов

 

 

2)

Проверить корректность позиций

 

 

3)

Восстановить массив

 

 

4) Определить пропуски и дубли

 

 

5) Сохранить результат и ошибки

 

 

 

Входные/выходные данные

Входные данные

 

Выходные данные

Input1.txt

 

=== ВОССТАНОВЛЕННЫЙ МАССИВ

0 25.7

 

 

===

4 69.4

 

позиция 0: 25.7

2 89.1

 

позиция 1: 89.2

Input2.txt

 

позиция 2: 48.6

6 58.7

 

 

позиция 3: None

2 48.6

 

 

позиция 4: 69.4

1 89.2

 

 

позиция 5: None

 

 

 

позиция 6: 58.7

 

 

 

=== ПРОПУСКИ ПОЗИЦИЙ ===

 

 

 

Пропущенные позиции: 3, 5

 

 

 

=== ДУБЛИКАТЫ ПОЗИЦИЙ ===

 

 

 

Позиция 2 встречается 2 раз(а)

 

 

 

Табл. № 7

 

Функции и их назначения

Функция

 

Назначение

load_tuples_from_file(filename)

 

Загружает кортежи (позиция, значение) из

 

 

 

файла, возвращает список и ошибку

validate_positions(tuples_list)

 

Проверяет позиции на целочисленность,

 

 

 

неотрицательность и дубликаты

restore_array(tuples_list)

 

Восстанавливает массив заданной длины

find_gaps_and_duplicates(tuples_list)

 

Находит пропущенные позиции и

 

 

 

дубликаты

save_output(array, gaps, duplicates, filename)

 

Обнаружение дубликатов

Save_result()

 

Сохраняет результат в файл

Log_errors()

 

Запись ошибок

 

 

 

Табл. № 8

 

 

10