Постановка задачи
проблема заключается в том, чтобы написать функцию, которая принимает двумерный список в качестве аргумента. затем нам нужно определить, является ли список магическим квадратом Ло-Шу или нет. Магический квадрат Ло-шу представляет собой сетку 3x3, содержащую числа от 1 до 9, а сумма всех столбцов, строк и диагоналей в сумме дает одно и то же число.
вход:
ввод пользователем числа для каждого квадрата в сетке
выход:
Отображение того, является ли сетка магическим квадратом или нет.
Проектирование решения
- назначить пустой список
- построить функцию для получения введенных пользователем чисел. затем повторите это 9 раз. назначить каждый номер в список
- преобразовать список в матрицу 3x3.
- построить функцию, которая принимает матрицу в качестве аргумента. затем просуммируйте столбцы и диагонали каждой строки
- возьмите первую сумму для сравнения с другой суммой. если есть сумма, отличная от суммы сравнения, программа решает, что это не магический квадрат. в противном случае это магический квадрат.
предположение:
цифры пользовательского ввода для всех входов
Код
''' 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.