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

нир / A-02-20_Дашин_НИР_3

.docx
Скачиваний:
0
Добавлен:
26.01.2024
Размер:
352.29 Кб
Скачать

Федеральное государственное бюджетное образовательное учреждение высшего образования «Национальный исследовательский университет «МЭИ»

Институт информационных и вычислительных технологий

Кафедра Управления и интеллектуальных технологий

Отчёт по «Производственная практика: научно-исследовательская работа»

Этап 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() #Вот и вся программа...

Соседние файлы в папке нир