км4
.pdfФГБОУ ВО
Национальный исследовательский университет
«МЭИ»
Институт дистанционного и дополнительного образования
Практическая работа № КМ 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 |
|
