Расчетно-аналитическое задание по "Программированию"
Автор: Albert003 • Апрель 20, 2023 • Лабораторная работа • 1,372 Слов (6 Страниц) • 290 Просмотры
Кафедра ____Информационные системы__________________________
Рейтинговая работа ________Расчетно-аналитическое задание ________
(домашняя творческая работа, расчетно-аналитическое задание, реферат, контрольная работа)
по дисциплине _________________________________________________
Задание/вариант № ____10______
Тема* ______________________________________________________________
Выполнена обучающимся группы
_______________ _______________________
(фамилия, имя, отчество)
Преподаватель ___________ Зайцев Сергей Александрович _______________
(фамилия, имя, отчество)
Москва – 2022 г.
* при наличии
Условие задачи
Дана функция, вычисляющая значение переменной y в зависимости от переменной x. Дан интервал целых чисел, которые может принимать переменная x. Необходимо написать программу на языке Python, которая выведет в текстовый файл result.txt значения переменной y для каждого из предложенных x. Точность значений у при распечатке установить в 3 знака после запятой. Кодировка в текстовом файле должна быть Unicode. Путь к входному и выходному файлу в коде программы нужно сделать относительным.
Исходные данные
Список значений x, подготавливается заранее в текстовом файле source_data.txt
Содержимое файла исходных данных представлено следующим образом:
x=-7
x=-6
x=-5
x=-4
x=-3
x=-2
x=-1
x=0
x=1
x=2
x=3
x=4
x=5
x=6
x=7
x=8
x=9
x=10
x=11
x=12
Функция, которую необходимо применить к каждому целому числу из представленного интервала, выглядит так:
Выходные данные
В текстовый файл result.txt должны быть выведены результаты в следующем формате:
При x = -3 значение y = 2.348
При x = -2 значение y = 7.928
При x = -1 значение y = -6.122
При x = 0 значение y = -4.115
При x = 1 значение y = -7.254
Алгоритм решения задачи
- Поскольку предопределен файл заранее нужного формата, то следующий алгоритм будет оптимальным:
- Инициализируем пустые списки xs и ys.
- Считываем файл исходных данных построчно, каждую строку мы очищаем от пробелов и символов переноса строк, вычленяем число после знака равно, добавляем его в список xs.
- Для каждого числа x из xs мы применяем функцию, описанную выше, если значение есть, то мы добавляем его в ys, иначе мы добавляем в ys пустое значение.
- Создаем пустой файл result.txt, который будет содержать выходные данные.
- Для каждого x из xs и y из ys записываем новую строку в файл result.txt в формате, описанном в условии задачи.
Код программы
from os import path
from typing import Callable
from math import pow, sqrt
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
SOURCE_FILE_PATH = path.join(path.dirname(__file__), 'source_data.txt')
RESULT_FILE_PATH = path.join(path.dirname(__file__), 'result.txt')
TEMPLATE = 'При x = %d значение y = %.3f\n'
TEMPLATE_NO_VALUE = 'При x = %d значение y не определено\n'
def get_xs_from_source_file(filepath: str) -> list[int]:
"""
A function used to extract a list of x values from a given filename.
A filename should be preformatted as follows:
x=1
...
x=9
Parameters:
----------
filename: string
An absolute path to a file.
Returns
----------
list[int]
A list of integer values.
"""
xs = []
with open(filepath) as f:
while line := f.readline():
x = int(line.split('=')[-1].strip())
xs.append(x)
f.close()
return xs
def func(x: int) -> float:
"""
A function from variant 10.
Parameters:
----------
x: int
Returns
----------
float | None
"""
try:
if x < -3:
return ((pow(56*x**7 + 58*x**2 + 60, 5) - 45*x**3) /
(pow(31*x**6 - x**3, 8) + pow(40*x**2 + 92, 4)))
elif -3 <= x < 4:
return ((sqrt(pow(72*x**5 + 54*x**2 + 77, 5)) - 90*x**6) /
(pow(92*x**7 + x**2, 5) + pow(76*x**2 - 7, 6)))
else:
return ((pow(39*x**5 + 74*x**2 + 84, 6) - 75*x**5) /
(pow(74*x**4 - x**3, 7) + sqrt(pow(56*x - 56, 3))))
except ValueError:
return None
def calculate(xs: list[int], fn: Callable[[int], float]) -> list[float]:
"""
Creates a list of float values from a given list with a given function.
Parameters:
----------
xs: list[int]
A list of integer values.
fn: (x: int) -> float
A function accepting an int value, returns a float.
Returns
----------
list[float]
"""
return [fn(x) for x in xs]
def write_ys_to_result_file(filepath: str, xs: list[int], ys: list[float]):
"""
Writes a result file mapping each x to y according to the format.
Parameters:
----------
filename: string
An absolute path to a file.
template: str
A template containing 2 placeholders for x and y.
xs: list[int]
A list of integer values.
ys: list[int]
A list of integer values.
"""
assert(len(xs) == len(ys))
with open(filepath, 'w') as f:
for i, _ in enumerate(xs):
if(ys[i]):
f.write(TEMPLATE % (xs[i], ys[i]))
else:
f.write(TEMPLATE_NO_VALUE % (xs[i]))
f.close()
def main():
xs = get_xs_from_source_file(SOURCE_FILE_PATH)
ys = calculate(xs, func)
write_ys_to_result_file(RESULT_FILE_PATH, xs, ys)
if __name__ == '__main__':
main()
...