Skip to content

Instantly share code, notes, and snippets.

@fenske
Last active February 11, 2022 21:43
Show Gist options
  • Select an option

  • Save fenske/051871c38a17e632668d3dad4ff917a5 to your computer and use it in GitHub Desktop.

Select an option

Save fenske/051871c38a17e632668d3dad4ff917a5 to your computer and use it in GitHub Desktop.
from NIR3_func import * # Импорт модуля NIR3_func
# **********************
# Ввод рабочего каталога
# **********************
while True:
path = input("Введите путь рабочего каталога: ")
# os.chdir('C:\\Users\\Alexandr\\Desktop\\НИР')
if os.path.isdir(path):
print("Обнаружен рабочий каталог", path)
os.chdir(path)
break
elif (path == ""):
print("Некорректный ввод пути")
else:
print("Рабочий каталог не обнаружен")
# *****************************************
# Определение имени базы данных и ее таблиц
# *****************************************
database_name = "VUZ.sqlite"
if os.path.isfile(database_name):
table_name_info = "vuzkart"
table_name_stat = "vuzstat"
else:
print("Исходная база данных {} не обнаружена".format(database_name))
sys.exit()
# ****************************************
# Работа с меню, вызов необходимых функций
# ****************************************
while True:
while True:
print("Выберите пункт меню")
print("1. Решение задачи 1")
print("2. Решение задачи 2")
print("3. Выход из программы")
menu_choice = input("-> ")
if int(menu_choice) == 1:
status = []
while True:
status_list = getUniversityStatus(database_name, table_name_info)
print("Выберите желаемый статус вуза:")
print("Введите A, чтобы выбрать Академия")
print("Введите U, чтобы выбрать Университет")
print("Введите I, чтобы выбрать Институт")
print("Введите 0, чтобы вернуться в главное меню")
while True:
status = input("-> ").split()
if status[-1].strip().upper() == "A":
showAverageStudentNumber(database_name, table_name_info, table_name_stat, "Академия")
break
elif status[-1].strip().upper() == "U":
showAverageStudentNumber(database_name, table_name_info, table_name_stat, "Университет")
break
elif status[-1].strip().upper() == "I":
showAverageStudentNumber(database_name, table_name_info, table_name_stat, "Институт")
break
elif status[-1].strip() == "0":
break
else:
print("Некорректный ввод статуса")
break
elif int(menu_choice) == 2:
minmax_percentage = minmaxDoctoratePercentage(database_name, table_name_stat)
while True:
while True:
percentage = float(input(
"Введите пороговое значение процента докторов наук среди преподавателей в вузе.\nДопустимый диапазон: ({}-{})%: ".format(
round(minmax_percentage[0], 2), round(minmax_percentage[1], 2))))
if ((percentage >= minmax_percentage[0] and percentage <= minmax_percentage[1])):
showSuitablePercentUniversities(database_name, table_name_info, table_name_stat, percentage)
break
else:
print("Неккоректный ввод значения процента")
break
break
elif int(menu_choice) == 3:
sys.exit()
else:
print("Некорректный выбор пункта меню")
# -*- coding: CP1251 -*
#****************
#Импорт библиотек
#****************
import sqlite3 #импорт модуля sqlite3 для работы с SQLite
import os #импорт библиотеки os для работы с каталогами
import sys #импорт библиотеки sys для перенаправления вывода в файл
#**********************************
#Функции для решения первой задачи:
#**********************************
def minmaxDoctoratePercentage(database_name,table_name_stat):
"""Вычисление минимального и максимального значения процента докторов наук среди преподавателей.
Возвращает список с двумя элементами, первый из которых -- минимальное значение, второй -- макисмальное
database_name -- имя базы данных
table_name_stat -- имя таблицы базы данных, содержащая статистические данные по вузам
"""
con=sqlite3.connect(database_name)
cur=con.cursor()
doctorate_number=cur.execute("SELECT DN FROM {}".format(table_name_stat)).fetchall()
staff_number=cur.execute("SELECT PPS FROM {}".format(table_name_stat)).fetchall()
doctorate_number_list=[x[0] for x in doctorate_number]
staff_number_list=[x[0] for x in staff_number]
percentage=[x/y for x,y in zip(doctorate_number_list,staff_number_list)]
min_percentage=min(percentage)
max_percentage=max(percentage)
cur.close()
con.close()
return [min_percentage*100,max_percentage*100]
def showSuitablePercentUniversities(database_name,table_name_info,table_name_stat,percent):
"""Отображение в виде таблицы перечня полных наименований вузов, для которых значения процента докторов наук среди преподавателей больше или равно выбранному порогу percentage
database_name -- имя базы данных
table_name_stat -- имя таблицы базы данных, содержащая статистические данные по вузам
"""
con=sqlite3.connect(database_name)
cur=con.cursor()
data=cur.execute("SELECT codvuz,dn,pps,z1 FROM {0} NATURAL JOIN {1} where e_mail IS NOT NULL".format(table_name_stat,table_name_info)).fetchall()
code_list=[int(x[0]) for x in data]
doctorate_number_list=[x[1] for x in data]
staff_number_list=[x[2] for x in data]
university_names_list=[x[3].strip() for x in data]
percentage_list=[x/y for x,y in zip(doctorate_number_list,staff_number_list)]
percentage_list_desired=pecentage_list=[x for x in percentage_list if x>=percent/100]
suitable_percent_codes=[code_list[percentage_list.index(x)] for x in percentage_list_desired]
university_names_list_desired=[university_names_list[percentage_list.index(x)] for x in percentage_list_desired]
cur.close()
con.close()
res=zip(suitable_percent_codes,university_names_list_desired,percentage_list_desired)
print("Заданный процент:", percent)
print("{:<10} {:<100} {:<20}".format("Код вуза","Полное наименование вуза", "Процент докторов наук"))
for x,y,z in res:
print("{:<10} {:<100} {:<20}".format(x,y,round(z*100,2)))
#**********************************
#Функции для решения второй задачи:
#**********************************
def getUniversityStatus(database_name,table_name_info):
"""Получение списка статусов вузов
database_name -- имя базы данных
table_name_info -- имя таблицы базы данных, содержащая информацию по вузам"""
con=sqlite3.connect(database_name)
cur=con.cursor()
status=cur.execute("SELECT status FROM {}".format(table_name_info))
status_list=[x[0].strip() for x in status]
cur.close()
con.close()
return list(set(status_list))
def showAverageStudentNumber(database_name,table_name_info,table_name_stat,status=["Университет", "Институт", "Академия"]):
"""Вычисление среднего числа студентов среди выбранных статусов status вузов по федеральным округам. Отображение полученных значений в виде таблицы.
database_name -- имя базы данных
table_name_stat -- имя таблицы базы данных, содержащая статистические данные по вузам"""
con=sqlite3.connect(database_name)
cur=con.cursor()
data=cur.execute("SELECT z1,status,e_mail FROM {0} WHERE e_mail '%@%'IS NOT LIKE AND status LIKE '%{1}%'".format(table_name_info,status)).fetchall()
status_list=[x[0].strip() for x in data]
region_list=[x[1].strip() for x in data]
stud=[x[2] for x in data]
data_zip=zip(status_list,region_list,stud)
dict_student_number=dict.fromkeys(set(region_list),0)
dict_university_number=dict.fromkeys(set(region_list),0)
dict_res=dict.fromkeys(set(region_list),0)
cur.close()
con.close()
print("Выбранный статус(ы):",str(status))
print("{:<5} {:<50} {:<50}".format("№","Федеральный округ","Среднее количество студентов"))
for i,data in enumerate(data):
print("{:<5} {:<50} {:<100} {:<100}".format(i+1,data[0],data[1],data[2]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment