Скачиваний:
0
Добавлен:
26.01.2024
Размер:
9.49 Кб
Скачать
#НИР часть 3
# А-03-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 tableUchSt():    
   
    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 vuzkart.z1, vuzstat.pps, vuzstat.dn, vuzstat.kn
    FROM vuzkart
    JOIN vuzstat ON vuzkart.codvuz == vuzstat.codvuz
    WHERE prof=="{}";""".format(prof)
    data = cur.execute(sql).fetchall()
    cur.close()
    con.close()
    for i in range(len(data)):
        data[i]+=(round((data[i][2]+data[i][3])/data[i][1],2)*100,)
    
    
    def sort_col(i):
        return i[4]

    data.sort(key=sort_col)

    data=data[0:20]
    

    count=[]
    
    for i in range(len(data)):
        count.append(i+1)
        a=list(data[i])
        del a[1:4]
        data[i]=tuple(a)
        
    headers = ["Полное наименование вуза", "Процент преподавателей с учеными степенями"]
    print('')
    print(tabulate(data, headers=headers, showindex=count, tablefmt='orgtbl'))




def tableMagRasp():
  
    def RegionMenu():   
        print('')
        print("Доступные федеральные округа:")
        print('1) Дальневосточный')
        print('2) Приволжский')
        print('3) Северо-западный')
        print('4) Северо-Кавказский')
        print('5) Сибирский')
        print('6) Уральский')
        print('7) Центральный')
        print('8) Южный')
        print('9) Все ФО')
        print('0) Выход из меню')
        cmd = input('Выберите федеральный округ по номеру:  ')
        return cmd

    def getRegionInput():
        cmd=RegionMenu()
        while cmd != "0":
            if cmd == "1":
                return "Дальневосточный  " 
            elif cmd == "2":
                return "Приволжский      " 
            elif cmd == "3":
                return "Северо-Западный  "
            elif cmd == "4":
                return "Северо-Кавказский"
            elif cmd == "5":
                return "Сибирский        "
            elif cmd == "6":
                return "Уральский        "
            elif cmd == "7":
                return "Центральный      "
            elif cmd == "8":
                return "Южный            "
            elif cmd == "9":
                return
            else:
                print("Такого федерального округа нет!")
            cmd=statusMenu()  
        return cmd

    region = getRegionInput()
    if(region=="0"): return
        
    con=sqlite3.connect('VUZ.sqlite')
    cur=con.cursor()
    if region != None:
        sql="""SELECT vuzkart.status, vuzkart.prof, vuzstat.mag
        FROM vuzkart
        JOIN vuzstat ON vuzkart.codvuz== vuzstat.codvuz
        WHERE  region=="{}" """.format(region)
    else:
        sql="""SELECT vuzkart.status, vuzkart.prof, vuzstat.mag
        FROM vuzkart
        JOIN vuzstat ON vuzkart.codvuz== vuzstat.codvuz"""
    data = cur.execute(sql).fetchall()
    cur.close()
    con.close()


    stats=['Университет    ', 'Академия       ', 'Институт       ']
    profs=['ИТ', 'КЛ', 'ГП', 'МП']
    
    mag=[]
    sumX=[0]*len(stats)
    sumY=[0]*len(profs)
    
    for i in range(len(profs)):
        mag.append([0]*len(stats))
   
    for k in range(len(data)):
        for i in range(len(profs)):
            for j in range(len(stats)):
                    if(data[k][1]==profs[i] and data[k][0]==stats[j]):
                        mag[i][j]+=data[k][2]
                        
    for i in range(len(profs)):
        for j in range(len(stats)):
            sumX[j]+=mag[i][j]
            sumY[i]+=mag[i][j]

            
    profNames=[]     
    for i in range(len(profs)):
            profNames.append([profs[i]])
        
    for i in range(len(profNames)):
        for j in range(len(stats)):
                    profNames[i].append(mag[i][j])
                   
    for j in range(len(stats)+1):
        profNames[j].append(sumY[j])

    endLine=["ИТОГО"]
    for sum in sumX:
        endLine.append(sum)
    endLine.append("-")
                   
    profNames.append(endLine)

    count=[]
    for i in range(len(profNames)):
        count.append(i+1)

    headers = ["Профиль"]
    for stat in stats:
        headers.append(stat)
    headers.append("ИТОГО")
                   
    print('')
    print(tabulate(profNames, headers=headers, showindex=count, tablefmt='orgtbl' ))    

def menu():
    print('')
    print('Меню:')
    print('1) Выбрать профиль вуза и отобразить перечень полных наименований 20-ти  вузов, соответствующих выбранному профилю и имеющих наименьший процент преподавателей с учеными степенями.')
    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":
            tableUchSt()
        elif cmd == "2":
           tableMagRasp()
        elif cmd == "3":
           tablePrint()
        else:
            print("Такой команды нет!")
        cmd=menu()
    return

main() #Вот и вся программа...
Соседние файлы в папке нир