Постановка задачи

проблема заключается в том, чтобы написать функцию, которая принимает двумерный список в качестве аргумента. затем нам нужно определить, является ли список магическим квадратом Ло-Шу или нет. Магический квадрат Ло-шу представляет собой сетку 3x3, содержащую числа от 1 до 9, а сумма всех столбцов, строк и диагоналей в сумме дает одно и то же число.

вход:

ввод пользователем числа для каждого квадрата в сетке

выход:

Отображение того, является ли сетка магическим квадратом или нет.

Проектирование решения

  1. назначить пустой список
  2. построить функцию для получения введенных пользователем чисел. затем повторите это 9 раз. назначить каждый номер в список
  3. преобразовать список в матрицу 3x3.
  4. построить функцию, которая принимает матрицу в качестве аргумента. затем просуммируйте столбцы и диагонали каждой строки
  5. возьмите первую сумму для сравнения с другой суммой. если есть сумма, отличная от суммы сравнения, программа решает, что это не магический квадрат. в противном случае это магический квадрат.

предположение:

цифры пользовательского ввода для всех входов

Код

'''
Author: Raditya Fahritama

---Variables in code---

loop = flag for loop
loop2 = second flag for loop
num = user number input
checklist = list of number from user's inputs
checkset = set of number from checklist
r1,r2,r3 = sum of number per row
v1,v2,v3 = sum of number per column
d1,d2 = sum of number per diagonal
listofsum = list of sums 
comparesum = sum that is intended as comparison
numlist = list for user's numbers
number = number from function numget
matrixarr = 3x3 shape matrix array
'''


import numpy as np

#building functions 

#building function to get numbers from user
def numget():
    loop2 = 1
    while loop2 == 1:
        try:
            num = int(input("\nEnter number : "))
            #exception handling
            if num <= 0 or num > 9:
                print("\nPlease input from 1 to 9!")
            elif num > 0 and num <= 9:
                loop2 = 0
                return num
            #-----------------------
        except:
            #exception handling
            print("\nInvalid Input!")
#-----------------------------

#building function to check duplicate
def duplicatecheck(x):
    checklist = x
    checkset = set(checklist)
    #if the length of list and set from the list is different, there's duplicate number in the list
    if len(checklist) != len(checkset):
        return 0
    else:
        return 1    
#--------------------------------------

#building function to get the matrix and sum the contents. after that, compare the sums and determine the magic square
def magicsquare(matrix):
    #summing all rows columns and diagonals
    r1 = matrix[0][0] + matrix[0][1] + matrix[0][2]
    r2 = matrix[1][0] + matrix[1][1] + matrix[1][2]
    r3 = matrix[2][0] + matrix[2][1] + matrix[2][2]

    v1 = matrix[0][0] + matrix[1][0] + matrix[2][0]
    v2 = matrix[0][1] + matrix[1][1] + matrix[2][1]
    v3 = matrix[0][2] + matrix[1][2] + matrix[2][2]

    d1 = matrix[0][0] + matrix[1][1] + matrix[2][2]
    d2 = matrix[0][2] + matrix[1][1] + matrix[2][0]            
    #-------------
    
    #group the sums to list
    listofsums = [r1,r2,r3,v1,v2,v3,d1,d2] 
    #take one sum for comparison
    comparesum = listofsums[0]

    print("\nList of sums: \n",listofsums)
    
    #compare sums one by one. if there's one sum that is not equal, it is not magic square
    for j in range(len(listofsums)):
        if listofsums[j] != comparesum:
            return("Not a Magic Square :(")
    #---------------------
    return("It's a Magic Square!") 
#------------------------------------

#assign empty list
numlist = []

loop = 1
while loop == 1:
    #calling the function in 9 loops. then append each number to the list
    for i in range(9):
        print("\n---Square ",(i+1))
        number = numget()
        numlist.append(number)
    #-----------------------
    
    #calling duplicate check function
    if duplicatecheck(numlist) == 1:
        print("\nList of numbers:\n",numlist)
        loop = 0
    else:
        print("\nDuplicate found in the numbers. Try again!")
        numlist.clear()
    #------------------------------------
    
#converting list of numbers to 3x3 matrix array
matrixarr = np.array(numlist)
matrixarr = matrixarr.reshape(3,3)

print("\nMatrix of numbers:\n",matrixarr)

#calling magic square function
magicsquare(matrixarr)

Тестирование и обработка исключений

тестирование:

  • ввод нецифровых входных данных
  • ввод ввода, отличного от 1 до 9
  • внесение повторяющихся чисел в сетку
  • ввод цифр без дубликатов от 1 до 9 (обычный случай)

Обработка исключений:

  • для нецифровых значений программа выдаст исключение, сообщающее пользователю, что введенные данные недействительны.
  • для ввода, отличного от 1 до 9, сценарий программы if else сообщит пользователю, что входные данные должны быть от 1 до 9
  • для повторяющихся входных данных я создал специальную функцию, которая проверяет, найден ли дубликат в сетке
  • все исключения находятся в цикле. чтобы пользователю не приходилось перезапускать программу при возникновении исключения. цикл прерывается, когда все в порядке

Обсуждение

программа, похоже, хорошо выполняет намеченное решение, основываясь на предоставленных ею результатах. Из всех десяти вопросов для меня этот самый сложный и сложный для кодирования. потому что в программе так много всего происходит. построение обработки исключений — самая сложная часть этой проблемы, обеспечивающая правильную работу программы. программа также хорошо обрабатывает указанное исключение. программа решила задачу постановки вопроса №8.