нир / A-02-20_Дашин_НИР_3
.docxФедеральное государственное бюджетное образовательное учреждение высшего образования «Национальный исследовательский университет «МЭИ»
Институт информационных и вычислительных технологий
Кафедра Управления и интеллектуальных технологий
Отчёт по «Производственная практика: научно-исследовательская работа»
Этап 3
Выполнил студент группы А-02-20
Дашин И.Н.
Проверил
Фомин Г.А.
Москва 2022 г.
Задание для этапа 3 НИР
Вариант 11.
1. Обеспечить выбор из списка профиля вуза, интересующего пользователя. Составить и отобразить на экране перечень полных наименований вузов, соответствующих выбранному профилю и имеющих подготовку магистров.
2. Обеспечить возможность пользователю выбрать из списка статус вузов или значение «Все». Для выбранного статуса отобрать вузы с подготовкой магистров и для них рассчитать и представить в виде таблицы соотношение числа аспирантов к числу магистров в вузах. Таблица должна иметь столбцы: порядковый номер, название вуза, количество аспирантов, количество магистров, соотношение количества аспирантов к количеству магистров Нижняя строка – итоговая, с указанием общего числа аспирантов, общего числа магистров и соотношения этих чисел. Таблица должна быть упорядочена по названию вуза.
Описание выполнения:
Для выполнения первого пункта разработанная программа запрашивает у пользователя профиль вуза из предоставленного списка, а затем отображает таблицу, содержащую полные наименования вузов, которые соответствуют выбранному профилю и имеют подготовку магистров (значит в поле mag таблицы vuzstat должно быть число больше 0).
Для выполнения второго пункта программа запрашивает статус вуза или дает выбрать все сразу. По полученному условию запрашиваются поля с названием вуза, количеством аспирантов (поле asp таблицы vuzstat) и количеством магистров (поле mag таблицы vuzstat). К полученным данным добавляются поля с порядковым номером и рассчитанное соотношение количества аспирантов к количеству магистров. Для этого для каждой записи рассчитывается значение asp/mag. В случае отсутствия магистров в поле с соотношением выводится 0.
Далее по всем записям суммируются количество аспирантов и магистров, рассчитывается соотношение общего количества и формируется итоговая запись, которая присоединяется к итоговой таблице снизу. Таблица при этом упорядочена по названию вуза.
Функционал двух пунктов задания затем был связан в общий интерфейс, позволяющий взаимодействовать с пунктами через главное меню и выбирать пункты, интересующие пользователя. По его желанию можно выйти в другой пункт либо завершить программу выходом из главного меню. Также имеется возможность отобразить одну из таблиц требуемой БД VUZ.sqlite. При запуске программы проверяется наличие файла БД VUZ.sqlite в директории программы. Без файла программа выполняться не будет.
Результаты тестирования:
Программа не будет выполняться если в директории с файлом программы не будет файла с БД VUZ.sqlite
При вводе неподходящих команд программа оповещает пользователя об этом и не прекращает работу:
Точно так же происходит и для подменю выбора в вспомогательных функциях:
Можно сделать вывод что программа адекватно работает в изначально установленных условиях при любых действиях пользователя, а значит базовая проверка на дуракоустойчивость была пройдена.
Примеры работы программы:
Выбрав первый пункт попадаем в меню выбора профиля вузов и выбрав профиль 3) Гуманитарно-педагогический получаем таблицу наименований вузов этого профиля, имеющих подготовку магистров.
Выбрав второй пункт попадаем в меню выбора статуса вузов. Выбрав статус Академия получаем сводку по количеству аспирантов и магистров вуза и их соотношению. Последней строкой получаем общие значения, которые говорят нам, что в вузах с этим статусом в сумме обучаются 1526 магистров и 1234 аспиранта, а соотношение количества аспирантов к количеству магистров равно 0,81.
Выбрав все статусы вузов для этого пункта мы получим упорядоченную по названию вуза таблицу по всем вузам.
Получаем итоговой записью информацию о том, что в сумме обучаются 49836 магистров и 42338 аспирантов, а соотношение количества аспирантов к количеству магистров равно 0,85.
Это значит, что в стране одновременно проходят подготовку почти 100 тысяч будущих специалистов высокого уровня.
Третий пункт позволяет выбрать одну из таблиц исходной БД для отображения.
Код программы:
#НИР часть 3
# А-02-20 Дашин И.Н.
import sqlite3
import sys
import os
from tabulate import tabulate
def tablePrint():
"""Функция печати выбранной таблицы БД"""
def printData(tbName):
"""Функция получает имя таблицы
и возвращает имена полей и все значения из таблицы"""
con = sqlite3.connect("VUZ.sqlite")
cur = con.cursor()
sql = ' SELECT * FROM {}'.format(tbName)
data = cur.execute(sql).fetchall()
fields = cur.description
headers = [nam[0] for nam in fields]
print('')
print(tabulate( data, headers=headers, tablefmt='orgtbl'))
def printTables():
"""Функция принимает имя БД, печатает названия её таблиц и возвращает их"""
con = sqlite3.connect("VUZ.sqlite")
cur = con.cursor()
cur.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cur.fetchall()
tb = []
for table in tables:
tb.append(list(table)[0])
print("Таблицы БД VUZ.sqlite:")
for table in tb:
print( "- " + table)
return tb
def inputTbName(tables):
"""Функция принимает имя БД и список её полей,
проверяет вводимое имя таблицы """
while True:
tbName = input('Введите имя таблицы, которую хотите отобразить: ')
if not tbName in tables:
print("В БД VUZ.sqlite нет таблицы \"" + tbName + "\"")
print('')
print("Таблицы БД VUZ.sqlite:")
for table in tables:
print( "- " + table)
else:
break
return tbName
tables = printTables()
my_tbName = inputTbName(tables)
printData(my_tbName)
def tableProfMag():
"""Первая вспомогательная функция: получает от пользователя выбранный профиль вузов
и выводит наименования вузов этого профиля где ведется подготовка магистров """
def profMenu():
print('')
print("Доступные профили вузов:")
print('1) Инженерно-технический')
print('2) Классический университет')
print('3) Гуманитарно-педагогический')
print('4) Многопрофильный')
print('0) Выход из меню')
cmd = input('Выберите профиль вуза по номеру: ')
return cmd
def getProfInput():
cmd=profMenu()
while cmd != "0":
if cmd == "1":
return "ИТ"
elif cmd == "2":
return "КЛ"
elif cmd == "3":
return "ГП"
elif cmd == "4":
return "МП"
else:
print("Такого профиля нет!")
cmd=profMenu()
return cmd
prof = getProfInput()
if(prof=="0"): return
con=sqlite3.connect('VUZ.sqlite')
cur=con.cursor()
sql="""SELECT z1
FROM vuzkart
JOIN vuzstat ON vuzkart.codvuz == vuzstat.codvuz
WHERE vuzstat.mag>0 AND prof=="{}";""".format(prof)
data = cur.execute(sql).fetchall()
cur.close()
con.close()
count=[]
for i in range(len(data)):
count.append(i+1)
headers = ["Полное наименование вуза"]
print('')
print(tabulate(data, headers=headers, showindex=count))
def tableStatus():
"""Вторая вспомогательная функция: получает в качастве аргумента выбранный статус вуза
и выводит количество обучающихся в нем аспирантов, магистров и их численное соотношение"""
def statusMenu():
print('')
print("Доступные статусы вузов:")
print('1) Университет')
print('2) Академия')
print('3) Институт')
print('4) Выбрать все')
print('0) Выход из меню')
cmd = input('Выберите статус вуза по номеру: ')
return cmd
def getStatusInput():
cmd=statusMenu()
while cmd != "0":
if cmd == "1":
return "Университет "
elif cmd == "2":
return "Академия "
elif cmd == "3":
return "Институт "
elif cmd == "4":
return
else:
print("Такого статуса нет!")
cmd=statusMenu()
return cmd
status = getStatusInput()
if(status=="0"): return
con=sqlite3.connect('VUZ.sqlite')
cur=con.cursor()
if status != None:
sql="""SELECT vuzkart.z1, vuzstat.asp, vuzstat.mag
FROM vuzkart
JOIN vuzstat ON vuzkart.codvuz== vuzstat.codvuz
WHERE status=="{}"
ORDER BY vuzkart.z1""".format(status)
else:
sql="""SELECT vuzkart.z1, vuzstat.asp, vuzstat.mag
FROM vuzkart
JOIN vuzstat ON vuzkart.codvuz== vuzstat.codvuz
ORDER BY vuzkart.z1"""
cur.execute(sql)
data=cur.fetchall()
cur.close()
con.close()
count=[]
for i in range(len(data)):
count.append(i+1)
if (data[i][2]!=0):
data[i]+=(round(data[i][1]/data[i][2],2),)
else: data[i]+=(0,)
mag=0
asp=0
for i in range(len(data)):
asp+=data[i][1]
mag+=data[i][2]
count.append("-")
if (mag!=0):
data+=(("ИТОГО", asp, mag, round(asp/mag,2)),)
else: data+=(("ИТОГО", asp, mag, 0),)
headers = ["Полное наименование вуза", "Количество аспирантов", "Количество магистров", "Отношение аспиранты/магистры"]
print('')
print(tabulate(data, headers=headers, showindex=count, tablefmt='orgtbl'))
def menu():
print('')
print('Меню:')
print('1) Вывести таблицу с наименованиями вузов, имеющих подготовку магистров, выбрав интересующий профиль вузов')
print('2) Вывести таблицу с информацией об обучающихся магистрах и аспирантах, выбрав интересующий статус вузов')
print('3) Выбрать таблицу БД для отображения')
print('0) Завершить работу с программой')
cmd = input('Выберите действие: ')
return cmd
def main():
path=os.getcwd()
if(not os.path.exists(path+"\\VUZ.sqlite")):
print("В директории программы отсутствует требуемая БД, работа невозможна.")
return
else: print("Соединение с требуемой БД установлено!")
cmd=menu()
while cmd != "0":
if cmd == "1":
tableProfMag()
elif cmd == "2":
tableStatus()
elif cmd == "3":
tablePrint()
else:
print("Такой команды нет!")
cmd=menu()
return
main() #Вот и вся программа...